pxc叢集的最大優點是高一緻性,每一個節點都可以讀寫。因為是高一緻,當向一個節點寫入資料時,必須要所有節點都成功,才傳回成功狀态,是以,寫入的性能比單一節點的資料庫和主從叢集的資料庫略差,但對于需要高一緻要求的資料,可以保證資料的安全。
注意這兒使用的是 pxc:5.7版本。此版本叢集之間節點互相認證不需要證書,後面有pxc8.0基于證書的叢集。
叢集應該安裝到多台真實的主控端上,如果是在一台宿主上安裝多個容器的叢集,這種形式隻能用于學習。
在多台真機上安裝mysql叢集時,為保證互相的通訊,可以使用--network=host主控端網絡模式,也可以先建立一個docker swarm叢集,實作通過ingress在多主控端容器之間通訊。
步1、下載下傳鏡像
下載下傳位址:https://hub.docker.com/r/percona/percona-xtradb-cluster。
# docker pull percona/percona-xtradb-cluster:5.7
步2、建立一個獨立的網絡給pxc叢集使用
$ docker network create -d bridge --attachable pxc-net
步3、建立三個資料卷
如果不建立資料卷,在後面啟動時,也可以使用-v指定影射目錄:
步4、建立三個pxc容器
參數說明:
- CLUSTER_NAME叢集之間需要有相同的叢集名稱。
- CLUSTER_JOIN後啟動的PXC目标節點的名稱。預設第一個啟動的PXC容器,會先建立一個PXC叢集并等待後續節點加入。
- 也可以直接使用docker-compose.yml建立,效果相同。
第一個:
#!/bin/bash
docker run --name node1 -d \
-p 3301:3306 \
-v v1:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
--privileged \
--network pxc-net \
percona/percona-xtradb-cluster:5.7 \
--character-set-server=utf8 --collation-server=utf8_generic_ci
第二個,注意添加join語句:
#!/bin/bash
docker run --name node2 -d \
-p 3302:3306 \
-v v2:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=node1 \
--privileged \
--network pxc-net \
percona/percona-xtradb-cluster:5.7 \
--character-set-server=utf8 --collation-server=utf8_generic_ci
第三個,注意添加join語句:
#!/bin/bash
docker run --name node3 -di \
-p 3303:3306 \
-v v3:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=node1 \
--privileged \
--network pxc-net \
percona/percona-xtradb-cluster:5.7 \
--character-set-server=utf8 --collation-server=utf8_generic_ci
步5、驗證叢集
分别通過MySql Client連接配接三台不同的主機,并建立資料庫,建立資料表、寫入資料,分别查詢其他幾台主機上的資料内容,如果資料已經同步,說明叢集已經可以工作了:
步6、配置MySql叢集的負載均衡
這兒我們使用haproxy給mysql叢集做負載均衡
下載下傳haproxy
下載下傳位址:https://hub.docker.com/_/haproxy
docker pull haproxy
2、建立haproxy的配置檔案
在任意目錄下,建立一個haproxy.cfg配置檔案,内容如下 :
注意,每一行如果最前面有空格,請使用4個空格,行内空格使用1個空格即可。
global
#工作目錄,需要與建立容器指定的目錄相同
# chroot /usr/local/etc/haproxy
#日志檔案
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
bind 0.0.0.0:8888
mode http
stats uri /dbs_monitor
#統計報告
stats realm global\statistics
#登入賬戶
stats auth admin:admin
#資料負載均衡
listen proxy-mysql
#通路的ip:port
bind 0.0.0.0:3306
mode tcp
#負載均衡算法
balance roundrobin
#日志格式
option tcplog
#在mysql中建立一個沒有權限的haproxy使用者密碼為空
#haproxy使用這個賬戶對mysql進行監控
option mysql-check user haproxy
server MySQL_1 node1:3306 check weight 1 maxconn 2000
server MySQL_2 node2:3306 check weight 1 maxconn 2000
server MySQL_3 node3:3306 check weight 2 maxconn 2000
option tcpka
3、建立haproxy使用者
在pxc資料庫上,建立haproxy使用者,密碼必須為空,此使用者用于haproxy對mysql進行健康檢查,不用授權任何權限。 登入pxc叢集的任何節點,執行建立即可:
mysql> create user 'haproxy'@'%' identified by “”;
啟動haproxy
8888為監控界面端口,3306為資料庫端口。
-v ~/a 為包含有haproxy.cfg的配置檔案的目錄。
#!/bin/bash
docker run --name haproxy -d \
-p 8888:8888 -p 3306:3306 \
-v ~/a:/usr/local/etc/haproxy \
--privileged \
--network pxc-net \
haproxy
通路8888端口
位址:http://192.168.56.61:8888/dbs_monitor
測試連接配接
使用mysql client訪3306(haproxy代理的mysql的端口)。
# mysql -uroot -p123456 -h192.168.56.61 -P3306
MYSQL>
或使用MySQLClient UI(任何可以連接配接mysql的ui)都可以通過haproxy 3306端口操作mysql.
連接配接成功:
步7、停止主節點重新啟動
處理兩個地方:
1: 修改主節點資料目錄下grastate.dat檔案,将safe_to_bootstrap修改為1。
2:添加CLUSTER_JOIN參數等于任何一個正在運作的mysql服務。
啟動參數添加:
-e CLUSTER_JOIN=mysql-node2
然後再重新啟動即可,啟動後查詢叢集的狀态:
show status like ‘wsrep_%’,如果顯示3台伺服器,就可以了:
關于safe_to_bootstrap值的說明:
一般下情況,在叢集中,隻會有一個pxc節點的safe_to_bootstrap值為1,即為初始化建立叢集的節點,pxc叢集建立成且其他節點加入成功後,任何的節點都可以執行讀寫,資料之間互相同步。
如果三台主機依次關閉,則最後一台關閉的主機safe_to_bootstrap的值為1,即此主機擁有最新的資料,啟動時,應該先啟動這個節點。
如果三台主機,同時關閉,則有可能三台主機的safe_to_bootstrap的值都是0,則隻需要任何一台的safe_to_bootstrap=1,後先啟動這台主機,再其他其他主機,就可以成功啟動叢集。