208. 容器化Mysql GTID主主複製+高可用方案

1.導入鏡像
[root@db01 ~]# docker load -i mysql57.tar 
[root@db02 ~]# docker load -i mysql57.tar 

2.啓動容器
不與weave混部可以適用橋接模式:
       # docker run -p 3301:3306 --name db01 -v /data1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
       # docker run -p 3302:3306 --name db02 -v /data2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

與weave混部適用host模式:
       #docker run --net=host --name db01 -v /data1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
       #docker run --net=host --name db02 -v /data2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

3.修改配置
       # docker cp  db01:/etc/mysql/mysql.conf.d/mysqld.cnf  /tmp/mysqld_1.cnf
       # docker cp  db02:/etc/mysql/mysql.conf.d/mysqld.cnf  /tmp/mysqld_2.cnf
       
[root@db01 ~]# vim /tmp/mysqld_1.cnf 
server-id = 101
log-bin = mysql-bin
max_connections = 1000

#GTID
gtid_mode = on
enforce_gtid_consistency = 1


auto_increment_offset = 1
auto_increment_increment = 2


[root@db02 ~]# vi /tmp/mysqld_2.cnf 
server-id = 102
log-bin = mysql-bin
max_connections = 1000

#GTID
gtid_mode = on
enforce_gtid_consistency = 1


auto_increment_offset = 2
auto_increment_increment = 2



[root@db01 ~]#  docker cp /tmp/mysqld_1.cnf  db01:/etc/mysql/mysql.conf.d/mysqld.cnf  
[root@db02 ~]# docker cp /tmp/mysqld_2.cnf  db02:/etc/mysql/mysql.conf.d/mysqld.cnf


4.重啓容器
docker restart db01 & db02
 
5.創建複製賬號
連接db01:
          # mysql -h127.0.0.1 -P 3301 -p123456
          mysql> grant replication slave on *.* to 'rep'@'%' identified by '123456';

連接db02:
          # mysql -h127.0.0.1 -P 3302 -p123456
          mysql> grant replication slave on *.* to 'rep'@'%' identified by '123456';



6.創建主主複製
         連接db01:
          # mysql -h127.0.0.1 -P 3301 -p123456
          mysql> change master to master_host='db02 IP',master_port=3306,master_user='rep',master_password='123456',MASTER_AUTO_POSITION=1;
          mysql> start slave;
          mysql> show slave status\G

       連接db02:
          # mysql -h127.0.0.1 -P 3302 -p123456
          mysql> change master to master_host='db01 IP',master_port=3306,master_user='rep',master_password='123456',MASTER_AUTO_POSITION=1;
          mysql> start slave;
          mysql> show slave status\G


7.檢查狀態
           Slave_IO_Running和Slave_SQL_Running 兩個值都爲YES,說明覆制狀態正常
           Seconds_Behind_Master 爲0,說明沒有同步延遲

在這裏插入圖片描述

#2.6 配置Mysql+Keepalived故障轉移的高可用環境
1)安裝keepalived並將其配置成系統服務。master1和master2兩臺機器上同樣進行如下操作:
yum install -y openssl-devel keepalived
#db01配置keepalived
[root@host2 ~]# cat /etc/keepalived/keepalived.conf
global_defs {     
	router_id db01
}

定義腳本名稱,以及腳本所在的路徑
vrrp_script chk_mysql_port { #檢測mysql服務是否在運行。有很多方式,比如進程,用腳本檢測等等
	script "/opt/chk_mysql.sh" #這裏通過腳本監測
	interval 2 #腳本執行間隔,每2s檢測一次
	weight -5 #腳本結果導致的優先級變更,檢測失敗(腳本返回非0)則優先級 -5
	fall 2 #檢測連續2次失敗纔算確定是真失敗。會用weight減少優先級(1-255之間)
	rise 1 #檢測1次成功就算成功。但不修改優先級
}
 
vrrp_instance VI_1 {
	state MASTER 
	interface eth0 #指定虛擬ip的網卡接口
	mcast_src_ip 10.0.0.12
	virtual_router_id 51 #路由器標識,MASTER和BACKUP必須是一致的
	priority 101 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級。這樣MASTER故障恢復後,就可以將VIP資源再次搶回來 
	advert_int 1 
	authentication { 
		auth_type PASS 
		auth_pass 1111 
	}
	virtual_ipaddress { 
		10.0.0.3
	}
 
	track_script { 
		chk_mysql_port 
	}
}

編寫切換腳本,KeepAlived做心跳檢測,如果db01的MySQL服務掛了(3306端口掛了),那麼它就會選擇自殺。Slave的KeepAlived通過心跳檢測發現這個情況,就會將VIP的請求接管
[root@host2 ~]# cat /opt/chk_mysql.sh 
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl  stop keepalived
fi


[root@host2 ~]# systemctl restart keepalived.service
===========================================================================================================================================================================
db02配置keepalived
[root@host4 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
        router_id db02
}

vrrp_script chk_mysql_port {
	script "/opt/chk_mysql.sh"
	interval 2 
	weight -5 
	fall 2 
	rise 1 
}
 
vrrp_instance VI_1 {
	state BACKUP
	interface eth0 
	mcast_src_ip 10.0.0.14
	virtual_router_id 51 
	priority 99 
	advert_int 1 
	authentication { 
		auth_type PASS 
		auth_pass 1111 
	}
	virtual_ipaddress { 
		10.0.0.3
	}
 
	track_script { 
		chk_mysql_port 
	}
}

[root@host4 ~]# cat /opt/chk_mysql.sh 
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl  stop keepalived
fi

chmod +x /opt/chk_mysql.sh
[root@host4 ~]# systemctl restart keepalived.service


#查看當前落地的VIP
[root@host2 ~]# ip a |grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0



#2.7 Mysql+keepalived故障轉移的高可用測試[遠程連接測試]
停止db01機器上的mysql服務,根據配置中的腳本,mysql服務停了,keepalived也會停,從而vip資源將會切換到master2機器上。(mysql服務沒有起來的時候,keepalived服務也無法順利啓動!)
PS:一定要先啓動mysql服務,然後再啓動keepalived服務。如果先啓動keepalived服務,按照上面的配置,mysql沒有起來,就會自動關閉keepalived。
腳本後續可優化,此腳本稍微有點Low
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章