Percona Xtradb Cluster


简介:

Percona Server 由领先的 MySQL 咨询公司 Percona 发布。Percona Server 是一款独立的数据库产品,其完全与 MySQL 兼容,可以在不更改代码的情况下将存储引擎更换为 XtraDB 。

Percona 数据库中使用的存储引擎为 XtraDB,它是 MySQL 数据库中 InnoDB 存储引擎的增强版,被设计用来更好的更新计算机硬件系统的新能,同时还包含一些在高性能环境下的新特性。

XtraDB 在 InnoDB 的坚实基础上构建,使用 XtraDB 具有更多的特性,更好调用,更多的参数指标和更多的扩展。

Percona XtraDB Cluster ( PXC ) 集群是开源、免费的 MySQL 高可用性软件,可以多主同时对外提供数据库读、写服务,分担数据库压力且不浪费资源。

特性:

1、同步复制,事务在所有节点提交或不提交。
2、多主复制,可以在任意节点上进行读、写操作。
3、在从服务器并行应用事件,真正意义上的并行复制。
4、节点自动配置,数据一致性,不再是异步复制。
5、当前版本 5.6 仅支持 InnoDB 存储引擎 ( MyISAM 存储引擎为实验阶段 )。
6、集群推荐至少三个节点;每个节点都是普通的 Percona 服务器;可以将现有的数据库服务器组成集群,也可以将集群拆分成单独的服务器;每个节点都包含完整的数据副本。

更多特性及限制请参考官方地址:https://www.percona.com/doc/percona-xtradb-cluster/LATEST/index.html 介绍一栏。

# 服务器:192.168.12.128、129、130

一、采用 YUM 安装 PXC

shell > yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm  # 安装 YUM 源

shell > yum -y install Percona-XtraDB-Cluster-56 # 安装 PXC

二、配置 PXC

shell > vim /etc/my.cnf
[mysqld]

user = mysql
socket = /var/lib/mysql/mysql.sock
datadir = /var/lib/mysql

log-bin = mysql-bin
binlog_format = ROW

default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2

wsrep_provider = /usr/lib64/libgalera_smm.so
wsrep_cluster_address = gcomm://192.168.12.128,192.168.12.129,192.168.12.130

wsrep_cluster_name = PXC
wsrep_node_address = 192.168.12.128
wsrep_sst_method = xtrabackup-v2
wsrep_sst_auth = "sstuser:s3cret"

[mysqld_safe]
log-error = /var/log/mysqld_error.log
pid-file = /var/run/mysqld/mysqld.pid

# 参数说明:

1、innodb_autoinc_lock_mode

自增字段锁策略,有三个值:0 全部使用表锁;1 可预判行数时使用新方式( 预留行数的值,分配的 ID 不连续 ),不可预判时使用表锁;2 不使用表锁 ( 不适用于 replication )

2、wsrep_slave_threads

复制事务的线程数,默认为 1。可以根据实际吞吐量增加该线程数,实现多线程并行复制 ( show variables like 'wsrep_slave_threads'; )。

3、wsrep_causal_reads

当被查询结果还没有同步到 slave 中时,通过该参数可以使查询动作等待结果同步,最终返回查到的结果 ( 这种短暂延迟可以通过增加并发线程数量、提升服务器硬件性能、优化网络环境来解决 )。

4、wsrep_sst_method

当集群中有新节点加入时,传输快照( 数据 )使用的方法:Xtrabackup 、mysqldump 、rsync 。

推荐使用 Xtrabackup-v2 ( Xtrabackup 的第二版 ),mysqldump 最慢、并且跟 rsync 一样需要全局锁,影响效率、导致用户无法写入数据。

5、wsrep_sst_auth

使用 Xtrabackup 、mysqldump 传输快照时需要的认证用户( 需要数据库中建立用户,my.cnf 也要指明 ),rsync 不需要设置。

三、启动 PXC

shell > setenforce 0 # 关闭 SELinux ,建议编辑 /etc/selinux/config 永久关闭

shell > iptables -I INPUT -p tcp --dport 4444 -j ACCEPT
shell > iptables -I INPUT -p tcp --dport 4567 -j ACCEPT
shell > iptables -I INPUT -p tcp --dport 4568 -j ACCEPT

# 需要开放的端口

1、TCP 3306

数据库对外服务端口,一般只对公司内部或指定 IP 开放。

2、TCP 4444

SST 数据全量传输端口,可以只对节点服务器开放。新节点加入时需要同步数据使用 ( 默认 )。

