开发者

MySQL8.4组复制的实现步骤

目录
  • 1 什么是组复制
  • 2 单主模式
    • 2.1 什么是单主模式
    • 2.2 单主模式部署示例
  • 3 多主模式

    1 什么是组复制

    • 组复制主要解决了传统javascript异步复制主机宕机时可能造成主从节点数据不一致问题
    • mysql Group Replication,简称MGR
    • 将原有的gtid复制功能进行可增强,支持单主模式和多主模式
    • 组复制在数据库层面做到了只要集群中大多数主机可用,则服务可用,也就是3台服务器的集群,允许其中1台宕机

    MySQL8.4组复制的实现步骤

    • 组复制提供了分布式状态机复制,服务器之间具有很强的协调性;
    • 当服务器属于同一组时,它们会自动进行协调
    • 传统的主从复制方式有一个主盒不等数据量的从,主节点执行的事务会异步发送给从节点,在从节点重新执行;
    • 而组复制采用整组写入,避免单点问题
    • 组复制在传输数据时使用了Paxos协议,Paxos协议保证了数据传输的一致性和原子性;
    • 基于Paxos协议,组复制构建了一个分布式的状态复制机制。这是实现多主复制的核心技术
    • 组复制提供乐多写方案
    • MGR能保证数据库服务的连续可用,但是存在以下问题
      • 当一个组成员不可用时,连接到它的客户端不能自主转移到其他组成员
      • MySQL Router提供乐故障转移的能力

    2 单主模式

    2.1 什么是单主模式

    • 在单主模式下,组中只有一个主服务器;
    • 主服务器被设置为读写模式
    • 组中其他所有成员都被设置为只读模式

    MySQL8.4组复制的实现步骤

    2.2 单主模式部署示例

    https://dev.mysql.com/doc/refman/8.4/en/group-replication-configuring-instances.html

    2.2.1 准备MySQL实例10000

    • 创建目录
    mkdir -p /opt/mysql/10000/{data,log,tmp} 
    • 准备配置文件
    vi /opt/mysql/10000/my.cnf
     
    [mysql]
    #设置mysql客户端默认编码
    default-character-set=utf8
    [mysqld]
    port=10000
    pid-file= /opt/mysql/10000/mysqld.pid
    socket= /opt/mysql/10000/mysqld.sock
    datadir= /opt/mysql/10000/data
    log-error=/opt/mysql/10000/log/mysqld.log
    tmpdir=/opt/mysql/10000/tmp
    secure-file-priv= NULL
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    #服务器唯一ID,默认是1
    server-id=10000
    #启用二进制日志
    log-bin=mysql-bin
    #最大连接数
    max_connections=1000
    #设置默认时区
    default-time_zone='+8:00'
    # 0:区分大小写
    # 1:不区分大小写
    lower_case_table_names=1
    user = mysql
    #启用全局事务标识符(GTID)模式
    gtid_mode=on
    #强制GTID的一致性。这意味着在执行事务时,MySQL将确保所有涉及的服务器都使用相同的GTID集。
    enforce_gtid_consistency=on
    • 初始化库
    chown -R mysql:mysql /opt/mysql/10000
    mysqld --defaults-file=/opt/mysql/10000/my.cnf --initialize
    • 启库
    mysqld --defaults-file=/opt/mysql/10000/my.cnf &
    • 初始化密码
    #查看临时密码
    cat /opt/mysql/10000/log/mysqld.log|grep "A temporary password"
    #登录
    mysql -uroot -p'EG+Pvd&jj0N=' --socket=/opt/mysql/10000/mysqld.sock
    >ALTER USER 'root'@'localhost' identified by '123456';
      flush privileges;
    • 创建同步用户
    mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
     >CREATE USER 'repl'@'%' IDENTIFIED  BY '123456';
      GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
      flush privileges;
    • 添加组复制配置
    vi /opt/mysql/10000/my.cnf
    #组复制设置
    plugin_load_add='group_replication.so'
    group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    group_replication_start_on_boot=off
    group_replication_local_address= "192.168.221.100:33061"
    group_replication_group_seeds= "192.168.221.100:33061,192.168.221.100:33062,192.168.221.100:33063"
    group_replication_bootstrap_group=off
    disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

    2.2.2 复制MySQL实例10001

    cp -rf /opt/mysql/10000 /opt/mysql/10001
    sed -i "s#10000#10001#g" /opt/mysql/10001/my.cnf
    rm -f /opt/mysql/10001/data/auto.cnf
    sed -i  "s#group_replication_local_address= '192.168.221.100:33061'#group_replication_local_address= '192.168.221.100:33062'#g" /opt/mysql/10001/my.cnf
    chown -R mysql:mysql /opt/mysql/10001
    mysqld --defaults-file=/opt/mysql/10001/my.cnf &
    

    2.2.3 复制MySQL实例10002

    cp -rf /opt/mysql/10000 /opt/mysql/10002
    sed -i "s#10000#10002#g" /opt/mysql/10002/my.cnf
    rm -f /opt/mysql/10002/data/auto.cnf
    sed -i  "s#group_replication_local_address= '192.168.221.100:33061'#group_replication_local_address= '192.168.221.100:33063'#g" /opt/mysql/10002/my.cnf
    chown -R mysql:mysql /opt/my编程客栈sqphpl/10002
    mysqld --defaults-file=/opt/mysql/10002/my.cnf &

    2.2.4 配置组复制

    • 主库实例10000执行
    mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
    > set global group_replication_recovery_get_public_key=on;
      CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
      SET GLOBAL group_replication_bootstrap_group=ON;
      START GROUP_REPLICATION;
      SET GLOBAL group_replication_bootstrap_group=OFF;
    • 从库实例10001执行
    mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
    > START GROUP_REPLICATION;
    • 从库实例10002执行
    mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
    > START GROUP_REPLICATION;
    • 查看组成员
    mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
    > SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;

    MySQL8.4组复制的实现步骤

    2.2.5 组复制数据同步测试

    • 主库实例10000插入数据
    mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
    >编程; create database test;
       use test;
       create table test (id int,name varchar(10));
       ALTER TABLE test ADD PRIMARY KEY id(id);
       insert into test values(1,'a'),(2,'b'),(3,'c');
    • 从库实例10001查询数据
    mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
    >  use test;
       select * from test;
    • 从库实例10002查询数据
    mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
    >  use test;
       select * from test;

    2.2.6 组复制主库宕机测试

    • kill主库实例10000
    • 查看组成员

    MySQL8.4组复制的实现步骤

    3 多主模式

    https://dev.mysql.com/doc/refman/8.4/en/group-replication-multi-primary-mode.html

    3.1 什么是多主模式
    • 在多主模式下,没有成员具有特殊角色
    • 任何组成员在加入组复制时读背设置为读写模式,可都以处理写事物
    3.2 多主模式部署示例
    • 关闭实例10000,10001,10002单主模式
    mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
    >  stop GROUP_REPLICATION;
    set global group_replication_single_primary_mode=off;
    set global group_replication_enforce_update_everywhere_checks=ON;
     
     
    mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
    >  stop GROUP_REPLICATION;
    set global group_replication_single_primary_mode=off;
    set global group_replication_enforce_update_everywhere_checks=ON;
     
    mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
    >  stop GROUP_REPLICATION;
    set global group_replication_single_primary_mode=off;
    set global group_replication_enforce_update_everywhere_checks=ON;
    • 使用实例10000引导组复制
    mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
    > SET GLOBAL group_replication_bootstrap_group=ON;
      START GROUP_REPLICATION;
      SET GLOBAL group_replication_bootstrap_group=OFF;
    
    • 实例10001,10002开启组复制
    mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
    > START GROUP_REPLICATION;
    
    mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
    > START GROUP_REPLICATION;
    
    • 查看组成员
    mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
    >  SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;

    MySQL8.4组复制的实现步骤

    到此这篇关于MySQL8.4组复制的实现步骤的文章就介绍到这了,更多相关MySQL8.4组复制内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文python章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