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架构
DB ip 备注 Master 10.243.95.3 keepalived Master Slave1 10.243.95.4 keepalived Backup Slave2 10.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.rpm2)修改配置文件
两个节点的配置大体相似,仅需修改优先级和角色
-
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 0x25)添加服务器内核参数
-
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服务