背景

最近在进行 MySQL 集群搭建测试的研究中

对于业界主流方案自然不能跳过

在此,整理成完整的文章,希望道友能得到参考价值 …

【注】:Percona XtraDB Cluster(简称 PXC 集群) —— 业界主流的 MySQL 集群方案

★ PXC 集群介绍

PXC 是基于 Galera 协议的高可用集群方案。

可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据强一致性

PXC 最大的优势:强一致性、无同步延迟 (牺牲性能)

环境

CentOS版本: CentOS Linux release 7.9.2009 (Core)

MySQL 版本: 5.7.32

PXC 版本 : percona/percona-xtradb-cluster 最新

前期准备

1). 三台 Vmware 虚拟机

我以三台创建运行的 CentOS7 作为宿主机进行配置操作

虚拟机 ip

角色

192.168.80.221

Docker Swarm 管理节点,Master 节点

192.168.80.222

worker 节点

192.168.80.223

worker 节点

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

3306:# mysql 实例端口

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

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

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

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

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

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

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

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

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

4). 配置 ntp 服务,确保时间同步

[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

5). 创建 Docker Swarm 集群

为了使三台服务器进行连接,如果没有安装 "docker",需要先执行命令: yum install -y docker

【拓展】:

查看 docker 版本: docker -v

判断 docker 是否安装成功:docker

docker 的启动/关闭/重启:service docker start、service docker stop、service docker restart

然后,要在各个服务器中,开放所需的三个端口号

(开放后重启 docker 服务 : service docker restart)

2377:用于集群管理通信的TCP端口

4789:用于容器覆盖网络

7946:用于容器网络发现

firewall-cmd --zone=public --add-port=2377/tcp --permanent

firewall-cmd --zone=public --add-port=4789/tcp --permanent

firewall-cmd --zone=public --add-port=4789/udp --permanent

firewall-cmd --zone=public --add-port=7946/tcp --permanent

firewall-cmd --zone=public --add-port=7946/udp --permanent

firewall-cmd --reload

注意,以上的操作,要对三台虚拟机,全部进行配置哦!!!

选择一台服务器作为管理集群的服务器,此处,我选择的是 【192.168.80.221】

运行命令:docker swarm init

则会得到一个形如下面的管理者口令

[root@localhost /]# docker swarm init

Swarm initialized: current node (g706owlgszx493xhpsb44k9t0) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join \

--token SWMTKN-1-4ea65xsm8xsyhrmn42qg125b10dxtcmt80gnuijnnskddces2n-6fok68mg86nf5lkah1wnnj6ra \

192.168.80.221:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

然后在其他两个虚拟服务器中( 192.168.80.222、192.168.80.223)

在 docker 服务启动的前提下

都要执行上面的口令

查看 swarm 集群的所有节点

只能在管理主机下【192.168.80.221】才能查看

docker node ls

【拓展】:

如果要删除一个节点,执行命令为 :docker node rm -f [节点的ID]

如果要解散 swarm 集群

先再 【manager 节点】上删除 所有 【worker 节点】

再强制删除自己,执行:docker swarm leave -f

最后,还需要在各个 【worker 节点】主机上执行:docker swarm leave

6). 创建 Docker 虚拟网络,

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

此处我自定义的虚拟网络名称为:swarm_mysql

docker network create -d overlay --attachable swarm_mysql

【拓展】:

查看虚拟网络: docker network inspect swarm_mysql

所有虚拟网络: docker network ls

删除虚拟网络: docker network rm swarm_mysql

搭建 PXC 集群

1). 下载 PXC 镜像 (三台主机都要做)

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

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

此处直接安装最新的 PXC 镜像

docker pull percona/percona-xtradb-cluster

建议配置一下加速镜像,请参考 【附录 - a: 配置 docker 加速镜像】

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

docker tag percona/percona-xtradb-cluster pxc

删除原始镜像

docker rmi percona/percona-xtradb-cluster

此时,可以通过命令查看所有的镜像:docker images

2). 创建分布式容器

注意: 第一个启动的 PXC节点是【主节点】,它要初始化 PXC 集群

