当前位置: 首页 > article >正文

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 集群节点越多,数据同步的速度就越慢。

img

4.PXC 与 Replication 的区别

ReplicationPXC
数据同步是单向的,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 SystemCentOS Linux 7 (Core)
KernelLinux 3.10.0-1160.119.1.el7.x86_64

ip地址以及对应主机名:

192.168.171.128/24pxc
192.168.171.129/24pxc1
192.168.171.130/24pxc2

更改主机名,重启生效。

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


http://www.kler.cn/a/540690.html

相关文章:

  • 防御保护-----前言
  • 【报错解决】MySQL报错:sql_mode=only_full_group_by
  • 什么是中间件中间件有哪些
  • 如何在Vscode中接入Deepseek
  • python爬虫--简单登录
  • 集成学习(二):从理论到实战(附代码)
  • Include多表查询
  • ECG分析0210
  • 软件工程-软件需求规格说明(SRS)
  • 实战设计模式之责任链模式
  • 使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理
  • php 实现 deepSeek聊天对话
  • MacOS安装Milvus向量数据库
  • 【AIGC】在VSCode中集成 DeepSeek(OPEN AI同理)
  • 蓝桥杯算法日记|贪心、双指针
  • 石英表与机械表的世纪之争(Quartz vs. Mechanical Watches):瑞士钟表业的危机与重生(中英双语)
  • 如何在Kickstart自动化安装完成后ISO内拷贝文件到新系统或者执行命令
  • 目标检测数据集合集(持续更新中)
  • centos docker安装
  • 【C#零基础从入门到精通】(八)——C#String字符串详解
  • 【华为OD-E卷 - 120 分割数组的最大差值 100分(python、java、c++、js、c)】
  • ABP框架9——自定义拦截器的实现与使用
  • 如何使用Socket编程在Python中实现实时聊天应用
  • 笔试-字符串2
  • Web前端开发--HTML
  • java后端开发day10--综合练习(一)