MySQL 数据库集群-PXC 方案(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL 数据库集群-PXC 方案(一)

MySQL 数据库集群-PXC 方案(一)


什么是 PXC

PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;


PXC 的特点

  • 完全兼容 MySQL。
  • 同步复制,事务要么在所有节点提交或不提交。
  • 多主复制,可以在任意节点进行写操作。
  • 在从服务器上并行应用事件,真正意义上的并行复制。
  • 节点自动配置,数据一致性,不再是异步复制。
  • 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
  • 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster 会自动拉取在线节点数据,集群最终会变为一致。


PXC 的优缺点

优点


  • 服务高可用。
  • 数据同步复制(并发复制),几乎无延迟。
  • 多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让 galera 解决数据冲突。
  • 新节点可以自动部署,部署操作简单。
  • 数据严格一致性,尤其适合电商类应用。
  • 完全兼容 MySQL。


缺点


  • 复制只支持InnoDB 引擎,其他存储引擎的更改不复制。
  • 写入效率取决于节点中最弱的一台,因为 PXC 集群采用的是强一致性原则,一个更改操作在所有节点都成功才算执行成功。
  • 所有表都要有主键。
  • 不支持 LOCK TABLE 等显式锁操作。
  • 锁冲突、死锁问题相对更多。


PXC 集群节点越多,数据同步的速度就越慢。

image.png

PXC 与 Replication 的区别

Replication PXC
数据同步是单向的,master 负责写,然后异步复制给 slave;如果 slave 写入数据,不会复制给 master 数据同步时双向的,任何一个 mysql 节点写入数据,都会同步到集群中其它的节点
异步复制,从和主无法保证数据的一致性 同步复制,事务在所有集群节点要么同时提交,要么同时不提交

PXC 常用端口

  • 3306:数据库对外服务的端口号。
  • 4444:请求 SST 的端口。
  • 4567:组成员之间进行沟通的一个端口号。
  • 4568:用于传输 IST。


  • SST(State Snapshot Transfer): 全量传输
  • IST(Incremental state Transfer):增量传输


MySQL 衍生版选择

image.png

MariaDB


起初 MySQL 之父 Monty 在 1979 年写下 MySQL 的第一行代码,后来逐渐创建起 MySQL 公司,后将其以 10 亿美金卖给 Sun,结果 Sun 又把 MySQL 转手卖给 Oracle,Monty 愤而出走,以 MySQL5.5 为基础创造了 MariaDB 数据库,这样就诞生出了 MySQL 分支里知名度最高的一个衍生版。


Percona Server


Percona Server 是 MySQL 咨询公司 Percona 发布的性能最接近 MySQL 企业版的 MySQL 产品。Percona 公司在 MySQL 数据库优化方面做了非常多的工作,以至于 Percona Server 数据库是 MySQL 众多分支中,在高负载、高并发情况下表现非常突出,乃至阿里巴巴的 OceanBase 数据库都要借鉴 Percona Server。


XtraDB 引擎是 Percona 公司开发设计的,与 MySQL5.1 内置的 InnoDB 相比,单位时间执行事务数量是后者的 2.7 倍。而且在 Percona Server 上面默认使用的也是 XtraDB 引擎。所以说 MariaDB 和 Percona Server 在正常情况下的性能基本持平。但是在高并发和高负载的条件下,Percona Server 的表现更好一些。所以本文采用 Percona Server 来搭建。


安装 Percona Server

首先打开 https://www.percona.com/downl...


选择对应版本,由于 Percona Server 只支持 Linux 所以我们就选择对应版本即可。

1654748441120.png

此时我们也需要下载 jemalloc 下载地址:


https://cbs.centos.org/koji/t...


最下方选择 jemalloc-3.6.0-8.el7.centos.x86_64.rpm 。


下载完成后,我们将文件拷贝到 linux 的 home 目录下:

image.png

  • 执行下面命令进行安装:
yum localinstall *.rpm

image.png

  • 执行完成后我们启动数据库:
systemctl start mysqld
  • 开放 3306 端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
  • 接下来要修改 MySQL 配置文件:
vim /etc/my.cnf
[mysqld]
character_set_server = utf8
bind-address = 0.0.0.0
#跳过DNS解析
skip-name-resolve
  • 完成之后重启 mysql
systemctl restart mysqld
  • 禁止开机启动 MySQL,防止 pxc 集群假如有一个节点宕机了,重启后会自动与一个 pxc 集群进行数据同步。如果宕机时间过长,同步数据非常多,这个时候会限制其它写入操作。所以正确操作,应该是拷贝数据文件再启动 mysql。
chkconfig mysqld off
  • 查看 MySQL 初始密码
cat /var/log/mysqld.log | grep "A temporary password"
  • 修改 MySQL 密码
mysql_secure_installation
  • 登录 mysql 并赋予远程登录权限
mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

搭建 PXC 集群

Percona XtraDB Cluster (简称 PXC)集群是基于 Galera 2.x library,事务型应用下的通用的多主同步复制插件,主要用于解决强一致性问题,使得各个节点之间的数据保持实时同步以及实现多节点同时读写。提高了数据库的可靠性,也可以实现读写分离,是 MySQL 关系型数据库中大家公认的集群优选方案之一。


  • 删除 MariaDB 程序包
yum -y remove mari*
  • 开放防火墙端口,PXC 集群使用的四个端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent
firewall-cmd --reload
  • 关闭 SELINUX
vim /etc/selinux/config

把 SELINUX 属性值设置成 disabled,之后保存。


  • 重启
reboot
  • 下载 PXC 安装包


安装 PXC 里面集成了 Percona Server 数据库,所以不需要安装 Percona Server 数据库。


https://www.percona.com/downl...

1654748666995.png

https://www.percona.com/downl...

1654748679800.png

下载 qpress-11-1.el7.x86_64.rpm


https://repo.percona.com/yum/...


最后上传到 centos 服务器中。

image.png

执行下面命令进行安装

yum localinstall *.rpm

之后还是对 Percona Server 数据库的初始化:


修改/etc/my.cnf


我们查看之后可以看到里面内容不是之前 mysql 的配置信息

image.png

我们进入 etc/percona-xtradb-cluster.conf.d/文件夹下可以看到有三个文件:

image.png

mysql 的常用信息都写在了 mysqld.cnf 文件,wsrep.cnf 文件配置的是 pxc 集群的信息。


我们可以简化一下配置文件,将 mysqld.cnf 文件和 wsrep.cnf 文件的内容复制到/etc/my.cnf 文件中,把所有配置信息写到一个文件中,并添加字符集等配置信息。


最终/etc/my.cnf 内容如下:

[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
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
bind-address = 0.0.0.0
#跳过DNS解析
skip-name-resolve
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
  • 然后我们启动 mysql
systemctl start mysqld
  • 查看默认密码
cat /var/log/mysqld.log | grep "A temporary password"
  • 修改 MySQL 密码:这里密码就修改为 Abc_123456
mysql_secure_installation
  • 进入 mysql
mysql -u root -p
  • 创建用户修改权限:
CREATE USER 'admin'@'%' IDENTIFIED BY 'Abc_123456';
GRANT all privileges ON *.* TO 'admin'@'%';
 FLUSH PRIVILEGES;

image.png

  • 之后我们 exit 退出,停止 mysql 服务
systemctl stop mysqld
  • 在/etc/my.cnf 中配置集群信息:
[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
bind-address = 0.0.0.0
# 跳过DNS解析
skip-name-resolve
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 集群信息
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# PXC集群的名称
wsrep_cluster_name=pxc-cluster
# PXC集群的所有ip
wsrep_cluster_address=gcomm://192.168.3.137,192.168.3.138,192.168.3.139
# 当前节点的名称
wsrep_node_name=pxc1
# 当前节点的IP
wsrep_node_address=192.168.3.137
# 同步方法(mysqldump、rsync、xtrabackup)
wsrep_sst_method=xtrabackup-v2
# 同步使用的帐户
wsrep_sst_auth= admin:Abc_123456
# 同步严厉模式
pxc_strict_mode=ENFORCING
# 基于ROW复制(安全可靠)
binlog_format=ROW
# 默认引擎
default_storage_engine=InnoDB
# 主键自增长不锁表
innodb_autoinc_lock_mode=2
  • 以上步骤在其余两台虚拟机重复此步骤,my.cnf 的文件中 server-id,wsrep_node_name,wsrep_node_address 这三个参数是不能重复的值。
  • 启动命令 主节点的管理命令(第一个启动的 PXC 节点)
systemctl start mysql@bootstrap.service
 systemctl stop mysql@bootstrap.service
 systemctl restart mysql@bootstrap.service
  • 非主节点的管理命令(非第一个启动的 PXC 节点)
service mysql start
service mysql stop
service mysql restart

连接测试

image.png

查看 PXC 集群状态信息,在任意一个节点执行以下命令:

show status like 'wsrep_cluster%';

wsrep_cluster_size 参数是说明 pxc 集群是几个数据库节点的集群。说明集群搭建成功。

image.png

测试数据

我们在 137 节点下创建数据库 test 看看其它两个是否同步过去。


可以看到没有问题:

1654749032450.png

我们再创建张表增加一条数据试试:

image.png

image.png

image.png

可以看到也是没有问题的。另外不仅使用哪个节点操作数据也会被同步到其它集群中。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课13 单机版转换为集群版
本文介绍如何将“本地存储实例”转换为“共享存储实例”,依赖于先前搭建的实验环境。主要步骤包括:准备PFS二进制文件、格式化共享盘为pfs文件系统、启动pfsd服务、停库并拷贝数据到pfs内、修改配置文件,最后启动实例。通过这些操作,成功实现了从本地存储到共享存储的转换,并验证了新实例的功能。相关系列文章和视频链接提供了更多背景信息和技术细节。
21 0
|
5天前
|
存储 缓存 API
自研一款共享集群数据库,有多难?
共享集群数据库管理系统是一种单库多实例的多活数据库管理系统,用户连接任意实例都可以访问同一个数据库,具备透明多写、高可用、高性能等特性。共享集群技术因其开发难度高,一直被国外垄断,也被称为数据库领域的“塔尖”技术。
|
2天前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
14天前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
33 9
|
13天前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
19天前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课12 集群版转换为单机版
本文介绍了如何将“共享存储实例”转换为“本地存储实例”,实验环境依赖于Docker容器中的loop设备模拟共享存储。具体步骤包括准备本地目录、停库、拷贝数据、修改配置文件并启动实例。通过这些操作,可以实现从共享存储到本地存储的平滑转换。相关系列文章详细记录了PolarDB RAC一写多读集群的搭建与管理,提供了丰富的实战经验。
20 2
|
1月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
86 9
|
2月前
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
61 22
|
2月前
|
Java 关系型数据库 MySQL
MySQL 分库分表方案
本文总结了数据库分库分表的相关概念和实践,针对单张表数据量过大及增长迅速的问题,介绍了垂直和水平切分的方式及其适用场景。文章分析了分库分表后可能面临的事务支持、多库结果集合并、跨库join等问题,并列举了几种常见的开源分库分表中间件。最后强调了不建议水平分库分表的原因,帮助读者在规划时规避潜在问题。
269 20
|
20天前
|
SQL 关系型数据库 数据库
【YashanDB 知识库】OM 仲裁节点故障后手工切换方案和 yasom 仲裁重新部署后重新纳管数据库集群方案
本文介绍了一主一备数据库集群的部署步骤。首先在OM节点上传并解压软件包至指定路径,随后通过调整安装参数、执行安装和集群部署完成数据库设置。接着,在主备节点分别配置环境变量,并查看数据库状态以确认安装成功。最后,针对OM仲裁故障提供了手动切换方案,包括构造故障场景、关闭自动切换开关及使用SQL命令进行主备切换,确保系统高可用性。