PXC 启动之后,就没有【主节点】的角色了!此处只是随机选择了【192.168.80.221】,其实任意一个都可以!

鄙人设置的是以 "9001"端口访问 集群,所以记得开启端口(也可以选用 3306 等任意不冲突的端口!)

☞ 创建主节点容器 【192.168.80.221】

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

[root@localhost ~]# service mysqld status

ERROR! MySQL is not running

同时要记住:创建主节点之后,稍等一会儿才能连接(大概一两分钟)

对于各参数的解释,请阅读 【附录 - b). 创建节点参数解释】

docker run -d --name=pn1 --net=swarm_mysql -p 9001:3306 -v pnv1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=mT123456 -e CLUSTER_NAME=PXC1 -e XTRABACKUP_PASSWORD=mT123456 pxc

等待数据库启动完成 【自动执行,正常情况下会发现 MySQL 服务启动了!】

此时,可以查看虚拟网络 : docker network inspect swarm_mysql,会发现,主节点ip成功配置进去了:

【提示】:

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

对节点的其他操作,请阅读 【附录 - c). 节点操作指令】

此时,可以通过 Navicat 等数据库连接工具测试是否能够连接

【提示】:

通过我多次的配置测试发现,【主节点】配置基本不会有多少问题

如果发现无法正常访问,那就查看下节点日志:

docker logs [节点名] (注意其中出现的 "ERROR" 信息)

而从第二个节点开始,基本根据不同的环境多少都会出现一些问题

即便我根据大佬的视频操作,也是不可能一帆风顺!

基本表现为,节点闪退、无法连接

网上大部分经验像是大海捞针

最好的方式就是,根据日志打印出的 "ERROR" 信息,在官网进行排查!!!

注意,排查时,先 stop 节点运行

不然,会出现更多的问题,比如你 MySQL后期直接不能用了 ...

☞ 创建从节点容器

必须主节点可以访问了,才能创建从节点,否则会闪退!

★ 加入第二个节点 【192.168.80.222】

相信,会有很多人在创建第二个节点时就会遇到问题,注意提示,要进行日志的排查: docker logs [节点名]

我的创建节点命令如下:

docker run -d --name=pn2 --net=swarm_mysql -p 9001:3306 -v pnv2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=mT123456 -e CLUSTER_NAME=PXC1 -e XTRABACKUP_PASSWORD=mT123456 -e CLUSTER_JOIN=pn1 pxc

需要注意是:

从第二个节点创建开始,需要增加 "-e CLUSTER_JOIN" 参数,表示与【主节点】容器同步

此处的命令,与创建【主节点】不同的地方,也只有参数 --name(节点名)、-v(数据卷),其他酌情自定义

稍等一两分钟

可以查看节点状态:docker ps -a

此时,可以继续通过 Navicat测试是否能够连接

也可以查看虚拟网络情况,通过命令:docker network inspect swarm_mysql

★ 加入第三个节点 【192.168.80.223 】

参考上面,则第三个节点创建命令为:

docker run -d --name=pn3 --net=swarm_mysql -p 9001:3306 -v pnv3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=mT123456 -e CLUSTER_NAME=PXC1 -e XTRABACKUP_PASSWORD=mT123456 -e CLUSTER_JOIN=pn1 pxc

可以查看节点状态:docker ps -a

其他操作,不做赘述!如果有更多的从节点需要创建,可以举一反三 …

3). 查看挂载情况

推荐的方式,需要进入 【主节点】的 mysql,运行查询语句:show status like 'wsrep%';

鄙人测试发现,进入任意一个节点,都可以执行查询操作

于是,我在节点2 [192.168.80.221] 的查询结果如下:

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

对于其他参数解释,建议可以参考 —— 【MySQL Galera cluster集群常用参数说明】

另外,我发现,在节点顺利启动后,可以通过查看虚拟网络信息,确认挂载情况

操作命令:docker network inspect swarm_mysql

[root@localhost ~]# docker network inspect swarm_mysql

