一、环境
Master(主机A):192.168.1.1
Slave(主机B) :192.168.1.2  
W-VIP(写入)  :192.168.1.3 
R-VIP(读取)  :192.168.1.4 
Client(测试) :192.168.1.100

操作系统版本:CentOS release 6.4
MySQL数据库版本:5.6.14
keepalived版本:1.2.7
LVS版本:1.26

所有环境均为虚拟机

二、设计思路

1. 服务器A和B,通过mysql的slave进程同步数据。
2. 通过keepalived启用两个虚IP:W-VIP/R-VIP,一个负责写入,一个负责读取,实现读写分离。
3. A和B都存在时,W-VIP下将请求转发至主机A,R-VIP将请求转发给A和B,实现负载均衡。
4. 当主机A异常时,B接管服务,W-VIP/R-VIP此时漂到了主机B上,此时这两个虚IP下都是主机B,实现高可用
5. 当主机B异常时,R-VIP会将B踢出,其他不变

三、架构图

四、软件安装
主从两个主机都要装以下软件:
1. MySQL的安装(略)
2. keepalived安装
yum install keepalived
2. LVS安装
yum install ipvsadm

五、配置
1. 配置MySQL的主从复制(略)
2. 配置keepalived
Master上的配置
vi /etc/keepalived/keepalived.conf

  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id MySQL-ha
  4. }
  5. vrrp_instance VI_1 {
  6. state BACKUP
  7. interface eth1
  8. virtual_router_id 90
  9. priority 100
  10. advert_int 1
  11. notify_master "/usr/local/mysql/bin/remove_slave.sh"
  12. nopreempt
  13. authentication {
  14. auth_type PASS
  15. auth_pass 1111
  16. }
  17. virtual_ipaddress {
  18. 192.168.1.3 label eth1:1
  19. 192.168.1.4 label eth1:2
  20. }
  21. }
  22. virtual_server 192.168.1.3 6603 {
  23. delay_loop 2
  24. lb_algo wrr
  25. lb_kind DR
  26. persistence_timeout 60
  27. protocol TCP
  28. real_server 192.168.1.1 6603 {
  29. weight 3
  30. notify_down /usr/local/mysql/bin/mysql.sh
  31. TCP_CHECK {
  32. connect_timeout 10
  33. nb_get_retry 3
  34. delay_before_retry 3
  35. connect_port 6603
  36. }
  37. }
  38. }
  39. virtual_server 192.168.1.4 6603 {
  40. delay_loop 2
  41. lb_algo wrr
  42. lb_kind DR
  43. persistence_timeout 60
  44. protocol TCP
  45. real_server 192.168.1.1 6603 {
  46. weight 1
  47. notify_down /usr/local/mysql/bin/mysql.sh
  48. TCP_CHECK {
  49. connect_timeout 10
  50. nb_get_retry 3
  51. delay_before_retry 3
  52. connect_port 6603
  53. }
  54. }
  55. real_server 192.168.1.2 6603 {
  56. weight 3
  57. TCP_CHECK {
  58. connect_timeout 10
  59. nb_get_retry 3
  60. delay_before_retry 3
  61. connect_port 6603
  62. }
  63. }
  64. }

keepalived配置成服务并开机启动

  1. cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
  2. cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  3. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
  4. chkconfig --add keepalived
  5. chkconfig --level 345 keepalived on

vi /usr/local/mysql/bin/remove_slave.sh

  1. #!/bin/bash
  2. user=u1
  3. password=12345
  4. log=/usr/local/mysql/log/remove_slave.log
  5. echo "`date`" >> $log
  6. /usr/local/mysql/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log
  7. /bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf

vi /usr/local/mysql/bin/mysql.sh

  1. #!/bin/bash
  2. /etc/init.d/keepalived stop

Slave上的配置
vi /etc/keepalived/keepalived.conf

  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id MySQL-ha
  4. }
  5. vrrp_instance VI_1 {
  6. state BACKUP
  7. interface eth1
  8. virtual_router_id 90
  9. priority 99
  10. advert_int 1
  11. notify_master "/usr/local/mysql/bin/remove_slave.sh"
  12. authentication {
  13. auth_type PASS
  14. auth_pass 1111
  15. }
  16. virtual_ipaddress {
  17. 192.168.1.3 label eth1:1
  18. 192.168.1.4 label eth1:2
  19. }
  20. }
  21. virtual_server 192.168.1.3 6603 {
  22. delay_loop 2
  23. lb_algo wrr
  24. lb_kind DR
  25. persistence_timeout 60
  26. protocol TCP
  27. real_server 192.168.1.2 6603 {
  28. weight 3
  29. notify_down /usr/local/mysql/bin/mysql.sh
  30. TCP_CHECK {
  31. connect_timeout 10
  32. nb_get_retry 3
  33. delay_before_retry 3
  34. connect_port 6603
  35. }
  36. }
  37. }
  38. virtual_server 192.168.1.4 6603 {
  39. delay_loop 2
  40. lb_algo wrr
  41. lb_kind DR
  42. persistence_timeout 60
  43. protocol TCP
  44. real_server 192.168.1.2 6603 {
  45. weight 3
  46. notify_down /usr/local/mysql/bin/mysql.sh
  47. TCP_CHECK {
  48. connect_timeout 10
  49. nb_get_retry 3
  50. delay_before_retry 3
  51. connect_port 6603
  52. }
  53. }
  54. }

