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,一经查实,立即删除!

相关文章

十二:内存简单介绍和OC的内存管理

一、内存简单介绍 内存结构 1、运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出)。 (2)堆:动态分配内存段。 2、编译器分配 (1)BSS段:…

java上传组件_java上传组件FileUpload

如果表单中有文件要上传,也就是有就需要在form标签中添加enctype"multipart/form-data"属性 如果添加此属性,在操作页面servlet中,用request.getParameter("name")获取普通表单数据就会出错java.lang.NullPointerExcepti…

第九周学习进度

第九周所花时间(包括上课)上课4小时,课后4小时代码量(行)      300博客量1了解到的知识点安卓开发环境的应用、服务器的连接转载于:https://www.cnblogs.com/wangzongze/p/5449535.html

百度推送java_关于百度推送,请教一下大家

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼2015-10-23 14:38:01,734 ERROR [main] - Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.web.servlet.mvc.method.annotation.Requ…

java一般做什么_java开发一般做什么

4java怎么样学习编程的时候,一定要独立思考现在网络很发达,我见很多程序员总爱百度,包括我带的许多人都是这样,一个jdbc这么初级的东东,他们编程几年了,每次用还总是百度查。这个东西应该是熟记于心的&…

echarts饼状图mysql_echarts饼状图位置设置

ReactNative环境配置参考链接 Windows系统安装React Native环境 windows下React Native Android 环境搭建 在Windows下搭建React Native Android开发环境 ...(转载)PHP获取客户端、PHP获取服务器相关信息(转载)http://www.php100.com/html/webkaifa/PHP/PHP/2009/1027/3446.htm…

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(…

java setlocation_Java Point.setLocation方法代碼示例

本文整理匯總了Java中java.awt.Point.setLocation方法的典型用法代碼示例。如果您正苦於以下問題:Java Point.setLocation方法的具體用法?Java Point.setLocation怎麽用?Java Point.setLocation使用的例子?那麽恭喜您, 這裏精選的…

hdu_2089 不要62

数位动态规划 数位动态规划是求解一个大区间[L, R]中间满足条件Q的所有数字的个数(或者和,或其他)的一种方法。它通过分析每一位上的数字,一般用 dp[len][digit][...] 来表示状态“len位长的数字,最高位数字为digi…

java 当天唯一ids_java-为不同的时间字符串接收相同的ZonedDat...

当您调用LocalDate.parse时,您只获得日期部分(日,月和年),而丢弃其余部分. LocalDate没有时间字段(小时,分钟,秒和秒的一部分),因此它们只是被丢弃并丢失.然后,调用atStartOfDay(ZoneId.systemDefault()),它将时间设置为JVM默认时区的午夜.如果要保留所有内容(日期和时间),请将…

Spring的常见问题及答案

目录 Spring 概述依赖注入Spring beansSpring注解Spring数据访问Spring面向切面编程(AOP)Spring MVCSpring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的…

java 打印abcd_用JAVA编程统计字符串ABCD123!@#$%ab中大写字母、小写字母、数字、其它字符的个数并打印出来...

/*** 编程统计字符串"ABCD123!#$%ab"中大写字母、小写字母、数字、其它字符的个数并打 印出来。*/public class Job1Test {public static void main(String[] args) {String str1 new String("ABCD123!#$%ab");System.out.println("字符串&#xff1…

什么是P问题、NP问题和NPC问题

这或许是众多OIer最大的误区之一。你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚N…

java jdbc 登录_java web JDBC 判断用户登录问题!

这是老师给我们讲课时候讲的一个实例!我没明白后来自己做练习没有按照老师的代码走!就是按我的理解敲了一遍最后敲成这样感觉越敲越晕!所以上来求教前辈们!Stringusernamerequest...这是老师给我们讲课时候讲的一个实例 &#xff…

子集生成 --二进制法

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

java正确的代码_对文件名为Test.java的java代码描述正确的是()

选C父类没有无参的构造函数,所以子类需要在自己的构造函数中显式调用父类的构造函数, 添加super("nm"); 否则报错: Implicit super constructorPerson() is undefined. Must explicitly invoke another constructorclass Person {S…

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函数所在区域主要实现生成…