[

{

"Name": "swarm_mysql",

"Id": "ir06z2hjlfduliphte8chwrop",

"Created": "2021-01-14T15:46:33.522125189+08:00",

"Scope": "swarm",

"Driver": "overlay",

"EnableIPv6": false,

"IPAM": {

"Driver": "default",

"Options": null,

"Config": [

{

"Subnet": "10.0.0.0/24",

"Gateway": "10.0.0.1"

}

]

},

"Internal": false,

"Attachable": true,

"Containers": {

"4d09f2b49a771f0976ea6379d1585059b1f54041ccdf975d540fc9e319258d3f": {

"Name": "pn1",

"EndpointID": "27662762e11842e96125cdca03a66941c7fe4c2574eea6a7cd29ed8a4b8cfea0",

"MacAddress": "02:42:0a:00:00:02",

"IPv4Address": "10.0.0.2/24",

"IPv6Address": ""

}

},

"Options": {

"com.docker.network.driver.overlay.vxlanid_list": "4097"

},

"Labels": {},

"Peers": [

{

"Name": "localhost.localdomain-bedc99cf44f1",

"IP": "192.168.80.221"

},

{

"Name": "localhost.localdomain-986f2f07e8b7",

"IP": "192.168.80.222"

},

{

"Name": "localhost.localdomain-4a1e3925814d",

"IP": "192.168.80.223"

}

]

}

]

4). 集群同步验证

验证是极为简单的,直接在任意节点数据库连接上,创建 db、创建数据表、操作数据

然后,正常情况下,其他节点刷新后,会发现对应的数据同步变化!

【题外话】:

个人感觉,

最终成果跟以前配置的 MySQL 数据库主从同步没啥大的区别

只是没有了主从之分

那就相当于所有节点【互为主备】

对比参考 —— 【CentOS7 下 MySQL5.7.32 主从复制+同步配置操作 (一主多从+多主多从)】

PXC 集群实际应用探讨

☞ ThinkPHP5 上的使用

以鄙人常用的 ThinkPHP5 框架使用为例

那么,在 "config/database.php" 中的配置参考如下://------------- PXC 集群配置参考----------------------------------

'hostname' => ['192.168.80.221','192.168.80.222','192.168.80.223'],

'database' => 'pxc_test',

'username' => 'root',

'password' => 'mT123456',

'hostport' => '9001',

'deploy' => 1,

//-------------------------------------------------------------

【提示】:

在成熟的项目配置中,应该是考虑其他中间件来进行数据库分布式部署操作的

比如,阿里开源的 MyCat

感兴趣的可以阅读下整理的文章 —— 【CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换】

如此一来

项目配置中,就只会显示 mycat 连接信息(减少负载均衡配置中的代码冗余)//------------- MyCat 主从分离配置参考----------------------------------

'hostname' => '192.168.80.221',

'database' => 'mycat_tp5_pro',

'username' => 'root_mycat',

'password' => 'mycat_007',

'prefix' => 'tp5_',//前缀而已,不要太在意

'hostport' => '8066',

//-------------------------------------------------------------

报错排查及解决

1). “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

2). “error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding”

当发现,节点无法连接后,这时就要查看日志

2021-01-14T09:02:35.487308Z 0 [ERROR] [MY-000000] [Galera] handshake with remote endpoint ssl://10.0.0.2:4567 failed: asio.ssl:67567754: 'invalid padding' ( 67567754: 'error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding')

This error is often caused by SSL issues. For more information, please see:

https://per.co.na/pxc/encrypt_cluster_traffic

--------

重启节点,也可使用命令:docker restart [节点名称]

3). 节点宕机问题

知识点

由于 PXC 在退出的时候会给集群中最后退出的那台打上标记,

当集群重新启动的时候

需要尽量先启动最后关闭的那台节点机器

★ 从节点宕机后的操作

即,以 指定主节点 形式进入 PXC 集群创建的容器(理解起来即为【从节点】如:pn2、pn3)

如果指定的【主节点】没有宕机

直接 docker start [节点名],数据会自行同步

如果指定的【主节点】没有启动

那么要么先等【主节点】启动后,再执行 docker start [节点名]