keepalived配置成服务并开机启动

  1. cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
  2. cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  3. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
  4. chkconfig --add keepalived
  5. chkconfig --level 345 keepalived on

vi /usr/local/mysql/bin/remove_slave.sh

  1. #!/bin/bash
  2. user=u1
  3. password=12345
  4. log=/usr/local/mysql/log/remove_slave.log
  5. echo "`date`" >> $log
  6. /usr/local/mysql/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log
  7. /bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf

vi /usr/local/mysql/bin/mysql.sh

  1. #!/bin/bash
  2. /etc/init.d/keepalived stop

3. 配置LVS
Master与Slave上的配置相同:
vi /usr/local/bin/lvs_real.sh

  1. #!/bin/bash
  2. # description: Config realserver lo and apply noarp
  3. SNS_VIP=192.168.1.3
  4. SNS_VIP2=192.168.1.4
  5. source /etc/rc.d/init.d/functions
  6. case "$1" in
  7. start)
  8. ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
  9. ifconfig lo:1 $SNS_VIP2 netmask 255.255.255.255 broadcast $SNS_VIP2
  10. /sbin/route add -host $SNS_VIP dev lo:0
  11. /sbin/route add -host $SNS_VIP2 dev lo:1
  12. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  13. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  14. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  15. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  16. sysctl -p >/dev/null 2>&1
  17. echo "RealServer Start OK"
  18. ;;
  19. stop)
  20. ifconfig lo:0 down
  21. ifconfig lo:1 down
  22. route del $SNS_VIP >/dev/null 2>&1
  23. route del $SNS_VIP2 >/dev/null 2>&1
  24. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  25. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
  26. echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
  27. echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
  28. echo "RealServer Stoped"
  29. ;;
  30. *)
  31. echo "Usage: $0 {start|stop}"
  32. exit 1
  33. esac
  34. exit 0
  1. chmod 755 /usr/local/bin/lvs_real.sh
  2. echo "/usr/local/bin/lvs_real.sh start" >> /etc/rc.local

五、Master和Slave的启动
1. 启动Master上的MySQL
service mysql start
2. 启动Slave上的MySQL
service mysql start
3. 启动Master上的realserver脚本
/usr/local/bin/lvs_real.sh start
4. 启动Slave上的realserver脚本
/usr/local/bin/lvs_real.sh start
5. 启动Master上的keepalived
service keepalived start
6. 启动Slave上的keepalived
service keepalived start

六、测试
1. 查看lvs能否进行负载均衡转发
在Master和Slave上分别执行:
ipvsadm -ln

2. 在Client上验证连通性:
ping 192.168.1.3
ping 192.168.1.4
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"
mysql -u u1 -p12345 -P 6603 -h 192.168.1.4 -e "show variables like 'server_id'"

3. 停掉Master上的MySQL,看写IP否自动切换到Slave,看读IP是否去掉了Master的MySQL
在Master和Slave上分别执行:
ipvsadm -ln
在Client上执行:
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"
mysql -u u1 -p12345 -P 6603 -h 192.168.1.4 -e "show variables like 'server_id'"

4. 停掉Master上的keepalived,看读写VIP是否会迁移到Slave上。
在Master和Slave上分别执行:
ipvsadm -ln
在Client上执行:
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"
mysql -u u1 -p12345 -P 6603 -h 192.168.1.4 -e "show variables like 'server_id'"

5. 停掉Slave上的MySQL,看读IP是否去掉了Slave的MySQL
在Master和Slave上分别执行:
ipvsadm -ln
在Client上执行:
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"
mysql -u u1 -p12345 -P 6603 -h 192.168.1.4 -e "show variables like 'server_id'"

6. 重启Master的系统,看看切换过程是否正常

