zoukankan      html  css  js  c++  java
  • MySQL Group Replication

    在>=mysql5.7.17的版本中开始支持组复制插件。组复制中的成员至少需要三个才会起到容错作用,各成员在通信层通过原子广播及总订单消息的

    传递一起应用或回滚事务组从而达到数据的强一致性。组复制的成员是独立处理事务的,rw事务需要通过组的冲突检查才可以进行,ro事务则不需要

    组之间的通信而直接提交。当一个成员要提交rw事务时,会原子广播写入的行数据和相关的写入集(变更行的唯一身份认证标志),所有的成员会接

    收到一组顺序相同的事务集并顺序应用。如果不同的两组事务同时并发在两个成员上修改相同的行记录,那么这就是冲突(通过事务集的唯一标识值来

    检测冲突),这种情况下,遵循第一提交完胜的准则。

    组复制协议

    组复制实践

    单主机部署三个实例,端口分别为

    s1:6666

    s2:6667

    s3:6668

    与组复制相关的参数配置

    server_id=1
    gtid_mode=ON
    enforce_gtid_consistency=ON
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    binlog_checksum=NONE
    log_slave_updates=ON
    log_bin=binlog
    binlog_format=ROW
    
    transaction_write_set_extraction=XXHASH64
    loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    loose-group_replication_start_on_boot=off
    loose-group_replication_local_address= "127.0.0.1:10001"
    loose-group_replication_group_seeds= "127.0.0.1:10001,127.0.0.1:10002,127.0.0.1:10003"
    loose-group_replication_bootstrap_group= off
    

     10001、10002、10003是每个实例的recovery process分别侦听的端口

    如果开启并行复制 还需 slave_preserve_commit_order 设置为1

    先部署s1

    1、创建用于复制事务日志的用户

    组复制基于binlog采用异步复制的协议,recovery process通过group_replication_recovery 通道在成员间传输事务日志,

    复制用户要有 REPLICATION SLAVE 权限

    注意创建用户的日志不可以到达其他的成员实例上

    set sql_log_bin=0;GRANT REPLICATION SLAVE ON *.* TO grepl@'%' IDENTIFIED BY 'grepl';       flush privileges;set sql_log_bin=1;
    

    配置恢复通道用于从其他成员复制恢复

    mysql>  CHANGE MASTER TO MASTER_USER='grepl', MASTER_PASSWORD='grepl' FOR CHANNEL 'group_replication_recovery';                
    Query OK, 0 rows affected, 2 warnings (0.02 sec)

    安装组复制插件

    mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    Query OK, 0 rows affected (0.10 sec)
    # check
    mysql> show plugins;

     开启组复制

    通过s1引导组(bootstrap group)并开启组复制,bootstrap group只可以进行一次并由一个成员进行,不把 group_replication_bootstrap_group=ON

    放到配置文件中的原因是避免实例重启重新进行bootstrap group,若果重复执行,则会产生两个拥有相同成员的组。

    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    mysql>  SELECT * FROM performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+----------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+----------------+-------------+--------------+
    | group_replication_applier | b110f16d-3163-11e7-b64a-fa163eef641d | 10.211.253.192 |        6666 | ONLINE       |
    +---------------------------+--------------------------------------+----------------+-------------+--------------+
    1 row in set (0.00 sec)

     MEMBER_HOST字段显示的是report_host 的值

     创建测试数据

    use test
    CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
    INSERT INTO t1 VALUES (1, 'Luis');
    SELECT * FROM t1;
    mysql> SHOW BINLOG EVENTS in 'mysql-bin.000002';
    +------------------+-----+----------------+------------+-------------+--------------------------------------------------------------------+
    | Log_name         | Pos | Event_type     | Server_id  | End_log_pos | Info                                                               |
    +------------------+-----+----------------+------------+-------------+--------------------------------------------------------------------+
    | mysql-bin.000002 |   4 | Format_desc    | 4294967295 |         123 | Server ver: 5.7.18-log, Binlog ver: 4                              |
    | mysql-bin.000002 | 123 | Previous_gtids | 4294967295 |         150 |                                                                    |
    | mysql-bin.000002 | 150 | Gtid           | 4294967295 |         211 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'  |
    | mysql-bin.000002 | 211 | Query          | 4294967295 |         270 | BEGIN                                                              |
    | mysql-bin.000002 | 270 | View_change    | 4294967295 |         369 | view_id=14939720086383376:1                                        |
    | mysql-bin.000002 | 369 | Query          | 4294967295 |         434 | COMMIT                                                             |
    | mysql-bin.000002 | 434 | Gtid           | 4294967295 |         495 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2'  |
    | mysql-bin.000002 | 495 | Query          | 4294967295 |         585 | CREATE DATABASE test                                               |
    | mysql-bin.000002 | 585 | Gtid           | 4294967295 |         646 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3'  |
    | mysql-bin.000002 | 646 | Query          | 4294967295 |         770 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
    | mysql-bin.000002 | 770 | Gtid           | 4294967295 |         831 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4'  |
    | mysql-bin.000002 | 831 | Query          | 4294967295 |         899 | BEGIN                                                              |
    | mysql-bin.000002 | 899 | Table_map      | 4294967295 |         942 | table_id: 219 (test.t1)                                            |
    | mysql-bin.000002 | 942 | Write_rows     | 4294967295 |         984 | table_id: 219 flags: STMT_END_F                                    |
    | mysql-bin.000002 | 984 | Xid            | 4294967295 |        1011 | COMMIT /* xid=73 */                                                |
    +------------------+-----+----------------+------------+-------------+--------------------------------------------------------------------+
    15 rows in set (0.01 sec)

     添加组成员

    重复上上面的操作,除了设置group_replication_bootstrap_group,注意个别配置项的更改

    mysql> select * FROM performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+----------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+----------------+-------------+--------------+
    | group_replication_applier | b110f16d-3163-11e7-b64a-fa163eef641d | 10.211.253.192 |        6666 | ONLINE       |
    | group_replication_applier | b9e9924f-3163-11e7-b226-fa163eef641d | 10.211.253.192 |        6667 | ONLINE       |
    | group_replication_applier | c1ae8a71-3163-11e7-ad97-fa163eef641d | 10.211.253.192 |        6668 | ONLINE       |
    +---------------------------+--------------------------------------+----------------+-------------+--------------+
    3 rows in set (0.00 sec)

    其他的成员加入组aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa后在被宣布online前自动复制s1的差异日志并应用

    组复制模式

    https://dev.mysql.com/doc/refman/5.7/en/group-replication-deploying-in-multi-primary-or-single-primary-mode.html

  • 相关阅读:
    关于MySQL 最后一部安装阶段无法响应的问题
    为PHP 启用Mysql 的dll
    webcast终于改版了
    有意思的oracle转义字符
    Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议
    我被百度悲剧了
    阻止 http://3b3.org/c.js恶意SQL注入
    驱动研究日记-链表+后备链表
    C# 执行汇编类
    Tuning and Slimming JBossAS
  • 原文地址:https://www.cnblogs.com/Bccd/p/6808391.html
Copyright © 2011-2022 走看看