首页 > 代码库 > mysql5.5 读写分离 半同步

mysql5.5 读写分离 半同步

 读写分离

    一般我们从服务器端是只负责客户的读请求的,主服务端负责写请求的。那么配置下吧!
    首先查看下从服务器端的只读方式是否打开。
    mysql> show global variables like ‘read%‘;
    +----------------------+---------+
    | Variable_name        | Value   |
    +----------------------+---------+
    | read_buffer_size     | 1048576 |
    | read_only            | OFF     |
    | read_rnd_buffer_size | 4194304 |
    +----------------------+---------+
    3 rows in set (0.00 sec)
    打开我们的只读方式有两种
    一种是在mysql服务器端的全局模式下配置,但是在全局模式下配置mysql重启之后就会失效;
    一种是在/etc/my.cnf配置文件中配置,这个配置是永久生效;这里我们选择第二种。
    给/etc/my.cnf配置文件添加一行如下:
    [root@slave1 ~]# vim /etc/my.cnf
    read_only = ON
    然后重启启动下我们的mysql服务器。
    [root@slave1 ~]# service mysqld restart
    Shutting down MySQL......                                  [  OK  ]
    Starting MySQL..................                           [  OK  ]
    进入mysql服务测试下是否启动只读模式。    
    
    主服务器端执行了写操作,日志文件立即同步到从服务器端,设置这些是为了保证事务的完整性。
    在主服务器端[mysqld]添加skip_slave_start = 1 


一 、MySQL5.5 除了支持内置的异步复制机制,还提供了接口支持半同步复制的机制。
        异步复制的缺点: MySQL复制默认是异步复制,Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。
        半同步复制的概念:
        i.
        当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。
        ii. 当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。
        iii.
        当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。
        iv.  如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。
        v.
        半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。
    

    二、半同步的定义:主服务器端执行了写操作,必须往从服务器端复制一份,才能给客户端返回提交状态。
        这里我们需要在主服务器端安装semisync_master.so从服务器端安装semisync_slave.so
        具体步骤如下:
        主服务器端:
        mysql> install plugin rpl_semi_sync_master SONAME ‘semisync_master.so‘;
        Query OK, 0 rows affected (0.36 sec)
        安装好之后看下是否启动如果没有启动我们启用下。
          mysql>show global variables like ‘%rpl%‘;        
        
        主服务器端开启semi_sync功能,并设置等待时候为3秒。
        mysql> set global rpl_semi_sync_master_enabled =1;
        Query OK, 0 rows affected (0.02 sec)
        mysql> set global rpl_semi_sync_master_timeout = 3000 ;
        Query OK, 0 rows affected (0.00 sec)
        
          mysql>show global variables like ‘%rpl%‘;    
        从服务器端:
        mysql> install plugin rpl_semi_sync_slave  SONAME ‘semisync_slave.so‘;
        Query OK, 0 rows affected (0.28 sec)
           mysql>show global variables like ‘%rpl%‘;    
        从服务器端开启semi_sync功能。
        mysql> set global rpl_semi_sync_slave_enabled =1;
        Query OK, 0 rows affected (0.03 sec)
        重启服务
        stop slave io_thread
        start slave io_thread
          mysql>show global variables like ‘%rpl%‘;    
        验收从主服务端:    
           mysql>show global status like ‘rpl%;
        半同步复制是如果从服务端没有开启的话,主服务端第一次会延迟3秒中之后提交,之后主服务端会降低延迟不再等待从服务端。从服务端开启之后在追赶上主服务端让后在实现半同步。
        实现演示下:
        1、先关闭从服务端。
        mysql> stop slave;
        Query OK, 0 rows affected (0.02 sec)
        2、主服务端创建一个semidb数据库
         mysql>create database  semidb;
        
        3、从服务端启动服务。
        mysql> start slave;
        Query OK, 0 rows affected (0.03 sec)    
        mysql> show slave status\G