zoukankan      html  css  js  c++  java
  • MySQL-MGR

    1. 介绍

        MGR(MySQL Group Replication)是MySQL官方在MySQL 5.7.17版本中以插件形式推出的主从复制高可用技术,它基于原生的主从复制,将各节点归入到一个组中,通过组内节点的通信协商(组通信协议基于Paxos算法),实现数据的强一致性、故障探测、冲突检测、节点加组、节点离组等等功能。

    image

    1.1 工作模式


    组复制以单主模式或多主模式运行。通过group_replication_single_primary_mode=[ON|OFF] 变量指定工作模式。 组内所有成员都必须运行相同得工作模式。 ON表示单主模式,这是默认模式,OFF表示多主模式。
         单主模式:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
         多主模式:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。


    1.2 单主模式主要选主算法

    1)第一个考虑因素通过成员运行的MySQL Server软件版本(补丁版本)进行排序

    2)第二个因素依据每个成员的权重group_replication_member_weigth参数控制,【5.7.20引入变量】默认为50

    3)第三个因素UUID的词典顺序(变量server_uuid控制),UUID最低的成员被选为新主


    1.3 容错

    MySQL组复制使用Paxos分布式算法来提供节点间的分布式协调。正因如此,它要求组中大多数节点在线才能达到法定票数,从而对一个决策做出一致的决定。

    大多数指的是N/2+1(N是组中目前节点总数),例如目前组中有5个节点,则需要3个节点才能达到大多数的要求。所以,允许出现故障的节点数量如下图:

    5-1966257287


    2. 实验环境搭建

    2.1 单主模式

    1)配置复制账号

    # 全新环境
    -- set password=password('root');
    create user 'sync'@'192.168.10.%' identified by 'sync';
    grant replication slave on *.* to 'sync'@'192.168.10.%';
    flush privileges;
    
    # 线上环境新增账号
    SET SQL_LOG_BIN=0;
    CREATE USER sync@'192.168.10.%' IDENTIFIED BY 'sync';
    GRANT REPLICATION SLAVE ON *.* TO sync@'192.168.10.%';
    FLUSH PRIVILEGES;
    SET SQL_LOG_BIN=1;
    
    select user,host,authentication_string from mysql.user;


    2)参数文件配置

    # GTID
    gtid_mode=on
    enforce-gtid-consistency=on
    binlog_gtid_simple_recovery=1
    binlog_checksum=NONE
    log-slave-updates=on
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    
    # MGR 复制
    transaction_write_set_extraction = XXHASH64
    loose-group_replication_group_name = '32078389-702d-11ea-95da-000c2960a1c6'
    loose-group_replication_ip_whitelist = '127.0.0.1/24,192.168.10.0/24'
    loose-group_replication_start_on_boot = OFF
    loose-group_replication_local_address = '192.168.10.181:33061'              # 替换本地服务器IP及通讯端口
    loose-group_replication_group_seeds = '192.168.10.181:33061,192.168.10.181:33062,192.168.10.181:33063'
    loose-group_replication_bootstrap_group = OFF
    loose-group_replication_single_primary_mode = true
    loose-group_replication_enforce_update_everywhere_checks = false
    loose-group_replication_member_weight=50                                   # mysql 5.7.20才开始支持该选项 权重:新主选举时的优先级参照,越大,优先级越高
    group_replication_flow_control_mode='DISABLED'                             # 建议关闭流控


    3)安装插件

    # 动态安装插件
    INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    show plugins;
    
    # 配置文件加载插件 group_replication=group_replication.so
    plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;group_replication=group_replication.so"


    4)配置组成员

    # mysql 3308 -- 首个实例
    #1 查看当前的group replication相关参数是否配置有误
    show global variables like 'group%';
    
    #2 配置MGR -- 开启分布式复制
    CHANGE MASTER TO
    MASTER_USER='sync',
    MASTER_PASSWORD='sync'
    FOR CHANNEL 'group_replication_recovery';
    
    #3 # 设置group_replication_bootstrap_group为ON是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置
    SET GLOBAL group_replication_bootstrap_group=ON;
    
    #4 启动MGR
    start group_replication;
    
    #5 关闭 group_replication_bootstrap_group
    SET GLOBAL group_replication_bootstrap_group=OFF;
    
    #6 #检测组是否创建并已加入新成员
    select * from performance_schema.replication_group_members;
    
    # 其它实例配置
    #1 查看当前的group replication相关参数是否配置有误
    show global variables like 'group%';
    
    #2 配置MGR -- 开启分布式复制
    CHANGE MASTER TO
    MASTER_USER='sync',
    MASTER_PASSWORD='sync'
    FOR CHANNEL 'group_replication_recovery';
    
    #3 启动MGR 注意:# 这里不再需要开启group_replication_bootstrap_group,由于复制组已经被创建了,只需要将第二个节点添加进去即可
    start group_replication;
    
    #4 #检测组是否创建并已加入新成员
    select * from performance_schema.replication_group_members;

    clipboard


    5)监控

    # 相关状态查看
    # 1、当前组成员列表
    select * from performance_schema.replication_group_members;
    # 2、当前节点详细日志应用信息
    select * from performance_schema.replication_group_member_stats;
    # 3、当前复制渠道连接信息
    select * from performance_schema.replication_connection_status;
    # 4、当前复制渠道应用信息
    select * from performance_schema.replication_applier_status;
    # 5、当前主master (单主模式)
    select a.variable_value,b.member_host,b.member_port,member_state
    from performance_schema.global_status a ,performance_schema.replication_group_members b
    where a.variable_value=b.member_id and variable_name= 'group_replication_primary_member';
    SHOW STATUS LIKE 'group_replication_primary_member';
    select b.member_host the_master,a.variable_value master_uuid
        from performance_schema.global_status a
        join performance_schema.replication_group_members b
        on a.variable_value = b.member_id
        where variable_name='group_replication_primary_member';
    
    # 可用性监控
    selecct member_state from replication_group_members where member_id=@@server_uuid;
    
    # 延迟
    select (SELECT Received_transaction_set FROM performance_schema.replication_connection_status WHERE Channel_name = 'group_replication_applier') - (select @@global.gtid_executed);
    -- 远程节点GTID
    SELECT Received_transaction_set FROM performance_schema.replication_connection_status WHERE Channel_name = 'group_replication_applier';
    -- 本地节点 GTID
    select @@global.gtid_executed;
    
    # 当前节点是否可以写
    select * from performance_schema.global_variables where variable_name in ('read_only', 'super_read_only');


    2.2 多主模式

    # 多主模式和单主模式配置方式一样,只需将修改或增加以下参数后配置组成员
    loose-group_replication_single_primary_mode=FALSE
    loose-group_replication_enforce_update_everywhere_checks = TRUE


    3. 工作模式切换

    3.1 单主切换成多主模式

    # MGR切换模式需要重新启动组复制,因此需要在所有节点上先关闭组复制,
    #设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。
    1) 停止组复制(在所有MGR节点上执行):
    stop group_replication;
    set global group_replication_single_primary_mode=OFF;
    set global group_replication_enforce_update_everywhere_checks=ON;
    
    2) 随便选择某个MGR节点执行 (比如这里选择在3308端口实例):
    
    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    
    3) 然后在其他的MGR节点执行 (这里指3309和3310端口实例上执行):
    START GROUP_REPLICATION;
    
    4) 查看MGR组信息 (在任意一个MGR节点上都可以查看)
    SELECT * FROM performance_schema.replication_group_members;

    3.2 多主切换单主模式

    # 多主切回单主模式
    1) 停止组复制(在所有MGR节点上执行):
    stop group_replication;
    set global group_replication_enforce_update_everywhere_checks=OFF;
    set global group_replication_single_primary_mode=ON;
    
    2) 选择一个节点作为主节点, 在主节点上执行 (这里选择3308端口作为主)
    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    
    3) 在其他剩余的节点, 也就是从库节点上执行 (这里从库节点指的就是3309和3310):
    START GROUP_REPLICATION;
    
    4) 查看MGR组信息 (在任意一个MGR节点上都可以查看)
    SELECT * FROM performance_schema.replication_group_members;


    4. 参数调优

    slave_parallel_type -> LOGICAL_CLOCK
    # 增强sql_thread 并行数量
    slave_parallel_workers -> 2~8
    
    # 流控(flow control)
    在MGR中如果节点落后集群中其它成员太多,就会发起让其它节点等他完成在做的控制,这个叫流控。
    当启用: group_replication_flow_control_mode=QUOTA 是表示启用流控。 流控默认通过两个参数控制:
    group_replication_flow_control_applier_threshold (默认: 25000)
    group_replication_flow_control_certifier_threshold (默认: 25000)
    默认延迟在25000个GTID时,会对整个集群Block住写操作
    # 建议关闭流控
    set global group_replication_flow_control_mode='DISABLED';
  • 相关阅读:
    .net 设置默认首页
    MySQL如何对数据库状态值指定排序
    golang将mm-dd-yy的字符串转时间格式
    Nginx文件解析
    Git使用笔记
    批量导入实现逻辑
    golang字符串截取
    golang格式化代码
    golang获取某一年某一月份的开始日期和结束日期
    nslookup install
  • 原文地址:https://www.cnblogs.com/binliubiao/p/12594529.html
Copyright © 2011-2022 走看看