要么,就要考虑以作为主节点的形式进行启动

★ 主节点宕机后的操作

即,以 自身为主节点 启动的容器(理解起来即为【主节点】,如 : pn1)

此时,先要明确下,原来作为【主节点】的是不是最后一个离开集群的

[如果其他节点还在运行中]

要先调整数据卷中 "grastate.dat" 文件的 safe_to_bootstrap 参数为 1

执行启动命令:docker start [节点名]

然后查看是否成功启动,并与其他节点数据同步(一般是不同步的)

此时,可以删除自身容器 : docker stop [节点名]、docker rm [节点名]

原来的数据卷无需删(继续使用,避免数据丢失)

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

[如果是最后一个离开集群的]

可直接进行启动:docker start [节点名]

★ 最坏情况,节点再创建一遍

记不清之前的退出操作了,也懒得排查了

先要保证不去删除 数据卷(避免数据丢失)

然后,这时,试着将所有的节点都 stop, rm 操作

再从创建节点步骤开始,执行一遍!

附录

a). 配置 docker 加速镜像

Docker 从 Docker Hub 拉取镜像,因为是从国外获取,所以速度较慢

编辑文件 daemon.json

vi /etc/docker/daemon.json

在文件中输入以下内容并保存

{

"registry-mirrors": ["http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","https://ung2thfc.mirror.aliyuncs.com"]

}

重新加载配置信息及重启 Docker 服务

# 重新加载某个服务的配置文件

systemctl daemon-reload

# 重新启动 docker

service docker restart

b). 创建节点参数解释

命令

说明

-d

代表创建的容器在后台运行

–name=pn1

容器名称,自定义

–net=swarm_mysql

加入到 swarm_mysql的虚拟网络

-p 9000:3306

端口映射 宿主机端口:容器端口

-v pnv1:/var/lib/mysql

数据卷挂载在 "pnv1" 数据卷

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

如果在这之前没有数据卷 pnv1,会自动创建一个进行挂载

–privileged

表示有读写权限

-e MYSQL_ROOT_PASSWORD=mT123456

Mysql 的 root 密码 (跟原来数据库设定的 root 密码没关系)

-e CLUSTER_NAME=PXC1

PXC 集群名称 (注意不要命为关键词:"PXC")

-e XTRABACKUP_PASSWORD=mT123456

PXC 集群之间数据同步的密码

-e CLUSTER_JOIN=pn1

表示与 pn1节点同步 (第一个节点是没有该参数的!)

pxc

来自哪个镜像创建

c). 节点操作指令

感觉,用的还挺频繁的,比如节点配置错误,想换名字,删除数据卷时都会用到!

用途

指令

停止节点

docker stop [节点名]

重启节点

docker restart [节点名]

查看所有节点

docker ps

删除节点

docker rm [节点名]

查看日志

docker logs [节点名](建议用来排查错误)

d). 创建数据卷,用于之后挂载

注:PXC 容器只支持数据卷挂载方式,不支持目录挂载

可以通过查看数据卷,以方便后期对数据及配置文件的查找:docker inspect [数据卷名]

[root@localhost download]# docker inspect pnv1

[

{

"Driver": "local",

"Labels": {},

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

"Name": "mTv1",

"Options": {},

"Scope": "local"

}

]

文章

本文同步分享在 博客“moTzxx”(CSDN)。

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

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

