• 11 : mysql 主从复制


    半同步复制
    出发点是保证主从数据一致性的问题,安全的考虑

    5.5 出现的概念,但是不建议使用,性能太差

    5.6以后出现group commit 组提交功能,来提升开启版同步复制的性能

    5.7 更加完善了,在group commit基础上出现了MGR
    5.7的增强半同步复制的新特性:after commit; after sync;

    ------
    恢复主从环境:

    1、全备3308 (因为前面我们做延时复制的时候, 模拟了一次故障,从库现在是主了)
    mysqldump -S /data/3308/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/tmp/full3308.sql

    2、从库(3307)恢复备份,并开启主从
    mysql -S /data/3307/mysql.sock
    mysql>set sql_log_bin=0;
    mysql>source /tmp/full3308.sql

    获取主从复制起点:(也可以show master status;在主库3308上面)
    -----------vim +22 /tmp/full3308.sql 第22行----------------------------------------
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=120;
    ------------------------------------------------------------------------------

    从库3307执行:
    mysql>CHANGE MASTER TO
    MASTER_HOST='192.168.6.181',
    MASTER_USER='repl',
    MASTER_PASSWORD='123',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000006',
    MASTER_LOG_POS=361,
    MASTER_CONNECT_RETRY=10;
    mysql> start slave;
    mysql> show slave status G

    将3308主库只读关闭
    mysql -S /data/3308/mysql.sock
    mysql>set global read_only=0;
    将配置文件read_only去掉 (主库需要正常写入操作的,所以需要关掉只读模式)

    将3307从库只读打开
    mysql -S /data/3307/mysql.sock
    mysql>set global read_only=1;
    将配置文件read_only=1

    -------------------------------------------------------
    半同步复制:
    加载插件 (半同步需要加载插件才能使用半同步功能)

    主3308:
    mysql -S /data/3308/mysql.sock
    mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';


    从3307:
    mysql -S /data/3307/mysql.sock
    mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

    查看是否加载成功:
    主3308:
    mysql>show plugins;
    | partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
    | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
    +----------------------------+----------+--------------------+--------------------+---------+
    43 rows in set (0.00 sec)

    从3307:
    mysql>show plugins;
    | partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
    | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
    +----------------------------+----------+--------------------+-------------------+---------+
    43 rows in set (0.00 sec)

    启动插件:
    主:
    mysql -S /data/3308/mysql.sock
    mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

    mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;

    修改配置文件:

    [mysqld]下面添加刚才的两句:

    rpl_semi_sync_master_enabled = 1;

    rpl_semi_sync_master_timeout = 1000;

    从:
    mysql -S /data/3307/mysql.sock
    mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

    [mysqld]下面添加刚才的两句:

    rpl_semi_sync_slave_enabled = 1;

    重启从库上的IO线程

    mysql -S /data/3307/mysql.sock
    mysql>stop SLAVE IO_THREAD;
    mysql>start SLAVE IO_THREAD;


    查看是否在运行
    主:
    mysql -S /data/3308/mysql.sock
    mysql> show status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | ON |
    +-----------------------------+-------+
    1 row in set (0.00 sec)
    从:
    mysql -S /data/3307/mysql.sock
    mysql> show status like 'Rpl_semi_sync_slave_status';
    +----------------------------+-------+
    | Variable_name | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | ON |
    +----------------------------+-------+
    1 row in set (0.00 sec)

    到此 -- 主从半同步复制搭建好了,从库现在已经是半同步复制。

    -------------------------------------

    七、复制过滤(了解就好,工作中用的不多,大多数是用软件实现的)

    先看一张图:
    xxxxxxx

    1:假如现在是一主2从(从1,从2)。主里面有三个库(bbs,blog,wordpress)
    2: 现在我想在主从复制的时候, 只把bbs复制到从1,blog,wordpress 复制到从2
    应该如何实现?
    这个时候就需要复制过滤的功能;


    主库方面:(可以这样设置,但是不能这样,所以不能主库设置白黑名单)
    mysql> show master status;(可以看到Position后面还有三个参数)
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000006 | 361 | | | |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    白名单:只记录白名单中列出的库的二进制日志
    binlog-do-db

    黑名单:不记录黑名单列出的库的二进制日志
    binlog-ignore-db

    从库:

    白名单:只执行白名单中列出的库或者表的中继日志

    --replicate-do-db=test(一般情况只设置白名单就行。只用这一句,只复制这个库)
    --replicate-do-table=test.t1
    --replicate-wild-do-table=test.x*

    黑名单:不执行黑名单中列出的库或者表的中继日志
    --replicate-ignore-db
    --replicate-ignore-table
    --replicate-wild-ignore-table

    例子:

    [root@db01 data]# vim /data/3307/my.cnf
    replicate-do-db=world

    停掉3307从库。重新做主从复制:
    mysqladmin -S /data/3307/mysql.sock shutdown
    重新初始化数据,测试白名单。
    mysqld_safe --defaults-file=/data/3307/my.cnf &
    ........此处省略搭建主从复制过程.....
    ++++++++++++++++++++
    测试复制过滤:

    第一次测试:
    主库:
    mysql -uroot -p123 -S /data/3308/mysql.sock
    use world
    create table t1(id int);

    从库查看结果:
    mysql -uroot -p123 -S /data/3307/mysql.sock
    use world
    show tables;
    --------------

    第二次测试:
    主库:
    mysql -uroot -p123 -S /data/3308/mysql.sock
    use test
    create table tb1(id int);

    从库查看结果:
    mysql -uroot -p123 -S /data/3307/mysql.sock
    use test
    show tables;

    ----------------------------------------------------------

  • 相关阅读:
    【BZOJ】2019: [Usaco2009 Nov]找工作(spfa)
    【BZOJ】3668: [Noi2014]起床困难综合症(暴力)
    Redis 字符串结构和常用命令
    Redis实现存取数据+数据存取
    Spring 使用RedisTemplate操作Redis
    使用 java替换web项目的web.xml
    SQL server 从创建数据库到查询数据的简单操作
    SQL server 安装教程
    IntelliJ IDEA 注册码(因为之前的地址被封杀了,所以换了个地址)
    对程序员有帮助的几个非技术实用链接(点我,你不会后悔的)
  • 原文地址:https://www.cnblogs.com/jim-xu/p/11668486.html
Copyright © 2020-2023  润新知