mysql集群重启报错lock_CentOS7.2 下 MySQL 之 PXC 集群部署【Docker+单机多节点】

背景

【注意】: 鄙人认为本篇适合做入门测试/学习之用,选择的 "单机多节点配置",后面再整理 "多机配置"文章.

近期正突击学习数据库知识

想着对 PXC 集群部署实际操作一番,提高技能点,为后续的升职加薪做充足的准备

于是,在此记录一下,

既能作为采坑笔记,又能帮助到后期有需要的道友,欢迎指摘 …

【注】:Percona XtraDB Cluster(简称 PXC 集群)

PXC的优缺点

35d039bb3c240e8f1849da355b0c0483.png

PXC 最大的优势:强一致性、无同步延迟, 推荐阅读: 【Docker 部署 Mysql集群】

MySQL 常见集群方案 【Replication vs PXC】

67731e200b6618c8ee42b23bc97a26c4.png

环境

CentOS版本: CentOS Linux release 7.9.2009 (Core)

MySQL 版本: 5.7.32

PXC 版本 : percona/percona-xtradb-cluster:5.7

其实,一开始,鄙人也是计划直接操作多机部署经验,基本百度出来的都是这一类的,只好先摸索一番吧 …

前期准备

1). 开启四个 PXC 环境所涉及的端口:

3306:# mysql 实例端口

4567:# PXC cluster 相互通讯的端口

4444:# 用于 SST(State Snapshot Transfer): 全量传输

4568:# 用于 IST(Incremental state Transfer):增量传输传送

以鄙人使用宝塔面板操作为例,注意以上端口的开启:

5db740a6669ef4cfa59b8e7338ce0197.png

2). 部署前建议关闭 SELINUX、将 MySQL 数据库服务停止

安全增强型 Linux(Security-Enhanced Linux)SELinux 主要由美国国家安全局开发

一种方法【荐】,永久关闭 Selinux:

"vi /etc/selinux/config" 把 "SELINUX" 属性值设置成 disabled,然后 reboot 重启

另一种方法,或者执行命令 Linux 临时关闭 Selinux: "setenforce 0"

3). 安装 "docker"

因为,PXC 官方提供了 Docker 镜像,所以我们可以很方便的搭建 PXC 集群

所以,如果没有安装 "docker",需要先执行命令: yum install docker

cad8db93522189bcaac9c55a515b3de3.png

搭建 PXC 集群

1). 下载 PXC 镜像 (可以指定版本)

Docker 仓库中的 PXC 官方镜像:https://hub.docker.com/r/percona/percona-xtradb-cluster

因为我所使用的 MySQL 版本为 5.7.32,此处对应选择的 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

重命名镜像名称 (名称太长,重命名一下)

docker tag percona/percona-xtradb-cluster:5.7 pxc

删除原始镜像

docker rmi percona/percona-xtradb-cluster:5.7

a5b2b16a7a503cf0cf06f4c5ba6a2753.png

2). 创建 Docker 网络,

出于安全考虑,给 PXC 集群创建 Docker 内部网络,用于 PXC 集群独立使用

docker network create --subnet=172.20.0.0/16 pxc-network-mT

【拓展】:

查看网段: docker network inspect pxc-network-mT

所有网段: docker network ls

删除网段: docker network rm pxc-network-mT

f1804bd1c4767a9f099885fe25da5751.png

3). 创建数据卷 (用于之后挂载)

使用 Docker 时,业务数据应保存在宿主机中,采用目录映射,这样可以使数据与容器独立。

但是容器中的 PXC 无法直接使用映射目录,解决办法是采用 Docker 卷 来映射

本文以最常用的三个节点作为配置,所以就可以创建三个数据卷

[root@localhost ~]# docker volume create vMZ1

vMZ1

[root@localhost ~]# docker volume create vMZ2

vMZ2

[root@localhost ~]# docker volume create vMZ3

vMZ3

【拓展】: 删除数据卷命令为: docker volume rm vMZ1 (最后一项为数据卷名称,可自定义)

查看数据卷

[root@localhost download]# docker inspect vMZ1

[

{

"Driver": "local",

"Labels": {},

"Mountpoint": "/var/lib/docker/volumes/vMZ1/_data", # 这里是在宿主机的保存位置

"Name": "vMZ1",

"Options": {},

"Scope": "local"

}

]

