docker部署mysql8之PXC8.0分布式集群過程
docker部署mysql8之PXC8.0分布式集群
環(huán)境說明
| IP | 主機(jī)名 | 節(jié)點(diǎn) | 服務(wù) | 服務(wù)類型 |
|---|---|---|---|---|
| 192.168.1.1 | host1 | docker swarm-master | PXC1 | 第一節(jié)點(diǎn)(默認(rèn)為master節(jié)點(diǎn)) |
| 192.168.1.2 | host2 | docker swarm-worker1 | PXC2 | 第二節(jié)點(diǎn) |
| 192.168.1.3 | host3 | docker swarm-worker2 | PXC3 | 第三節(jié)點(diǎn) |
1.創(chuàng)建docker swarm集群
部署集群依賴一個(gè)overlay網(wǎng)絡(luò),實(shí)現(xiàn)PXC服務(wù)之間跨節(jié)點(diǎn)通過主機(jī)名通訊,這里直接部署docker swarm,使用docker swarm自帶的overlay網(wǎng)絡(luò)來完成部署。
1.1 yum安裝docker
三臺(tái)主機(jī)都需要安裝一下
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
yum -y install docker-ce
systemctl enable docker && systemctl start docker 1.2 docker swarm集群部署
1.swarm-master上執(zhí)行如命令創(chuàng)建 swarm:docker swarm init --advertise-addr {master主機(jī)IP}
[root@host1 ~]# docker swarm init --advertise-addr 192.168.1.1
Swarm initialized: current node (l2wbku2vxecmbz8cz94ewjw6d) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-27aqwb4w55kfkcjhwwt1dv0tdf106twja2gu92g6rr9j22bz74-2ld61yjb69uokj3kiwvpfo2il 192.168.1.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@host1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
l2wbku2vxecmbz8cz94ewjw6d * host1 Ready Active Leader 19.03.3
注:如果當(dāng)時(shí)沒有記錄下 docker swarm init 提示的添加 worker 的完整命令,可以通過 docker swarm join-token worker 查看。2.復(fù)制前面的 docker swarm join 命令,在 swarm-worker1 和 swarm-worker2 上執(zhí)行,將它們添加到 swarm 中。
命令輸出如下:
[root@host2 ~]# docker swarm join --token SWMTKN-1-27aqwb4w55kfkcjhwwt1dv0tdf106twja2gu92g6rr9j22bz74-2ld61yjb69uokj3kiwvpfo2il 192.168.1.1:2377
This node joined a swarm as a worker.
[root@host3 ~]# docker swarm join --token SWMTKN-1-27aqwb4w55kfkcjhwwt1dv0tdf106twja2gu92g6rr9j22bz74-2ld61yjb69uokj3kiwvpfo2il 192.168.1.1:2377
This node joined a swarm as a worker.3.swarm-master上docker node ls 可以看到兩個(gè) worker node 已經(jīng)添加進(jìn)來了。
[root@host1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ju6g4tkd8vxgnrw5zvmwmlevw host2 Ready Active 19.03.3
asrqc03tcl4bvxzdxgfs5h60q host3 Ready Active 19.03.3
l2wbku2vxecmbz8cz94ewjw6d * host1 Ready Active Leader 19.03.32.部署PXC集群
2.1 創(chuàng)建ca證書
swarm-master上執(zhí)行以下命令:
1. mkdir -p /data/ssl && cd /data/ssl && openssl genrsa 2048 > ca-key.pem
2. openssl req -new -x509 -nodes -days 3600 \
-key ca-key.pem -out ca.pem
3. openssl req -newkey rsa:2048 -days 3600 \
-nodes -keyout server-key.pem -out server-req.pem
4. openssl rsa -in server-key.pem -out server-key.pem
5. openssl x509 -req -in server-req.pem -days 3600 \
-CA ca.pem -CAkey ca-key.pem -set_serial 01 \
-out server-cert.pem
6. openssl req -newkey rsa:2048 -days 3600 \
-nodes -keyout client-key.pem -out client-req.pem
7. openssl rsa -in client-key.pem -out client-key.pem
8. openssl x509 -req -in client-req.pem -days 3600 \
-CA ca.pem -CAkey ca-key.pem -set_serial 01 \
-out client-cert.pem
9. openssl verify -CAfile ca.pem server-cert.pem client-cert.pem (出現(xiàn)兩個(gè)OK即可)
server-cert.pem: OK
client-cert.pem: OK問題:第9步報(bào)錯(cuò)為error 18 at 0 depth lookup:self signed certificate
解決方案:當(dāng)你在創(chuàng)建ca.csr, server.csr, client.csr時(shí) 要求你填寫的 Common Name。
ca.csr 的common name 不能和server.csr, client.csr填的相同
將目錄/data/ssl下所有東西拷貝至 swarm-worker1 和 swarm-worker2的相同目錄下
scp * 192.168.1.2:`pwd`/ scp * 192.168.1.3:`pwd`/
2.2 創(chuàng)建cert.cnf文件
三臺(tái)機(jī)器同時(shí)操作:
mkdir -p /data/ssl/cert && vi /data/ssl/cert/cert.cnf [mysqld] skip-name-resolve ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem [client] ssl-ca = /cert/ca.pem ssl-cert = /cert/client-cert.pem ssl-key = /cert/client-key.pem [sst] encrypt = 4 ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem
2.3 創(chuàng)建docker overlay網(wǎng)絡(luò)
swarm-master上執(zhí)行以下命令:
docker network create -d overlay --attachable swarm_mysql
2.4 創(chuàng)建容器
- 2.4.1 初始化集群,創(chuàng)建第一個(gè)節(jié)點(diǎn)
swarm-master上執(zhí)行以下命令:
docker network create -d overlay --attachable swarm_mysql docker run -d --name=pn1 \ --net=swarm_mysql \ --restart=always \ -p 9001:3306 \ --privileged \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=mT123456 \ -e CLUSTER_NAME=PXC1 \ -v /data/ssl:/cert \ -v mysql:/var/lib/mysql/ \ -v /data/ssl/cert:/etc/percona-xtradb-cluster.conf.d \ percona/percona-xtradb-cluster:8.0
- 2.4.2 創(chuàng)建第二個(gè)節(jié)點(diǎn)
swarm-worker1 執(zhí)行一下命令:
docker run -d --name=pn2 \ --net=swarm_mysql \ --restart=always \ -p 9001:3306 \ --privileged \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=mT123456 \ -e CLUSTER_NAME=PXC1 \ -e CLUSTER_JOIN=pn1 \ -v /data/ssl:/cert \ -v mysql:/var/lib/mysql/ \ -v /data/ssl/cert:/etc/percona-xtradb-cluster.conf.d \ percona/percona-xtradb-cluster:8.0
- 2.4.3 創(chuàng)建第三個(gè)節(jié)點(diǎn)
swarm-worker2執(zhí)行一下命令:
docker run -d --name=pn3 \ --net=swarm_mysql \ --restart=always \ -p 9001:3306 \ --privileged \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=mT123456 \ -e CLUSTER_NAME=PXC1 \ -e CLUSTER_JOIN=pn1 \ -v /data/ssl:/cert \ -v mysql:/var/lib/mysql/ \ -v /data/ssl/cert:/etc/percona-xtradb-cluster.conf.d \ percona/percona-xtradb-cluster:8.0
- 2.4.4 檢查集群的狀態(tài)
swarm-master上執(zhí)行一下命令,檢查集群的狀態(tài) docker exec -it pn1 /usr/bin/mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 Server version: 8.0.25-15.1 Percona XtraDB Cluster (GPL), Release rel15, Revision 8638bb0, WSREP version 26.4.3 Copyright (c) 2009-2021 Percona LLC and/or its affiliates Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. You are enforcing ssl connection via unix socket. Please consider switching ssl off as it does not make connection via unix socket any more secure. mysql> show status like 'wsrep%'; +------------------------------+-------------------------------------------------+ | Variable_name | Value | +------------------------------+-------------------------------------------------+ | wsrep_local_state_uuid | 625318e2-9e1c-11e7-9d07-aee70d98d8ac | ... | wsrep_local_state_comment為Synced, | ... | wsrep_incoming_addresses | ce9ffe81e7cb:3306,89ba74cac488:3306,0e35f30ba764:3306 | ... | wsrep_cluster_conf_id | 3 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | 625318e2-9e1c-11e7-9d07-aee70d98d8ac | | wsrep_cluster_status | Primary | | wsrep_connected | ON | ... | wsrep_ready | ON | +------------------------------+-------------------------------------------------+ 59 rows in set (0.02 sec) #wsrep_local_state_comment為Synced,wsrep_incoming_addresses為三個(gè),wsrep_connected狀態(tài)為ON, wsrep_ready為ON即為正常
2.5 高可用測(cè)試
- 2.5.1 非master重啟
當(dāng)pn1(master)正常運(yùn)行的時(shí)候,pn2,pn3模擬重啟沒問題,測(cè)試步驟省略,主要測(cè)試重啟后所有節(jié)點(diǎn)能否正常同步數(shù)據(jù)
docker restart pn2 或者 docker restart pn3
- 2.5.2 master節(jié)點(diǎn)重啟
docker restart pn1
重啟pn1(master)主節(jié)點(diǎn)模擬重啟后,無法正常啟動(dòng),需要以成員方式重加集群,重建命令如下:
docker run -d --name=pn1 \ --net=swarm_mysql \ --restart=always \ -p 9001:3306 \ --privileged \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=mT123456 \ -e CLUSTER_NAME=PXC1 \ -e CLUSTER_JOIN=pn2 \ -v /data/ssl:/cert \ -v mysql:/var/lib/mysql/ \ -v /data/ssl/cert:/etc/percona-xtradb-cluster.conf.d \ percona/percona-xtradb-cluster:8.0
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker 私有倉(cāng)庫(kù)恢復(fù)實(shí)例詳解
這篇文章主要介紹了Docker 私有倉(cāng)庫(kù)恢復(fù)實(shí)例詳解的相關(guān)資料,這里提供了詳細(xì)的實(shí)現(xiàn)步驟,及注意事項(xiàng),完成docker私有倉(cāng)庫(kù)的恢復(fù),需要的朋友可以參考下2016-11-11
Docker搭建Minio容器的流程步驟(完整詳細(xì)版)
Minio 是一個(gè)基于Apache License v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù),雖然輕量,卻擁有著不錯(cuò)的性能,它兼容亞馬遜S3云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),本文將給大家介紹Docker搭建Minio容器的流程步驟,需要的朋友可以參考下2024-08-08
docker部署mysql 實(shí)現(xiàn)遠(yuǎn)程連接的示例代碼
這篇文章主要介紹了docker部署mysql 實(shí)現(xiàn)遠(yuǎn)程連接的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Armbian5.9.0安裝docker及部署可視化portainer的詳細(xì)教程
這篇文章主要介紹了Armbian5.9.0安裝docker及部署可視化portainer的詳細(xì)教程,通過?ssh?進(jìn)去?Armbian?系統(tǒng)后,輸入相應(yīng)代碼,按提示輸入y,等待安裝完成即可,需要的朋友可以參考下2022-05-05
Jenkins構(gòu)建Docker鏡像并推送至Harbor倉(cāng)庫(kù)的實(shí)現(xiàn)
本文主要介紹了Jenkins構(gòu)建Docker鏡像并推送至Harbor倉(cāng)庫(kù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
使用非root用戶安裝及啟動(dòng)docker的問題(rootless模式運(yùn)行)
docker是使用--userns-remap容器用戶映射宿主機(jī)用戶的方式來解決問題,用戶和組的映射由兩個(gè)配置文件來控制,分別是/etc/subuid和/etc/subgid,本文給大家介紹非root用戶啟動(dòng)docker的問題,感興趣的朋友一起看看吧2022-05-05