七、参考
http://wenku.baidu.com/link?url=17K0UDApzfK18A8F5Of9wl0lmGx6AD_0PQ8GyVqmCsBMSz16xjt2JI88lPAeID2qECs7piUxkzQLyatTtDuEJxwZEy6joIBfBmT3vgTfdUS
http://blog.chinaunix.net/uid-23500957-id-3781918.html
http://blog.chinaunix.net/uid-23500957-id-3781919.html
http://blog.chinaunix.net/uid-20639775-id-3337471.html

MySQL主从复制与lvs+keepalived单点写入读负载均衡高可用实验【转】的更多相关文章

  1. Lvs+keepAlived实现负载均衡高可用集群(DR实现)

    第1章 LVS 简介 1.1 LVS介绍 LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能. ...

  2. lvs+keepalived+nginx实现高性能负载均衡集群【转】

    转自 lvs+keepalived+nginx实现高性能负载均衡集群 - 青衫lys - 博客园http://www.cnblogs.com/liuyisai/p/5990645.html 一.为什么 ...

  3. LVS+Keepalived-DR模式负载均衡高可用集群

    LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...

  4. 实现基于Haproxy+Keepalived负载均衡高可用架构

    1.项目介绍: 上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务 ...

  5. Nginx+Keepalived负载均衡高可用

    Nginx+Keepalived负载均衡高可用方案: Nginx 使用平台:unix.linux.windows. 功能: A.www web服务  http 80 b.负载均衡(方向代理proxy) ...

  6. JAVAEE——宜立方商城03:Nginx负载均衡高可用、Keepalived+Nginx实现主备

    1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...

  7. Keepalived+Nginx实现负载均衡高可用

    一.负载均衡高可用 Nginx作为负载均衡器,所有请求都到了Nginx,可见Nginx处于非常重点的位置,如果Nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了避免负载均衡服务器的宕机 ...

  8. Nginx+keepalived实现负载均衡高可用配置

    1. 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了屏蔽负载均衡服务 ...

  9. 23.Nginx+keepalived负载均衡高可用

    Nginx+keepalived负载均衡高可用 结构图 环境: 主 服务器:192.168.239.10 备 服务器:192.168.239.20 Web 服务器1:192.168.239.40 We ...

随机推荐

  1. xcode升级插件失效修复

    每次xcode升级以后,插件都会失效.可以通过一行命令解决这个问题. 摘自传人的博客 find ~/Library/Application\ Support/Developer/Shared/Xcod ...

  2. java对mysql数据库进行单表筛选备份、还原操作

    最近在做的一个项目需要对mysql数据库中的单个表格进行备份 其中,一部分表格需要进行筛选备份(例如对最近插入的1000条记录进行备份) 思路:java调用系统命令完成备份操作 假设现在有数据库tes ...

  3. cas sso单点登录系列6_cas单点登录防止登出退出后刷新后退ticket失效报500错

    转(http://blog.csdn.net/ae6623/article/details/9494601) 问题: 我登录了client2,又登录了client3,现在我把client2退出了,在c ...

  4. delphi服务程序(service)的调试方法

    方法一: 1.调试delphi 写的服务程序,有这么一个办法.原来每次都是用attach to process方法,很麻烦.并且按照服务线程的执行线路,可能会停不到想要的断点.笨办法是,在proced ...

  5. SecureCRT上使用公钥登陆Linux服务器

    SecureCRT部分配置 1.首先生成公钥. 打开SecureCRT(我的版本为7.0,估计其他版本基本相同)程序,点击菜单栏的“工具”->“创建公钥”.按照步骤执行.其中一步比较重要就是选择 ...

  6. 用webclient.DownloadFile下载exe文件时大小为0

    用自己写的下载软件从服务器端下载文件,别的文件能下,但exe文件显示下载文件大小为0,连接超时,原因是服务上发布的下载文件夹的虚拟目录的属性有问题, 包含.exe 文件的虚拟目录已启用执行应用程序权限 ...

  7. Extjs中grid表格中去掉红三角

    在编辑Extjs的gridpanel的时候,数据有错误或是修改在每个单元格上都会出现红色的小三角,在每个列上面可以配置allowBlank: false来标识这个不可以为空 有的时候在保存数据时如果不 ...

  8. 逻辑很重要:一句sql语句的事,自己却想了半天,绕了个大弯子

    问题:系统升级后审核认证信息分别写入两个表,现在需要链接用户表和相应的新旧审核表获取字段值? 钻进胡同里:一直纠结于升级之后的会员信息从新表查,升级之前的数据从旧表查,纠结于根据时间戳分条件判断, 其 ...

  9. [Python笔记]第八篇:模块

    本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...

  10. STM32库中 __IO 修饰符(volatile修饰符)

    STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay; 这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原 ...