背景
最近在进行 MySQL 的 PXC 集群搭建使用和研究
前期已完成了一篇记录文章 : 【CentOS7 下 MySQL 之 PXC 集群部署【Docker+多机多节点】】
但是,毕竟不是所有人都熟悉 docker
而作为开发人员,还是习惯于原生状态的安装流程
所以,在此整理官方指导的PXC 集群配置步骤
欢迎指摘 …
【注】:Percona XtraDB Cluster(简称 PXC 集群) —— 业界主流的 MySQL 集群方案
环境
CentOS 版本:CentOS Linux release 7.9.2009 (Core)
PXC 版本:Percona XtraDB Cluster 5.7
前期准备
【注】: PXC 集群部署,会自行安装 MySQL 服务,建议操作前卸载原来的 MySQL
1). 三台 Vmware 虚拟机
PXC 集群节点越多,数据同步的速度就越慢(建议不要太多!)
在此,我以三台创建运行的 CentOS7 作为宿主机,进行配置操作演示
虚拟机 ip
端口
角色
192.168.80.221
3306
第一个 节点
192.168.80.222
3306
第二个 节点
192.168.80.223
3306
第三个 节点
注意各节点硬件配置尽量相同
因为短板效应,PXC 集群数据同步的速度取决配置最低的节点
PXC 集群只支持 InnoDB 引擎
2). 卸载 mariadb-libs
因为 CentOS7 默认捆绑安装了 mariadb-libs,为了不影响 PXC 的使用,需要先卸载!
yum -y remove mari*
3). 开启四个 PXC 环境所涉及的端口
3306:# mysql 实例端口
4567:# PXC cluster 相互通讯的端口
4444:# 用于 SST(State Snapshot Transfer): 全量传输
4568:# 用于 IST(Incremental state Transfer): 增量传输传送
以鄙人使用宝塔面板操作为例,注意以上端口的开启:
4). 部署前建议关闭 SELINUX、将 MySQL 数据库服务停止
安全增强型 Linux(Security-Enhanced Linux)SELinux 主要由美国国家安全局开发
把 "SELINUX" 属性值设置成 disabled,然后 reboot 重启
vi /etc/selinux/config
5). 配置 ntp 服务,确保时间同步
这一步,多数经验没有提及,我是操作 docker 时发现需要配置的哦!
[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
搭建 PXC 集群
1). 下载解压缩工具 qpress、PXC 安装包
为方便后期对 PXC 集群操作的使用,需要下载 "qpress" >>> 下载地址
然后就是 PXC 安装包的下载了
一般指导都是支持在线安装的,但我发现,虚拟机里无法安装
本身下载速度慢,而且最新版本资源比较大
此处,我以下载 【Percona XtraDB 群集 5.7】 为例
此时我进行安装发现,依赖关系提示:"需要:percona-xtrabackup-24 >= 2.4.21"
所以,继续下载了 【Percona-XtraBackup-2.4】
【提示】
1 本人发现:不论在官网使用浏览器下载,还是使用 wget 命令下载都提示文件缺失,解压异常,最后选择迅雷下载
2 有需要这些资源的,在此提供【百度云链接,提取码:fd0g 】
3 如果是宝塔系统,已安装了 mysql 会有冲突,所以要卸掉原来的 mysql 数据库
将解压得到的所有 ".rpm" 文件,上传到 Linux 系统,此处我选择的是 "/www/server/download"
2). 执行安装 PXC 命令
在三个虚拟机上分别安装 PXC 程序
在上一步存放 ".rpm" 文件的目录中,执行命令:
yum localinstall *.rpm
注意,如果提示还有其他需要使用的依赖包,进行下载后再操作一遍命令!
3). 修改 "mysqld.cnf" 文件
上一步命令执行完毕后,如果成功
可以注意到 "etc/my.cnf" 文件中出现如下信息
其实,我们操作的配置文件,只是 "/etc/percona-xtradb-cluster.conf.d/" 目录中的三个!
mysql 的常用配置信息都在 "mysqld.cnf" 文件, pxc 集群的配置信息都在 "wsrep.cnf" 文件
在 "mysqld.cnf"中配置信息对比参考如下(注意,我添加了三个参数)
并且,对参数 "server-id",赋值唯一的ID (三台服务器都要配置)
# Template my.cnf for PXC
# Edit to your requirements.
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
#PXC集群中MySQL实例的唯一ID,不能重复,必须是数字
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7
#数据库字符集
character_set_server = utf8
#运行远程访问的IP地址
bind-address = 0.0.0.0
#跳过DNS解析
skip-name-resolve
#skip-grant-tables
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
4). 新建传送用户
首先,查看默认的 mysql 登录密码 cat /var/log/mysqld.log | grep "A temporary password"
以下面的打印信息为例,默认账号 root,密码为:BJuk-xlad8XS
[root@localhost download]# cat /var/log/mysqld.log | grep "A temporary password"
2021-01-25T08:33:57.335210Z 1 [Note] A temporary password is generated for root@localhost: BJuk-xlad8XS
初始化,建议参考 【附录 - 如何重置 root 密码】,感觉出错少,更加方便
账号[adminPXC] 及密码[201107070]自定义即可
用于 PXC 集群中的数据传输
依次执行下面三条 SQL 语句:
CREATE USER 'adminPXC'@'localhost' IDENTIFIED BY '201107070';
GRANT all privileges ON *.* TO 'adminPXC'@'localhost';
FLUSH PRIVILEGES;
【提示一】 用户名密码,要与配置文件 "wsrep.cnf" 中的 wsrep_sst_auth="adminPXC:201107070" 对应
【提示二】 三台服务器都要配置,mysql 的重启命令: systemctl restart mysql.service
【提示三】 在 节点启动前,最好 关闭 mysql 服务: systemctl stop mysql.service
5). 第一个节点【PXC1】
本次演示,我选择 [192.168.80.221] ,作为第一个节点主机
▶ 修改 "wsrep.cnf" 的 PXC 配置信息
基本重要的配置参数,都做了解释
下面展示一下第一个节点的配置信息:
[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# Cluster connection URL contains IPs of nodes
#If no IP is found, this implies that a new cluster needs to be created,
#in order to do that you need to bootstrap this node
#PXC集群节点的IP
wsrep_cluster_address=gcomm://192.168.80.221,192.168.80.222,192.168.80.223
# In order for Galera to work correctly binlog format should be ROW
#基于ROW复制(安全可靠)
binlog_format=ROW
# MyISAM storage engine has only experimental support 默认引擎
default_storage_engine=InnoDB
# Slave thread to use
wsrep_slave_threads= 8
wsrep_log_conflicts
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
#主键自增长不锁表
innodb_autoinc_lock_mode=2
# Node IP address
#当前节点的IP地址
#wsrep_node_address=192.168.80.221
# Cluster name PXC 集群的名称
wsrep_cluster_name=pxc-moTzxx
#If wsrep_node_name is not specified, then system hostname will be used
#当前节点的名称
wsrep_node_name=pxc1
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
#同步严厉模式
pxc_strict_mode=ENFORCING
# SST method 同步方法
wsrep_sst_method=xtrabackup-v2
#Authentication for SST method 同步使用的账户
wsrep_sst_auth="adminPXC:201107070"
每个主机的 server-id 和 wsrep_node_addres、wsrep_node_name 保持不同即可
▶ 第一个节点启动
第一个节点启动的命令为:
systemctl start [email protected]
查看状态,可以通过指令
systemctl status [email protected]
此处,附上对第一个节点的操作指令
systemctl start [email protected]
systemctl stop [email protected]
systemctl restart [email protected]
systemctl status [email protected]
为了操作方便,建议可以使用 "Navicat" 等工具进行连接
执行 SQL 语句:show status like 'wsrep_cluster%';
显示效果如下:
【提示】: 一定要等第一个节点启动,可以连接后,再考虑第二个、第三个节点的启动!
6). 第二个节点【PXC2】
本次演示,我选择 [192.168.80.222] ,作为第二个节点主机
注意:非主节点的管理命令(非第一个启动的 PXC 节点)
service mysql start
service mysql stop
service mysql restart
service mysql status
为了对比参考,此处展示第二个节点的配置信息(其他的就没必要了)
[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# Cluster connection URL contains IPs of nodes
#If no IP is found, this implies that a new cluster needs to be created,
#in order to do that you need to bootstrap this node
#PXC集群节点的IP
wsrep_cluster_address=gcomm://192.168.80.221,192.168.80.222,192.168.80.223
# In order for Galera to work correctly binlog format should be ROW
#基于ROW复制(安全可靠)
binlog_format=ROW
# MyISAM storage engine has only experimental support 默认引擎
default_storage_engine=InnoDB
# Slave thread to use
wsrep_slave_threads= 8
wsrep_log_conflicts
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
#主键自增长不锁表
innodb_autoinc_lock_mode=2
# Node IP address
#当前节点的IP地址
#wsrep_node_address=192.168.80.222
# Cluster name PXC 集群的名称
wsrep_cluster_name=pxc-moTzxx
#If wsrep_node_name is not specified, then system hostname will be used
#当前节点的名称
wsrep_node_name=pxc2
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
#同步严厉模式
pxc_strict_mode=ENFORCING
# SST method 同步方法
wsrep_sst_method=xtrabackup-v2
#Authentication for SST method 同步使用的账户
wsrep_sst_auth="adminPXC:201107070"
启动后,打印信息如下:
第三个节点 【PXC3】基本操作一样,只是配置文件的参数稍有不同
7). 测试 PXC 集群部署效果
在此,我将三个成功启动的 mysql 服务,通过 "Navicat" 连接
在第一个节点上,创建一个数据库 "test_pxc"
进而, 创建了一个数据表 "pxc_users"
然后,随意,在数据表中添加了几条记录
打开第二个节点、第三个节点
刷新,会发现也会有同样的数据库,数据表
继而修改任意一个节点的数据,
会发现,其他节点也会同步更新
PXC 节点重启问题
【官方 - 重新启动集群节点】 不同于 Replication 集群的重启操作,PXC 集群需要分好几种情况
▶ 强行关机之后,PXC 集群无法启动
这种情况常见于测试练习时,虚拟机关机的情况
以我的操作经历为例:
昨天直接关闭所有的虚拟机,
今天想着继续 PXC集群的测试
发现,都无法启动了
提示信息如下:
部分网上经验,是:
查看一下各个虚拟机中的 "/var/lib/mysql/grastate.dat" 文件
然后,将 "safe_to_bootstrap: 1" 的主机作为第一个节点进行启动
但是,我发现所有的主机参数都为 "0"
此时我的解决方案为:
选中其中一个主机,将 "safe_to_bootstrap" 参数手动改为 "1"
然后将其作为第一个节点启动
vim /var/lib/mysql/grastate.dat
systemctl start [email protected]
其他节点,依次启动即可,命令:
service mysql start
测试同步状况,我这里是完全没有问题的 …
▶ 最后关闭的 PXC 节点是安全退出时
这种情况,一般就是停服检测、数据维护才会全部退出 …
此时,可以查看 "grastate.dat" 文件(默认会在"/var/lib/mysql/" 目录中)
其中 safe_to_bootstrap: 1,
再次启动集群时,则先启动该节点
cat /var/lib/mysql/grastate.dat
systemctl start [email protected]
▶ 节点正常退出后,重新加入进群
这种情况,多发生在数据库冷备份时,选取其中一台主机,正常退出 service mysql stop
此处,不用分清当前主机是第几个节点
毕竟在两个节点以后,就没有主从之分了
等其他操作完成后
直接以非第一个节点操作启动即可
service mysql start
注意: 这种情况的前提 —— 存在正常工作状态中的 PXC 节点
PXC 集群实际应用探讨
☞ ThinkPHP5 上的使用
以鄙人常用的 ThinkPHP5 框架使用为例
那么,在 "config/database.php" 中的配置参考如下://------------- PXC 集群配置参考----------------------------------
'hostname' => ['192.168.80.221','192.168.80.222','192.168.80.223'],
'database' => 'test_pxc',
'username' => 'root',
'password' => 'mT123456',
'hostport' => '3306',
'deploy' => 1,
//-------------------------------------------------------------
☞ MyCat 部署读写分离
【提示】:
在成熟的项目配置中,应该是考虑其他中间件来进行数据库分布式部署操作的
比如,阿里开源的 MyCat
感兴趣的可以阅读下整理的文章
—— 【CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换】
我在【192.168.80.221】主机上安装了 mycat 服务
在此,附一张配置截图以作参考:
如此一来
上面项目配置中,就只会显示 mycat 连接信息(减少负载均衡配置中的代码冗余) //------------- MyCat 主从分离配置参考----------------------------------
'hostname' => '192.168.80.221',
'database' => 'mycat_tp5_pro',
'username' => 'root_mycat',
'password' => 'mycat_007',
'prefix' => 'tp5_',//前缀而已,不要太在意
'hostport' => '8066',
//-------------------------------------------------------------
☞ 对比 “Replication” 集群部署
通常来讲,对于数据库集群部署,"PXC" 都会拿来与 "Replication" 进行对比!
【Replication 部署方案】:
【PXC 部署方案】:
注意,两种方案不是对立的,一个大型项目中,完全可以根据自己的业务 : 结合使用、取长补短!
附录
☞ 关闭 mysql 的开启自启动
很多系统,默认了 mysql 会开启自启动,感觉很方便
但是,对于部署了 PXC 集群的数据库,会因为节点启动方式的不同有影响
建议关闭开机启动
☞ 提示:宝塔 mysql 版本与依赖包安装冲突
提示信息如下:
file /usr/include/mysql/mysql/plugin.h from install of Percona-XtraDB-Cluster-devel-57-5.7.32-31.47.1.el7.x86_64 conflicts with file from package bt-mysql57-5.7.32-1.el7.x86_64
此时,我参考网友的建议:直接卸载掉原来的 mysql
yum -y remove bt-mysql57-5.7.32-1.el7.x86_64
☞ 如何重置 root 密码
首先,在 "mysqld.cnf" 文件中
配置参数 :skip-grant-tables
然后,重启 mysql 服务
systemctl restart mysql.service
此时,进入 mysql
使用命令:mysql -uroot -p,回车后无需密码
然后, 执行 SQL 语句:
flush privileges; #刷新权限
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; #重置新密码
exit; #修改完毕,退出 mysql
接下来,将第一步开启的参数关闭,重启 mysql 服务即可
systemctl restart mysql.service
☞ 推荐文章
本文同步分享在 博客“moTzxx”(CSDN)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。