zoukankan      html  css  js  c++  java
  • 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 则表明节点已经不在正常工作状态。

  • 相关阅读:
    PAT (Advanced Level) 1060. Are They Equal (25)
    PAT (Advanced Level) 1059. Prime Factors (25)
    PAT (Advanced Level) 1058. A+B in Hogwarts (20)
    PAT (Advanced Level) 1057. Stack (30)
    PAT (Advanced Level) 1056. Mice and Rice (25)
    PAT (Advanced Level) 1055. The World's Richest (25)
    PAT (Advanced Level) 1054. The Dominant Color (20)
    PAT (Advanced Level) 1053. Path of Equal Weight (30)
    PAT (Advanced Level) 1052. Linked List Sorting (25)
    PAT (Advanced Level) 1051. Pop Sequence (25)
  • 原文地址:https://www.cnblogs.com/wangxiaoqiangs/p/5736134.html
Copyright © 2011-2022 走看看