mysql多主多从架构与mysql-proxy读写分离
最近心血来潮想要部署几台mysql的服务器,实现一个多主多从的服务器架构,并且要在这个架构上利用mysql-proxy实现读写分离操作,之前只是搭建过一主多从的架构,原本以为多主多从的架构也会非常简单,但是过程中还是发现了一些比较有意思的地方,所以我决定还是写一篇博客来记录一下。
下面是我的mysql多主多从架构拓扑图:
主从结构以及IP地址已经很明显,接下来我说说我的配置,以及在我搭建过程中遇到的一些比较有意思的问题。
主从同步的具体配置过程可以参考本人博客:http://8838848.blog.51cto.com/8828848/1538999
互为主从结构只不过是在master1于master2上互相设置主服务器为对方:
本机登录master1的数据库:
mysql > changemaster to \
-> master_host=’10.60.77.207’ ,\
->master_user=’slaveuser’, \
->master_password=’123456’, \
->master_log_file=’mysqld-bin.000001’, \
->masetr_log_pos=243;
此处有一个问题,每一条配置后面都要有一个英文逗号作为分隔,如果不写或者写成别的符号会报错。记得有一次在配置的过程中我就没写逗号,然后一直报错,后来反复检查发现这个逗号是必不可少的。
至于两台从服务器配置与我上述博客中的配置完全相同,配置完成后开启主从服务,正式开始测试阶段,就是在这个时候,开始出现问题,我的测试过程如下:
先在master1上创建一个新的数据库,然后,在slave1上和master上查看,此时数据是正常的。但是在slave2上查看的时候我发现slave2并没有将该数据库同步过来。发现这个问题之后,我就去master2上新建一个数据库,和我猜想的一样,除了slave1以外的主机都可以正常同步。
这个问题很值得思考,为什么会有这样的结果,后来经过思考、询问大牛等发现,这个机制其实就类似于某些路由选择协议中的放环机制,防止sql语句在各台设备中出现回环。
同时,在大牛的帮助下,找到了实现上述架构的配置选项。当你需要链式复制的时候,如A->B->C,你就必须在B主机上的mysql中添加一条配置:
log_slave_updates,此配置允许链式复制。
在本文的架构中,master1和master2的mysql配置文件中的[mysqld]部分中添加上述配置,然后重启两台服务器的mysql服务。这次再测试一下发现,所有的机器上都可以正常同步了。
上述问题是在搭建主从结构的时候遇到的一个问题,接下来,我在搭建mysql-proxy的时候无意中又发现了一个问题,注意,上述测试过程中,我第一次在master1和master2分别创建的测试数据库在slave2和slave1上是没有同步到的,也就是我在搭建mysql-proxy服务的时候,在slave1和slave2上数据库其实是不同的。
关于使用mysql-proxy搭建读写分离的实验可以参考我的博客http://8838848.blog.51cto.com/8828848/1539134,此次我发现的问题不在服务的配置上。
在我测试的过程中,我连接mysql-proxy读取数据,发现我此时查看到的数据库是slave1和slave2上的数据的和,也就是slave1和slave2上面所有的数据库我都能看到。这也就意味着,mysql-proxy在分配读写请求的时候并不是按照负载均衡的方式来分配读写的,而是请求会同时分配到两台主机上,两台主机同时响应该请求。
这个问题的发现使我对我这个小架构有了一个新的认识,原来我设计这个架构的初衷是为了提供一个负载均衡的效果,现在看来使用mysql-proxy并不能实现负载均衡,倒是可以提高系统的性能,因为这相当于两台机器合成成了一台服务器在提供服务嘛。
这篇博客可能技术含量不大,但是这些问题的确是我在工作中摸索出来的经验,所以我还是决定把这些记录下来,作为我给人的一个技术积累,欢迎各位看官给我留言,也请大神不要喷我。
我们都是手艺人,运维也是一种手艺,是一门艺术,我爱这一行,我爱我的工作。