4). 创建节点(PXC 容器)

注意:在这一步之前,要把 MySQL 数据库停止服务 !

[root@localhost ~]# service mysqld status

SUCCESS! MySQL running (1992)

[root@localhost ~]# service mysqld stop

Shutting down MySQL.. SUCCESS!

A. 创建第一个节点

执行命令(对于参数释义,请移步 【附录 - 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

abe6ffd5f262898bcfead8c545defef2.png

因为后续节点的添加需要关联到第一个节点,

所以,此时需要等待数据库启动完成 【自动执行,正常情况下会发现 mySQL 服务启动了!】

通过查看日志

docker logs node1

如果出现下面的输出,证明启动成功;

"2021-01-08T10:00:17.143767Z 0 [Note] InnoDB: Buffer pool(s) load completed at 210108 10:00:17"

ddadcde88cf7479c31ca45cbeeabeb19.png

【拓展】:

如果发现启动有误,建议先将容器停止,不然 mysqld 服务各种报错

删除节点命令为: docker rm node1

停止节点运行:docker stop node1

查看所有节点:docker ps

此时,可以通过 Navicat 等数据库连接工具测试是否能够连接 【前提:9000 端口开放】

9a8949f94785d9b7db10310fcef67f77.png

也可以同过命令 :docker ps,查看已创建的节点

B. 加入第二个/第三个…节点

只有主节点可以访问了,才能创建从节点

加入第二个节点,执行命令:

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

需要注意是: 第二个节点开始需要增加 -e CLUSTER_JOIN=node1 参数

表示与 node1 节点同步,否则 node2容器会自动关闭

当 PXC 集群中存在两个节点以上之后就没有主节点的概念了。集群中最后一个退出的节点就会变为主节点

加入第三个节点,执行命令:

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 ~]#

进入 node1 节点

docker exec -it node1 /usr/bin/mysql -uroot -pmT123456

查看状态

mysql> show status like 'wsrep%';

可以看到 "wsrep_incoming_addresses" 的值就是我们三个容器的IP地址

" wsrep_incoming_addresses | db0a01e25a4d:3306,501d6b015853:3306,079cfbecc5b0:3306 "

5). 集群同步验证

最直接的方式就是操作数据库,进行数据比对

为了操作方便,我直接使用 Navicat 客户端,分别使用端口 "9000、9001、9002" 连接

然后,在节点 node2 上,创建数据库 test_pxc,以及表 test-pxc

随便更改数据,会发现,其他节点的数据也是同步变化的

9c7bd479051f9eff646db802d5f74b07.png

初步探索到这吧,后面再做多机部署的测试、整理 …

宕机操作

对于节点的停止操作,分第一个节点和其他节点,是不同的!

1). 如果 【node1】 节点不是最后一个离开集群

如果 【node1】 节点不是最后一个离开集群的不能再以主节点的形式启动了

此时,只运行 "docker start node1" 命令,过会会发现 【node1】没有启动

这时,需要通过 "docker volume inspect vMZ1",进入数据卷目录,查看是否存在 grastate.dat文件

1b6ff21de727413a5332dd08a1af31a0.png

将 "safe_to_bootstrap" 参数值修改为 1,保存退出

然后再进入 【node1】节点中查看数据

试着修改一下,看是否和其他节点数据同步

我发现我这里时可以同步的

但根据网友经验多数是不会同步的

此时,可以 删除 【node1】容器 : docker stop node1、docker rm node1

然后再以从节点方式加入集群,注意参数 "-e CLUSTER_JOIN=node3" 的指定(此时是【node3】未停止)

后面再检查数据是否能同步 !

2). 如果其他以指定主节点形式的节点离开集群后

可以通过命令:docker start node2(形如), 进入 PXC 集群创建的容器

然后,通过 docker ps 查看是否进入成功

附录

a. 创建节点参数解释

–name=node1 :容器名称

–net=pxc-network-mT:加入到 pxc-network-mT 的虚拟网络

-p 9000:3306:随机端口映射,容器内部端口9000随机映射到主机 mySQL 数据库的 3306 端口

-v vMZ1:/var/lib/mysql:数据卷挂载在 "vMZ1" 数据卷。可以理解为虚拟的磁盘,容器在保存数据的时候往 /var/lib/mysql 路径保存数据,其实就是把数据包存在数据卷上了

–privileged:表示有读写权限

