一、主从复制与读写分离
1.1.1、意义
企业中的业务通常数据量都比较大,而单台数据库在数据存储、安全性和高并发方面都无法满足实际的需求,所以需要配置多台主从数据服务器,以实现主从复制,增加数据可靠性,读写分离,也减少数据库压力和存储引擎带来的表锁定和行锁定问题。
1.1.2、原理
MySQL的主从复制和MySQL读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
1.1.3、mysql支持的复制类型
1)基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
2)基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。3)混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
一、主从复制的工作过程
1)在每个事务更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成后,Master 通知存储引擎提交事务。
- Slave 将Master的Binary log复制到其中继日志。首先,Slave 开始个工作线程-I/O线程,I/O线程在Master上打开一一个普通的连接,然后开始Binlog dumpprocess。Binlog dump process从Master 的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件。I/O 线程将这些事件写入中继日志。3) SQL slave thread (SQL从线程)处理该过程的最后步。SQL 线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与1/O线程保持-一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行 操作。
二、主从读写分离原理
简单来说,读写分离(见图)就是只在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从数据库处理selet查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。
基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库,有两个代表性程序。
(1) MySQL-Proxy。MySQL-Proxy 为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL-Proxy用到生产环境。
(2)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
环境准备:
需要准备五台主机,一台作主数据库服务器,两台做从服务器,还需要一台Amoeba的服务器作为中间代理,用于客户机登录数据库进行读写操作,而不用直接登录主从服务器。
1、为了保证数据同步必须先保证时间同步,在三台服务器均做时间同步
[root@master ~]# ntpdate ntp.aliyun.com
21 Oct 18:29:46 ntpdate[44242]: step time server 120.25.115.20 offset 1.449094 sec
主服务器配置:
从服务器配置:
master_log_file:需要同步的二进制日志文件名,即主服务器上查询到的状态中file
master_log_pos:断点位置,即主服务器上查询到的状态position
查看从服务器状态: mysql> show slave status \G
4、验证主从复制效果
在主服务器上创建aaa数据库:
mysql> create database aaa;
Query OK, 1 row affected (0.01 sec)
在两个从服务器上查看:有aaa数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
同步到了主服务器的数据,主从复制实现。
**amoeba配置:**
安装jdk依赖包