天天看点

CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录

背景

  • 最近在进行

    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
           
官网指导 ——

【在 CentOS上 配置 Percona XtraDB 集群】

前期准备

【注】:

PXC

集群部署,会自行安装

MySQL

服务,建议操作前卸载原来的

MySQL

1). 三台

Vmware

虚拟机

  • PXC

    集群节点越多,数据同步的速度就越慢(建议不要太多!)
    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题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): 增量传输传送
           
  • 以鄙人使用宝塔面板操作为例,注意以上端口的开启:
    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录

4). 部署前建议关闭

SELINUX

、将

MySQL

数据库服务停止

安全增强型

Linux(Security-Enhanced Linux)SELinux

主要由美国国家安全局开发
  • "SELINUX"

    属性值设置成

    disabled

    ,然后

    reboot

    重启
vi /etc/selinux/config
           

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

  • 这一步,多数经验没有提及,我是操作 docker 时发现需要配置的哦!
[[email protected] ~]# yum -y install ntp ntpdate
 [[email protected] ~]# ntpdate 0.asia.pool.ntp.org
 [[email protected] ~]# hwclock --systohc
 [[email protected] ~]# date
 2021年 01月 08日 星期五 09:54:23 CST
           

搭建 PXC 集群

官方指导 ——

【在 Red Hat Enterprise Linux 和 CentOS 上安装 Percona XtraDB 集群】

1). 下载解压缩工具

qpress

PXC

安装包

  • 为方便后期对

    PXC

    集群操作的使用,需要下载

    "qpress"

    >>> 下载地址
    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
  • 然后就是

    PXC

    安装包的下载了

    一般指导都是支持在线安装的,但我发现,虚拟机里无法安装

    本身下载速度慢,而且最新版本资源比较大

    此处,我以下载

    【Percona XtraDB 群集 5.7】

    为例
    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
  • 此时我进行安装发现,依赖关系提示:

    "需要:percona-xtrabackup-24 >= 2.4.21"

    所以,继续下载了 【Percona-XtraBackup-2.4】

【提示】

1

本人发现:不论在官网使用浏览器下载,还是使用 wget 命令下载都提示文件缺失,解压异常,最后选择迅雷下载

2 有需要这些资源的,在此提供【百度云链接,提取码:fd0g 】

3 如果是宝塔系统,已安装了

mysql

会有冲突,所以要卸掉原来的

mysql

数据库
  • 将解压得到的所有

    ".rpm"

    文件,上传到

    Linux

    系统,此处我选择的是

    "/www/server/download"

    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录

2). 执行安装

PXC

命令

在三个虚拟机上分别安装

PXC

程序
  • 在上一步存放

    ".rpm"

    文件的目录中,执行命令:
yum localinstall *.rpm
           
CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
注意,如果提示还有其他需要使用的依赖包,进行下载后再操作一遍命令 !

3). 修改

"mysqld.cnf"

文件

  • 上一步命令执行完毕后,如果成功

    可以注意到

    "etc/my.cnf"

    文件中出现如下信息
    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
其实,我们操作的配置文件,只是

"/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

[[email protected] download]# cat /var/log/mysqld.log | grep "A temporary password"
2021-01-25T08:33:57.335210Z 1 [Note] A temporary password is generated for [email protected]: 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]
           
CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
此处,附上对第一个节点的操作指令
  • systemctl start [email protected]ap.service

  • systemctl stop [email protected]

  • systemctl restart [email protected]

  • systemctl status [email protected]

  • 为了操作方便,建议可以使用

    "Navicat"

    等工具进行连接

    执行

    SQL

    语句:

    show status like 'wsrep_cluster%';

    显示效果如下:
    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录

【提示】:

一定要等第一个节点启动,可以连接后,再考虑第二个、第三个节点的启动!

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"

           
  • 启动后,打印信息如下:
    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
第三个节点

【PXC3】

基本操作一样,只是配置文件的参数稍有不同

7). 测试 PXC 集群部署效果

在此,我将三个成功启动的

mysql

服务,通过

"Navicat"

连接
  • 在第一个节点上,创建一个数据库

    "test_pxc"

    进而, 创建了一个数据表

    "pxc_users"

    然后,随意,在数据表中添加了几条记录
  • 打开第二个节点、第三个节点

    刷新,会发现也会有同样的数据库,数据表

  • 继而修改任意一个节点的数据,

    会发现,其他节点也会同步更新

    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录

PXC 节点重启问题

【官方 - 重新启动集群节点】

不同于

Replication

集群的重启操作,

PXC

集群需要分好几种情况

▶ 强行关机之后,PXC 集群无法启动

这种情况常见于测试练习时,虚拟机关机的情况
  • 以我的操作经历为例:

    昨天直接关闭所有的虚拟机,

    今天想着继续

    PXC

    集群的测试

    发现,都无法启动了

    提示信息如下:

    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 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

    服务

    在此,附一张配置截图以作参考:

    CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
  • 如此一来

    上面项目配置中,就只会显示

    mycat

    连接信息(减少负载均衡配置中的代码冗余)
    //------------- MyCat 主从分离配置参考----------------------------------
      'hostname'        => '192.168.80.221',
      'database'        => 'mycat_tp5_pro',
      'username'        => 'root_mycat',
      'password'        => 'mycat_007',
      'prefix'          => 'tp5_',//前缀而已,不要太在意
      'hostport'        => '8066',
    //-------------------------------------------------------------
               

☞ 对比

“Replication”

集群部署

通常来讲,对于数据库集群部署,

"PXC"

都会拿来与

"Replication"

进行对比!
CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录

Replication

部署方案】:

CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录

PXC

部署方案】:

CentOS7 下 MySQL 数据库 PXC 集群部署操作指导背景前期准备搭建 PXC 集群PXC 节点重启问题PXC 集群实际应用探讨附录
注意,两种方案不是对立的,一个大型项目中,完全可以根据自己的业务 :

结合使用、取长补短

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

附录

☞ 关闭

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
           

☞ 推荐文章

  • 【PXC 原理分析】