mysql高可用-基於docker容器下的pxc叢集方案
mysql單機效能測試
mysqlslap -h192.168.1.16 -uroot -p123456 -P3306 --concurrency=5000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=5000 --debug-info
關於這個測試命令呢,我簡單講一下幾個關鍵引數
--concurrency=5000 表示啟動5000個執行緒連線資料庫
--iterations=1 測試執行次數
--number-of-queries=5000 總的執行次數
這個mysqlslap是mysql自帶的測試工具,大家可以試一下。
我分別在物理機和虛擬機器上做了兩次測試,物理機在10000的測試下出現了大量的失敗資訊,虛擬機器5000的測試就導致mysql服務掛掉了,已經無法自動回覆!大家可以自行測試,說道這裡,大家肯定不會忘記大學校園網選課或者查成績的時候,基本上都是登入不上去,實際上也驗證了這個問題。
docker 基礎
關於docker的介紹,我這裡不做重點,大家自行查閱相關資料。
docker 安裝也有很多種方式,包括docker映象加速器,我推薦使用阿里雲相關產品,不要問我為什麼,因為我用的很爽!
-
先更新軟體包
yum -y update
-
安裝Docker虛擬機器
yum install -y docker
-
執行、重啟、關閉Docker虛擬機器
service docker start
service docker start
service docker stop
-
搜尋映象
docker search 映象名稱
-
下載映象
docker pull 映象名稱
-
檢視映象
docker images
-
刪除映象
docker rmi 映象名稱
-
執行容器
docker run 啟動引數 映象名稱
-
檢視容器列表
docker ps -a
-
停止、掛起、恢復容器
docker stop 容器ID
docker pause 容器ID
docker unpase 容器ID
-
檢視容器資訊
docker inspect 容器ID
-
刪除容器
docker rm 容器ID
-
資料卷管理
docker volume create 資料卷名稱 #建立資料卷
docker volume rm 資料卷名稱 #刪除資料卷
docker volume inspect 資料卷名稱 #檢視資料卷
-
網路管理
docker network ls 檢視網路資訊
docker network create --subnet=網段 網路名稱
docker network rm 網路名稱
看過上面這些docker 命令,接下來我們就正式開始吧,對了你還需要一臺linux伺服器,這裡我使用的vmware虛擬機器
使用的centos 7.4的映象系統。
在虛擬機器中安裝好docker,練習過上述命名後,我們開始進入下面主要部分。
安裝PXC叢集
-
安裝PXC映象
docker pull percona/percona-xtradb-cluster
-
為PXC映象改名
docker tag percona/percona-xtradb-cluster pxc
-
建立net1網段
docker network create --subnet=172.18.0.0/16 net1
-
建立5個數據卷
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
-
建立備份資料卷(用於熱備份資料)
docker volume create --name backup
-
建立5節點的PXC叢集
注意,每個MySQL容器建立之後,因為要執行PXC的初始化和加入叢集等工作,耐心等待1分鐘左右再用客戶端連線MySQL。另外,必須第1個MySQL節點啟動成功,用MySQL客戶端能連線上之後,再去建立其他MySQL節點。
#建立第1個MySQL節點
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
#建立第2個MySQL節點
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
#建立第3個MySQL節點
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
#建立第4個MySQL節點
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
#建立第5個MySQL節點
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
至此我們的5節點pxc叢集已經搭建完成,大家可以通過navicat等mysql客戶端工具連線。測試在任何一個數據庫節點建立或修改資料,其它節點均會自動同步資料。
5節點pxc叢集已經搭建完畢,實際上我們可以連線任何一個節點操作資料庫,其它節點均會同步該節點資料。
但上述叢集仍然存在問題,假如我們連線的那個節點掛掉了,那麼叢集就不可以用了,因此
僅僅完成以上叢集還是遠遠不夠的,實際後臺應用仍然無法達到高效能高可用的目的。
Haproxy實現負載均衡
關於負載均衡,相信大家都不陌生,例如web應用使用的nginx,這裡我選擇的是老牌的haproxy,至於原因,請大家自行查閱資料。
-
安裝Haproxy映象
docker pull haproxy
-
宿主機上編寫Haproxy配置檔案
vi /home/soft/haproxy.cfg
配置檔案如下:
global
#工作目錄
chroot /usr/local/etc/haproxy
#日誌檔案,使用rsyslog服務中local5日誌裝置(/var/log/local5),等級info
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
#監控介面的訪問的IP和埠
bind 0.0.0.0:8888
#訪問協議
mode http
#URI相對地址
stats uri /dbs
#統計報告格式
stats realm Global\ statistics
#登陸帳戶資訊
stats auth admin:abc123456
#資料庫負載均衡
listen proxy-mysql
#訪問的IP和埠
bind 0.0.0.0:3306
#網路協議
mode tcp
#負載均衡演算法(輪詢演算法)
#輪詢演算法:roundrobin
#權重演算法:static-rr
#最少連線演算法:leastconn
#請求源IP演算法:source
balance roundrobin
#日誌格式
option tcplog
#在MySQL中建立一個沒有許可權的haproxy使用者,密碼為空。Haproxy使用這個賬戶對MySQL資料庫心跳檢測
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檢測死鏈
option tcpka
-
建立兩個Haproxy容器
#建立第1個Haproxy負載均衡伺服器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
#進入h1容器,啟動Haproxy
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
#建立第2個Haproxy負載均衡伺服器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
#進入h2容器,啟動Haproxy
docker exec -it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
到這裡,大家肯定會問,為什麼建立兩個haproxy呀,怎麼用的啊,別急,讓我慢慢講。請看下面!
keepalived實現雙機熱備
-
Haproxy容器內安裝Keepalived,設定虛擬IP
#進入h1容器
docker exec -it h1 bash
#更新軟體包
apt-get update
#安裝VIM
apt-get install vim
#安裝Keepalived
apt-get install keepalived
#編輯Keepalived配置檔案(參考下方配置檔案)
vim /etc/keepalived/keepalived.conf
#啟動Keepalived
service keepalived start
#宿主機執行ping命令
ping 172.18.0.201
配置檔案內容如下:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
#進入h2容器
docker exec -it h2 bash
#更新軟體包
apt-get update
#安裝VIM
apt-get install vim
#安裝Keepalived
apt-get install keepalived
#編輯Keepalived配置檔案
vim /etc/keepalived/keepalived.conf
#啟動Keepalived
service keepalived start
#宿主機執行ping命令
ping 172.18.0.201
配置檔案內容如下:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
-
宿主機安裝Keepalived,實現雙擊熱備
#宿主機執行安裝Keepalived
yum -y install keepalived
#修改Keepalived配置檔案
vi /etc/keepalived/keepalived.conf
#啟動Keepalived
service keepalived start
Keepalived配置檔案如下:
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.99.150
}
}
virtual_server 192.168.99.150 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 192.168.99.150 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
終於搞定了!到這裡,一個5節點的pxc叢集已經實現了真正意義上的高可用。任何一個數據庫節點掛掉,沒有問題,業務任然可以訪問其他資料庫,一個haproxy掛掉,也沒問題,還有另一個提供負載均衡。
結束!
等等,說好的高效能,高可用呢,高效能去哪裡了?補充說明,pxc叢集只能保證節點之間資料同步,而且保證資料一致性,也就是說node1節點中有2000萬條資料,其它節點同樣有這麼多資料,說以高效能無法保證,pxc叢集的效能取決於叢集中效能最差的節點,而不是最好的節點。有沒有既有高效能,又有高可用的解決方案呢?我說有!在哪裡?。。。。
好睏啊,凌晨1點了,睡覺吧,後續我會介紹如何結合mycat達到高效能的目的,以及後端、前端專案的高可用方案。
晚安!
這裡有個很重要的事情忘記講了,pxc叢集停掉之後,直接通過docker start node1 或者任何一個節點是啟動不了的,原因是叢集之前的同步機制造成的,啟動任何一個節點,該節點都會去其它節點同步資料,其它節點仍處於宕機狀態,所以該節點啟動失敗,這也是pxc叢集的強一致性的表現,解決方式是,刪除所有節點docker rm node1 node2 node3 node4 node 5
和資料卷中的grastate.dat檔案
rm -rf /var/lib/docker/volumes/v1/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v2/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v3/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v4/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v5/_data/grastate.dat
重新執行叢集建立的命令即可,因為資料都在資料卷中,所有放心,叢集重新啟動都資料仍然都在.。
對於初學者操作可能不熟練,容易出錯,因此我把docker下載安裝(用的阿里雲的docker-ce),映象加速(阿里雲的 映象加速),網路配置,映象下載,建立資料卷,建立pxc5個節點的命令整理好了指令碼,初學者只需要在centos虛擬機器內執行./deploy-pxc-create.sh指令碼即可等待整個docker環境和後續叢集搭建完畢,直接用mysql客戶端連線使用,測試,十分方便。首次將指令碼檔案放到虛擬機器內,先授權 chmod 777 deploy-pxc-create.sh 之後執行指令碼即可。無需自己安裝docker環境。
-----------來源:CSDN 原文:https://blog.csdn.net/u013218587/article/details/80863054?utm_source=copy