單節(jié)點數(shù)據(jù)庫的弊病
單節(jié)點MySQL的性能瓶領(lǐng)頸
2016年春節(jié)微信紅包巨大業(yè)務(wù)量,數(shù)據(jù)庫承受巨大負(fù)載
常見MySQL集群方案
mysql 集群方案介紹,建議使用pxc,因為弱一致性會有問題,比如說a節(jié)點數(shù)據(jù)庫顯示我購買成功,b 節(jié)點數(shù)據(jù)庫顯示沒有成功,這就麻煩了,pxc 方案是在全部節(jié)點都寫入成功之后才會告訴你成功,是可讀可寫雙向同步的,但是replication是單向的,不同節(jié)點的數(shù)據(jù)庫之間都會開放端口進(jìn)行通訊,如果從防火墻的這個端口關(guān)閉,pxc就不會同步成功,也不會返給你成功了。
Replication
PXC (Percona XtraDB Cluster)
建議PXC使用PerconaServer (MySQL改進(jìn)版,性能提升很大)
PXC的數(shù)據(jù)強一致性
同步復(fù)制,事務(wù)在所有集群節(jié)點要么同時提交,要么不提交 Replication采用異步復(fù)制,無法保證數(shù)據(jù)的一致性
PXC集群安裝介紹
在Docker中安裝PXC集群,使用Docker倉庫中的PXC官方鏡像:https://hub.docker.com/r/percona/percona-xtradb-cluster
1、從docker官方倉庫中拉下PXC鏡像:
docker pull percona/percona-xtradb-cluster
或者本地安裝
docker load < /home/soft/pxc.tar.gz
安裝完成:
[root@localhost ~]# docker pull percona/percona-xtradb-cluster Using default tag: latest Trying to pull repository docker.io/percona/percona-xtradb-cluster ... latest: Pulling from docker.io/percona/percona-xtradb-cluster ff144d3c0ab1: Pull complete eafdff1524b5: Pull complete c281665399a2: Pull complete c27d896755b2: Pull complete c43c51f1cccf: Pull complete 6eb96f41c54d: Pull complete 4966940ec632: Pull complete 2bafadcea292: Pull complete 3c2c0e21b695: Pull complete 52a8c2e9228e: Pull complete f3f28eb1ce04: Pull complete d301ece75f56: Pull complete 3d24904bec3c: Pull complete 1053c2982c37: Pull complete Digest: sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd Status: Downloaded newer image for docker.io/percona/percona-xtradb-cluster:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/percona/percona-xtradb-cluster latest 70b3670450ef 2 months ago 408 MB
2、重命名鏡像:(名稱太長,重命名一下)
docker tag percona/percona-xtradb-cluster:latest pxc
然后原來的鏡像就可以刪除掉了
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/percona/percona-xtradb-cluster latest 70b3670450ef 2 months ago 408 MB pxc latest 70b3670450ef 2 months ago 408 MB docker.io/java latest d23bdf5b1b1b 2 years ago 643 MB [root@localhost ~]# docker rmi docker.io/percona/percona-xtradb-cluster Untagged: docker.io/percona/percona-xtradb-cluster:latest Untagged: docker.io/percona/percona-xtradb-cluster@sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE pxc latest 70b3670450ef 2 months ago 408 MB docker.io/java latest d23bdf5b1b1b 2 years ago 643 MB
3、出于安全考慮,給PXC集群創(chuàng)建Docker內(nèi)部網(wǎng)絡(luò)
# 創(chuàng)建網(wǎng)段 docker network create --subnet=172.18.0.0/24 net1 # 查看網(wǎng)段 docker network inspect net1 # 刪除網(wǎng)段 # docker network rm net1
4、創(chuàng)建Docker卷:
使用Docker時,業(yè)務(wù)數(shù)據(jù)應(yīng)保存在宿主機中,采用目錄映射,這樣可以使數(shù)據(jù)與容器獨立。但是容器中的PXC無法直接使用映射目錄,解決辦法是采用Docker卷來映射
# 創(chuàng)建名稱為v1的數(shù)據(jù)卷,--name可以省略 docker volume create --name v1
查看數(shù)據(jù)卷
docker inspect v1
結(jié)果:
[root@localhost ~]# docker inspect v1 [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/v1/_data",#這里是在宿主機的保存位置 "Name": "v1", "Options": {}, "Scope": "local" } ]
刪除數(shù)據(jù)卷
docker volume rm v1
創(chuàng)建5個數(shù)據(jù)卷
# 創(chuàng)建5個數(shù)據(jù)卷 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
5、創(chuàng)建5個PXC容器:
# 創(chuàng)建5個PXC容器構(gòu)成集群 # 第一個節(jié)點 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --name=node1 --network=net1 --ip 172.18.0.2 pxc # 在第一個節(jié)點啟動后要等待一段時間,等候mysql啟動完成。 # 第二個節(jié)點 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 --name=node2 --net=net1 --ip 172.18.0.3 pxc # 第三個節(jié)點 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 --name=node3 --net=net1 --ip 172.18.0.4 pxc # 第四個節(jié)點 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 --name=node4 --net=net1 --ip 172.18.0.5 pxc # 第五個節(jié)點 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 --name=node5 --net=net1 --ip 172.18.0.6 pxc
查看:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f4708ce32209 pxc "/entrypoint.sh " About a minute ago Up About a minute 4567-4568/tcp, 0.0.0.0:3309->3306/tcp node4 bf612f9586bc pxc "/entrypoint.sh " 17 minutes ago Up 17 minutes 4567-4568/tcp, 0.0.0.0:3310->3306/tcp node5 9fdde5e6becd pxc "/entrypoint.sh " 17 minutes ago Up 17 minutes 4567-4568/tcp, 0.0.0.0:3308->3306/tcp node3 edd5794175b6 pxc "/entrypoint.sh " 18 minutes ago Up 18 minutes 4567-4568/tcp, 0.0.0.0:3307->3306/tcp node2 33d842de7f42 pxc "/entrypoint.sh " 21 minutes ago Up 21 minutes 0.0.0.0:3306->3306/tcp, 4567-4568/tcp node1
數(shù)據(jù)庫負(fù)載均衡的必要性
雖然搭建了集群,但是不使用數(shù)據(jù)庫負(fù)載均衡,單節(jié)點處理所有請求,負(fù)載高,性能差
將請求均勻地發(fā)送給集群中的每一個節(jié)點。
負(fù)載均衡中間件對比
負(fù)載均衡首先是數(shù)據(jù)庫的集群,加入5個集群,每次請求都是第一個的話,有可能第一個數(shù)據(jù)庫就掛掉了,所以更優(yōu)的方案是對不同的節(jié)點都進(jìn)行請求,這就需要有中間件進(jìn)行轉(zhuǎn)發(fā),比較好的中間件有nginx,haproxy等,因nginx 支持插件,但是剛剛支持了tcp/ip 協(xié)議,haproxy 是一個老牌的中間轉(zhuǎn)發(fā)件。如果要用haproxy的話,可以從官方下載鏡像,然后呢對鏡像進(jìn)行配置(自己寫好配置文件,因為這個鏡像是沒有配置文件的,配置好之后再運行鏡像的時候進(jìn)行文件夾的映射,配置文件開放3306(數(shù)據(jù)庫請求,然后根據(jù)check心跳檢測訪問不同的數(shù)據(jù)庫,8888 對數(shù)據(jù)庫集群進(jìn)行監(jiān)控))。配置文件里面設(shè)置用戶(用戶在數(shù)據(jù)庫進(jìn)行心跳檢測,判斷哪個數(shù)據(jù)庫節(jié)點是空閑的,然后對空閑的進(jìn)行訪問),還有各種算法(比如輪訓(xùn)),最大連接數(shù),時間等,還有對集群的監(jiān)控。配置文件寫好以后運行這個鏡像,鏡像運行成功后進(jìn)入容器啟動配置文件 。其實haprocy返回的也是一個數(shù)據(jù)庫實例(但是并不存儲任何的數(shù)據(jù),只是轉(zhuǎn)發(fā)請求),這個實例用來check其他節(jié)點。
安裝Haproxy
1、從Docker倉庫拉取haproxy鏡像:https://hub.docker.com/_/haproxy
docker pull haproxy
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/haproxy latest 11fa4d7ff427 11 days ago 72.2 MB
2、創(chuàng)建Haproxy配置文件。供Haproxy容器使用(docker中未生成配置文件,我們需要在宿主機中自己創(chuàng)建配置文件)
配置文件詳情參考:https://www.cnblogs.com/wyt007/p/10829184.html
# 啟動容器時使用目錄映射技術(shù)使容器讀取該配置文件 touch /home/soft/haproxy/haproxy.cfg
haproxy.cfg
# haproxy.cfg global #工作目錄 chroot /usr/local/etc/haproxy #日志文件,使用rsyslog服務(wù)中l(wèi)ocal5日志設(shè)備(/var/log/local5),等級info log 127.0.0.1 local5 info #守護(hù)進(jìn)程運行 daemon defaults log global mode http #日志格式 option httplog #日志中不記錄負(fù)載均衡的心跳檢測記錄 option dontlognull #連接超時(毫秒) timeout connect 5000 #客戶端超時(毫秒) timeout client 50000 #服務(wù)器超時(毫秒) timeout server 50000 #監(jiān)控界面 listen admin_stats #監(jiān)控界面的訪問的IP和端口 bind 0.0.0.0:8888 #訪問協(xié)議 mode http #URI相對地址 stats uri /dbs #統(tǒng)計報告格式 stats realm Global\ statistics #登陸帳戶信息 stats auth admin:abc123456 #數(shù)據(jù)庫負(fù)載均衡 listen proxy-mysql #訪問的IP和端口 bind 0.0.0.0:3306 #網(wǎng)絡(luò)協(xié)議 mode tcp #負(fù)載均衡算法(輪詢算法) #輪詢算法:roundrobin #權(quán)重算法:static-rr #最少連接算法:leastconn #請求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中創(chuàng)建一個沒有權(quán)限的haproxy用戶,密碼為空。Haproxy使用這個賬戶對MySQL數(shù)據(jù)庫心跳檢測 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
3、在數(shù)據(jù)庫集群中創(chuàng)建空密碼、無權(quán)限用戶haproxy,來供Haproxy對MySQL數(shù)據(jù)庫進(jìn)行心跳檢測
create user 'haproxy'@'%' identified by '';
4、創(chuàng)建Haproxy容器(name=h1的原因是為了高可用)
# 這里要加 --privileged docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --net=net1 --ip 172.18.0.7 --privileged haproxy
5、進(jìn)入容器
docker exec -it h1 bash
6、在容器bash中啟動Haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
接下來便可以在瀏覽器中打開Haproxy監(jiān)控界面,端口4001,在配置文件中定義有用戶名admin,密碼abc123456。
我這邊訪問的是http://192.168.63.144:4001/dbs,并且要使用用戶名密碼進(jìn)行登錄(小插曲,使用的是Basic登錄,我的Chrome不知為何被屏蔽了,我最后用的火狐)
這時候我們手動掛掉一個Docker節(jié)點,看一下變化(我們會發(fā)現(xiàn)已經(jīng)顯示掛掉了)
8、Haproxy不存儲數(shù)據(jù),只轉(zhuǎn)發(fā)數(shù)據(jù)??梢栽跀?shù)據(jù)庫中建立Haproxy的連接,端口4002,用戶名和密碼為數(shù)據(jù)庫集群的用戶名和密碼
為什么要采用雙機熱備
單節(jié)點Haproxy不具備高可用,必須要有冗余設(shè)計
雙機就是兩個請求處理程序,比如兩個haproxy,當(dāng)一個掛掉的時候,另外 一個可以頂上。熱備我理解就是keepalive。在haproxy 容器中安裝keepalive。
虛擬IP地址
linux系統(tǒng)可以在一個網(wǎng)卡中定義多個IP地址,把這些地址分配給多個應(yīng)用程序,這些地址就是虛擬IP,Haproxy的雙機熱備方案最關(guān)鍵的技術(shù)就是虛擬IP。
關(guān)鍵就是虛擬ip,定義一個虛擬ip,然后比如兩個haproxy分別安裝keepalive鏡像,因為haproxy是ubuntu系統(tǒng)的,所以安裝用apt-get,keepalive是作用是搶占虛擬ip,搶到的就是主服務(wù)器,沒有搶到的就是備用服務(wù)器,然后兩個keepalive進(jìn)行心跳檢測(就是創(chuàng)建一個用戶到對方那里試探,看是否還活著,mysql的集群之間也是心跳檢測),如果 掛掉搶占ip。所以在啟動keepalive 之前首先要編輯好他的配置文件,怎么搶占,權(quán)重是什么,虛擬ip是什么,創(chuàng)建的用戶交什么。配置完啟動完以后可以ping一下看是否正確,然后將虛擬ip映射到局域網(wǎng)的ip
利用Keepalived實現(xiàn)雙機熱備
Нaproxy雙機熱備方案
Docker中創(chuàng)建兩個Haproxy,并通過Keepalived搶占Docker內(nèi)地虛擬IP
Docker內(nèi)的虛擬IP不能被外網(wǎng),所以需要借助宿主機Keepalived映射成外網(wǎng)可以訪問地虛擬IP
安裝Keepalived
1、進(jìn)入Haproxy容器,安裝Keepalived:
$ docker exec -it h1 bash apt-get update apt-get install keepalived
2、Keepalived配置文件(Keepalived.conf):
Keepalived的配置文件是/etc/keepalived/keepalived.conf
# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER # Keepalived的身份(MASTER主服務(wù)要搶占IP,BACKUP備服務(wù)器不會搶占IP)。 interface eth0 # docker網(wǎng)卡設(shè)備,虛擬IP所在 virtual_router_id 51 # 虛擬路由標(biāo)識,MASTER和BACKUP的虛擬路由標(biāo)識必須一致。從0~255 priority 100 # MASTER權(quán)重要高于BACKUP數(shù)字越大優(yōu)先級越高 advert_int 1 # MASTER和BACKUP節(jié)點同步檢查的時間間隔,單位為秒,主備之間必須一致 authentication { # 主從服務(wù)器驗證方式。主備必須使用相同的密碼才能正常通信 auth_type PASS auth_pass 123456 } virtual_ipaddress { # 虛擬IP。可以設(shè)置多個虛擬IP地址,每行一個 172.18.0.201 } }
3、啟動Keepalived
service keepalived start
啟動成功后,通過ip a可以查看網(wǎng)卡中虛擬IP是否成功,另外可以在宿主機中ping成功虛擬IP172.18.0.201
4、可以按照以上步驟,再另外創(chuàng)建一個Haproxy容器,注意映射的宿主機端口不能重復(fù),Haproxy配置一樣。然后在容器中安裝Keepalived,配置也基本一樣(可以修改優(yōu)先權(quán)重)。這樣便基本實現(xiàn)了Haproxy雙機熱備方案
命令如下:
創(chuàng)建Haproxy容器(name=h2的原因是為了高可用)
# 這里要加 --privileged docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --net=net1 --ip 172.18.0.8 --privileged haproxy
進(jìn)入容器
docker exec -it h2 bash
在容器bash中啟動Haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
接下來便可以在瀏覽器中打開Haproxy監(jiān)控界面,端口4003,在配置文件中定義有用戶名admin,密碼abc123456。
我這邊訪問的是http://192.168.63.144:4003/dbs,并且要使用用戶名密碼進(jìn)行登錄(小插曲,使用的是Basic登錄,我的Chrome不知為何被屏蔽了,我最后用的火狐)
安裝Keepalived:
apt-get update apt-get install keepalived
Keepalived配置文件(Keepalived.conf):
Keepalived的配置文件是/etc/keepalived/keepalived.conf
# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER # Keepalived的身份(MASTER主服務(wù)要搶占IP,BACKUP備服務(wù)器不會搶占IP)。 interface eth0 # docker網(wǎng)卡設(shè)備,虛擬IP所在 virtual_router_id 51 # 虛擬路由標(biāo)識,MASTER和BACKUP的虛擬路由標(biāo)識必須一致。從0~255 priority 100 # MASTER權(quán)重要高于BACKUP數(shù)字越大優(yōu)先級越高 advert_int 1 # MASTER和BACKUP節(jié)點同步檢查的時間間隔,單位為秒,主備之間必須一致 authentication { # 主從服務(wù)器驗證方式。主備必須使用相同的密碼才能正常通信 auth_type PASS auth_pass 123456 } virtual_ipaddress { # 虛擬IP??梢栽O(shè)置多個虛擬IP地址,每行一個 172.18.0.201 } }
啟動Keepalived
service keepalived start
啟動成功后,通過ip a可以查看網(wǎng)卡中虛擬IP是否成功,另外可以在宿主機中ping成功虛擬IP172.18.0.201
實現(xiàn)外網(wǎng)訪問虛擬IP
查看當(dāng)前局域網(wǎng)IP分配情況:
yum install nmap -y nmap -sP 192.168.1.0/24
在宿主機中安裝Keepalived
yum install keepalived
宿主機Keepalived配置如下(/etc/keepalived/keepalived.conf):
vrrp_instance VI_1 { state MASTER #這里是宿主機的網(wǎng)卡,可以通過ip a查看當(dāng)前自己電腦上用的網(wǎng)卡名是哪個 interface ens33 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #這里是指定的一個宿主機上的虛擬ip,一定要和宿主機網(wǎng)卡在同一個網(wǎng)段, #我的宿主機網(wǎng)卡ip是192.168.63.144,所以指定虛擬ip是160 192.168.63.160 } } #接受監(jiān)聽數(shù)據(jù)來源的端口,網(wǎng)頁入口使用 virtual_server 192.168.63.160 8888 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP #把接受到的數(shù)據(jù)轉(zhuǎn)發(fā)給docker服務(wù)的網(wǎng)段及端口,由于是發(fā)給docker服務(wù),所以和docker服務(wù)數(shù)據(jù)要一致 real_server 172.18.0.201 8888 { weight 1 } } #接受數(shù)據(jù)庫數(shù)據(jù)端口,宿主機數(shù)據(jù)庫端口是3306,所以這里也要和宿主機數(shù)據(jù)接受端口一致 virtual_server 192.168.63.160 3306 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP #同理轉(zhuǎn)發(fā)數(shù)據(jù)庫給服務(wù)的端口和ip要求和docker服務(wù)中的數(shù)據(jù)一致 real_server 172.18.0.201 3306 { weight 1 } }
啟動Keepalived服務(wù)
service keepalived start #service keepalived status #service keepalived stop
之后其他電腦便可以通過虛擬IP192.168.63.160的8888和3306端口來訪問宿主機Docker中的172.18.0.201的相應(yīng)端口。
暫停PXC集群的辦法
vi /etc/sysctl.conf #文件中添加net.ipv4.ip_forward=1這個配置 systemctl restart network
然后把虛擬機掛起
熱備份數(shù)據(jù)
冷備份
熱備份
熱備份是在系統(tǒng)運行狀態(tài)下備份數(shù)據(jù)
MySQL常見的熱備份有LVM和XtraBackup兩種方案
XtraBackup
XtraBackup是一款基于InnoDB的在線熱備工具,具有開源免費,支持在線熱備,占用磁盤空間小,能夠非??焖俚貍浞菖c恢復(fù)mysql數(shù)據(jù)庫
全量備份和增量備份
PXC全量備份
備份要在某個PXC節(jié)點的容器內(nèi)進(jìn)行,但應(yīng)該把備份數(shù)據(jù)保存到宿主機內(nèi)。所以采用目錄映射技術(shù)。先新建Docker卷:
docker volume create backup
挑選一個PXC節(jié)點node1,將其容器停止并刪除,然后重新創(chuàng)建一個增加了backup目錄映射的node1容器
docker stop node1 docker rm node1 # 數(shù)據(jù)庫數(shù)據(jù)保存在Docker卷v1中,不會丟失 # 參數(shù)改變: # 1. -e CLUSTER_JOIN=node2;原來其他節(jié)點是通過node1加入集群的,現(xiàn)在node1重新創(chuàng)建,需要選擇一個其他節(jié)點加入集群 # 2. -v backup:/data;將Docker卷backup映射到容器的/data目錄 docker run -d -u root -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --network=net1 --ip 172.18.0.2 --name=node1 pxc
在node1容器中安裝percona-xtrabackup-24
docker exec -it node1 bash apt-get update apt-get install percona-xtrabackup-24
之后便可以執(zhí)行如下命令進(jìn)行全量備份,備份后的數(shù)據(jù)會保存在/data/backup/full
目錄下:
mkdir /data/backup mkdir /data/backup/full #不建議,已過時 innobackupex --backup -u root -p abc123456 --target-dir=/data/backup/full xtrabackup --backup -uroot -pabc123456 --target-dir=/data/backup/full
官方文檔已經(jīng)不推薦使用innobackupex
,而推薦使用xtrabackup
命令
PXC全量還原
數(shù)據(jù)庫可以熱備份,但是不能熱還原,否則會造成業(yè)務(wù)數(shù)據(jù)和還原數(shù)據(jù)的沖突。
對于PXC集群為了避免還原過程中各節(jié)點數(shù)據(jù)同步?jīng)_突的問題,我們要先解散原來的集群,刪除節(jié)點。然后新建節(jié)點空白數(shù)據(jù)庫,執(zhí)行還原,最后再建立起其他集群節(jié)點。
還原前還要將熱備份保存的未提交的事務(wù)回滾,還原之后重啟MySQL
停止并刪除PXC集群所有節(jié)點
docker stop node1 node2 node3 node4 node5 docker rm node1 node2 node3 node4 node5 docker volume rm v1 v2 v3 v4 v5
按照之前的步驟重新創(chuàng)建node1容器,并進(jìn)入容器,執(zhí)行冷還原
# 創(chuàng)建卷 docker volume create v1 # 創(chuàng)建容器 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 --name=node1 --network=net1 --ip 172.18.0.2 pxc # 以root身份進(jìn)入容器 docker exec -it -uroot node1 bash # 刪除數(shù)據(jù) rm -rf /var/lib/mysql/* # 準(zhǔn)備階段 xtrabackup --prepare --target-dir=/data/backup/full/ # 執(zhí)行冷還原 xtrabackup --copy-back --target-dir=/data/backup/full/ # 更改還原后的數(shù)據(jù)庫文件屬主 chown -R mysql:mysql /var/lib/mysql # 退出容器后,重啟容器 docker stop node1 docker start node1
到此這篇關(guān)于Docker部署Mysql集群的實現(xiàn)的文章就介紹到這了,更多相關(guān)Docker部署Mysql集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:烏海 嘉興 齊齊哈爾 亳州 衡陽 運城 澳門 拉薩
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Docker部署Mysql集群的實現(xiàn)》,本文關(guān)鍵詞 Docker,部署,Mysql,集群,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。