2016-08-04 01:52:32 13167 [Note] WSREP: SST received: 4f33cb6b-598a-11e6-8738-8b3354956db1:7 # 通过 SST 全量传输 ( error.log )

3、TCP 4567

节点与节点通信端口。例如:不开放该端口,其余节点服务器无法接入到集群 ( 无法启动 )。

4、TCP 4568

IST 数据增量传输端口。节点下线再上线时传输数据使用 ( 当 gcache.size 里完全存放着节点服务器下线到上线之间的数据时,才会使用增量传输 )。

gcache.size 可以在 my.cnf 中通过参数 wsrep_provider_options = "gcache.size=512M" 设置,默认 128M。可以根据生成的 binlog 大小设置。建议大于生成的 binlog 大小。

2016-08-04 02:01:53 13961 [Note] WSREP: Receiving IST: 3 writesets, seqnos 7-10
2016-08-04 02:01:53 13961 [Note] WSREP: IST received: 4f33cb6b-598a-11e6-8738-8b3354956db1:10 # 通过 IST 增量传输 ( error.log )
shell > service mysql bootstrap-pxc # 启动 PXC 集群,申明这是第一个节点不需要数据同步 ( 仅第一次 )

shell > mysql

mysql > update mysql.user set password=password('123456') where user='root'; # 设置 root 密码 ( 安全 )

mysql > flush privileges;

mysql > grant reload, lock tables, replication client on *.* to sstuser@localhost identified by 's3cret'; # 建立同步用户

四、测试 PXC

1、其余两台服务器按照上面的步骤分别配置。

2、其中 my.cnf 中 wsrep_node_address 参数的值改为自身 IP 即可。

3、最后的授权用户 sstuser 无需创建,会自动同步第一个节点的数据。

4、可以在任意节点创建数据库,查看是否同步到其余节点。

5、关闭任意节点,之后其余节点写入数据,启动关闭的节点查看是否数据完整。

6、将节点全部关闭,重新启动,测试集群是否正常。( 这种情况为一个新的集群,要保证第一个启动的是数据最新的节点。)

# 一个小报错:

测试中将所有节点关闭后,又重新启动。数据最新的节点启动成功 ( bootstrap-pxc ),并且状态正常。

但是启动其余节点时,报错如下 ( error.log ):

2016-08-04 01:05:09 12517 [ERROR] WSREP: gcs/src/gcs_group.cpp:group_post_state_exchange():321: Reversing history: 10 -> 7, 
this member has applied 3 more events than the primary component.Data loss is possible. Aborting.

且第一个节点的状态也变成了 wsrep_cluster_status 为 Non-Primary ,wsrep_local_state_comment 为 Initialized ,wsrep_ready 为 OFF 。

最终查资料发现需要删除 /var/lib/mysql/grastate.dat 文件 ( 启动不了的节点上 ),然后启动即可。( 原因未知 )

# 实际环境中,至少保证一个节点在线。例如升级硬件时轮流升级,我想大多也会这么做吧。

# 另外这也是官方为何建议至少三个节点做 PXC ,因为当只有两个节点时,失败的节点会导致剩下的节点进入 Non-Primary 状态,导致集群失败。

五、监控指标

shell > mysql -uroot -p123456

