Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50653
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 172
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-12 08:12
个人简介

生命在于折腾~~~ 在SQL中摸爬滚打~~~ 微博 @iheycc

文章分类

全部博文(4)

文章存档

2016年(1)

2013年(3)

我的朋友

分类: Mysql/postgreSQL

2013-06-30 00:49:44

LVS+Keepalived实现MySQL写高可用和读负载均衡

主库高可用和只读库负载均衡,是在主主高可用方案的基础上做改进,这里只介绍实现细节的不同。

keepalived架构

同一个keepalived配置读写分离2VIP,可以有两种办法:

  • 一种是读写VIP共用同一个VRRP实例。这种方案中,两个VIP会绑定在当前的主库机器上,分别提供读写请求。所有的业务请求都会进入主库,其LVS在分离部分读负载到从库。这个配置维护简单。
  • 另一种是读写VIP各自独立VRRP示例。这种方案中,两个VIP可以绑定在主从库机器上。写请求会进入主库,读请求进入从库,从库的LVS做负载均衡,部分读分离到主库。这种配置维护复杂。

架构图如下:


LVS架构中的directorrealserver是同一台机器时,会出现两台director无限循环转发请求的情况。具体分析如下:

a) director1master1)收到目的地址为VIP数据包。

b) director1经过ip_vs对数据包做负载均衡,部分包转发给realserver2mater2/director2)。

c) director2收到的转发包,目的地址也是VIP,再经过ip_vs做负载均衡,部分包转发给realserver1master1/director1)。

解决办法是,director使用iptables,对数据包做标记,LVSfwm转发而不是直接转发TCP。

IP配置

这里的主备库IP配置如下:

HA IP

HA IPmac

服务VIP

10.0.0.69

mac-source aa:aa:aa:b5:7b:88

写:10.0.0.68

读:10.0.0.140

10.0.0.70

mac-source aa:aa:aa:53:3e:28

iptables配置

每台director上,对非其他director发送的数据包,做标记,ip_vs转发这些被标记的包。亦即其他director发送的数据包,不再做ip_vs转发,直接交给上层监听程序。

点击(此处)折叠或打开

  1. 主库上:
  2. iptables -t mangle -I PREROUTING -d 10.0.0.140 -p tcp -m tcp --dport 3306 -m mac ! --mac-source aa:aa:aa:53:3e:28 -j MARK --set-mark 0x1
  3. 备库上:
  4. iptables -t mangle -I PREROUTING -d 10.0.0.140 -p tcp -m tcp --dport 3306 -m mac ! --mac-source aa:aa:aa:b5:7b:88 -j MARK --set-mark 0x2

realserver配置

有读请求负载均衡后,就需要配置realserver了。

开启realserver的办法:sh lvs_realserver.sh start

点击(此处)折叠或打开

  1. vim lvs_realserver.sh

  2. #!/bin/bash
  3. #description : start realserver
  4. VIP='10.0.0.140 10.0.0.68'
  5. /etc/rc.d/init.d/functions
  6. case "$1" in
  7. start)
  8. echo " start LVS of REALServer"
  9. for ip in $VIP;do
  10. /sbin/ifconfig lo:0 $ip broadcast $ip netmask 255.255.255.255 up
  11. done
  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. ;;
  17. stop)
  18. /sbin/ifconfig lo:0 down
  19. echo "close LVS Directorserver"
  20. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  21. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
  22. echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
  23. echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
  24. ;;
  25. *)
  26. echo "Usage: $0 {start|stop}"
  27. exit 1
  28. esac
keepalived配置。10.0.0.69为例

点击(此处)折叠或打开

  1. global_defs {
  2.    router_id LVS_1
  3. }
  4. vrrp_sync_group mysql_ha {
  5.    group {
  6.      mysql_lb
  7.    }
  8.    notify_backup "/usr/local/keepalived_script/keepalived_notify.sh BACKUP"
  9.    notify_master "/usr/local/keepalived_script/keepalived_notify.sh MASTER"
  10.    notify_fault "/usr/local/keepalived_script/keepalived_notify.sh FAULT"
  11.    notify "/usr/local/keepalived_script/keepalived_notify.sh"
  12. }

  13. vrrp_instance mysql_master_ha_slave_lb {
  14.    state BACKUP
  15.    interface eth0
  16.    virtual_router_id 61
  17.    priority 150
  18.    nopreempt
  19.    advert_int 1
  20.    authentication {
  21.      auth_type PASS
  22.      auth_pass 1111
  23.    }
  24.    virtual_ipaddress {
  25.      10.0.0.68
  26.      10.0.0.140
  27.    }
  28. }
  29. ## 写VIP virtual_server,只配置本地机器
  30. virtual_server 10.0.0.68 3306 {
  31.    delay_loop 2
  32.    lb_algo rr
  33.    lb_kind DR
  34.    nat_mask 255.255.255.0
  35.    persistence_timeout 20
  36.    protocol TCP
  37.    real_server 10.0.0.69 3306 {
  38.      weight 3
  39.      notify_down "/usr/local/keepalived_script/keepalived_notify.sh MYSQL_DOWN"
  40.      TCP_CHECK {
  41.        connect_timeout 10
  42.        connect_port 3306
  43.      }
  44.    }
  45. }
  46. ## 读VIP,配置fwmark转发
  47. virtual_server fwmark 1 {  # 另一台备库是fwmark 2
  48.    delay_loop 2
  49.    lb_algo wrr
  50.    lb_kind DR
  51.    nat_mask 255.255.255.0
  52.    persistence_timeout 20
  53.    protocol TCP
  54.    real_server 10.0.0.69 3306 {
  55.      weight 1
  56.      TCP_CHECK {
  57.      connect_timeout 10
  58.      connect_port 3306
  59.      }
  60.    }
  61.    real_server 10.0.0.70 3306 {
  62.      weight 5
  63.      TCP_CHECK {
  64.        connect_timeout 10
  65.        connect_port 3306
  66.      }
  67.    }
  68. }




阅读(3437) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~