1、爲什麼要搭建MySQL集羣呢,首先來簡單說一下單節點數據庫的弊病
大型互聯網程序用戶羣體龐大,所以架構必須要特殊設計;
單節點的數據庫無法滿足性能上的要求;
單節點的數據庫沒有冗餘設計,無法滿足高可用。
2、常見MySQL集羣方案
- Repliaction 集羣方案
- PXC 集羣方案( Percona XtraDB Cluster )
1)Repliaction 集羣方案
PXC方案在任何一個節點寫入的數據都會同步到其他節點,數據雙向同步的(在任何節點上都可以同時讀寫)。
2)Repliaction 集羣方案
Replication方案只能在Master數據庫進行寫操作,在Slave數據庫進行讀操作。如果在Slave數據庫中寫入數據,Master數據庫是不能知道的(單向同步的)。
3)PXC 數據的強一致性
PXC 採用同步複製,事務在所有集羣節點要麼同時提交,要麼不提交。
當一個寫入請求到達PXC集羣中的一個 mysql(node1數據庫) 數據庫時,node1數據庫會將該寫入請求同步給集羣中的其他所有數據庫,等待所有數據庫都成功提交事務後,node1節點纔會將寫入成功的結果告訴給 node1的客戶端。
Replication 採用異步複製,無法保證數據的一致性。
當一個寫入請求到達 Master數據庫時,Master數據庫執行寫入操作,然後 Master 向客戶端返回寫入成功,同時異步的複製寫入操作給 Slave數據庫,如果異步複製時出現問題,從數據庫將無法執行寫入操作,而客戶端得到的是寫入成功。這也是弱一致性的體現。
3、搭建PXC的MySQL集羣--數據強一致性
1)PXC集羣安裝介紹
Docker的鏡像倉庫中包含了PXC數據庫的鏡像,下載即可
https://hub.docker.com/r/percona/percona-xtradb-cluster/
2)安裝PXC鏡像
下載鏡像
docker pull percona/percona-xtradb-cluster
#建議使用5.7.21PXC鏡像
docker pull percona/percona-xtradb-cluster:5.7.21
#修改鏡像名字,將鏡像名字修改一下,便於使用
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
#刪除鏡像
docker rmi percona/percona-xtradb-cluster:5.7.21
3)出於安全考慮,需要給PXC集羣實例創建Docker內部網絡
docker network create net1
docker network inspect net1
docker network rm net1
4)創建Docker卷
容器中的PXC節點映射數據目錄的解決辦法
docker volume create --name v1
5)創建PXC容器
只需要向PXC鏡像傳入運行參數就能創建出PXC容器
docker run -d\
--name node1\
-p 3306:3306\
-v v1:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
--net net1\
--ip 172.18.0.2\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node2\
-p 3307:3306\
-v v2:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.3\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node3\
-p 3308:3306\
-v v3:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.4\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node4\
-p 3309:3306\
-v v4:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.5\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node5\
-p 3310:3306\
-v v5:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.6\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
查看創建的5個pxc容器
4、數據庫負載均衡
使用Haproxy做負載均衡,請求被均勻發給每個節點,單節點負載低,性能好。
Docker倉庫中保存了Haproxy的鏡像
docker pull haproxy
創建Haproxy配置文件,配置文件詳情參考https://zhang.ge/5125.html
touch /home/soft/haproxy/haproxy.cfg
global
#工作目錄
chroot /usr/local/etc/haproxy
#日誌文件,使用rsyslog服務中local5日誌設備(/var/log/local5),等級info
log 127.0.0.1 local5 info
#守護進程運行
daemon
defaults
log global
mode http
#日誌格式
option httplog
#日誌中不記錄負載均衡的心跳檢測記錄
option dontlognull
#連接超時(毫秒)
timeout connect 5000
#客戶端超時(毫秒)
timeout client 50000
#服務器超時(毫秒)
timeout server 50000
#監控界面
listen admin_stats
#監控界面的訪問的IP和端口
bind 0.0.0.0:8888
#訪問協議
mode http
#URI相對地址
stats uri /dbs
#統計報告格式
stats realm Global\ statistics
#登陸帳戶信息
stats auth admin:abc123456
#數據庫負載均衡
listen proxy-mysql
#訪問的IP和端口
bind 0.0.0.0:3306
#網絡協議
mode tcp
#負載均衡算法(輪詢算法)
#輪詢算法:roundrobin
#權重算法:static-rr
#最少連接算法:leastconn
#請求源IP算法:source
balance roundrobin
#日誌格式
option tcplog
#在MySQL中創建一個沒有權限的haproxy用戶,密碼爲空。Haproxy使用這個賬戶對MySQL數據庫心跳檢測
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive檢測死鏈
option tcpka
創建容器
docker run -d\
-p 4001:8888\
-p 4002:3306\
-v /home/soft/haproxy:/usr/local/etc/haproxy\
--name h1\
--privileged\
--net=net1\
--ip=172.18.0.7\
docker.io/haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
配置完成之後,查看一下監控畫面
http://192.168.0.103:4001/dbs
5、高可用方案
爲什麼要採用雙機熱備?單節點Haproxy不具備高可用,必須冗餘設計。
利用Keepalived實現雙機熱備
Haproxy雙機熱備方案