1、Lvs+keepalived架构数据流向流程参考地址1. 双主Master1和Master2通过keepalived虚拟出的VIP地址对外提供服务2. Slave1和Slave2 通过主从复制,获取与主库相同数据,对外提供读服务3. 通过lvs+keepalived 实现mysql读服务的高可用1. 通过读写分离的方式,减轻了主库的压力(设定环境读远大于写)2. 通过lvs+keepalived实现mysql读服务的高可用3. 通过keepalived实现了mysql双主的同时对外提供服务,实现了写的高可用(当然还有heartbeat+drdb的方案)4. 通过lvs+keepalived 的
2、会话保持功能简单的避免了裂脑的风险1. 双主同时对外提供服务,必须保持两端数据的一致性。这就要求Master 1 和Master 2 之间必须实时的进行数据的同步。这样一来,当有大量数据插入的时候,Master 1 和Master 2之间既要同步,又要将数据给Slave ,所以Master端压力依然很重,数据延迟是一个问题。2. Master 和 Slave 之间,也需要做主从同步,势必会导致Master 端的压力过大,所以我们在做监控的时候,应注意slave端与主库的延迟的问题,这里我会用脚本来简单实现的通过检查slave端的状态,来实现自动剔除功能。3. 同时基于高可用的考虑lvs+kee
3、palived 应尽量也采用主备的模式,因此此方案,的成本控制也会成为一个问题。4. 如果是基于vip地址的同步,同时设置了lvs的会话保持功能,那Slave会只跟这一台机器同步,如果采用的wrr一类的调度算法,很有可能会使,后端所有的Slave,跟同一台Master 同步,那这台主库的压力就可想而知了。所以在Slave端同步的选择上,必须跟同一台固定的MASTER同步我们也要注意。5. 当mysql主主切换的时候,主从会出现很多问题。下面我们就开始基于一个原点,开始逐步配置我们的Mysql高可用架构思路1. 首先在Master 1 和Master 2之间做双向同步2. 配置三个Slave端3
4、. 在Master 1 和Master 2之间做keeplived的高可用4. 开发shell 脚本检查slave的状态5. 做两台lvs+keepalived 主备的 读高可用具体的实施思路主机地址规划主机IP地址主机用途VIP地址Master 1 10.0.0.104主库10.0.0.253Master 210.0.0.102Apache10.0.0.120Web服务器测试程序:Discuz_:下载地址:rootAPACHE www# cat /etc/hosts# Do not remove the following line, or various programs# that re
5、quire network functionality will fail.127.0.0.1 APACHE:1 localhost6.localdomain6 localhost610.0.0.253 mysql.master.vip 此为VIP地址#10.0.0.252 mysql.slave.viprootAPACHE www# ping mysql.master.vipPING mysql.master.vip (10.0.0.253) 56(84) bytes of data.64 bytes from mysql.master.vip (10.0.0.253): icmp_seq=
6、1 ttl=64 time=0.322 ms2. 在Mysql上授权使用用户(这个两端都要设置,因为我们不同步授权表)mysql grant all privileges on web.* to web10.0.0.% identified by 123;复制前的说明:两边都要开启binlog功能server-id不能一样建议两端使用同一个用户进行授权1)在Master 1上的备份sql语句 flush tables with read lock;Query OK, 0 rows affected (0.01 sec) show master status;+-+-+-+-+| File |
7、Position | Binlog_Do_DB | Binlog_Ignore_DB | mysql-bin.000001 | 512 | | |1 row in set (0.00 sec) unlock tables;Query OK, 0 rows affected (0.00 sec)备份sql语句rootrsync bak# mysqldump -uroot -p bbs -B |gzip ./bbs_B.sql.gz授权用户grant replication slave on *.* to slave在Master 2 上从库设置2)导入sql语句rootapache # mysq
8、l -uroot -p RemoteAddress:PortTCP 10.0.0.253:3306 9 306 0 31963 0 10.0.0.102:3306 9 306 0 31963 02)从keepalived 状态rootrsync data# ipvsadm -L -n -stats3306 0 0 0 0 0 10.0.0.104:3306 0 0 0 0 0首先我们先测试正常访问下的web此时我们停掉Master 1 上的数据库,此时主keepalived上面的数据,rootapache # ip add|grep 253 inet 10.0.0.253/32 scope g
9、lobal eth0rootapache # /etc/init.d/mysqld stopShutting down MySQL. OK rootapache # VIP 已经没有了在备keepalived上面检查rootrsync data# ip add|grep 253inet 10.0.0.253/32 scope global eth0VIP已经跳转过来客户端验证 此时我们在网页上发帖子可以看到两个数据库之间的数据是同步的 。恢复主库测试此时,我们启动主keepalived上面的数据库,然后启动Keepalived服务rootapache # /etc/init.d/mysqld
10、startStarting MySQL. OK rootapache # /etc/init.d/keepalived startStarting keepalived: OK 此时在在网站上测试问题1这个在keepalived VIP漂移的时候,两边都出现的问题 No Last_Errno: 1062Last_Error: Error Duplicate entry 1 for key PRIMARY on query. Default database: bbs. Query:INSERT INTO pre_common_onlinetime SET uid= , thismonth=10 , total= , lastupdate=1352792067问题描述重复insert 相同primary key 导致 slave SQL thread终止。而Slave I/O thread 正常运行。如果日志中出现了这样代码,可能是错误的select,或update操作,master是跳过这些操作,但是被记录到了二进制日志中,slave会依据二进制中的语句做相同的动作,就会报错,知道原理了要做的操作就很简单了网上找的办法编辑fmysqldslave_skip_errors = 1062问题2主keepalived重启后,从keepal
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1