zoukankan      html  css  js  c++  java
  • (5.14)mysql高可用系列——级联复制与多主一从(多源复制)

    目录:

    【0】实验需求
      级联复制,201为主库,202为从库/同时为203的主库,203为202的从库
    【1】实验环境
      级联:A->B->C
      实践思路:
        (1)直接拿A的xtrabackup的全备到 B和C 还远即可
        (2)然后设置gtid_purged,最后change master 即可;
    【2】操作
      【2.0】配置文件 my.cnf
      【2.1】在主库201创建复制用户
      【2.2】在主库201创建测试数据
      【2.3】备份与还原
      【2.4】构建级联主从复制
      【2.5】核验

     【3】多主一从

    正文:

    【0】实验需求

      级联复制,201为主库,202为从库/同时为203的主库,203为202的从库

      一般建议2级级联,如上描述,不建议更多层次。

    【1】实验环境

      操作系统:CentOS 7.5

      数据库版本:MySQL 5.7.24

      数据库架构:主从复制,基于主库搭建3个从库,采用Xtrabackup + GTID + 无损同步复制

      A:主库IP:192.168.1.201  port:3306

      B:主库/从库IP:192.168.1.202  port:3306

      C:从库IP:192.168.1.203  port:3306

         级联:A->B->C

      简单思路:

        (1)B用A的全备初始化,然后B先作为从库连上主库A。

        (2)等B至少产生一个gtid事务后,停止B的 io线程,然后全备B 以初始化C。

        (3)C用B的全备来初始化后,再配置B->C的主从

      实践思路:

        (1)直接拿A的xtrabackup的全备到 B和C 还远即可

        (2)然后设置gtid_purged,最后change master 即可;

    【2】操作

    【2.0】配置文件 my.cnf

    #replication_new
    log_bin=/mysql/log/3306/mysql-bin #开启binlog
    log_bin_index=/mysql/log/3306/mysql-bin.index
    binlog_format=row
    binlog_rows_query_log_events=on
    max_binlog_size=2048
    
    bind-address=0.0.0.0
    server_id=2013306   #从库务必记得修改
    expire_logs_days=7    #超过7天的binlog清理
    innodb_support_xa=1
    binlog_cache_size=1M
    log_bin_trust_function_creators=1    #同步存储过程、函数、触发器
    innodb_flush_log_at_trx_commit=1
    sync_binlog=1
    transaction-isolation=read-committed
    
    #slave parameter 如果是从库,务必放开
    #relay_log=/mysql/log/3306/relaylog/mysql-relay.log
    #read_only=1  
    #slave-parallel-type=LOGICAL_CLOCK
    #slave-parallel-workers=4
    #master_info_repository=table #master_info 会记录到 mysql.slave_master_info
    #relay_log_info_repository=table #relay_log 会记录到,mysql.slave_relay_log_info
    #relay_log_recovery=1
    #slave_skip_errors=ddl_exist_errors
    #slave_preserve_commit_order=1
    
    #5.7的增强半同步
    #如果是5.7,参数前面加上loose_,如下列,如果是5.6 则直接使用 rpl_semi_sync_master_enabled=1 之类的就好了。
    #我这里是5.7就直接做增强半同步了(loseless Semisynchronous )
    
    plugin_dir=/mysql/app/mysql/lib/plugin/
    plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
    loose_rpl_semi_sync_master_enabled=1 #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled) 
    loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6开启从的半同步复制 
    loose_rpl_semi_sync_master_timeout=5000 #超时5秒,切回异步 
    rpl_semi_sync_master_wait_for_slave_count=1 #至少收到1个slave发会的ack 
    rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default value,增强半同步) & AFTER_COMMIT(传统半同步)
    #GTID mode
    gtid_mode=on
    enforce_gtid_consistency=1
    log-slave-updates=1

    【2.1】在主库201创建复制用户

    create user 'rpl'@'192.168.1.%' identified by '123456';
    grant replication slave on *.* to 'rpl'@'192.168.1.%';
    flush privileges;
    select user,host from mysql.user;

    【2.2】在主库201创建测试数据

    -- 【2.2.1】构造test库和test库下的test1,test2,test3表。test4表用于模拟业务一直在运行
    create database test;
    use test;
    create table test1(id int);
    insert into test1 values(1);
    create table test2(id int);
    insert into test2 values(2);
    create table test3(id int);
    insert into test3 values(3);
    commit;
    create table test4(id int);
    insert into test4 values(4);
    commit;
    
    -- 【2.2.2】构造存储过程sp_test4来循环插入test4表,模拟业务运行
    use test;
    drop procedure if exists sp_test4;
    delimiter $$
    create procedure sp_test4()
    begin
    declare n int;
    set n=11;
    while(n<=20)
    do
    insert into test.test4 values(n);
    commit;
    set n=n+1;
    end while;
    end $$
    delimiter ;
    
    -- 【2.2.3】构造事件,来调度sp_test4过程
    use test;
    set global event_scheduler=1;
    
    delimiter $$
    create event if not exists event_test4
    on schedule every 5 second
    on completion preserve
    enable
    do
    begin
    call sp_test4();
    end $$
    delimiter ;
    
    -- 为了防止测试数据量累计导致卡顿,我这里5小时做一次truncate
    delimiter $$
    create event if not exists event_truncate_test4
    on schedule every 5 hour
    on completion preserve
    enable
    do
    begin
    truncate table test.test4;
    end $$
    delimiter ;

    【2.3】备份与还原

    #在主库A:201
    innobackupex --defaults-file=/etc/my.cnf -uroot -p123456 --no-timestamp /mysql/backup/full.bak

    #在从库B/C:202,203
    scp -r root@192.168.1.201:/mysql/backup/full.bak /mysql/backup/
    innobackupex --apply-log --user-memory=800M /mysql/backup/full.bak #应用redo/undo
    mv data data1
    mkdir data
    innobackupex --defaults-file=/etc/my.cnf --copy-back /mysql/backup/full.bak/ #复制还原
    chown -R mysql:mysql /mysql
    chmod -R 755 /mysql

    【2.4】构建级联主从复制

    #从xtrabackup备份中的,info文件 or binlog_info文件中找到 gtid;
      
    stop slave;
    reset master;
    reset slave all;
    set
    session sql_log_bin=0; set global gtid_purged='de853101-b165-11e9-900a-000c291f4171:1-1697'; set session sql_log_bin=1; change master to master_host='192.168.1.202', master_user='rpl', master_password='123456', master_auto_position=1;

    #核验主从,在从库执行
    show slave statusG
    show processlist;
    select count(1) from test.test4;

    【2.5】核验

    #在主库A:201  执行
    create database test1;
    create table test1.test1(id int);
    insert into test1.test1 values(1);
    commit;
    select * from test1.test1;

    #核验三个库
    select * from test1.test1;

    【3】多主一从(多源复制)

    【3.1】实验环境

      操作系统:CentOS 7.5

      数据库版本:MySQL 5.7.24

      数据库架构:主从复制,基于主库搭建3个从库,采用Xtrabackup + GTID + 无损同步复制

      A:主库IP:192.168.1.201  port:3306

      B:主库IP:192.168.1.202  port:3306

      C:从库IP:192.168.1.203  port:3306

      A服务器之复制 test库,B服务器之复制test1库

    【3.2】主从库参数 my.cnf

    #【3.2.1】A服务器参数额外配置  
    
    binlog-do-db=test  #binlog只把该库的操作记录到binlog,每一行一个数据库,多个数据库需要另起行
    binlog-ignore-db=sys  #表示忽略某个数据库,除了这个数据库之外都复制,每一行一个数据库,多个数据库需要另起行
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    
    
    
    #【3.2.2】B服务器参数额外配置
    
    binlog-do-db=test1  #binlog只把该库的操作记录到binlog,每一行一个数据库,多个数据库需要另起行
    binlog-ignore-db=sys  #表示忽略某个数据库,除了这个数据库之外都复制,每一行一个数据库,多个数据库需要另起行
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    
    
    
    #【3.2.3】C服务器参数额外配置
    
    replicate_do_db=test
    replicate_do_db=test1
    replicate_wild_do_table=test.%
    replicate_wild_do_table=test1.%
    replicate_ignore_db=mysql
    replicate_ignore_db=sys
    replicate_ignore_db=information_schema
    replicate_ignore_db=performance_schema

    【3.3】配置主从(channel)

    #在从库C操作
    #核心就是channel 加频道,以便可以接收多个主库的复制
    
    stop slave;
    reset master;
    reset slave all;
    
    change master to 
    master_host='192.168.1.201',
    master_port=3306,
    master_user='rpl',
    master_password='123456',
    master_auto_position=1
    for channel 'master_201';
    
    change master to 
    master_host='192.168.1.202',
    master_port=3306,
    master_user='rpl',
    master_password='123456',
    master_auto_position=1
    for channel 'master_202';

    【3.4】关于channel的管理与维护

    3.4.1】关于channel 的常规操作
    
    show slave for 'master_201'G   -- 查看单个channel 的状态
    stop slave for channel 'master_201'; -- 停止单个channel的同步
    start slave for channel 'master_202'; -- 开始单个channel的同步
    reset slave all for channel 'master_201'; -- 重置单个channel
    
    -- 如果是关于全部的,那么和正常的主从一样
    stop slave; reset slave all; show slave statusG
    
    -- 跳过一个channel 的报错
       show slave  status for channel 'master_201'G
    
    -- 处理办法,先停止所有的channel(stop slave;),处理错误,接着开启报错所在的 channel ,最后开启所有的channel
    -- 启用GTID 模式时
    
    stop slave; -- stop slave for channel 'master_201'; 
    set session gtid_next='de853101-b165-11e9-900a-000c291f4171:1-1697';
    begin;
    commit;
    set session gtid_next='automatic';
    start slave;

    -- 未启用GTID模式时
    stop slave; -- stop slave for channel 'master_201';
    set global sql_slave_skip_counter=N --N为数字,表示跳过N个事件
    start slave;

    【3.4.2】监控通道channel 信息,在performance_schema 增加了一些 replication 的监控表;
    use performance_schema;
    show tables like 'replicat%';
    select * from performance_schema.replication_connection_statusG
  • 相关阅读:
    Redis:五、Redis持久化
    Redis:四、jedis连接redis服务器
    Redis:三、Key和Value
    php 拆分的 string里包含“2”或“1”符号(“”或者“”)
    清除float浮动
    js 判断数据类型
    form表单里target属性(在新窗口打开页面)
    think PHP5实现文件下载
    echarts自定义提示框内容
    Chrome浏览器不支持小于12px的字体大小
  • 原文地址:https://www.cnblogs.com/gered/p/11613961.html
Copyright © 2011-2022 走看看