-e MYSQL_ROOT_PASSWORD=mT123456 :Mysql 的 root 密码 (跟原来数据库设定的 root 密码没关系)

-e CLUSTER_NAME=cluster-mT:PXC 集群名称 (注意不要命为:PXC)

-e XTRABACKUP_PASSWORD=mT123456 :PXC 集群之间数据同步的密码

-e CLUSTER_JOIN=node1 :表示与 node1 节点同步

pxc:来自哪个镜像创建

b. 数据卷操作指令

查看当前存在的数据卷

docker volume ls

创建一个的数据卷 ,name:数据卷名称

docker volume create ${name}

删除某个数据卷,name:数据卷名称

docker volume rm ${name}

查看某个数据卷,name:数据卷名称

docker volume inspect ${name}

c. 文章

d. 报错排查及解决

1). ERROR! MySQL server PID file could not be found!

基本就是 节点启动有警告、错误信息

建议,先退出节点,排查错误:基本上退出后,就不用报这个错咯 …

2). Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

执行命令:

systemctl restart docker.service

3). ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists

那就删除这个文件

第一个节点启动,报错

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.

f5ab9b651859ff281145e999a47b3074.png

如果发现启动有误,建议先将容器停止,不然 MySQL 服务各种报错

[root@localhost ~]# docker stop pn-mT1

pn-mT1

[root@localhost ~]# docker rm pn-mT1

pn-mT1

[root@localhost ~]#

此时,会注意到 MySQL 服务自动停止

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)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fragment销毁时replace和add两个方法的区别

