阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL高可用架构PXC(Percona XtraDB Cluster)

229次阅读
没有评论

共计 11327 个字符,预计需要花费 29 分钟才能阅读完成。

简介

Percona XtraDB Cluster 是 MySQL 高可用性和可扩展性的解决方案,Percona XtraDB Cluster 提供的特性如下:

1). 同步复制,事务要么在所有节点提交或不提交。

2). 多主复制,可以在任意节点进行写操作。

3). 在从服务器上并行应用事件,真正意义上的并行复制。

4). 节点自动配置。

5). 数据一致性,不再是异步复制。

Percona XtraDB Cluster 完全兼容 MySQL 和 Percona Server,表现在:

1). 数据的兼容性

2). 应用程序的兼容性:无需更改应用程序

1). 集群是有节点组成的,推荐配置至少 3 个节点,但是也可以运行在 2 个节点上。

2). 每个节点都是普通的 mysql/percona 服务器,可以将现有的数据库服务器组成集群,反之,也可以将集群拆分成单独的服务器。

3). 每个节点都包含完整的数据副本。

优点如下:

1). 当执行一个查询时,在本地节点上执行。因为所有数据都在本地,无需远程访问。

2). 无需集中管理。可以在任何时间点失去任何节点,但是集群将照常工作,不受影响。

3). 良好的读负载扩展,任意节点都可以查询。

缺点如下:

1). 加入新节点,开销大。需要复制完整的数据。

2). 不能有效的解决写缩放问题,所有的写操作都将发生在所有节点上。

3). 有多少个节点就有多少重复的数据。

架构图如下:

MySQL 高可用架构 PXC(Percona XtraDB Cluster)

Percona XtraDB Cluster 与 MySQL Replication 区别在于:

分布式系统的 CAP 理论。

C— 一致性,所有节点的数据一致。

A— 可用性,一个或多个节点失效,不影响服务请求。

P— 分区容忍性,节点间的连接失效,仍然可以处理请求。

任何一个分布式系统,需要满足这三个中的两个。

MySQL Replication: 可用性和分区容忍性

Percona XtraDB Cluster: 一致性和可用性

因此 MySQL Replication 并不保证数据的一致性,而 Percona XtraDB Cluster 提供数据一致性。

Percona XtraDB Cluster 组件:

Percona XtraDB Cluster 基于 XtraDB 的 Percona Server 以及包含写复制集补丁。使用 Galera 2.x library,事务型应用下的通用的多主同步复制插件。

Galera 2.x 新特性有:

1).IST(Incremental State Transfer)增量状态传输。对于 WAN 特别有用。

2).RSU(Rolling Schema Update)旋转更新架构。不会阻止对表进行操作。

局限性

1). 目前的复制仅仅支持 InnoDB 存储引擎。任何写入其他引擎的表,包括 mysql.* 表将不会复制。但是 DDL 语句会被复制的,因此创建用户将会被复制,但是 insert into mysql.user…将不会被复制的。

2).DELETE 操作不支持没有主键的表。没有主键的表在不同的节点顺序将不同,如果执行 SELECT…LIMIT… 将出现不同的结果集。

3). 在多主环境下 LOCK/UNLOCK TABLES 不支持。以及锁函数 GET_LOCK(), RELEASE_LOCK()…

4). 查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。

5). 允许最大的事务大小由 wsrep_max_ws_rows 和 wsrep_max_ws_size 定义。任何大型操作将被拒绝。如大型的 LOAD DATA 操作。

6). 由于集群是乐观的并发控制,事务 commit 可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).

7).XA 事务不支持,由于在提交上可能回滚。

8). 整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

9). 集群节点建议最少 3 个。2 个也可以运行,但是官方不推荐这么做,因为 3 个节点是为了预防脑裂。

10). 如果 DDL 语句有问题将破坏集群。建议使用 pt-online-schema-change 操作 DDL。

