MySQL 高可用架构之 PXC 集群

Percona XtraDB Cluster (简称 PXC) 是 Percona 公司开源的实现 MySQL 高可用的解决方案。它将 Percona Server 和 Percona XtraBackup 与 Galera 库集成,以实现多主同步复制。和 MySQL 传统的异步复制相比,它能够保证数据的强一致性,在任何时刻集群中任意节点上的数据状态都是完全一致的,并且整个架构实现了去中心化,所有节点都是对等的,即允许你在任意节点上进行写入和读取,集群会把数据状态同步至其他所有节点。但目前 PXC 集群只支持 InnoDB 存储引擎,并具有以下限制:

  • 添加新节点时,必须从现有节点之一复制完整数据集。如果是 100GB,则复制 100GB。为了减少网络开销,建议在搭建集群前使用备份的方式将所有节点初始的数据状态调整至一致。
  • 不支持 LOCK TABLES ,在多主设置的情况下也不支持 UNLOCK TABLES。
  • 不支持锁定功能,如 GET_LOCK(),RELEASE_LOCK() 等。
  • 由于可能在提交时回滚,因此也不支持 XA 事务 (分布式事务) 。
  • 所有表必须具有主键。
  • 由于节点是对等的,所以整个集群的写吞吐量受限于性能最差的节点,如果一个节点变慢,则整个群集都会变慢。因此应该保证所有节点的硬件配置一致,并避免单个节点超负载运行。
  • 允许的最大事务大小由 wsrep_max_ws_rows 和 wsrep_max_ws_size 参数共同定义,因此超大型事务会被拆分为一系列小型事务,如加载大数据集 LOAD DATA INFILE。
  • 由于在集群级别采用乐观锁进行并发控制,所以事务在 COMMIT 阶段仍然有被中止的可能。如两个事务在不同的集群节点上提交对相同的行的写入,此时只有其中一个可以成功提交,另一个将被中止。
image

<figcaption></figcaption>

虽然 PXC 集群存在以上限制,但就目前而言,它仍然是解决数据一致性和高可用性的最好方案,其搭建步骤如下:

二、集群搭建

为保证集群高可用,群集最少要有 3 个节点,这里以搭建一个 3 节点的集群为例,具体如下:

2.1 准备安装

1. 删除 MariaDB

1.这里我的服务器版本为 Centos 7.x ,需要删除自带的 MariaDB 数据库,避免对后面安装造成影响:

yum -y remove mari*
复制代码

2. 开放访问墙端口

开放以下四个防火墙端口,其作用和开放命令分别如下:

# MySQL 对外提供服务的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 请求进行全量同步(SST)的端口
firewall-cmd --zone=public --add-port=4444/tcp --permanent
# 集群中各个节点间的通讯端口
firewall-cmd --zone=public --add-port=4567/tcp --permanent
# 请求进行增量同步(IST)的端口
firewall-cmd --zone=public --add-port=4568/tcp --permanent
复制代码

3. 关闭SELINUX

SELinux 安全模块可能会限制对 Percona XtraDB Cluster 的数据访问。此时可以在运行时使用 setenforce 0 命令进行更改,也可以通过修改 /etc/selinux/config 文件中的 SELINUX 属性的值为 disabled ,从而进行永久性的更改:

vi /etc/selinux/config
# 修改
SELINUX=disabled
复制代码

修改该文件后需要重启才能生效:

reboot
复制代码

2.2 在线安装

配置 yum 源后,直接使用 yum 命令进行在线安装,命令如下:

sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum install Percona-XtraDB-Cluster-57
复制代码

使用以上命令安装完成后,会同时安装好 Percona Server 数据库,它基于 MySQL 社区版进行了扩展增强,并完全兼容原有版本,使用方式也完全一致,启动命令如下:

sudo systemctl start mysql
复制代码

2.3 修改密码

使用以下命令获取安装时自动生成的 root 账户的密码:

sudo grep 'temporary password' /var/log/mysqld.log
复制代码

使用 root 账户登录,并修改其账户密码:

# 登录服务
mysql -u root -p
# 修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
# 退出服务
mysql> exit
复制代码

之后使用以下命令停止 MySQL 服务:

sudo systemctl stop mysql
复制代码

2.4 搭建集群