这个首先从一个bug说起,如图: 我们都知道fragment切换有两种方式: 1. replace方式 transaction.replace(R.id.content, IndexFragment); 2. add-hide-show方式 transaction.add(R.id.content, IndexFragment); transaction.hide(…

子集生成 --二进制法

用二进制表示{0,1,2,3...n-1}的子集s;从右往左第i位表示元素i是否在集合s中。图2表示10100110是如何展示了集合{1,2,5,7}的。 注意:为了方便,最右边的为总是对应元素0,而不是元素1; 异或最重要的性质就是开关型---异或…

20150303+JQuery选择器-02

20150303JQuery选择器-02 三、文档处理 插入 删除 复制 替换 包裹 查找 1、插入操作——内部插入 jQuery <div> jQuery hello jQuery</div> l append(content) &#xff1a;将content内容插入到元素的尾部 l appendTo(content) &#xff1a;将匹配到的元素插入到co…

java实现记事本查找_Java实现记事本

首先说明&#xff0c;这是可能本人大学所写的最后一个Java程序了&#xff0c;接下来写C。一直想写这个程序很久了&#xff0c;作为跟计算器类似的经典小程序&#xff0c;写一下还是挺有意义的。本来觉得这程序不难写&#xff0c;其实各个部分综合起来&#xff0c;还是挺麻烦的&…

机器学习 —— 概率图模型(Homework: CRF Learning)

概率图模型的作业越往后变得越来越有趣了。当然&#xff0c;难度也是指数级别的上涨啊&#xff0c;以至于我用了两个周末才完成秋名山神秘车牌的寻找&#xff0c;啊不&#xff0c;CRF模型的训练。 条件随机场是一种强大的PGM&#xff0c;其可以对各种特征进行建模&#xff0c;同…

java生成四则运算表达式_生成四则运算(java实现)

|博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/ ||作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376||作业目标 | 写一个能自动生成小学四则运算题目的程序 ||学号 | 3190704130 |代码如下&#xff1a;//main函数所在区域主要实现生成…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(三)

钓鱼邮件 当攻击者制作了钓鱼网站、木马程序后&#xff0c;便会想法设法将其传给受害者&#xff0c;而常见的传播方式便是钓鱼网站了。安全意识较差的用户在收到钓鱼邮件后点击邮件中的钓鱼链接、下载附件中的木马程序&#xff0c;便可能遭受攻击&#xff01; 工具简介 Swak…

struts2拦截器详解

在之前的文章中&#xff0c;我们已经涉及到了拦截器&#xff08;Interceptor&#xff09;的概念。 downpour 写道拦截器是AOP中的概念&#xff0c;它本身是一段代码&#xff0c;可以通过定义“织入点”&#xff0c;来指定拦截器的代码在“织入点”的前后执行&#xff0c;从而起…

为什么选用 React 创建混合型移动应用?

【编者按】本文作者为 14islands 联合创始人、创新 Web 开发者 David Lindkvist&#xff0c;主要介绍有关混合型应用搭建的方方面面。文章系国内 ITOM 管理平台 OneAPM 编译呈现。 最近&#xff0c;我们有幸与 Fjord 合作&#xff0c;从零开始为其用户打造了一款 HMTL5 混合型应…

python中减法运算函数_OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减...

OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比? ? 前往老猿Python博文目录 ?在《OpenCV-Python图像的加法运算cv2.add函数详解》详细介绍了图像的加法运算&#xff0c;有加法就有减…

数据访问......单条件查询与多条件查询

一. 将数据库数据访问封装成类 <?php class DB {public $host "localhost"; //服务器地址public $uid "root"; //用户名public $pwd "123"; //密码//执行SQL语句,返回相应结果的方法//$sql代表要执行的SQL语句,$type代表…

java集合类分析-hashset

一、 HashSet概述&#xff1a; HashSet实现Set接口&#xff0c;由哈希表&#xff08;实际上是一个HashMap实例&#xff09;支持。它不保证set 的迭代顺序&#xff1b;特别是它不保证该顺序恒久不变。此类允许使用null元素。 二、 HashSet的实现&#xff1a; 对于HashSet而言&…

站立会议 2

这是我们的第二次人员集中&#xff0c;主要是讨论一下接下来的一些工作安排&#xff0c;还有讨论一下在准备过程中出现的一些问题&#xff01; 项目进展&#xff1a; 今天的会议中&#xff0c;我们讨论了我们的项目进展&#xff0c;结果是&#xff1a;我们都已经找到了小球还有…

转为win64后, MS的lib问题

> 正在创建库 C:\Users\Administrator\Desktop\branch-Unicode-156\\Temp\Link\PointCloudMeasure\x64\Debug\PointCloudMeasure.lib 和对象 C:\Users\Administrator\Desktop\branch-Unicode-156\\Temp\Link\PointCloudMeasure\x64\Debug\PointCloudMeasure.exp1>vtkXM…

php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

许多网站都有排行榜的功能&#xff0c;比如球员人气榜单、阅读排行榜&#xff0c;对于一些小网站&#xff0c;通过查数据库就能实现排行榜的功能&#xff0c;但是对于稍微有点用户量而且还是实时排名的网站&#xff0c;使用一些关系型数据库如(MySQL、Oracle)等来实现就有点力不…

iOS 开发疑难杂症(01)

搜了好多博客&#xff0c;技术网站&#xff0c;答案都不统一&#xff0c;今天偶然发现一个解决方案&#xff1a;这个问题一般是重复导入&#xff0c;使用include的问题&#xff0c;不过iOS一般不用include&#xff0c;所以这个不是正解&#xff0c;还有就是预编译文件&#xff…

cJONS序列化工具解读二(数据解析)

cJSON数据解析 关于数据解析部分&#xff0c;其实这个解析就是个自动机&#xff0c;通过递归或者解析栈进行实现数据的解析 /* Utility to jump whitespace and cr/lf *///用于跳过ascii小于32的空白字符 static const char *skip(const char *in) { while (in && *in…

小米范工具系列之二:小米范 web目录扫描器

最新版本1.1&#xff0c;下载地址&#xff1a;http://pan.baidu.com/s/1c1NDSVe 文件名scandir&#xff0c;请使用java1.8运行 小米范web目录扫描器主要功能是探测web可能存在的目录及文件&#xff0c;界面如下&#xff0c;左侧为发现的url&#xff0c;中间为浏览器&#xff0…

php中介者,PHP设计模式 - 中介者模式

【一】模式定义中介者模式(Mediator)就是用一个中介对象来封装一系列的对象交互&#xff0c;中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。对于中介对象而言&#xff0c;所有相互交互的对象&#xff0c;都视…

dedecms模版php,dedecms专题模板怎么用

dedecms专题模板怎么用&#xff1f;DeDeCms的专题相关信息bbs上相对较少&#xff0c;之前查阅了很多资料都未找到其解决方案推荐学习&#xff1a;织梦cms无柰只有靠自己动手丰衣足食&#xff1b;在官方的版本上有这样的一段话&#xff1a;1、文章列表用ID1,ID2,ID3这样形式分开…