docker搭建mysql集群

前言

本文章使用Percona XtraDB Cluster(MySQL改進(jìn)版,性能提升很大)進(jìn)行集群搭建,集群mysql的數(shù)量是5,宿主機(jī)為centos7。

常見(jiàn)集群方案

  • PXC同步復(fù)制,事務(wù)在所有集群節(jié)點(diǎn)要么同時(shí)提交,要么不提交
  • Replication采用異步復(fù)制,無(wú)法保證數(shù)據(jù)的一致性

安裝鏡像

docker pull percona/percona-xtradb-cluster

名字太長(zhǎng)了,對(duì)鏡像進(jìn)行重命名

docker tag percona/percona-xtradb-cluster percona

可以看到執(zhí)行該命令,docker為我們復(fù)制了一份


image.png

創(chuàng)建內(nèi)部網(wǎng)絡(luò)

出于安全考慮,將PXC集群放置于docker內(nèi)部網(wǎng)絡(luò)中。只需將宿主的端口與之映射并開(kāi)放出來(lái)即可。

docker network create --subnet=172.18.0.0/24 net1

說(shuō)明:–subnet=172.18.0.0/24 自定義網(wǎng)段172.18.0.0,24是指24位子網(wǎng)掩碼 net1 網(wǎng)段名稱(chēng)。

創(chuàng)建docker卷

docker容器的運(yùn)行規(guī)則:通過(guò)目錄映射的方法,將業(yè)務(wù)數(shù)據(jù)寫(xiě)入到宿主機(jī)中。好處是如果容器故障,只需將容器刪除,重新啟用一個(gè)容器即可,這樣就不會(huì)丟失原來(lái)的數(shù)據(jù)。重新創(chuàng)建啟動(dòng)一個(gè)新的容器還可以繼續(xù)使用。
由于PXC較為特殊,無(wú)法直接使用映射目錄的方法做映射(使用后會(huì)閃退),故使用docker卷。

創(chuàng)建5個(gè)docker卷

docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5

創(chuàng)建運(yùn)行PXC容器

#第一個(gè)節(jié)點(diǎn)
docker run -d  -p 3306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node1 --net=net1 --ip 172.18.0.2 percona
#第二個(gè)節(jié)點(diǎn)
docker run -d  -p 3307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node2 --net=net1 --ip 172.18.0.3 percona
#第三個(gè)節(jié)點(diǎn)
docker run -d  -p 3308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node3 --net=net1 --ip 172.18.0.4 percona
#第四個(gè)節(jié)點(diǎn)
docker run -d  -p 3309:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node4 --net=net1 --ip 172.18.0.5 percona
#第五個(gè)節(jié)點(diǎn)
docker run -d  -p 3310:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --privileged --name=node5 --net=net1 --ip 172.18.0.6 percona

參數(shù)說(shuō)明:

-d  默認(rèn)在后臺(tái)運(yùn)行
-p  3306(宿主):3306(容器)   端口映射,將容器3306端口映射到宿主3306坤口
-v  目錄映射,將第四步創(chuàng)建的v1映射到容器/var/lib/mysql
-e MYSQL_ROOT_PASSROWD  創(chuàng)建的用戶實(shí)例的密碼,默認(rèn)實(shí)例root
-e CLUSTER_NAME  集群名稱(chēng)
-e XTRABACKUP_PASSWORD  數(shù)據(jù)庫(kù)之間同步使用的密碼
--privileged  權(quán)限.給予最高權(quán)限
--name 給容器容命名
--net 使用內(nèi)部網(wǎng)段
--ip 內(nèi)部網(wǎng)段分到的地址
pxc 指的是鏡像

驗(yàn)證是否創(chuàng)建成功PCX集群

開(kāi)放端口3306-3310

開(kāi)放端口范圍3306至3310
firewall-cmd --permanent --add-port=3306-3310/tcp
查看開(kāi)放端口的列表
firewall-cmd --permanent --list-ports
image.png

在本地用mysql的客戶端連接工具對(duì)五個(gè)幾點(diǎn)進(jìn)行連接,看看是否每個(gè)節(jié)點(diǎn)都成功運(yùn)行。如果成功運(yùn)行,再選任意一個(gè)節(jié)點(diǎn)創(chuàng)建一個(gè)表,然后插入數(shù)據(jù)看其他節(jié)點(diǎn)是否能夠進(jìn)行同步

負(fù)載均衡

使用支持TCP/IP協(xié)議的harpoxy中間件進(jìn)行負(fù)載均衡。

#創(chuàng)建目錄
mkdir /home/soft/haproxy
# 拉取鏡像
docker pull haproxy
# 宿主機(jī)創(chuàng)建配置文件
touch /home/soft/haproxy/haproxy.cfg 
# 創(chuàng)建容器,4001:8888為管理界面的端口
docker run -it -d -p 4001:8888 -p 4000:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy

把下面haproxy.conf配置文件的內(nèi)容添加到宿主機(jī)的haproxy.conf文件里
haproxy.conf 配置文件

global
    #工作目錄
    chroot /usr/local/etc/haproxy
    #日志文件,使用rsyslog服務(wù)中l(wèi)ocal5日志設(shè)備(/var/log/local5),等級(jí)info
    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)控界面的訪問(wèn)的IP和端口
    bind  0.0.0.0:8888
    #訪問(wèn)協(xié)議
    mode        http
    #URI相對(duì)地址
    stats uri   /dbs
    #統(tǒng)計(jì)報(bào)告格式
    stats realm     Global\ statistics
    #登陸帳戶信息
    stats auth  admin:123456
#數(shù)據(jù)庫(kù)負(fù)載均衡
listen  proxy-mysql
    #訪問(wèn)的IP和端口
    bind  0.0.0.0:3306  
    #網(wǎng)絡(luò)協(xié)議
    mode  tcp
    #負(fù)載均衡算法(輪詢(xún)算法)
    #輪詢(xún)算法:roundrobin
    #權(quán)重算法:static-rr
    #最少連接算法:leastconn
    #請(qǐng)求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中創(chuàng)建一個(gè)沒(méi)有權(quán)限的haproxy用戶,密碼為空。Haproxy使用這個(gè)賬戶對(duì)MySQL數(shù)據(jù)庫(kù)心跳檢測(cè)
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 
    server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive檢測(cè)死鏈
    option  tcpka  
# 進(jìn)入容器
docker exec -it h1 bash
# 加載指定配置文件,啟動(dòng)haproxy 
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

執(zhí)行sql語(yǔ)句創(chuàng)建賬戶

# mysql創(chuàng)建賬號(hào)
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
image.png

訪問(wèn)管理界面,輸入用戶名密碼admin 123456(上面haproxy.conf配置的信息)


image.png
image.png

綠色為正常節(jié)點(diǎn),紅色為故障節(jié)點(diǎn),這說(shuō)明你需要做些處理了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容