mysql> show global status like 'wsrep_%';
+------------------------------+--------------------------------------+
| Variable_name                | Value                                |
+------------------------------+--------------------------------------+
| wsrep_local_state_uuid       | 505b98ce-54e4-11e6-99d7-d64eb985b5d7 |
| wsrep_protocol_version       | 7                                    |
| wsrep_last_committed         | 3                                    |
| wsrep_replicated             | 0                                    |
| wsrep_replicated_bytes       | 0                                    |
| wsrep_repl_keys              | 0                                    |
| wsrep_repl_keys_bytes        | 0                                    |
| wsrep_repl_data_bytes        | 0                                    |
| wsrep_repl_other_bytes       | 0                                    |
| wsrep_received               | 2                                    |
| wsrep_received_bytes         | 159                                  |
| wsrep_local_commits          | 0                                    |
| wsrep_local_cert_failures    | 0                                    |
| wsrep_local_replays          | 0                                    |
| wsrep_local_send_queue       | 0                                    |
| wsrep_local_send_queue_max   | 1                                    |
| wsrep_local_send_queue_min   | 0                                    |
| wsrep_local_send_queue_avg   | 0.000000                             |
| wsrep_local_recv_queue       | 0                                    |
| wsrep_local_recv_queue_max   | 2                                    |
| wsrep_local_recv_queue_min   | 0                                    |
| wsrep_local_recv_queue_avg   | 0.500000                             |
| wsrep_local_cached_downto    | 0                                    |
| wsrep_flow_control_paused_ns | 0                                    |
| wsrep_flow_control_paused    | 0.000000                             |
| wsrep_flow_control_sent      | 0                                    |
| wsrep_flow_control_recv      | 0                                    |
| wsrep_cert_deps_distance     | 0.000000                             |
| wsrep_apply_oooe             | 0.000000                             |
| wsrep_apply_oool             | 0.000000                             |
| wsrep_apply_window           | 0.000000                             |
| wsrep_commit_oooe            | 0.000000                             |
| wsrep_commit_oool            | 0.000000                             |
| wsrep_commit_window          | 0.000000                             |
| wsrep_local_state            | 4                                    |
| wsrep_local_state_comment    | Synced                               |
| wsrep_cert_index_size        | 0                                    |
| wsrep_cert_bucket_count      | 22                                   |
| wsrep_gcache_pool_size       | 1320                                 |
| wsrep_causal_reads           | 0                                    |
| wsrep_cert_interval          | 0.000000                             |
| wsrep_incoming_addresses     | 192.168.12.128:3306                  |
| wsrep_desync_count           | 0                                    |
| wsrep_evs_delayed            |                                      |
| wsrep_evs_evict_list         |                                      |
| wsrep_evs_repl_latency       | 0/0/0/0/0                            |
| wsrep_evs_state              | OPERATIONAL                          |
| wsrep_gcomm_uuid             | 76fe2163-58dd-11e6-9409-e3323d524fdf |
| wsrep_cluster_conf_id        | 1                                    |
| wsrep_cluster_size           | 1                                    |
| wsrep_cluster_state_uuid     | 505b98ce-54e4-11e6-99d7-d64eb985b5d7 |
| wsrep_cluster_status         | Primary                              |
| wsrep_connected              | ON                                   |
| wsrep_local_bf_aborts        | 0                                    |
| wsrep_local_index            | 0                                    |
| wsrep_provider_name          | Galera                               |
| wsrep_provider_vendor        | Codership Oy <info@codership.com>    |
| wsrep_provider_version       | 3.16(r5c765eb)                       |
| wsrep_ready                  | ON                                   |
+------------------------------+--------------------------------------+
59 rows in set (0.00 sec)

# 集群状态监控

1、wsrep_cluster_status

监控该值是否为 Primary ,可能的值有 Primary 、Non-Primary 、Disconnected 。非 Primary 为不正常。

2、wsrep_connected 、wsrep_ready

监控参数值是否为 ON ,非 ON 为不正常。

3、wsrep_local_cert_failures 、wsrep_local_bf_aborts

复制冲突导致失败的次数,为 0 最理想。

4、wsrep_flow_control_sent 、wsrep_flow_control_recv

流量控制信息,发送、接收。

5、wsrep_local_recv_queue

当前接收的队列长度。

# 需要收集的数据

1、wsrep_local_recv_queue 、wsrep_local_send_queue # 队列大小

2、wsrep_flow_control_sent 、wsrep_flow_control_recv # 进出流量

3、wsrep_replicated 、wsrep_received # 进出事务数量

4、wsrep_replicated_bytes 、wsrep_received_bytes # 进出事务字节

5、wsrep_local_cert_failures 、wsrep_local_bf_aborts # 复制冲突

# 有了这些指标,可以通过 Zabbix 监控脚本来收集数据、报警、绘图等。

五、附加

1、wsrep_cluster_state_uuid

集群 UUID ,所有节点该值必须一致,否则某节点没有加入到集群中。

2、wsrep_cluster_conf_id

集群变化次数,所有节点都应一致,否则某节点已经被隔离了。

3、wsrep_cluster_size

该值显示当前集群中有多少节点。

4、wsrep_cluster_status

正常情况所有节点值为 Primary ,表示集群正常。如为 Non-Primary 或 Disconnected 则当前节点不能被操作。

5、wsrep_ready

该值为 ON 表示节点正常,可以接受 SQL Query ;否则几乎所有的 Query 都会报错 'ERROR 1047 (08S01) Unknown Command'。

6、wsrep_connected

该值为 ON 表示正常,证明该节点已经连接到集群组。

7、wsrep_local_state_comment

通常情况下返回 Synced 表示节点处于工作状态,如返回 Initialized 则表明节点已经不在正常工作状态。

posted @ 2016-08-04 11:49  WangXiaoQiang  阅读(1302)  评论(0编辑  收藏  举报