mysql8.0使用PXC实现高可用
目录
1.什么是 PXC
2.PXC 的特点
3.PXC 的优缺点
优点:
缺点:
4.PXC 与 Replication 的区别
5.PXC 常用端口
6.搭建 PXC 集群
6.1 搭建初始化环境
6.2 下载安装包
6.3 数据库初始化
6.4 创建集群
6.5 启动数据库服务
6.6 查询集群信息
6.7 节点下线
1.什么是 PXC
PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性。
2.PXC 的特点
-
完全兼容 MySQL。
-
同步复制,事务要么在所有节点提交或不提交。
-
多主复制,可以在任意节点进行写操作。
-
在从服务器上并行应用事件,真正意义上的并行复制。
-
节点自动配置,数据一致性,不再是异步复制。
-
故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
-
自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster 会自动拉取在线节点数据,集群最终会变为一致。
3.PXC 的优缺点
优点:
-
服务高可用。
-
数据同步复制(并发复制),几乎无延迟。
-
多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让 galera 解决数据冲突。
-
新节点可以自动部署,部署操作简单。
-
数据严格一致性,尤其适合电商类应用。
-
完全兼容 MySQL。
缺点:
-
复制只支持InnoDB 引擎,其他存储引擎的更改不复制。
-
写入效率取决于节点中最弱的一台,因为 PXC 集群采用的是强一致性原则,一个更改操作在所有节点都成功才算执行成功。
-
所有表都要有主键。
-
不支持 LOCK TABLE 等显式锁操作。
-
锁冲突、死锁问题相对更多。
PXC 集群节点越多,数据同步的速度就越慢。
4.PXC 与 Replication 的区别
Replication | PXC |
---|---|
数据同步是单向的,master 负责写,然后异步复制给 slave;如果 slave 写入数据,不会复制给 master | 数据同步时双向的,任何一个 mysql 节点写入数据,都会同步到集群中其它的节点 |
异步复制,从和主无法保证数据的一致性 | 同步复制,事务在所有集群节点要么同时提交,要么同时不提交 |
5.PXC 常用端口
-
3306:数据库对外服务的端口号。
-
4444:请求 SST 的端口。
-
4567:组成员之间进行沟通的一个端口号。
-
4568:用于传输 IST。
SST(State Snapshot Transfer):全量传输
IST(Incremental state Transfer):增量传输
6.搭建 PXC 集群
所有操作在root用户下进行。
6.1 搭建初始化环境
操作系统信息:
Operating System | CentOS Linux 7 (Core) |
Kernel | Linux 3.10.0-1160.119.1.el7.x86_64 |
ip地址以及对应主机名:
192.168.171.128/24 | pxc |
192.168.171.129/24 | pxc1 |
192.168.171.130/24 | pxc2 |
更改主机名,重启生效。
hostnamectl set-hostname pvc
hostnamectl set-hostname pvc1
hostnamectl set-hostname pvc2
配置hosts解析(三个节点同步操作)
cat >> /etc/hosts << EOF
192.168.171.128 pxc
192.168.171.129 pxc1
192.168.171.130 pxc2
EOF
删除 MariaDB 程序包(三个节点同步操作)
yum -y remove maria*
注意: 由于PXC集成了mysql数据库(这个内嵌数据库的版本和我们下载的percona-xtradb-cluster版本一致),所以当前所有节点不能安装任何数据库,以免发生依赖和冲突。
6.2 下载安装包
(三个节点同步操作)
官网目前最高8.4版本,实验用的是8.0。
percona官网:Software Downloads - Percona
下载percona-xtradb-cluster-8.0.34-26.1.el7.x86_64
Percona XtraDB Cluster
下载Percona-XtraBackup-8.0.34-29-r5ba706ee-el7-x86_64
Percona XtraBackup
下载qpress-11-1.el7.x86_64.rpm
https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm
温馨提示:这三个网址使用wget下载tar包,文件末尾会出现乱码,将这些乱码删除到“.tar”截止,然后正常解压安装即可。
执行下面命令进行安装。
yum localinstall *.rpm -y
6.3 数据库初始化
(三个节点都要操作),这里以pxc为例。
之后是对 Percona Server 数据库的初始化,应为使用的是8.0版本,部分配置需要在初始化数据库前进行配置,如忽略表名大小写等。
[root@pxc ~]# vim /etc/my.cnf
...
[mysqld]
server-id=28 #每台mysql的id不能相同,这里我用的ip最后一位
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# Binary log expiration period is 604800 seconds, which equals 7 days
binlog_expire_logs_seconds=604800 #二进制日志过期时间为604800秒,等于7天
注意:pxc1和pxc2只需要server-id设置为29和30即可。
然后我们启动 mysql,修改密码。
#登录数据库。
systemctl start mysqld
tmp_pass=$(awk '/temporary password/ {print $NF}' /var/log/mysqld.log)
mysql -uroot -p${tmp_pass}
#更改root密码。
mysql> alter user root@localhost identified by 'Elysia123.';
Query OK, 0 rows affected (0.01 sec)
#重新登录数据库
mysql -uroot -pElysia123.
#创建admin用户。
mysql> CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'Elysia123.';
Query OK, 0 rows affected (0.00 sec)
#为admin用户授权。
mysql> GRANT all privileges ON *.* TO 'admin'@'%';
Query OK, 0 rows affected (0.00 sec)
6.4 创建集群
# 停止所有节点的mysqld服务
systemctl stop mysqld
[root@pxc ~]# vim /etc/my.cnf
...
######## wsrep ###############
# Path to Galera library
wsrep_provider=/usr/lib64/galera4/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
wsrep_cluster_address=gcomm://192.168.171.128,192.168.171.129,192.168.171.130 # PXC集群的所有ip
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# 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
wsrep_node_address=192.168.171.128 # 当前节点的IP
# Cluster name
wsrep_cluster_name=pxc-cluster # PXC集群的名称
#If wsrep_node_name is not specified, then system hostname will be used
wsrep_node_name=pxc # 当前节点的名称
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
pxc_strict_mode=ENFORCING
# SST method
wsrep_sst_method=xtrabackup-v2 # 同步方法
注意:pxc1和pxc2参照,修改集群节点ip(wsrep_node_address)和名称( wsrep_node_name)。
复制密钥和证书文件
默认情况下,系统变量pxc_encrypt_cluster_traffic设置为ON,意味着所有集群流量都使用证书进行保护,所以要求所有节点使用相同的密钥和证书文件,systemctl start mysql启动初始话过程中生成默认密钥和证书文件,并将其放在datadir数据目录下,这就造成故障节点和其他节点密钥和证书文件不一致,因此需要将故障节点的*.pem全部删除,并将某一个正常节点数据目录下的 *.pem文件全部复制到故障节点。
这里将pxc节点的密钥和证书文件拷贝到其他节点。(pxc节点操作)
scp /var/lib/mysql/*.pem pxc1:/var/lib/mysql/
scp /var/lib/mysql/*.pem pxc2:/var/lib/mysql/
改变密钥和证书的属主属组为mysql。(pxc1和pxc2节点操作)
chown -R mysql.mysql /var/lib/mysql/
6.5 启动数据库服务
pxc节点需要以引导模式启动:
systemctl start mysql@bootstrap.service
接着在pxc1节点和pxc2节点上正常启动数据库服务即可:
systemctl start mysql
6.6 查询集群信息
登录数据库,查询集群信息。
mysql -uroot -pElysia123.
#查看状态表
mysql> show status like 'wsrep%';
表比较长,这里仅展示关键部分。
以下参数一致则集群搭建完毕。
- wsrep_incoming_addresses
- wsrep_cluster_size
- wsrep_cluster_status
- wsrep_connected
可通过视图performance_schema.pxc_cluster_view、dstat工具监控同步状态。
mysql> select * from performance_schema.pxc_cluster_view;
+-----------+--------------------------------------+--------+-------------+---------+
| HOST_NAME | UUID | STATUS | LOCAL_INDEX | SEGMENT |
+-----------+--------------------------------------+--------+-------------+---------+
| pxc | 10af12fd-e75c-11ef-8a5d-2f82690a1095 | SYNCED | 0 | 0 |
| pxc1 | 6b01b890-e75d-11ef-a5fd-6364ae887ae6 | SYNCED | 1 | 0 |
| pxc2 | bf541658-e75c-11ef-a586-8627f5d89504 | SYNCED | 2 | 0 |
+-----------+--------------------------------------+--------+-------------+---------+
3 rows in set (0.00 sec)
查看 PXC 集群状态信息,在任意一个节点执行以下命令:
mysql> show status like 'wsrep_cluster%';
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_cluster_weight | 3 |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | aeb81324-e792-11ef-a34a-e2081db04787 |
| wsrep_cluster_status | Primary |
+----------------------------+--------------------------------------+
6 rows in set (0.00 sec)
mysql> show status where Variable_name in ('wsrep_cluster_size','wsrep_cluster_status','wsrep_connected','wsrep_ready') ;
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_size | 3 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_ready | ON |
+----------------------+---------+
4 rows in set (0.00 sec)
6.7 节点下线
PXC 集群允许动态下线节点,但需要注意的是节点的启动命令和关闭命令必须一致,如以引导模式启动的第一个节点必须以引导模式来进行关闭:
systemctl stop mysql@bootstrap.service
其他节点则可以按照正常方式关闭:
systemctl stop mysql