mysql从节点报错_CentOS7.9 下 MySQL 之 PXC 集群部署【Docker+多机多节点】相关推荐

  1. redis哨兵集群部署 docker单机模拟-六节点

    目录 如果有不懂得,私信我就行,十分欢迎交流 一.准备工作 二.拉取redis镜像 三.部署多个容器 四.脚本讲解 1.脚本循环 2.配置文件 3.创建docker容器 五.从节点加入主节点 一.加入 ...

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

    背景 [注意]: 鄙人认为本篇适合做入门测试/学习之用,选择的 "单机多节点配置",后面再整理 "多机配置"文章. 近期正突击学习数据库知识 想着对 PXC 集 ...

  3. CentOS7 下 MySQL 之 PXC 集群部署【Docker+多机多节点】

    背景 最近在进行 MySQL 集群搭建测试的研究中 对于业界主流方案自然不能跳过 在此,整理成完整的文章,希望道友能得到参考价值 - 对于 docker 不熟悉的小伙伴,个人建议移步文章 -- [Ce ...

  4. mysql数据库的pxc工具_CentOS7 下 MySQL 数据库 PXC 集群部署操作指导

    背景 最近在进行 MySQL 的 PXC 集群搭建使用和研究 前期已完成了一篇记录文章 : [CentOS7 下 MySQL 之 PXC 集群部署[Docker+多机多节点]] 但是,毕竟不是所有人都 ...

  5. 安装完MySQL后启动报错_MySQL数据库之mysql编译安装完成后,启动时报错The server quit without updating PID file...

    本文主要向大家介绍了MySQL数据库之mysql编译安装完成后,启动时报错The server quit without updating PID file ,通过具体的内容向大家展现,希望对大家学习 ...

  6. MySQL数据库高可用集群搭建-PXC集群部署

    Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法.集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上. PXC原理描述: 分布式 ...

  7. 虚拟机开启mysql密码报错_Linux虚拟机下mysql 5.7安装配置方法图文教程

    一. 下载mysql5.7 Linux下载: 输入命令:wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5 ...

  8. centos7.2 mysql集群_Centos7.2下安装mysql-group-replication数据库集群

    系统版本:Centos7.2 x64 数据库版本:mysql5.7.17 1.首先安装环境: yum -y install gcc gcc-c++ libaio-devel boost-devel a ...

  9. mysql 唯一性约束报错_怪异的MySQL Online DDL报错Duplicate entry

    今天线上执行Online DDL的时候发现一个奇怪的报错,觉得比较意义,遂整理如下.线上数据库版本:percona server 5.7.14 报错现场:每次执行的时候重复报错记录都不一样 mysql ...

最新文章

  1. android 隐藏底部虚拟按键
  2. SpringBoot集成FreeMarker
  3. 看看是否有人用USB偷插你的电脑
  4. 用C#开发的双色球走势图(原创)值得园友拥有(二)接上一篇
  5. 产品待办列表如何精化?
  6. RabbitMQ初探--用C#简单实现通信服务
  7. 页面的访问速度如何提高?(我所知道的,哪位高手有其它的高见,敬请提醒....)...
  8. python db api_dbapi · PyPI
  9. atitit.提升备份文件复制速度(1) -----分析统计问题and解决方案
  10. vs code 的常用快捷键列表
  11. 工具及方法 - 编辑二进制文件(使用VSCode和Notepad++的插件Hex Editor)
  12. 虚幻引擎/UE4离线安装
  13. New York Comic Con 2013 - 2013年纽约动漫展
  14. mxgraph进阶(三)Web绘图——mxGraph项目实战(精华篇)
  15. 【GoLang】Map的遍历
  16. 开发落网电台windows phone 8应用的计划(7)
  17. 第二届世界物联网安全峰会WISS 2019将在京隆重召开
  18. 经典语录~想要的东西立马去买,想做的事情马上去做,想见的人立马去见
  19. html中bak是什么文件怎么打开,bak文件怎么打开?打开bak文件的方法
  20. i710750h和i510300h对比哪个好 i5 10300h和i7 10750h选哪个

热门文章

  1. 物联网在智能交通领域,主要有哪些应用场景?
  2. bench.h:39:10: 致命错误:rpc/rpc.h:没有那个文件或目录
  3. javascript深入了解匿名函数和闭包
  4. 火狐打开新标签搜索_快速提示:在“新标签”中打开Firefox搜索
  5. elc character system_小米MIUI11系统解锁system分区软件分享和操作教程
  6. CT117E LCD操作 学习笔记
  7. 阿里技术专家:详解技术中台/移动中台/研发中台!
  8. keil软件STM32下载错误:Overlapping of Algorithms at Address 08000000H错误
  9. 基于SSM框架的学籍管理系统
  10. 浅谈linux的命令行解析参数之getopt_long函数