IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]MySQL 5.7.16 Group Replication 初始

    mchdba发表于 2016-12-31 17:28:22
    love 0

    1,关于 Group Replication

    基于组的复制(Group-based Replication)是一种被使用在容错系统中的技术。Replication-group(复制组)是由能够相互通信的多个服务器(节点)组成的。

    在通信层,Group replication实现了一系列的机制:比如原子消息(atomic message delivery)和全序化消息(totalordering of messages)。

    这些原子化,抽象化的机制,为实现更先进的数据库复制方案提供了强有力的支持。

     

    MySQL Group Replication正是基于这些技术和概念,实现了一种多主全更新的复制协议。

    简而言之,一个Replication-group就是一组节点,每个节点都可以独立执行事务,而读写事务则会在于group内的其他节点进行协调之后再commit。

    因此,当一个事务准备提交时,会自动在group内进行原子性的广播,告知其他节点变更了什么内容/执行了什么事务。

    这种原子广播的方式,使得这个事务在每一个节点上都保持着同样顺序。

    这意味着每一个节点都以同样的顺序,接收到了同样的事务日志,所以每一个节点以同样的顺序重演了这些事务日志,最终整个group保持了完全一致的状态。

     

    然而,不同的节点上执行的事务之间有可能存在资源争用。这种现象容易出现在两个不同的并发事务上。

    假设在不同的节点上有两个并发事务,更新了同一行数据,那么就会发生资源争用。

    面对这种情况,Group Replication判定先提交的事务为有效事务,会在整个group里面重演,后提交的事务会直接中断,或者回滚,最后丢弃掉。

     

    因此,这也是一个无共享的复制方案,每一个节点都保存了完整的数据副本。看如下图片01.png,描述了具体的工作流程,能够简洁的和其他方案进行对比。这个复制方案,在某种程度上,和数据库状态机(DBSM)的Replication方法比较类似。

     



    2,安装mysql5.7.16

    官方下载地址:http://dev.mysql.com/downloads/mysql/,不过官方只保留最新的version,5.7.16这个url地址不一定长期有效,所以,需要的不一定有,我这里在百度云盘保留了下来,版本是5.7.16,可以随时去下载使用,分享地址:链接:http://pan.baidu.com/s/1jIhqSXw 密码:ifx5

     

    安装过程参考我的blog地址:http://blog.csdn.net/mchdba/article/details/53889781,大概变化的地方就是my.cnf里面的server-id需要修改。

     

    在三台db服务器上面设置/etc/hosts映射,如下:

    192.168.136.130    db1                                                                                        

    192.168.136.133    db2

    192.168.136.134    db3

     

     

    安装的数据库服务器:

    数据库服务器地址

    端口

    数据目录

    Server-id

    192.168.136.130(db1)

    3317

    /data/mysql/data

    120136130

    192.168.136.133(db2)

    3317

    /data/mysql/data

    120136133

    192.168.136.134(db3)

    3317

    /data/mysql/data

    120136134

     

     

     


    3,搭建gtid复制:

    在3台my.cnf上面配置gtid:

    [mysqld]

    gtid_mode=ON

    log-slave-updates=ON

    enforce-gtid-consistency=ON

     

     

    在3台mysql实例上db1、db2、db3分配账号:

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'rlpbright_1927@ys';

    Query OK, 0 rows affected, 1 warning (0.00 sec)

     

    mysql>

     

     

    在db2、db3上搭建gtid服务:

    mysql> change master to master_user='repl', master_password='rlpbright_1927@ys', master_host='db1',master_port=3317, master_auto_position=1;

    Query OK, 0 rows affected, 2 warnings (0.02 sec)

     

    mysql> start slave;

    Query OK, 0 rows affected (0.04 sec)

     

    mysql>

    mysql> show slave status\G

    *************************** 1. row ***************************

                   Slave_IO_State: Waiting for master to send event

                      Master_Host: db1

                      Master_User: repl

                      Master_Port: 3317

                    Connect_Retry: 60

                  Master_Log_File: mysql-bin.000002

              Read_Master_Log_Pos: 445

                   Relay_Log_File: mysql-relay-bin.000002

                    Relay_Log_Pos: 414

            Relay_Master_Log_File: mysql-bin.000002

                 Slave_IO_Running: Yes

                Slave_SQL_Running: Yes

    ………………………………..

     

     

     


    4,开启Group Replication

    有了gtid之后,开启group replication就方便多了。首先需要安装group replication插件

    mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

    Query OK, 0 rows affected (0.03 sec)

     

     

    mysql> show plugins;

    +----------------------------+----------+--------------------+----------------------+---------+

    | Name                       | Status   | Type               | Library              | License |

    +----------------------------+----------+--------------------+----------------------+---------+

    | binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

    …………

    | group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |

    +----------------------------+----------+--------------------+----------------------+---------+

    45 rows in set (0.00 sec)

     

    配置参数,db1(master)上:

    mysql> set @@global.transaction_write_set_extraction = XXHASH64

    mysql> set @@global.group_replication_start_on_boot = OFF

    mysql> set @@global.group_replication_bootstrap_group = OFF

    mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6

    mysql> set @@global.group_replication_local_address = 'db1:6606'

    mysql> set @@global.group_replication_group_seeds = 'db2:6607,db3:6608'

     

    配置参数,db2(slave1)上:

    mysql> set @@global.transaction_write_set_extraction = XXHASH64

    mysql> set @@global.group_replication_start_on_boot = OFF

    mysql> set @@global.group_replication_bootstrap_group = OFF

    mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6

    mysql> set @@global.group_replication_local_address = 'db2:6607'

    mysql> set @@global.group_replication_group_seeds = 'db111:6606,127.0.0.1:db3'

     

    配置参数,db3(slave2)上:

    mysql> set @@global.transaction_write_set_extraction = XXHASH64

    mysql> set @@global.group_replication_start_on_boot = OFF

    mysql> set @@global.group_replication_bootstrap_group = OFF

    mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6

    mysql> set @@global.group_replication_local_address = 'db3:6608'

    mysql> set @@global.group_replication_group_seeds = 'db1:6607,db2:6606'

     

    BTY:如果之前没有配置transaction_write_set_extraction=XXHASH64,这里修改之后之前创建的数据库是没有办法执行插入操作的。所有如果想在线完成Group Replication的改造需要保证之前已经设置了transaction_write_set_extraction=XXHASH64。

     

    开始构建集群,在db1(master)上执行:

    # 构建集群
    CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='rlpbright_1927@ys'FORCHANNEL'group_replication_recovery';
    #开启group_replication

    SETGLOBAL group_replication_bootstrap_group=ON;

    START GROUP_REPLICATION;

    SETGLOBAL group_replication_bootstrap_group=OFF;

     

     

    db2、db3上加入

    stop slave;

    START GROUP_REPLICATION;

     

     

    在db1上查看集群信息:

    mysql> SELECT * FROM performance_schema.replication_group_members;

     




沪ICP备19023445号-2号
友情链接