数据库的读写分离的好处?mysql
1. 将读操做和写操做分离到不一样的数据库上,避免主服务器出现性能瓶颈;linux
2. 主服务器进行写操做时,不影响查询应用服务器的查询性能,下降阻塞,提升并发;sql
3. 数据拥有多个容灾副本,提升数据安全性,同时当主服务器故障时,可当即切换到其余服务器,提升系统可用性;数据库
读写分离的基本原理就是让主数据库处理事务性增、改、删操做(INSERT、UPDATE、DELETE)操做,而从数据库处理SELECT查询操做。数据库复制被用来把事务性操做致使的变动同步到其余从数据库。以SQL为例,主库负责写数据、读数据。读库仅负责读数据。每次有写库操做,同步更新到读库。写库就一个,读库能够有多个,采用日志同步的方式实现主库和多个读库的数据同步。数组
Replication原理
Mysql 的 Replication 是一个异步的复制过程,从一个MySQL节点(称之为Master)复制到另外一个MySQL节点(称之Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(SQL 线程和 I/O 线程)在 Slave 端,另一个线程(I/O 线程)在 Master 端。
www.2cto.com
要实现 MySQL 的 Replication ,首先必须打开 Master 端的 Binary Log,由于整个复制过程实际上就是 Slave 从 Master 端获取该日志而后再在本身身上彻底顺序的执行日志中所记录的各类操做。
看上去MySQL的Replication原理很是简单,总结一下:
* 每一个从仅能够设置一个主。
* 主在执行sql以后,记录二进制log文件(bin-log)。
* 从链接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行sql,一旦遇到错误则中止同步。
从这几条Replication原理来看,能够有这些推论:
* 主从间的数据库不是实时同步,就算网络链接正常,也存在瞬间,主从数据不一致。
* 若是主从的网络断开,从会在网络正常后,批量同步。
* 若是对从进行修改数据,那么极可能从在执行主的bin-log时出现错误而中止同步,这个是很危险的操做。因此通常状况下,很是当心的修改从上的数据。
* 一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,能够工做良好。
* 若是须要多主的话,能够用环形配置,这样任意一个节点的修改均可以同步到全部节点。安全
主从设置
由于原理比较简单,因此Replication从MySQL 3就支持,并在全部平台下能够工做,多个MySQL节点甚至能够不一样平台,不一样版本,不一样局域网。作Replication配置包括用户和my.ini(linux下为my.cnf)两处设置。
首先在主MySQL节点上,为slave建立一个用户:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.1.10' IDENTIFIED BY 'slave';
实际上,为支持主从动态同步,或者手动切换,通常都是在全部主从节点上建立好这个用户。而后就是MySQL自己的配置了,这须要修改my.cnf或者my.ini文件。在mysqld这一节下面增长: 服务器
server-id=1
auto-increment-increment=2
auto-increment-offset=1
log-bin
binlog-do-db=mstest
binlog_format=mixed
master-host=192.168.1.62
master-user=slave
master-password=slave
replicate-do-db=mstest
上面这两段设置,前一段是为主而设置,后一段是为从设置的。也就是说在两个MySQL节点上,各加一段就好。binlog-do-db和 replicate-do-db就是设置相应的须要作同步的数据库了,auto-increment-increment和auto- increment-offset是为了支持双主而设置的(参考下一节),在只作主从的时候,也能够不设置。 网络
双主的设置
从原理论来看MySQL也支持双主的设置,即两个MySQL节点互为主备,不过虽然理论上,双主只要数据不冲突就能够工做的很好,但实际状况中还 是很容发生数据冲突的,好比在同步完成以前,双方都修改同一条记录。所以在实际中,最好不要让两边同时修改。即逻辑上仍按照主从的方式工做。但双主的设置 仍然是有意义的,由于这样作以后,切换主备会变的很简单。由于在出现故障后,若是以前配置了双主,则直接切换主备会很容易。
双主在设置时,只需将上面的一段设置复制一份,分别写入两个MySQL节点的配置文件,但要修改相应的server-id,auto- increment-offset和master-host。auto-increment-offset就是为了让双主同时在一张表中进行添加操做时不 会出现id冲突,因此在两个节点上auto-increment-offset设置为不一样的值就好。 另:不要忘了,在两个节点上都为对方建立用户。应用层的负载均衡 本文只介绍了MySQL自身的Repilication配置,在上面的图中也能够看出,有了Replication,还须要应用层(或者中间件)作一个负载均衡,这样才能最大程度发挥MySQL Replication的优点,这些将在之后探讨。并发