简介:
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 则表明节点已经不在正常工作状态。