首页 > 代码库 > 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