前言
本文章使用Percona XtraDB Cluster(MySQL改進版,性能提升很大)進行集群搭建,集群mysql的數(shù)量是5,宿主機為centos7。
常見集群方案
- PXC同步復制,事務在所有集群節(jié)點要么同時提交,要么不提交
- Replication采用異步復制,無法保證數(shù)據(jù)的一致性
安裝鏡像
docker pull percona/percona-xtradb-cluster
名字太長了,對鏡像進行重命名
docker tag percona/percona-xtradb-cluster percona
可以看到執(zhí)行該命令,docker為我們復制了一份

創(chuàng)建內(nèi)部網(wǎng)絡
出于安全考慮,將PXC集群放置于docker內(nèi)部網(wǎng)絡中。只需將宿主的端口與之映射并開放出來即可。
docker network create --subnet=172.18.0.0/24 net1
說明:–subnet=172.18.0.0/24 自定義網(wǎng)段172.18.0.0,24是指24位子網(wǎng)掩碼 net1 網(wǎng)段名稱。
創(chuàng)建docker卷
docker容器的運行規(guī)則:通過目錄映射的方法,將業(yè)務數(shù)據(jù)寫入到宿主機中。好處是如果容器故障,只需將容器刪除,重新啟用一個容器即可,這樣就不會丟失原來的數(shù)據(jù)。重新創(chuàng)建啟動一個新的容器還可以繼續(xù)使用。
由于PXC較為特殊,無法直接使用映射目錄的方法做映射(使用后會閃退),故使用docker卷。
創(chuàng)建5個docker卷
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
創(chuàng)建運行PXC容器
#第一個節(jié)點
docker run -d -p 3306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node1 --net=net1 --ip 172.18.0.2 percona
#第二個節(jié)點
docker run -d -p 3307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node2 --net=net1 --ip 172.18.0.3 percona
#第三個節(jié)點
docker run -d -p 3308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node3 --net=net1 --ip 172.18.0.4 percona
#第四個節(jié)點
docker run -d -p 3309:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node4 --net=net1 --ip 172.18.0.5 percona
#第五個節(jié)點
docker run -d -p 3310:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node5 --net=net1 --ip 172.18.0.6 percona
參數(shù)說明:
-d 默認在后臺運行
-p 3306(宿主):3306(容器) 端口映射,將容器3306端口映射到宿主3306坤口
-v 目錄映射,將第四步創(chuàng)建的v1映射到容器/var/lib/mysql
-e MYSQL_ROOT_PASSROWD 創(chuàng)建的用戶實例的密碼,默認實例root
-e CLUSTER_NAME 集群名稱
-e XTRABACKUP_PASSWORD 數(shù)據(jù)庫之間同步使用的密碼
--privileged 權限.給予最高權限
--name 給容器容命名
--net 使用內(nèi)部網(wǎng)段
--ip 內(nèi)部網(wǎng)段分到的地址
pxc 指的是鏡像
驗證是否創(chuàng)建成功PCX集群
開放端口3306-3310
開放端口范圍3306至3310
firewall-cmd --permanent --add-port=3306-3310/tcp
查看開放端口的列表
firewall-cmd --permanent --list-ports

在本地用mysql的客戶端連接工具對五個幾點進行連接,看看是否每個節(jié)點都成功運行。如果成功運行,再選任意一個節(jié)點創(chuàng)建一個表,然后插入數(shù)據(jù)看其他節(jié)點是否能夠進行同步
負載均衡
使用支持TCP/IP協(xié)議的harpoxy中間件進行負載均衡。
#創(chuàng)建目錄
mkdir /home/soft/haproxy
# 拉取鏡像
docker pull haproxy
# 宿主機創(chuàng)建配置文件
touch /home/soft/haproxy/haproxy.cfg
# 創(chuàng)建容器,4001:8888為管理界面的端口
docker run -it -d -p 4001:8888 -p 4000:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
把下面haproxy.conf配置文件的內(nèi)容添加到宿主機的haproxy.conf文件里
haproxy.conf 配置文件
global
#工作目錄
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服務中l(wèi)ocal5日志設備(/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
#監(jiān)控界面
listen admin_stats
#監(jiān)控界面的訪問的IP和端口
bind 0.0.0.0:8888
#訪問協(xié)議
mode http
#URI相對地址
stats uri /dbs
#統(tǒng)計報告格式
stats realm Global\ statistics
#登陸帳戶信息
stats auth admin:123456
#數(shù)據(jù)庫負載均衡
listen proxy-mysql
#訪問的IP和端口
bind 0.0.0.0:3306
#網(wǎng)絡協(xié)議
mode tcp
#負載均衡算法(輪詢算法)
#輪詢算法:roundrobin
#權重算法:static-rr
#最少連接算法:leastconn
#請求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中創(chuàng)建一個沒有權限的haproxy用戶,密碼為空。Haproxy使用這個賬戶對MySQL數(shù)據(jù)庫心跳檢測
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 exec -it h1 bash
# 加載指定配置文件,啟動haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
執(zhí)行sql語句創(chuàng)建賬戶
# mysql創(chuàng)建賬號
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

訪問管理界面,輸入用戶名密碼admin 123456(上面haproxy.conf配置的信息)


綠色為正常節(jié)點,紅色為故障節(jié)點,這說明你需要做些處理了