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服務