MySQL系列-Docker搭建Percona XtraDB Cluster(圖文)
一、部署環(huán)境說明
本文中使用本地VM虛機(jī)部署測(cè)試。
OS:CentOS Linux release 7.6.1810 (Core) 3.10.0-957.el7.x86_64
IP:192.168.168.100
Docker Version:v20.10.6
虛機(jī)配置:2核CPU、4G內(nèi)存
注:①系統(tǒng)為最小化安裝,部署前已完成系統(tǒng)初始化、內(nèi)核及安全優(yōu)化;
②Docker已安裝。
二、Docker部署PXC
Docker鏡像倉庫地址:
https://hub.docker.com/r/percona/percona-xtradb-cluster
Docker部署官方說明文檔:
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/install/docker.html
1.拉取鏡像
- docker pull percona/percona-xtradb-cluster:5.7.33
## 使用 tag 給他打個(gè)標(biāo)簽,方便使用
- docker tag percona/percona-xtradb-cluster:5.7.33 pxc:5.7.33
## 刪除之前的鏡像
- docker rmi -f percona/percona-xtradb-cluster:5.7.33
2.設(shè)置網(wǎng)絡(luò)
## 創(chuàng)建一個(gè)網(wǎng)絡(luò)專門給 pxc 進(jìn)行使用
- docker network create --subnet=10.8.0.0/24 pxc-net
## 查看創(chuàng)建好的網(wǎng)絡(luò)信息
- docker network ls
3.持久化存儲(chǔ)
## 創(chuàng)建三個(gè) volume 給容器使用
- docker volume create --name data1
- docker volume create --name data2
- docker volume create --name data3
## 查看已創(chuàng)建的存儲(chǔ)卷信息
- docker volume ls
## 查看存儲(chǔ)卷詳情
- docker volume inspect data1
4.構(gòu)建容器并形成集群關(guān)系
- ##node1
- docker run -d --restart always -p 3301:3306 \
- -v data1:/var/lib/mysql \
- -e MYSQL_ROOT_PASSWORD=test20210425 \
- -e CLUSTER_NAME=pxc \
- -e XTRABACKUP_PASSWORD=test20210425 \
- --net=pxc-net --privileged \
- --ip 10.8.0.2 --name node1 pxc:5.7.33
- ##node2
- docker run -d --restart always -p 3302:3306 \
- -v data2:/var/lib/mysql \
- -e MYSQL_ROOT_PASSWORD=test20210425 \
- -e CLUSTER_NAME=pxc \
- -e XTRABACKUP_PASSWORD=test20210425 \
- -e CLUSTER_JOIN=node1 \
- --net=pxc-net --privileged \
- --ip 10.8.0.3 --name node2 pxc:5.7.33
- ##node3
- docker run -d --restart always -p 3303:3306 \
- -v data3:/var/lib/mysql \
- -e MYSQL_ROOT_PASSWORD=test20210425 \
- -e CLUSTER_NAME=pxc \
- -e XTRABACKUP_PASSWORD=test20210425 \
- -e CLUSTER_JOIN=node1 \
- --net=pxc-net --privileged \
- --ip 10.8.0.4 --name node3 pxc:5.7.33
## 部分參數(shù)說明
- ①CLUSTER_JOIN:形成集群關(guān)系
- ②MYSQL_ROOT_PASSWORD:用戶root密碼
- ③CLUSTER_NAME:集群名稱
- ④XTRABACKUP_PASSWORD:數(shù)據(jù)備份密碼
- ⑤privileged:指定最高優(yōu)先級(jí)。標(biāo)識(shí)容器內(nèi)的root擁有真正的root權(quán)限,否則root只是一個(gè)普通用戶
- ⑥net:所處網(wǎng)段,pxc-net為創(chuàng)建網(wǎng)段
## 查看容器
- docker ps -a
5.驗(yàn)證
①驗(yàn)證集群是否可用
##訪問MySQL客戶端(任意節(jié)點(diǎn))
- docker exec -it node1 /usr/bin/mysql -uroot -p
- //輸入上述設(shè)置的root密碼登錄MySQL
## 查看wsrep狀態(tài)變量(部分變量截圖)
- show status like 'wsrep%';
- +----------------------------------+-------------------------------------------------------+
- | Variable_name | Value |
- +----------------------------------+-------------------------------------------------------+
- | wsrep_local_state_uuid | f9d0df93-a995-11eb-8057-e2d1b05bbeb4 |
- | wsrep_protocol_version | 9 |
- | wsrep_last_applied | 18 |
- | wsrep_last_committed | 18 |
- | wsrep_replicated | 0 |
- | wsrep_replicated_bytes | 0 |
- | wsrep_repl_keys | 0 |
- | wsrep_repl_keys_bytes | 0 |
- | wsrep_repl_data_bytes | 0 |
- | wsrep_repl_other_bytes | 0 |
- | wsrep_received | 16 |
- | wsrep_received_bytes | 1876 |
- | wsrep_local_commits | 0 |
- | wsrep_local_cert_failures | 0 |
- | wsrep_local_replays | 0 |
- | wsrep_local_send_queue | 0 |
- | wsrep_local_send_queue_max | 1 |
- | wsrep_local_send_queue_min | 0 |
- | wsrep_local_send_queue_avg | 0.000000 |
- | wsrep_local_recv_queue | 0 |
- | wsrep_local_recv_queue_max | 2 |
- | wsrep_local_recv_queue_min | 0 |
- | wsrep_local_recv_queue_avg | 0.187500 |
- | wsrep_local_cached_downto | 0 |
- | wsrep_flow_control_paused_ns | 0 |
- | wsrep_flow_control_paused | 0.000000 |
- | wsrep_flow_control_sent | 0 |
- | wsrep_flow_control_recv | 0 |
- | wsrep_flow_control_interval | [ 173, 173 ] |
- | wsrep_flow_control_interval_low | 173 |
- | wsrep_flow_control_interval_high | 173 |
- | wsrep_flow_control_status | OFF |
- | wsrep_flow_control_active | false |
- | wsrep_flow_control_requested | false |
- | wsrep_cert_deps_distance | 0.000000 |
- | wsrep_apply_oooe | 0.000000 |
- | wsrep_apply_oool | 0.000000 |
- | wsrep_apply_window | 0.000000 |
- | wsrep_commit_oooe | 0.000000 |
- | wsrep_commit_oool | 0.000000 |
- | wsrep_commit_window | 0.000000 |
- | wsrep_local_state | 4 |
- | wsrep_local_state_comment | Synced |
- | wsrep_cert_index_size | 0 |
- | wsrep_cert_bucket_count | 22 |
- | wsrep_gcache_pool_size | 1576 |
- | wsrep_causal_reads | 0 |
- | wsrep_cert_interval | 0.000000 |
- | wsrep_open_transactions | 0 |
- | wsrep_open_connections | 0 |
- | wsrep_ist_receive_status | |
- | wsrep_ist_receive_seqno_start | 0 |
- | wsrep_ist_receive_seqno_current | 0 |
- | wsrep_ist_receive_seqno_end | 0 |
- | wsrep_incoming_addresses | 1d475a8c4011:3306,c315e1e4f978:3306,883260fe6518:3306 |
- | wsrep_cluster_weight | 3 |
- | wsrep_desync_count | 0 |
- | wsrep_evs_delayed | |
- | wsrep_evs_evict_list | |
- | wsrep_evs_repl_latency | 0/0/0/0/0 |
- | wsrep_evs_state | OPERATIONAL |
- | wsrep_gcomm_uuid | 04954080-a996-11eb-bbb9-9319a5bdf715 |
- | wsrep_gmcast_segment | 0 |
- | wsrep_cluster_conf_id | 5 |
- | wsrep_cluster_size | 3 |
- | wsrep_cluster_state_uuid | f9d0df93-a995-11eb-8057-e2d1b05bbeb4 |
- | wsrep_cluster_status | Primary |
- | wsrep_connected | ON |
- | wsrep_local_bf_aborts | 0 |
- | wsrep_local_index | 0 |
- | wsrep_provider_name | Galera |
- | wsrep_provider_vendor | Codership Oy <info@codership.com> |
- | wsrep_provider_version | 3.49(r0ef0d79) |
- | wsrep_ready | ON |
- +----------------------------------+-------------------------------------------------------+
說明:wsrep_ready:狀態(tài)監(jiān)控項(xiàng),可以知道當(dāng)前節(jié)點(diǎn)的狀態(tài)是不是可以撫慰,正常情況下為ON,如果變?yōu)镺FF,則可能是發(fā)生了腦裂,或者和其他節(jié)點(diǎn)之間的網(wǎng)絡(luò)連不上,又或者是galera集群沒有正常啟動(dòng)等;一般可以通過命令set global wsrep_provider_options='pc.bootstrap=yes' 來恢復(fù),不過在執(zhí)行這個(gè)命令之后,需要觀察整個(gè)集群的狀態(tài),不然可能會(huì)導(dǎo)致這個(gè)節(jié)點(diǎn)在邏輯上脫離集群。這個(gè)命令的作用就是讓當(dāng)前節(jié)點(diǎn)變?yōu)閜rimary,如果執(zhí)行了,則說明確定要使用這個(gè)節(jié)點(diǎn)來提供服務(wù)了。
②使用Naticat工具連接進(jìn)行驗(yàn)證
注:構(gòu)建容器時(shí)映射的端口防火墻默認(rèn)已放開。
## 在 node1 中創(chuàng)建一個(gè) test 庫
## 查看 node2 和 node3
可看到數(shù)據(jù)進(jìn)行了同步,至此 pxc 的搭建就完成了。
三、Docker部署HaProxy
搭建好了 pxc 之后,每次訪問的是哪個(gè)數(shù)據(jù)庫,可以通過 haproxy 進(jìn)行路由,類似 nginx,如果 node1 資源不是很多了,可以將請(qǐng)求分發(fā)到 node2 或者 node3 當(dāng)中。
Docker鏡像倉庫地址:
https://hub.docker.com/_/haproxy
1.拉取鏡像
- docker pull haproxy
2.創(chuàng)建配置文件
## 創(chuàng)建haproxy的配置文件,映射到容器中
- mkdir -p /data/haproxy
- vi /data/haproxy/haproxy.cfg
## 在配置文件中輸入以下內(nèi)容
- global
- #工作目錄,這邊要和創(chuàng)建容器指定的目錄對(duì)應(yīng)
- chroot /usr/local/etc/haproxy
- #日志文件
- log 127.0.0.1 local5 info
- #守護(hù)進(jìn)程運(yùn)行
- daemon
- defaults
- log global
- mode http
- #日志格式
- option httplog
- #日志中不記錄負(fù)載均衡的心跳檢測(cè)記錄
- option dontlognull
- #連接超時(shí)(毫秒)
- timeout connect 5000
- #客戶端超時(shí)(毫秒)
- timeout client 50000
- #服務(wù)器超時(shí)(毫秒)
- timeout server 50000
- #監(jiān)控界面
- listen admin_stats
- #監(jiān)控界面的訪問的IP和端口
- bind 0.0.0.0:8888
- #訪問協(xié)議
- mode http
- #URI相對(duì)地址
- stats uri /dbs_monitor
- #統(tǒng)計(jì)報(bào)告格式
- stats realm Global\ statistics
- #登陸帳戶信息
- stats auth admin:admin123456
- #數(shù)據(jù)庫負(fù)載均衡
- listen proxy-mysql
- #訪問的IP和端口,haproxy開發(fā)的端口為3306
- #假如有人訪問haproxy的3306端口,則將請(qǐng)求轉(zhuǎn)發(fā)給下面的數(shù)據(jù)庫實(shí)例
- bind 0.0.0.0:3306
- #網(wǎng)絡(luò)協(xié)議
- mode tcp
- #負(fù)載均衡算法(輪詢算法)
- #輪詢算法:roundrobin
- #權(quán)重算法:static-rr
- #最少連接算法:leastconn
- #請(qǐng)求源IP算法:source
- balance roundrobin
- #日志格式
- option tcplog
- #在MySQL中創(chuàng)建一個(gè)沒有權(quán)限的haproxy用戶,密碼為空。
- #Haproxy使用這個(gè)賬戶對(duì)MySQL數(shù)據(jù)庫心跳檢測(cè)
- option mysql-check user haproxy
- server MySQL_1 10.8.0.2:3306 check weight 1 maxconn 2000
- server MySQL_2 10.8.0.3:3306 check weight 1 maxconn 2000
- server MySQL_3 10.8.0.4:3306 check weight 1 maxconn 2000
- #使用keepalive檢測(cè)死鏈
- option tcpka
3.構(gòu)建容器
- docker run -d --restart always \
- -p 3306:3306 -p 8888:8888 \
- -v /data/haproxy:/usr/local/etc/haproxy \
- --name haproxy01 \
- --net=pxc-net --privileged haproxy
4.查看容器
- docker ps -a |grep haproxy
5.驗(yàn)證
①查看監(jiān)控頁面
瀏覽器訪問
http://host:port/dbs_monitor,本文中為http://192.168.168.100:8888/dbs_monitor,賬號(hào)/密碼:admin/admin123456
## 登錄之后可以發(fā)現(xiàn) MYSQL 幾個(gè)節(jié)點(diǎn)都是DOWN狀態(tài)的,這需要在容器內(nèi)部啟動(dòng)haproxy服務(wù)。
②啟動(dòng)haproxy服務(wù)
## 進(jìn)入haproxy容器內(nèi)啟動(dòng)服務(wù)
- docker exec -it haproxy01 /bin/bash
- haproxy -f /usr/local/etc/haproxy/haproxy.cfg &
③創(chuàng)建haproxy用戶并授權(quán)
## 進(jìn)入任一數(shù)據(jù)庫容器內(nèi)操作(或在Naticat工具端操作)
- docker exec -it node1 /bin/bash
- mysql -uroot -p
- //輸入密碼登錄
- use mysql;
- CREATE USER 'haproxy'@'%' IDENTIFIED BY ''; //空密碼
- flush privileges;
④刷新監(jiān)控頁面
## 刷新頁面后,3個(gè)節(jié)點(diǎn)都是 up 狀態(tài)
## 同時(shí)可以使用3306端口在 navicat 進(jìn)行連接了
## 點(diǎn)擊“測(cè)試連接”
## 連接成功如下圖所示,即可在Navicat工具上進(jìn)行創(chuàng)建\刪除用戶、數(shù)據(jù)庫等其他操作,無需進(jìn)入容器操作。