mysql集群重启报错lock_CentOS7.2 下 MySQL 之 PXC 集群部署【Docker+单机多节点】
背景
【注意】: 鄙人認(rèn)為本篇適合做入門測(cè)試/學(xué)習(xí)之用,選擇的 "單機(jī)多節(jié)點(diǎn)配置",后面再整理 "多機(jī)配置"文章.
近期正突擊學(xué)習(xí)數(shù)據(jù)庫(kù)知識(shí)
想著對(duì) PXC 集群部署實(shí)際操作一番,提高技能點(diǎn),為后續(xù)的升職加薪做充足的準(zhǔn)備
于是,在此記錄一下,
既能作為采坑筆記,又能幫助到后期有需要的道友,歡迎指摘 …
【注】:Percona XtraDB Cluster(簡(jiǎn)稱 PXC 集群)
PXC的優(yōu)缺點(diǎn)
PXC 最大的優(yōu)勢(shì):強(qiáng)一致性、無同步延遲, 推薦閱讀: 【Docker 部署 Mysql集群】
MySQL 常見集群方案 【Replication vs PXC】
環(huán)境
CentOS版本: CentOS Linux release 7.9.2009 (Core)
MySQL 版本: 5.7.32
PXC 版本 : percona/percona-xtradb-cluster:5.7
其實(shí),一開始,鄙人也是計(jì)劃直接操作多機(jī)部署經(jīng)驗(yàn),基本百度出來的都是這一類的,只好先摸索一番吧 …
前期準(zhǔn)備
1). 開啟四個(gè) PXC 環(huán)境所涉及的端口:
3306:# mysql 實(shí)例端口
4567:# PXC cluster 相互通訊的端口
4444:# 用于 SST(State Snapshot Transfer): 全量傳輸
4568:# 用于 IST(Incremental state Transfer):增量傳輸傳送
以鄙人使用寶塔面板操作為例,注意以上端口的開啟:
2). 部署前建議關(guān)閉 SELINUX、將 MySQL 數(shù)據(jù)庫(kù)服務(wù)停止
安全增強(qiáng)型 Linux(Security-Enhanced Linux)SELinux 主要由美國(guó)國(guó)家安全局開發(fā)
一種方法【薦】,永久關(guān)閉 Selinux:
"vi /etc/selinux/config" 把 "SELINUX" 屬性值設(shè)置成 disabled,然后 reboot 重啟
另一種方法,或者執(zhí)行命令 Linux 臨時(shí)關(guān)閉 Selinux: "setenforce 0"
3). 安裝 "docker"
因?yàn)?#xff0c;PXC 官方提供了 Docker 鏡像,所以我們可以很方便的搭建 PXC 集群
所以,如果沒有安裝 "docker",需要先執(zhí)行命令: yum install docker
搭建 PXC 集群
1). 下載 PXC 鏡像 (可以指定版本)
Docker 倉(cāng)庫(kù)中的 PXC 官方鏡像:https://hub.docker.com/r/percona/percona-xtradb-cluster
因?yàn)槲宜褂玫?MySQL 版本為 5.7.32,此處對(duì)應(yīng)選擇的 PXC 版本就是 5.7
docker pull percona/percona-xtradb-cluster:5.7
[root@localhost download]# docker pull percona/percona-xtradb-cluster:5.7
Trying to pull repository docker.io/percona/percona-xtradb-cluster ...
5.7: Pulling from docker.io/percona/percona-xtradb-cluster
75f829a71a1c: Already exists
cf0efe55f10d: Already exists
e632c0ccd2fb: Already exists
4c86e21499a1: Already exists
32a8cd67d865: Already exists
3672a73f6188: Already exists
6c6c92c55055: Already exists
cd786bd32ef1: Pull complete
8236bd03304c: Pull complete
bd59b303b228: Pull complete
c574c241c2a3: Pull complete
030daf9905bb: Pull complete
Digest: sha256:d95cfa86d2dca1a2c62c05e53050fd569512bf4b78d867b0e5f8f234d7f3999a
Status: Downloaded newer image for docker.io/percona/percona-xtradb-cluster:5.7
[root@localhost download]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/percona/percona-xtradb-cluster 5.7 3a0dc027d8ac 2 months ago 442 MB
重命名鏡像名稱 (名稱太長(zhǎng),重命名一下)
docker tag percona/percona-xtradb-cluster:5.7 pxc
刪除原始鏡像
docker rmi percona/percona-xtradb-cluster:5.7
2). 創(chuàng)建 Docker 網(wǎng)絡(luò),
出于安全考慮,給 PXC 集群創(chuàng)建 Docker 內(nèi)部網(wǎng)絡(luò),用于 PXC 集群獨(dú)立使用
docker network create --subnet=172.20.0.0/16 pxc-network-mT
【拓展】:
查看網(wǎng)段: docker network inspect pxc-network-mT
所有網(wǎng)段: docker network ls
刪除網(wǎng)段: docker network rm pxc-network-mT
3). 創(chuàng)建數(shù)據(jù)卷 (用于之后掛載)
使用 Docker 時(shí),業(yè)務(wù)數(shù)據(jù)應(yīng)保存在宿主機(jī)中,采用目錄映射,這樣可以使數(shù)據(jù)與容器獨(dú)立。
但是容器中的 PXC 無法直接使用映射目錄,解決辦法是采用 Docker 卷 來映射
本文以最常用的三個(gè)節(jié)點(diǎn)作為配置,所以就可以創(chuàng)建三個(gè)數(shù)據(jù)卷
[root@localhost ~]# docker volume create vMZ1
vMZ1
[root@localhost ~]# docker volume create vMZ2
vMZ2
[root@localhost ~]# docker volume create vMZ3
vMZ3
【拓展】: 刪除數(shù)據(jù)卷命令為: docker volume rm vMZ1 (最后一項(xiàng)為數(shù)據(jù)卷名稱,可自定義)
查看數(shù)據(jù)卷
[root@localhost download]# docker inspect vMZ1
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/vMZ1/_data", # 這里是在宿主機(jī)的保存位置
"Name": "vMZ1",
"Options": {},
"Scope": "local"
}
]
4). 創(chuàng)建節(jié)點(diǎn)(PXC 容器)
注意:在這一步之前,要把 MySQL 數(shù)據(jù)庫(kù)停止服務(wù) !
[root@localhost ~]# service mysqld status
SUCCESS! MySQL running (1992)
[root@localhost ~]# service mysqld stop
Shutting down MySQL.. SUCCESS!
A. 創(chuàng)建第一個(gè)節(jié)點(diǎn)
執(zhí)行命令(對(duì)于參數(shù)釋義,請(qǐng)移步 【附錄 - a】 ):
docker run -di --name=node1 --net=pxc-network-mT -p 9000:3306 -v vMZ1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=mT123456 -e CLUSTER_NAME=cluster-mT -e XTRABACKUP_PASSWORD=mT123456 --ip 172.20.0.2 pxc
因?yàn)楹罄m(xù)節(jié)點(diǎn)的添加需要關(guān)聯(lián)到第一個(gè)節(jié)點(diǎn),
所以,此時(shí)需要等待數(shù)據(jù)庫(kù)啟動(dòng)完成 【自動(dòng)執(zhí)行,正常情況下會(huì)發(fā)現(xiàn) mySQL 服務(wù)啟動(dòng)了!】
通過查看日志
docker logs node1
如果出現(xiàn)下面的輸出,證明啟動(dòng)成功;
"2021-01-08T10:00:17.143767Z 0 [Note] InnoDB: Buffer pool(s) load completed at 210108 10:00:17"
【拓展】:
如果發(fā)現(xiàn)啟動(dòng)有誤,建議先將容器停止,不然 mysqld 服務(wù)各種報(bào)錯(cuò)
刪除節(jié)點(diǎn)命令為: docker rm node1
停止節(jié)點(diǎn)運(yùn)行:docker stop node1
查看所有節(jié)點(diǎn):docker ps
此時(shí),可以通過 Navicat 等數(shù)據(jù)庫(kù)連接工具測(cè)試是否能夠連接 【前提:9000 端口開放】
也可以同過命令 :docker ps,查看已創(chuàng)建的節(jié)點(diǎn)
B. 加入第二個(gè)/第三個(gè)…節(jié)點(diǎn)
只有主節(jié)點(diǎn)可以訪問了,才能創(chuàng)建從節(jié)點(diǎn)
加入第二個(gè)節(jié)點(diǎn),執(zhí)行命令:
docker run -di --name=node2 --net=pxc-network-mT -p 9001:3306 -v vMZ2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=mT123456 -e CLUSTER_NAME=cluster-mT -e XTRABACKUP_PASSWORD=mT123456 -e CLUSTER_JOIN=node1 --ip 172.20.0.3 pxc
需要注意是: 第二個(gè)節(jié)點(diǎn)開始需要增加 -e CLUSTER_JOIN=node1 參數(shù)
表示與 node1 節(jié)點(diǎn)同步,否則 node2容器會(huì)自動(dòng)關(guān)閉
當(dāng) PXC 集群中存在兩個(gè)節(jié)點(diǎn)以上之后就沒有主節(jié)點(diǎn)的概念了。集群中最后一個(gè)退出的節(jié)點(diǎn)就會(huì)變?yōu)橹鞴?jié)點(diǎn)
加入第三個(gè)節(jié)點(diǎn),執(zhí)行命令:
docker run -di --name=node3 --net=pxc-network-mT -p 9002:3306 -v vMZ3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=mT123456 -e CLUSTER_NAME=cluster-mT -e XTRABACKUP_PASSWORD=mT123456 -e CLUSTER_JOIN=node1 --ip 172.20.0.4 pxc
查看掛載情況
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db0a01e25a4d pxc "/entrypoint.sh my..." 5 seconds ago Up 4 seconds 4567-4568/tcp, 0.0.0.0:9002->3306/tcp node3
501d6b015853 pxc "/entrypoint.sh my..." 6 minutes ago Up 6 minutes 4567-4568/tcp, 0.0.0.0:9001->3306/tcp node2
079cfbecc5b0 pxc "/entrypoint.sh my..." 27 minutes ago Up 27 minutes 4567-4568/tcp, 0.0.0.0:9000->3306/tcp node1
[root@localhost ~]#
進(jìn)入 node1 節(jié)點(diǎn)
docker exec -it node1 /usr/bin/mysql -uroot -pmT123456
查看狀態(tài)
mysql> show status like 'wsrep%';
可以看到 "wsrep_incoming_addresses" 的值就是我們?nèi)齻€(gè)容器的IP地址
" wsrep_incoming_addresses | db0a01e25a4d:3306,501d6b015853:3306,079cfbecc5b0:3306 "
5). 集群同步驗(yàn)證
最直接的方式就是操作數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)比對(duì)
為了操作方便,我直接使用 Navicat 客戶端,分別使用端口 "9000、9001、9002" 連接
然后,在節(jié)點(diǎn) node2 上,創(chuàng)建數(shù)據(jù)庫(kù) test_pxc,以及表 test-pxc
隨便更改數(shù)據(jù),會(huì)發(fā)現(xiàn),其他節(jié)點(diǎn)的數(shù)據(jù)也是同步變化的
初步探索到這吧,后面再做多機(jī)部署的測(cè)試、整理 …
宕機(jī)操作
對(duì)于節(jié)點(diǎn)的停止操作,分第一個(gè)節(jié)點(diǎn)和其他節(jié)點(diǎn),是不同的!
1). 如果 【node1】 節(jié)點(diǎn)不是最后一個(gè)離開集群
如果 【node1】 節(jié)點(diǎn)不是最后一個(gè)離開集群的不能再以主節(jié)點(diǎn)的形式啟動(dòng)了
此時(shí),只運(yùn)行 "docker start node1" 命令,過會(huì)會(huì)發(fā)現(xiàn) 【node1】沒有啟動(dòng)
這時(shí),需要通過 "docker volume inspect vMZ1",進(jìn)入數(shù)據(jù)卷目錄,查看是否存在 grastate.dat文件
將 "safe_to_bootstrap" 參數(shù)值修改為 1,保存退出
然后再進(jìn)入 【node1】節(jié)點(diǎn)中查看數(shù)據(jù)
試著修改一下,看是否和其他節(jié)點(diǎn)數(shù)據(jù)同步
我發(fā)現(xiàn)我這里時(shí)可以同步的
但根據(jù)網(wǎng)友經(jīng)驗(yàn)多數(shù)是不會(huì)同步的
此時(shí),可以 刪除 【node1】容器 : docker stop node1、docker rm node1
然后再以從節(jié)點(diǎn)方式加入集群,注意參數(shù) "-e CLUSTER_JOIN=node3" 的指定(此時(shí)是【node3】未停止)
后面再檢查數(shù)據(jù)是否能同步 !
2). 如果其他以指定主節(jié)點(diǎn)形式的節(jié)點(diǎn)離開集群后
可以通過命令:docker start node2(形如), 進(jìn)入 PXC 集群創(chuàng)建的容器
然后,通過 docker ps 查看是否進(jìn)入成功
附錄
a. 創(chuàng)建節(jié)點(diǎn)參數(shù)解釋
–name=node1 :容器名稱
–net=pxc-network-mT:加入到 pxc-network-mT 的虛擬網(wǎng)絡(luò)
-p 9000:3306:隨機(jī)端口映射,容器內(nèi)部端口9000隨機(jī)映射到主機(jī) mySQL 數(shù)據(jù)庫(kù)的 3306 端口
-v vMZ1:/var/lib/mysql:數(shù)據(jù)卷掛載在 "vMZ1" 數(shù)據(jù)卷。可以理解為虛擬的磁盤,容器在保存數(shù)據(jù)的時(shí)候往 /var/lib/mysql 路徑保存數(shù)據(jù),其實(shí)就是把數(shù)據(jù)包存在數(shù)據(jù)卷上了
–privileged:表示有讀寫權(quán)限
-e MYSQL_ROOT_PASSWORD=mT123456 :Mysql 的 root 密碼 (跟原來數(shù)據(jù)庫(kù)設(shè)定的 root 密碼沒關(guān)系)
-e CLUSTER_NAME=cluster-mT:PXC 集群名稱 (注意不要命為:PXC)
-e XTRABACKUP_PASSWORD=mT123456 :PXC 集群之間數(shù)據(jù)同步的密碼
-e CLUSTER_JOIN=node1 :表示與 node1 節(jié)點(diǎn)同步
pxc:來自哪個(gè)鏡像創(chuàng)建
b. 數(shù)據(jù)卷操作指令
查看當(dāng)前存在的數(shù)據(jù)卷
docker volume ls
創(chuàng)建一個(gè)的數(shù)據(jù)卷 ,name:數(shù)據(jù)卷名稱
docker volume create ${name}
刪除某個(gè)數(shù)據(jù)卷,name:數(shù)據(jù)卷名稱
docker volume rm ${name}
查看某個(gè)數(shù)據(jù)卷,name:數(shù)據(jù)卷名稱
docker volume inspect ${name}
c. 文章
d. 報(bào)錯(cuò)排查及解決
1). ERROR! MySQL server PID file could not be found!
基本就是 節(jié)點(diǎn)啟動(dòng)有警告、錯(cuò)誤信息
建議,先退出節(jié)點(diǎn),排查錯(cuò)誤:基本上退出后,就不用報(bào)這個(gè)錯(cuò)咯 …
2). Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
執(zhí)行命令:
systemctl restart docker.service
3). ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
那就刪除這個(gè)文件
第一個(gè)節(jié)點(diǎn)啟動(dòng),報(bào)錯(cuò)
2021-01-07T12:09:53.283195Z 0 [Note] Event Scheduler: Loaded 0 events
2021-01-07T12:09:53.283401Z 0 [Note] mysqld: ready for connections.
Version: '5.7.31-34-57' socket: '/tmp/mysql.sock' port: 3306 Percona XtraDB Cluster (GPL), Release rel34, Revision d76a6e8, WSREP version 31.45, wsrep_31.45
2021-01-07T12:09:53.285952Z 2 [Note] WSREP: Initialized wsrep sidno 2
2021-01-07T12:09:53.285963Z 2 [Note] WSREP: Auto Increment Offset/Increment re-align with cluster membership change (Offset: 1 -> 1) (Increment: 1 -> 1)
2021-01-07T12:09:53.285973Z 2 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
2021-01-07T12:09:53.286017Z 2 [Note] WSREP: Assign initial position for certification: 18, protocol version: 4
2021-01-07T12:09:53.286056Z 0 [Note] WSREP: Service thread queue flushed.
2021-01-07T12:09:53.286093Z 2 [Note] WSREP: GCache history reset: 23f2c29d-50b6-11eb-9f32-1eec49f8ecb5:0 -> 23f2c29d-50b6-11eb-9f32-1eec49f8ecb5:18
2021-01-07T12:09:53.288361Z 2 [Note] WSREP: Synchronized with group, ready for connections
2021-01-07T12:09:53.288374Z 2 [Note] WSREP: Setting wsrep_ready to true
2021-01-07T12:09:53.288377Z 2 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
如果發(fā)現(xiàn)啟動(dòng)有誤,建議先將容器停止,不然 MySQL 服務(wù)各種報(bào)錯(cuò)
[root@localhost ~]# docker stop pn-mT1
pn-mT1
[root@localhost ~]# docker rm pn-mT1
pn-mT1
[root@localhost ~]#
此時(shí),會(huì)注意到 MySQL 服務(wù)自動(dòng)停止
5). transport: x509: certificate has expired or is not yet valid
[root@localhost ~]# yum -y install ntp ntpdate
[root@localhost ~]# ntpdate 0.asia.pool.ntp.org
[root@localhost ~]# hwclock --systohc
[root@localhost ~]# date
2021年 01月 08日 星期五 09:54:23 CST
本文同步分享在 博客“moTzxx”(CSDN)。
如有侵權(quán),請(qǐng)聯(lián)系 support@oschina.cn 刪除。
本文參與“OSC源創(chuàng)計(jì)劃”,歡迎正在閱讀的你也加入,一起分享。
總結(jié)
以上是生活随笔為你收集整理的mysql集群重启报错lock_CentOS7.2 下 MySQL 之 PXC 集群部署【Docker+单机多节点】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10000元投资基金一天能赚多少钱?不同
- 下一篇: 【复习】使用 SQLiteDatabas