第十三讲 MySQL配置Keepalived读写分离

1 背景

在数据库一主多从架构中,若所有查询的流量都切入主节点,会造成服务器拥塞,因此需要将业务一致性要求不是特别高的应用的查询流量分散到从库,以实现负载均衡

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的

LVS负载均衡

  • lvs 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之上
  • 传输层上有 TCP/UDP,lvs 支持 TCP/UDP 的负载均衡
  • 因为 LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法, 比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效 率是非常高的
  • lvs 的转发可以通过修改 IP 地址实现(NAT 模式)
  • lvs 的转发还可以通过修改直接路由实现(DR 模式)

因LVS缺乏后端状态检测,于是配合Keepalived使用会拥有不错的效果

2 架构

LVS+Keepalived架构

DBip备注
Master10.243.95.3keepalived Master
Slave110.243.95.4keepalived Backup
Slave210.243.95.5
10.243.95.101读VIP

3 搭建

1)安装依赖包
yum -y install net-snmp
unzip -u keepalived_pack.zip
cd keepalived_pack/rhel6/;
rpm -ivh ipvsadm-1.26-2.el6.x86_64.rpm
rpm -ivh keepalived-1.2.7-3.el6.x86_64.rpm
2)修改配置文件

两个节点的配置大体相似,仅需修改优先级和角色

global_defs {
   notification_email {
      #user@example.com
   }
   notification_email_from mail@example.org
   #smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_mha {
   script "/root/mha/scripts/check_manager.sh /root/mha"
   interval 5
   weight -40
   fall   3
   rise   1
     }
vrrp_instance VI_1 {
	#修改1.主节点MASTER
    state BACKUP
    interface eth0
    virtual_router_id 200
    #修改2.主节点优先级需大于从节点
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
  #VIP
    virtual_ipaddress {
       10.243.95.101
    }
    notify_master "/root/mha/scripts/write_keepalived_state.sh /root/mha/log MASTER"
    notify_backup "/root/mha/scripts/write_keepalived_state.sh /root/mha/log BACKUP"
}

virtual_server fwmark 2 {
        delay_loop 10
        lb_algo rr
        lb_kind DR
#    persistence_timeout 2
        protocol TCP
        real_server 10.243.95.5 3306 {
                weight 3
                TCP_CHECK {
                        connect_timeout 10
                        nb_get_retry 3
                    delay_before_retry 3
                        connect_port 3306
                }
        }
        real_server 10.243.95.4 3306 {
                weight 3
                TCP_CHECK {
                        connect_timeout 10
                        nb_get_retry 3
                    delay_before_retry 3
                        connect_port 3306
                }
        }
        real_server 10.243.95.3 3306 {
                weight 3
                TCP_CHECK {
                        connect_timeout 10
                        nb_get_retry 3
                    delay_before_retry 3
                        connect_port 3306
                }
        }
     }
3)绑定子接口VIP

应用于三个数据库节点

ip addr add $VIP/32 dev lo
4)设置iptables规则

因LVS-keepalived需同时部署在RS服务器,存在一些问题

现象分析:请求经过keepalived MASTER节点后,会根据负载均衡策略分发到配置文件中的RS服务器,此时会包含BACKUP节点,若分发至BACKUP节点会发生二次轮询分发给MASTER节点,造成循环

解决方案:通过设置fwmark参数,当数据包发送给VIP且mac地址不属于任何LVS节点会通过iptables进行标记,带标记的包才会进入LVS进行负载均衡处理

#在master上执行,MAC地址为数据库SLave1的MAC
iptables -t mangle -I PREROUTING -d 10.243.95.101 -p tcp -m tcp --dport 3306 -m mac ! --mac-source FA:16:3E:1C:EB:DC -j MARK --set-mark 0x2
#在Slave1上执行,MAC地址为数据库Master的MAC
iptables -t mangle -I PREROUTING -d 10.243.95.101 -p tcp -m tcp --dport 3306 -m mac ! --mac-source FA:16:3E:30:DF:12 -j MARK --set-mark 0x2
5)添加服务器内核参数

vim /etc/sysctl.conf

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

修改后需重载配置 sysctl -p

6)启动Keepalived服务
/etc/init.d/keepalived start
7)测试验证
  • 查看vip是否存在
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet 10.243.95.101/32 brd 10.243.95.101 scope global lo:0
    inet6 ::1/128 scope host 
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:30:df:12 brd ff:ff:ff:ff:ff:ff
    inet 10.243.95.3/24 brd 10.243.95.255 scope global eth0
    inet 10.243.95.101/32 scope global eth0
    inet6 fe80::f816:3eff:fe30:df12/64 scope link 
    valid_lft forever preferred_lft forever
  • 在其它服务器进行轮询测试
mysql -uroot -p123456 -h10.243.95.101 -P3306 -e"show variables like 'server_uuid'"
  • 查看LVS状态
[root@systestsitdb13 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port  Forward Weight ActiveConn InActConn
FWM  2 rr
-> 10.243.95.3:3306    Local   3      0          1         
-> 10.243.95.4:3306    Route   3      0          1         
-> 10.243.95.5:3306    Route   3      0          1
ipvsadm -Ln --stats
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴走的Mine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值