目前公司有需求做MySQL高可用读写分离,网上搜集了不少方案,都不尽人意,下面是我结合现有组件拼凑的实现方案,亲测已满足要求,希望各位多提建议 :)
一、 网上方案整理(搜集地址不详。。。)
1、MySQL Replication
对于单一的MySQL同步功能,因无法实现IP地址的自动切换,而该表中所列的功能是MySQL Replication的单向同步工作方式,需要改进为双向同步,就可以实现数据的双向同步、重同步、数据库切换的功能。
2、MySQL Replication+Heartbeat
对于第二种方案,引入了heartbeat,所以可以实现IP地址切换,heartbeat只针对主机和网络故障的切换,无法监控数据库故障,所以需要额外的工具和配置,而且MySQL Replication的工作机制为异步通讯方式,对同步的数据的一致性可能产生影响。
3、MySQL+Heartbeat+DRBD
对于第三种采用了DRBD,DRBD是Distributed Replicated Block Device,是基于内核开发的一个虚拟块设备的工具,该软件可以在一个实际块设备或分区上虚拟一个块设备,并挂载到系统之上,两台主机通过配置,来同步块设备上的数据,能够实现双向实时同步的功能,但同时只能有一台主机处于活动状态,从服务器上的虚拟块设备无法挂载,从而不能启动从服务器的MySQL服务,在切换时需要从服务器控制启动顺序,按顺序切换DRBD,挂载虚拟块设备,启动MySQL,调试中该时延较长。而且DRBD基于内核,在应用调试中,多次导致服务器内核出问题而导致主机死机,所以对于服务器的高稳定需求不满足。
4、MySQL Cluster
集群方式一般应用在负载均衡,采用单向同步的方式,对数据的修改只在一台数据库服务器上进行,对于查询则交给其他的数据库服务器,同时无法完成IP地址的自动切换,所以没有调试
5、MySQL+memcached
这种方案采用共享内存的方式,使多个MySQL共享同一内存缓冲区,故不适用备份的目的。
6、MySQL Proxy:
对于IP地址切换的功能,也可以采用MySQL Proxy来实现,其工作原理是在MySQL Server和Client之间添加一个代理设备,通过lua脚本来处理数据请求,可以根据业务需求用lua脚本实现不同的功能,但这种方式将多添加一台MySQL Proxy服务器。
二、推荐方案
采用MySQL Replication+ MySQL Proxy+Heartbeat实现MySQL读写分离HA
1、双Master都安装MySQL Proxy和Heartbeat(也可以单独安装MySQL Proxy,Heartbeat跟MySQL Proxy必须装在一起,MySQL Proxy的代理IP使用Heartbeat浮动IP);
2、多个Slave跟Heartbeat主MasterA进行一主多从模式的数据同步,如果MasterA突然挂掉,Heartbeat自动切换到MasterB,所有的从也会切换到MasterB上(通过Heartbeat的haresources配置实现);
3、Application通过Heartbeat浮动IP访问数据库。
三、测试
为测试方便修改rw-splitting.lua中 min_idle_connections和max_idle_connections的值为1,开启两个以上客户端连接mysql-proxy(这里的ip地址是Heartbeat浮动IP)
mysql -h172.**.**.** –P4040 -uroot –pcoship
use 测试数据库
1、先插入部分数据,再登陆主从多服务器的MySQL查看数据是否同步;
2、然后在从服务执行stop slave;在插入数据(目的是不然数据同步到从服务),再执行查询操作,查看是否是在从上面查询;
3、直接关闭MasterA服务器,看MySQL是否可以继续使用;
目前上面方案已经实现并已写成自动化安装,具体安装配置有需要的同学可以评论回复;