以上安装过程在三台主机上均相同执行,之后就可以开始集群的搭建。首先需要修改每个服务器上的 /etc/my.cnf 文件,第一个节点上需要增加的内容如下:

[mysqld]

# PXC集群中每个MySQL实例的唯一标识,不能重复
server-id=1  

wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

# PXC集群的名称和所有服务地址
wsrep_cluster_name=pxc-cluster  
wsrep_cluster_address=gcomm://192.168.0.226,192.168.0.227,192.168.0.228

# 当前节点的名称和服务地址
wsrep_node_name=pxc1 
wsrep_node_address=192.168.0.226

# 指定同步方法和账户信息,这个用户在下文会进行创建
wsrep_sst_method=xtrabackup-v2 
wsrep_sst_auth= sstuser:123456

#开启严厉模式,它会阻止用户执行 Percona XtraDB Cluster 所不支持的功能。
pxc_strict_mode=ENFORCING  

# 指定二进制日志的格式
binlog_format=ROW 
# 指定默认的存储引擎
default_storage_engine=InnoDB 
# Galera 仅支持 InnoDB 的 interleaved(2) 锁定模式:
# 该模式下所有 INSERT SQL 都不会有表级 AUTO-INC 锁,多个语句可以同时执行
innodb_autoinc_lock_mode=2 
复制代码

第二、三个节点的配置与上面基本相同,但是需要修改 server id 以及当前节点的名称和地址,具体如下:

server-id=2
wsrep_node_name=pxc2
wsrep_node_address=192.168.0.227
复制代码
server-id=3
wsrep_node_name=pxc3
wsrep_node_address=192.168.0.228
复制代码

2.5 启动集群

第一个节点需要以引导模式启动:

sudo systemctl start mysql@bootstrap.service
复制代码

在将其他节点添加到群集之前,需要登录当前节点,来为 SST 操作创建用户并提供权限,命令如下:

# 创建用户
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY '123456';
# 授予权限
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
# 刷新权限
FLUSH PRIVILEGES;
复制代码

接着在第二和第三个节点上正常启动数据库服务,命令如下:

sudo systemctl start mysql
复制代码

启动后,可以登录任意节点并使用以下命令查看集群状态。输出中的 wsrep_cluster_size 的值应该为 3 ,即集群中节点总数为 3,此时代表所有节点都已成功加入集群,至此集群已经搭建完成。

mysql> show status like 'wsrep%';
+----------------------------------+----------------------------------------------------------+
| Variable_name                    | Value                                                    |
+----------------------------------+----------------------------------------------------------+
| wsrep_local_state_uuid           | 8bcc22cf-bfab-11e9-8a49-6e46c7af709e                     |
.......
| wsrep_incoming_addresses         | 192.168.0.227:3306,192.168.0.228:3306,192.168.0.226:3306 |
| wsrep_gcomm_uuid                 | c8afc276-c623-11e9-a9ea-677d72419479                     |
| wsrep_cluster_conf_id            | 3                                                        |
| wsrep_cluster_size               | 3                                                        |
| wsrep_cluster_state_uuid         | 8bcc22cf-bfab-11e9-8a49-6e46c7af709e                     |
| wsrep_cluster_status             | Primary                                                  |
| wsrep_connected                  | ON                                                       |
| wsrep_local_bf_aborts            | 0                                                        |
| wsrep_local_index                | 2                                                        |
| wsrep_provider_name              | Galera                                                   |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>                        |
| wsrep_provider_version           | 3.37(rff05089)                                           |
| wsrep_ready                      | ON                                                       |
+----------------------------------+----------------------------------------------------------+
复制代码

2.6 节点下线

PXC 集群允许动态下线节点,但需要注意的是节点的启动命令和关闭命令必须一致,如以引导模式启动的第一个节点必须以引导模式来进行关闭:

systemctl stop mysql@bootstrap.service
复制代码

其他节点则可以按照正常方式关闭:

systemctl stop mysql
复制代码

由于所有节点都是对等的,所以下线第一个节点和下线其他节点在效果上都是相同的,如果全下线后无法启动,查看vi /home/data/mysql/grastate.dat文件的safe_to_bootstrap值,是1的那个作为引导启动,以上就是关于 PXC 集群搭建的全部内容。

作者:heibaiying
链接:https://juejin.cn/post/6844904039063224327
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容