通过以上的简单了解,相信大家已经有了初步认识,更加深入的内容,推荐童鞋们阅读官方文档。下面我们进行环境的搭建与测试。测试机器信息如下:

注意:Percona-XtraDB-Cluster 在启动以后会额外启动端口来进行状态检测,所以请开放相应的端口,默认是 4567 端口。我测试环境关闭了 iptables。

服务器环境信息如下:

node1    192.168.0.100

node2    192.168.0.101

node3    192.168.0.102

1. 安装软件依赖包(添加 repl 源,再安装依赖,3 台 server 操作一样。)

[root@node1 ~]# rpm -ivh http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@node1 ~]# yuminstallperl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes socat nc libaio rsync -y

2. 安装 xtrabackup(PXC 同步数据需要用到,为什么使用 xtrabackup?自己查询官方文档)

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.11/binary/RedHat/6/x86_64/percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

rpm -ivh percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

3. 下载安装 Percona-XtraDB-Cluster

wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-56/Percona-XtraDB-Cluster-5.6.24-25.11/binary/tarball/Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64.tar.gz

无法下载软件包的请先 FQ 或者去官方网站查找最新版本

tar xf Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64.tar.gz -C /usr/local/services/

cd /usr/local/services/

ln -s Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64/ mysql

cd mysql

groupadd mysql

useradd -r -g mysql mysql

chown -R mysql .

chgrp -R mysql .   

cp support-files/my-default.cnf /etc/my.cnf

mkdir -p /data/mysql/data

chown -R mysql.mysql /data/mysql/data

./scripts/mysql_install_db –user=mysql –basedir=/usr/local/services/mysql –datadir=/data/mysql/data/

chown -R root .

cp support-files/mysql.server /etc/init.d/mysqld

chmod 755 /etc/init.d/mysqld

以上安装步骤三个节点都安装, 如果在初始化的时候报 libssl.so.6 和 libcrypto.so.6 两个动态库文件不存在的,就做下链接:

ln -s /usr/lib64/libssl.so /usr/lib64/libssl.so.6

ln -s /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.6

node1 的配置和启动如下:

修改 my.cnf 配置文件如下:

/etc/my.cnf 添加如下内容:

[mysqld]

basedir = /usr/local/services/mysql

datadir = /data/mysql/data

并在 [mysqld] 段落添如下参数:

wsrep_provider=/usr/local/services/mysql/lib/libgalera_smm.so      #库文件

wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102          #节点中所有 ip

wsrep_node_address=192.168.0.100    #节点的 ip

wsrep_slave_threads=2  #开启的复制线程数,cpu 核数 *2

binlog_format=ROW    #binlog 格式必须为 row

default_storage_engine=InnoDB  #暂时不支持其他存储引擎,只支持 innodb,当然可以支持 myisam,需要另外参数打开

innodb_autoinc_lock_mode=2    #自增锁的优化

wsrep_cluster_name=pxc-linuxidc  #集群名字

wsrep_sst_auth=sst:linuxidc      #sst 模式需要的用户名和密码

wsrep_sst_method=xtrabackup-v2  #采用什么方式复制数据。还支持 mysqldump,rsync

启动,进行授权操作,对于第一个节点必须以特殊方式启动,如下:

查看启动选项:/etc/init.d/mysqld –help

Usage: mysql {start|stop|restart|restart-bootstrap|reload|force-reload|status|bootstrap-pxc}  [MySQL (Percona XtraDB Cluster) options ]

启动:

[root@node1 mysql]# /etc/init.d/mysqld bootstrap-pxc

Bootstrapping PXC (Percona XtraDB Cluster)Starting MySQL (P[  OK]traDB Cluster)………

[root@node1 mysql]#

进行查看,可以发现启动两个端口

[root@node1 ~]# netstat -nltp | grep mysqld

tcp        0      00.0.0.0:4567                0.0.0.0:*                  LISTEN      2964/mysqld       

