• Mysql5.6.x版本半同步主从复制的开启方法


    Mysql5.6.x版本半同步主从复制的开启方法

     

    介绍

        先了解一下mysql的主从复制是什么回事,我们都知道,mysql主从复制是基于binlog的复制方式,而mysql默认的主从复制方式,其实是异步复制.

        主库实际上并不关心从库是否把数据拉完没有,也不关心从库有没有把数据写进硬盘入库,反正数据丢过去,让从库自己慢慢跑,而实际上这也并不影响主库任何使用的情况.

        细心的人就会发现,这种情况下,假如主库临时挂了,binlog还没传输完毕,即使是集群也不能保证说这挂了之后的数据一致性,因为你不能排除别人在主库是正常提交的,而从库没有数据的情况.

        然后在某个位面的时间上,就有人提出同步复制的概念,意思就是说,只要从库没写入,主库就不返回完成,这个时候即使主库挂了,这也只是一个未完成的事务,从库也不会记录,能保证数据一致性.

        看上去,数据一致性是解决了,但是呢,每个事务的延时就增大了,如果是大事务的话,就更惨,这得看网络带宽能不能顶得住,不然延时更低,性能更差.

        最后,在mysql5.5之后,半同步就提出来了,意思就是说,每个事务的复制,至少保证一个从库已经收到了binlog,主库才返回事务完成,但不需要理会从库是否写入硬盘.

        这样做虽然延时还是有,但是比起完全的同步方式还是好太多,对于数据一致性要求高的情况,牺牲性能来换取一定的价值,是在所难免的.

      

    大家留意上面的数字,

    第一部,客户端提交sql语句,

    第二部,提交给存储引擎解析并处理数据修改,

    第三部,事务在主库处理完毕,处于待完成状态,等待最终完成,

    第四部,同时提交给各从库,等待完成,

    第五部,从库返回状态给主库,标记已完成,半同步只需要一个从库返回就可以,其他会转成异步

    第六部,返回客户端,整个事务已完成.

    看上去还是比较不错,主从的数据一致性得到很大的提高,但是延时也不含糊,就是牺牲性能来提高一致性的问题了.

    不过我还是得负责任的讲句,在极端的情况下,还是可能会丢一些数据的,所以定期做主从数据校验还是有必要的,例如使用PT工具什么的,至于为什么,这个不仿让大家思考一下,而对于大事务来说,半同步也是比较无力的情况,性能损耗较大.

    安装使用

    下面来看看如何安装使用半同步,大部分mysql本身并没有预装半同步的组件,需要另外安装,但是一般mysql的包里面会自带so文件,所以只要手动加载一下就可以用了.

    安装使用

    下面来看看如何安装使用半同步,大部分mysql本身并没有预装半同步的组件,需要另外安装,但是一般mysql的包里面会自带so文件,所以只要手动加载一下就可以用了.

    #查找mysql插件目录位置

    mysql> show variables like 'plugin_dir';
    +---------------+---------------------------------+
    | Variable_name | Value                           |
    +---------------+---------------------------------+
    | plugin_dir    | /roobo/server/mysql/lib/plugin/ |
    +---------------+---------------------------------+
    1 row in set (0.00 sec)

     #查看文件

    [root@m2 ~]# cd /roobo/server/mysql/lib/plugin/
     
    [root@m2 plugin]# ll
    总用量 1048
    -rwxr-xr-x. 1 mysql mysql  16445 5月   8 2017 adt_null.so
    -rwxr-xr-x. 1 mysql mysql  25459 5月   8 2017 auth.so
    -rwxr-xr-x. 1 mysql mysql  12532 5月   8 2017 auth_socket.so
    -rwxr-xr-x. 1 mysql mysql  24544 5月   8 2017 auth_test_plugin.so
    -rw-r--r--. 1 mysql mysql    227 5月   8 2017 daemon_example.ini
    drwxr-xr-x. 2 mysql mysql   4096 5月   8 2017 debug
    -rwxr-xr-x. 1 mysql mysql  38715 5月   8 2017 libdaemon_example.so
    -rwxr-xr-x. 1 mysql mysql  17827 5月   8 2017 mypluglib.so
    -rwxr-xr-x. 1 mysql mysql  11865 5月   8 2017 mysql_no_login.so
    -rwxr-xr-x. 1 mysql mysql  18079 5月   8 2017 qa_auth_client.so
    -rwxr-xr-x. 1 mysql mysql  23862 5月   8 2017 qa_auth_interface.so
    -rwxr-xr-x. 1 mysql mysql  12934 5月   8 2017 qa_auth_server.so
    -rwxr-xr-x. 1 mysql mysql 414708 5月   8 2017 semisync_master.so  #有semisync开头的文件,就说明插件安装成功了。
    -rwxr-xr-x. 1 mysql mysql 247783 5月   8 2017 semisync_slave.so   #有semisync开头的文件,就说明插件安装成功了。
    -rwxr-xr-x. 1 mysql mysql 168184 5月 8 2017 validate_password.so

     #看到下面两个,就是半同步的组件了,一个是主库组件,一个是从库组件,你可以两个都装上或者只装一个.

    semisync_master.so
    semisync_slave.so

     #下面开始正式安装:

    #在主库上执行

    mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
    mysql> show plugins;
    #看到下面这个就证明成功了
    rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL

     #从库当然也要做

    #然后在从库执行
    mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
    mysql> show plugins;
    #看到下面这个就证明成功了
    rpl_semi_sync_slave  | ACTIVE | REPLICATION | semisync_slave.so  | GPL

    安装完了,就开始准备启动了,

    主库很简单,只要设置一下半同步启动就可以了.

    mysql> set global rpl_semi_sync_master_enabled = on;

    当然,你也可以写到配置文件,不过写到配置文件要重启才生效,而且还要重新加载组件,所以这就没意思了.

    然后到从库,slave要重启动IO线程来生效,否则还是异步的方式复制数据。

    mysql> set global rpl_semi_sync_slave_enabled = on;
    mysql> stop slave IO_THREAD;
    mysql> start slave IO_THREAD;

    同样你也能写到配置文件,我就不多说了,反正这就启动完毕了.

    下面来验证一下是否成功,以下是主库的信息,因为从库很多信息是没有的.

    来看看我们能设置些什么关于半同步的参数

    mysql> show variables like '%Rpl%';
    +------------------------+----------+
    | Variable_name          | Value    |
    +------------------------+----------+
    | rpl_stop_slave_timeout | 31536000 |
    +------------------------+----------+
    1 row in set (0.00 sec)

    更多详细情况参考:

    https://www.cnblogs.com/paul8339/p/8177683.html

    https://www.cnblogs.com/abobo/p/4242417.html  (备注:这个介绍的更详细)

    other:

    主从复制参考:

    http://www.cnblogs.com/agileai/p/6126823.html

  • 相关阅读:
    Swap file ".hive-site.xml.swp" already exists
    Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误
    hbase启动后HMaster进程自动关闭
    Hadoop数据分析平台项目实战(基于CDH版本集群部署与安装)
    Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
    Exception in thread "main" java.lang.NullPointerException
    eclipse工具下hadoop环境搭建
    18/03/18 04:53:44 WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
    java.net.ConnectException: Call From slaver1/192.168.19.128 to slaver1:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org
    从gitlab下载下来的maven无法运行,老报404解决方法
  • 原文地址:https://www.cnblogs.com/dengbingbing/p/10429086.html
Copyright © 2020-2023  润新知