1.PXC(Percona XtraDB Cluster)
速度慢 但能保證強一致性 適用於儲存價值較高的資料
資料同步是雙向的 在任一節點寫入資料 都會同步到其他所有節點 在任何節點上都能同時讀寫
採用同步複製 向任一節點寫入資料 只有所有節點都同步成功後 才會向客戶端返回成功。事務在所有節點要麼同時提交,要麼不提交
1.1 PXC叢集安裝
(1)安裝 docker pull percona/percona-xtradb-cluster
(2)重新命名 docker tag percona/percona-xtradb-cluster:latest pxc
(3)刪除源映象標籤 docker rmi percona/percona-xtradb-cluster
docker images
(3)建立網段 docker network create --subnet=172.188.0.0/24 hxjf-docker (如果有重複可以刪除 docker network rm 名稱)
檢視 docker network inspect hxjf-docker
(4)建立5個數據卷
docker volume create --name pxc-vm01
docker volume create --name pxc-vm02
docker volume create --name pxc-vm03
docker volume create --name pxc-vm04
docker volume create --name pxc-vm05
檢視 docker inspect pxc-vm01
(5)建立5個PXC容器
# 第一個節點
(1)建立容器
docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v pxc-vm01:/var/lib/mysql -v backup:/data --privileged --name=pxcnode01 --net=hxjf-docker --ip 172.188.0.81 pxc
(2)驗證
docker ps -a
docker exec -it pxcnode01 bash
mysql -u root -proot (這裡我後來重新docker run MYSQL_ROOT_PASSWORD引數修改123456登入也不行 只能用root登入)
#以下二三四五節點 多了個 -e CLUSTER_JOIN=pxcnode01
# 第二個節點
docker run -d -p 3302:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm02:/var/lib/mysql -v backup:/data --privileged --name=pxcnode02 --net=hxjf-docker --ip 172.188.0.82 pxc
# 第三個節點
docker run -d -p 3303:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm03:/var/lib/mysql -v backup:/data --privileged --name=pxcnode03 --net=hxjf-docker --ip 172.188.0.83 pxc
# 第四個節點
docker run -d -p 3304:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm04:/var/lib/mysql -v backup:/data --privileged --name=pxcnode04 --net=hxjf-docker --ip 172.188.0.84 pxc
# 第五個節點
docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm05:/var/lib/mysql -v backup:/data --privileged --name=pxcnode05 --net=hxjf-docker --ip 172.188.0.85 pxc
# 檢視 docker ps -a
2.解決SSL通訊問題
2.1第一種方案
(1)重新配置pxcnode01
檢視日期發現其它pxcnode02 pxcnode03 pxcnode04 pxcnode05沒有起來
docker ps -a
docker logs -f pxcnode03
刪掉第一個pxcnode01 重新配置
docker stop pxcnode01
docker rm pxcnode01
docker ps -a
(2) 配置
(3)docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v pxc-vm01:/var/lib/mysql -v backup:/data -v conf01:/etc/mysql --privileged=true --name=pxcnode01 --net=hxjf-docker --ip 172.188.0.81 pxc
[mysqld] default_authentication_plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
skip-host-cache
core-file
# 關閉ssl通訊
pxc-encrypt-cluster-traffic=OFF #server_id=0
(5)重啟pxcnode01
(6)重啟剩餘節點
docker rm pxcnode02
docker rm pxcnode03
docker rm pxcnode04
docker rm pxcnode05
docker ps -a
#pxcnode02
docker run -d -p 3302:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm02:/var/lib/mysql -v backup:/data -v conf02:/etc/mysql --privileged --name=pxcnode02 --net=hxjf-docker --ip 172.188.0.82 pxc
#pxcnode03
docker run -d -p 3303:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm03:/var/lib/mysql -v backup:/data -v conf03:/etc/mysql --privileged --name=pxcnode03 --net=hxjf-docker --ip 172.188.0.83 pxc
#pxcnode04
docker run -d -p 3304:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm04:/var/lib/mysql -v backup:/data -v conf04:/etc/mysql --privileged --name=pxcnode04 --net=hxjf-docker --ip 172.188.0.84 pxc
#pxcnode05
docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm05:/var/lib/mysql -v backup:/data -v conf05:/etc/mysql --privileged --name=pxcnode05 --net=hxjf-docker --ip 172.188.0.85 pxc
#檢視容器 docker ps -a 還是失敗
(7)配置從節點

(8)重啟節點
docker start pxcnode02
docker start pxcnode03
docker start pxcnode04
docker start pxcnode05
(9)檢視節點
啟動正常 docker ps -aq
2.資料庫的負載均衡
將所有請求傳送給單一節點 其負載過高 效能很低 其他節點卻很空閒
使用Haproxy做負載均衡 可以將請求均勻地傳送給每個節點 單節點負載低 效能好
2.1安裝Haproxy
(1)docker pull haproxy
(2)建立配置檔案
mkdir -p /home/soft/haproxy/
touch /home/soft/haproxy/haproxy.cfg
vim /home/soft/haproxy/haproxy.cfg
# 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:123456
#資料庫負載均衡
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.188.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.188.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.188.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.188.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.188.0.6:3306 check weight 1 maxconn 2000
#使用keepalive檢測死鏈
option tcpka
(3)