1. 程式人生 > 實用技巧 >docker技術快速實現前後端專案的叢集化⑤docker環境下搭建percona-mysql的pxc叢集

docker技術快速實現前後端專案的叢集化⑤docker環境下搭建percona-mysql的pxc叢集

docker技術快速實現前後端專案的叢集化⑤docker環境下搭建percona-mysql的pxc叢集

生產環境中使用docker搭建類似mysql資料庫、redis等有業務狀態的叢集是不合理的,資料庫的資料很關鍵,壓力大,對效能的要求較高,如果叢集崩潰除了重啟docker沒有太好的解決方法,而重啟對業務的影響是很難控制的

部署pxc叢集perconadb

參考文件:https://hub.docker.com/r/percona/percona-xtradb-cluster/

# docker pull docker.io/percona/percona-xtradb-cluster

給映象改名字

[root@server01 ~]# docker images

[root@server01 ~]# docker tag docker.io/percona/percona-xtradb-cluster pxc

處於安全考慮需要給pxc叢集建立docker內部網路

建立自定義網段172.18.0.0/24,docker inspect net1可以檢視網路資訊

[root@server01 ~]# docker network create --subnet=172.18.0.0/24 net1

[root@server01 ~]# docker inspect net1

Docker的儲存

一般可以直接對映到宿主機,Pxc技術不能直接對映需要使用到卷volume

# 建立卷

[root@server01 ~]# docker volume create v1

# 檢視卷資訊

[root@server01 ~]# docker inspect v1

# 刪除卷

[root@server01 ~]# docker volume rm v1

建立叢集

建立pxc各節點的volume卷

建立5節點的pxc叢集

1.建立5個卷

[root@server01 ~]# docker volume create v1

[root@server01 ~]# docker volume create v2

[root@server01 ~]# docker volume create v3

[root@server01 ~]# docker volume create v4

[root@server01 ~]# docker volume create v5

[root@server01 ~]# docker volume ls

DRIVER VOLUME NAME

local v1

local v2

local v3

local v4

local v5

建立第一個節點

[root@server01 ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -v v1:/var/lib/mysql --privileged --name=pxcnode01 --net=net1 --ip 172.18.0.2 pxc

我們在建立第一個pxc例項後要等待第一個例項可以成功執行,並且能通過客戶端連線,因為啟動node2,node3。。。等需要和node1同步,如果同步不成功就會閃退

通過客戶端工具測試是否能夠連線成功

依次建立剩下的4個pxc節點
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -v v1:/var/lib/mysql --privileged --name=pxcnode01 --net=net1 --ip 172.18.0.2 pxc 

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --privileged --name=pxcnode02 --net=net1 --ip 172.18.0.3 pxc

docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=pxcnode03 --net=net1 --ip 172.18.0.4 pxc

docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=pxcnode04 --net=net1 --ip 172.18.0.5 pxc

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --privileged --name=pxcnode05 --net=net1 --ip 172.18.0.6 pxc


預設使用的是percona8.0但是第二個節點起不來,報錯ssl證書問題
於是使用percona-mysql5.7
# docker pull percona/percona-xtradb-cluster:5.7
# docker tag percona/percona-xtradb-cluster:5.7
因為之前volume已經建立了percona8.0的檔案,此時再次啟動就起不來,所以需要刪除裡面的檔案
# docker volume rm v1
# docker volume create v1
# 再次執行節點的建立
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -v v1:/var/lib/mysql --privileged --name=pxcnode01 --net=net1 --ip 172.18.0.2 pxc 

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=pxcnode01 -v v2:/var/lib/mysql --privileged --name=pxcnode02 --net=net1 --ip 172.18.0.3 pxc


docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=pxcnode01 -v v3:/var/lib/mysql --privileged --name=pxcnode03 --net=net1 --ip 172.18.0.4 pxc

docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=pxcnode01 -v v4:/var/lib/mysql --privileged --name=pxcnode04 --net=net1 --ip 172.18.0.5 pxc

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root123456 -e CLUSTER_NAME=pxc01 -e XTRABACKUP_PASSWORD=root123456 -e CLUSTER_JOIN=pxcnode01 -v v5:/var/lib/mysql --privileged --name=pxcnode05 --net=net1 --ip 172.18.0.6 pxc
# 最終全部跑起來了
[root@server01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                   NAMES
1561e31c4952        pxc                 "/entrypoint.sh my..."   6 seconds ago        Up 5 seconds        4567-4568/tcp, 0.0.0.0:3310->3306/tcp   pxcnode05
befc01d39968        pxc                 "/entrypoint.sh my..."   25 seconds ago       Up 24 seconds       4567-4568/tcp, 0.0.0.0:3309->3306/tcp   pxcnode04
0e56217ade2c        pxc                 "/entrypoint.sh my..."   44 seconds ago       Up 44 seconds       4567-4568/tcp, 0.0.0.0:3308->3306/tcp   pxcnode03
39f47c1c7357        pxc                 "/entrypoint.sh my..."   About a minute ago   Up About a minute   4567-4568/tcp, 0.0.0.0:3307->3306/tcp   pxcnode02
c989361c6d63        pxc                 "/entrypoint.sh my..."   5 minutes ago        Up 5 minutes        0.0.0.0:3306->3306/tcp, 4567-4568/tcp   pxcnode01

# 等待所有節點都建立完成,並且能通過客戶端連線
驗證叢集的同步是否正常,在node01中建立庫,表,插入資料,在node03中看是否正常同步

報錯:
[root@server01 ~]# docker start pxcnode03
Error response from daemon: driver failed programming external connectivity on endpoint pxcnode03 (982c64d5b204741d8b0b2c6ee1630756643e75199ad27ced845f011525593c81):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3308 -j DNAT --to-destination 172.18.0.4:3306 ! -i br-a90d3111cc8b: iptables: No chain/target/match by that name.
 (exit status 1))
Error: failed to start containers: pxcnode03
解決辦法:
[root@server01 ~]# systemctl restart docker

啟動叢集報錯
# docker logs pxcnode01

2020-07-28T21:41:01.087855Z 0 [ERROR] WSREP: failed to open gcomm backend connection: 131: No address to connect (FATAL)
     at gcomm/src/gmcast.cpp:connect_precheck():311
2020-07-28T21:41:01.087884Z 0 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():209: Failed to open backend connection: -131 (State not recoverable)
2020-07-28T21:41:01.164568Z 0 [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1514: Failed to open channel 'pxc01' at 'gcomm://pxcnode01': -131 (State not recoverable)
2020-07-28T21:41:01.164614Z 0 [ERROR] WSREP: gcs connect failed: State not recoverable
2020-07-28T21:41:01.164620Z 0 [ERROR] WSREP: Provider/Node (gcomm://pxcnode01) failed to establish connection with cluster (reason: 7)
2020-07-28T21:41:01.164623Z 0 [ERROR] Aborting

處理辦法:
[root@server01 ~]# docker inspect v1
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/v1/_data",
        "Name": "v1",
        "Options": {},
        "Scope": "local"
    }
]

[root@server01 ~]# cat /var/lib/docker/volumes/v1/_data/grastate.dat 
# GALERA saved state
version: 2.1
uuid:    7751e544-ce81-11ea-9de6-3784633f45d7
seqno:   27
# 由0修改為1
safe_to_bootstrap: 1