基於MyCat的MySql自動故障轉移



# MySql雙主複製
## 創建主a,b鏡像
    建立文件夾,創建相關文件,這裏只給a的過程


mkdir mysql-mm-a
touch Dockerfile
touch mysql.cnf
mkdir /var/docker/mysql/data-mm-a


文件內寫入相應內容


FROM mysql:latest
COPY mysql.cnf /etc/mysql/conf.d/mysql.cnf


[mysqld]
log-bin=mysql-bin   #[必須]啓用二進制日誌
server-id=1           #設置爲主機ip,主機b此處設爲2
relay-log=slave-relay-bin


創建鏡像 注意要在相應目錄下 mysql-mm-a,啓動鏡像


docker build -t mysql-mm-a .
docker run --privileged=true -p 33075:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-a/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-a
# 注意啓動b的時候要在不同端口及文件夾
docker run --privileged=true -p 33076:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-b/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-b


創建b的鏡像與a基本相同,需要注意的地方前面的步驟已經說明,主要是文件夾,命名,端口不一樣
 
## 配置兩個服務互爲主從
    連入mysql-mm-a,並執行相應命令


mysql -h127.0.0.1 -P33075 -uroot -p


輸入密碼,進入後執行以下命令:


GRANT REPLICATION SLAVE ON *.* TO 'dev'@'%' IDENTIFIED BY 'dev';
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
SHOW MASTER STATUS; --file和position參數要用於從節點配置


連接mysql-mm-b,執行相應命令:


mysql -h127.0.0.1 -P33076 -uroot -p


輸入密碼,進入後執行以下命令:


change master to
master_host='127.0.0.1',
master_port=33075,
master_user='dev',
master_password='dev',
master_log_file='mysql-bin.000003',
master_log_pos=428;   -- 這兩個參數是另一個服務執行 SHOW MASTER STATUS的結果
START SLAVE;


至此便完成了主33075從33076的複製狀態,將以上步驟按照33075和33076互換,配置爲主33076從33075,這樣便互爲主從複製了


# 創建MyCat服務
    


mkdir mycat-mm
cd mycat-mm
touch Dockerfile
wget http://dl.mycat.io/1.7-BETA/Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz
mv Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz mycat.tar.gz


將MyCat壓縮包解壓,將conf文件夾複製到當前目錄
文件內寫入相應內容


FROM openjdk:8
ADD mycat.tar.gz /usr/local/
COPY conf /usr/local/mycat/conf
VOLUME /usr/local/mycat/conf
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console","&"]


<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="user" primaryKey="id" dataNode="dn1" rule="auto-sharding-long" />
	</schema>
	<dataNode name="dn1" dataHost="host1" database="test" />
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="host1" url="127.0.0.1:33075" user="root" password="root"></writeHost>
		<writeHost host="host2" url="127.0.0.1:33076" user="root" password="root"></writeHost>
	</dataHost>

</mycat:schema>


創建鏡像 注意要在相應目錄下 mycat-mm,啓動鏡像


docker build -t mycat-mm .
docker run --name mycat-mm -p 8088:8066 -p 9088:9066 -d mycat-mm


# 測試
嘗試連接8088端口的mycat服務,對user表進行插入,分別到33075,33076數據庫中查看已有記錄;
停止 33075,再執行插入,可以看到插入依然成功,到33076可以看到數據插入該庫,mycat以將寫入庫切換到33076
重新啓動33075,查詢其中的數據,可以看到,重啓後的33075會自動同步33076的數據
再次插入數據,可以看到33075,33076都插入,說明33075恢復後又自動納入了mycat的管理

# MySql雙主複製
## 創建主a,b鏡像
    建立文件夾,創建相關文件,這裏只給a的過程


mkdir mysql-mm-a
touch Dockerfile
touch mysql.cnf
mkdir /var/docker/mysql/data-mm-a


文件內寫入相應內容


FROM mysql:latest
COPY mysql.cnf /etc/mysql/conf.d/mysql.cnf


[mysqld]
log-bin=mysql-bin   #[必須]啓用二進制日誌
server-id=1           #設置爲主機ip,主機b此處設爲2
relay-log=slave-relay-bin


創建鏡像 注意要在相應目錄下 mysql-mm-a,啓動鏡像


docker build -t mysql-mm-a .
docker run --privileged=true -p 33075:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-a/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-a
# 注意啓動b的時候要在不同端口及文件夾
docker run --privileged=true -p 33076:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-b/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-b


創建b的鏡像與a基本相同,需要注意的地方前面的步驟已經說明,主要是文件夾,命名,端口不一樣
 
## 配置兩個服務互爲主從
    連入mysql-mm-a,並執行相應命令


mysql -h127.0.0.1 -P33075 -uroot -p


輸入密碼,進入後執行以下命令:


GRANT REPLICATION SLAVE ON *.* TO 'dev'@'%' IDENTIFIED BY 'dev';
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
SHOW MASTER STATUS; --file和position參數要用於從節點配置


連接mysql-mm-b,執行相應命令:


mysql -h127.0.0.1 -P33076 -uroot -p


輸入密碼,進入後執行以下命令:


change master to
master_host='127.0.0.1',
master_port=33075,
master_user='dev',
master_password='dev',
master_log_file='mysql-bin.000003',
master_log_pos=428;   -- 這兩個參數是另一個服務執行 SHOW MASTER STATUS的結果
START SLAVE;


至此便完成了主33075從33076的複製狀態,將以上步驟按照33075和33076互換,配置爲主33076從33075,這樣便互爲主從複製了


# 創建MyCat服務
    


mkdir mycat-mm
cd mycat-mm
touch Dockerfile
wget http://dl.mycat.io/1.7-BETA/Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz
mv Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz mycat.tar.gz


將MyCat壓縮包解壓,將conf文件夾複製到當前目錄
文件內寫入相應內容


FROM openjdk:8
ADD mycat.tar.gz /usr/local/
COPY conf /usr/local/mycat/conf
VOLUME /usr/local/mycat/conf
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console","&"]


<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="user" primaryKey="id" dataNode="dn1" rule="auto-sharding-long" />
	</schema>
	<dataNode name="dn1" dataHost="host1" database="test" />
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="host1" url="127.0.0.1:33075" user="root" password="root"></writeHost>
		<writeHost host="host2" url="127.0.0.1:33076" user="root" password="root"></writeHost>
	</dataHost>

</mycat:schema>


創建鏡像 注意要在相應目錄下 mycat-mm,啓動鏡像


docker build -t mycat-mm .
docker run --name mycat-mm -p 8088:8066 -p 9088:9066 -d mycat-mm


# 測試
嘗試連接8088端口的mycat服務,對user表進行插入,分別到33075,33076數據庫中查看已有記錄;
停止 33075,再執行插入,可以看到插入依然成功,到33076可以看到數據插入該庫,mycat以將寫入庫切換到33076
重新啓動33075,查詢其中的數據,可以看到,重啓後的33075會自動同步33076的數據
再次插入數據,可以看到33075,33076都插入,說明33075恢復後又自動納入了mycat的管理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章