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

  • 相关阅读:
    python-列表生成式
    python-迭代
    python接口自动化测试-requests下载图片
    python接口自动化测试-requests请求异常处理
    python接口自动化测试-requests.get()
    什么是单元测试?如何做好单元测试?
    Elasticsearch 6 Mapping设置
    git pull报“unable to update local ref”解决方式
    Artifactory 简介
    maven项目版本管理
  • 原文地址:https://www.cnblogs.com/wangxiaoqiangs/p/5736134.html
Copyright © 2020-2023  润新知