你的位置:首页 > 数据库

[数据库]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 = mysqlsocket = /var/lib/mysql/mysql.sockdatadir = /var/lib/mysqllog-bin = mysql-binbinlog_format = ROWdefault_storage_engine = InnoDBinnodb_autoinc_lock_mode = 2wsrep_provider = /usr/lib64/libgalera_smm.sowsrep_cluster_address = gcomm://192.168.12.128,192.168.12.129,192.168.12.130wsrep_cluster_name = PXCwsrep_node_address = 192.168.12.128wsrep_sst_method = xtrabackup-v2wsrep_sst_auth = "sstuser:s3cret"[mysqld_safe]log-error = /var/log/mysqld_error.logpid-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 ACCEPTshell > iptables -I INPUT -p tcp --dport 4567 -j ACCEPTshell > 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-102016-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 > mysqlmysql > 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 -p123456mysql> 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 则表明节点已经不在正常工作状态。