tcp        0      00.0.0.0:3306                0.0.0.0:*                  LISTEN      2964/mysqld       

[root@node1 ~]#

进行授权,推荐使用 grant 方式

mysql 登录:

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON * . * TO ‘sst’@’localhost’ IDENTIFIED BY ‘linuxidc’;

Query OK, 0 rows affected (0.03 sec)

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.03 sec)

mysql>

到这里我们的第一个节点就搞定了,剩下的两个节点配置稍微不同,安装方式都是一样的,不再重复。

node2 的配置如下:

[mysqld]

basedir = /usr/local/services/mysql

datadir = /data/mysql/data

wsrep_provider=/usr/local/services/mysql/lib/libgalera_smm.so                           

wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102       

wsrep_node_address=192.168.0.101                                             

wsrep_slave_threads=2                                                         

binlog_format=ROW                                                               

default_storage_engine=InnoDB                                                 

innodb_autoinc_lock_mode=2                                                     

wsrep_cluster_name=pxc-linuxidc                                                   

wsrep_sst_auth=sst:linuxidc                                                       

wsrep_sst_method=xtrabackup-v2         

node3 的配置如下:

[mysqld]

basedir = /usr/local/services/mysql

datadir = /data/mysql/data

wsrep_provider=/usr/local/services/mysql/lib/libgalera_smm.so                           

wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102       

wsrep_node_address=192.168.0.102                                           

wsrep_slave_threads=2                                                         

binlog_format=ROW                                                             

default_storage_engine=InnoDB                                                 

innodb_autoinc_lock_mode=2                                                     

wsrep_cluster_name=pxc-linuxidc                                                   

wsrep_sst_auth=sst:linuxidc                                                       

wsrep_sst_method=xtrabackup-v2         

node2,node3 节点都配置完成以后,我们启动,对于第 2,3 个节点启动和我们普通的 MySQL 启动方式一样。

node2 启动:

[root@node2 ~]# /etc/init.d/mysqld start

MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists

Starting MySQL (Percona XtraDB Cluster)……………State transfer in progress, setting sleep higher

………….                                              [OK]

[root@node2 ~]#

日志输出如下:

[root@node2 mysql]# tail -n 20 node2.err

2014-07-2510:44:2933172 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646

2014-07-2510:44:2933172 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 997242b1-13a5-11e4-aa74-000c29fedc91.

2014-07-2510:44:2933172 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.

2014-07-2510:44:2933172 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.

2014-07-2510:44:2933172 [Note] Server hostname (bind-address): ‘*’; port: 3306

2014-07-2510:44:2933172 [Note] IPv6 is available.

2014-07-2510:44:2933172 [Note]  – ‘::’ resolves to ‘::’;

2014-07-2510:44:2933172 [Note] Server socket created on IP: ‘::’.

2014-07-2510:44:2933172 [Note] Event Scheduler: Loaded 0 events

2014-07-2510:44:2933172 [Note] WSREP: Signalling provider to continue.

2014-07-2510:44:2933172 [Note] WSREP: inited wsrep sidno 1

2014-07-2510:44:2933172 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1

2014-07-2510:44:2933172 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: ‘5.6.19-67.0-25.6’  socket: ‘/tmp/mysql.sock’  port: 3306  Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111

2014-07-2510:44:3033172 [Note] WSREP: 1.0 (node2): State transfer from 0.0 (node1) complete.

2014-07-2510:44:3033172 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1)

2014-07-2510:44:3033172 [Note] WSREP: Member 1.0 (node2) synced with group.

2014-07-2510:44:3033172 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1)

2014-07-2510:44:3033172 [Note] WSREP: Synchronized with group, ready for connections

2014-07-2510:44:3033172 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.

[root@node2 mysql]#

node3 启动:

[root@node3 ~]# /etc/init.d/mysqld start

MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists

Starting MySQL (Percona XtraDB Cluster)………………………………State transfer in progress, setting sleep higher

…..                                                      [OK]

[root@node3 ~]#

日志输出如下:

[root@node3 mysql]# tail -n 20 node3.err

2014-07-2510:49:2638949 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646

2014-07-2510:49:2638949 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4ad6df19-13a6-11e4-aae1-000c29d894d0.

2014-07-2510:49:2738949 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.

2014-07-2510:49:2738949 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.

2014-07-2510:49:2738949 [Note] Server hostname (bind-address): ‘*’; port: 3306

2014-07-2510:49:2738949 [Note] IPv6 is available.

2014-07-2510:49:2738949 [Note]  – ‘::’ resolves to ‘::’;

2014-07-2510:49:2738949 [Note] Server socket created on IP: ‘::’.

2014-07-2510:49:2738949 [Note] Event Scheduler: Loaded 0 events

2014-07-2510:49:2738949 [Note] WSREP: Signalling provider to continue.

2014-07-2510:49:2738949 [Note] WSREP: inited wsrep sidno 1

2014-07-2510:49:2738949 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1

2014-07-2510:49:2738949 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: ‘5.6.19-67.0-25.6’  socket: ‘/tmp/mysql.sock’  port: 3306  Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111

2014-07-2510:49:2838949 [Note] WSREP: 0.0 (node3): State transfer from 1.0 (node1) complete.

2014-07-2510:49:2838949 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1)

2014-07-2510:49:2838949 [Note] WSREP: Member 0.0 (node3) synced with group.

2014-07-2510:49:2838949 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1)

2014-07-2510:49:2838949 [Note] WSREP: Synchronized with group, ready for connections

2014-07-2510:49:2838949 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.

[root@node3 mysql]#

如果启动失败,日志里面也会有提示的,通常启动失败的原因有如下:

(1)配置文件错误

(2)防火墙没有开放相应的端口,比如默认的 4567 端口

(3)忘记进行授权账号

(4)xtrabackup 没有安装或者安装有问题

下面我们进行相关的测试,比如在 node 节点创建表,插入数据,看另外两个节点是否有数据。

node1 节点创建表 t1,插入数据,在另外两个节点也可以看见:

mysql> create database linuxidc;

Query OK, 1 row affected (0.02 sec)

 mysql> use linuxidc

Database changed

mysql> create table t1 (idint,name char(20)) engine=innodb;

Query OK, 0 rows affected (0.03 sec)

 mysql> insert into t1 select1,’linuxidc’;

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0

 mysql> select * from t1;

+——+——-+

| id  | name  |

+——+——-+

|    1 | linuxidc |

+——+——-+

1 row in set (0.00 sec)

 mysql>

node2 节点:

mysql>select*from linuxidc.t1;

+——+——-+

| id  | name  |

+——+——-+

|    1| linuxidc |

+——+——-+

1 row inset (0.00 sec)

 mysql>

node3 节点:

mysql>select*from linuxidc.t1;

+——+——-+

| id  | name  |

+——+——-+

|    1| linuxidc |

+——+——-+

1 row inset (0.00 sec)

 mysql>

到这里搭建就基本结束了。3 个节点同时支持 write/read 操作。最大节点数量不建议超过 8 个,更加详细的介绍以及细节建议大家参考官方文档。

总结:

Percona XtraDB Cluster 现在已经有企业在使用了,我这里只是简单的搭建以及测试,如果线上需要使用我们还需要进行相关压力测试。比如使用 sysbench,或者 tpcc-mysql。

通常我们单独使用 Percona XtraDB Cluster 也没有任何问题的,如果使用通过结合 harproxy,或者 lvs+keepalived 的方式来使用会更加的完美。前面说到的那些局限性通常我们很少能够触发到,所以使用 Percona XtraDB Cluster 来实现高可用是非常不错的选择。后续我会进行一个压力测试对比。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143519.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计11327字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中