Keepalived是一個免費開源的,用C編寫的,具有第3層、第4層和第7層交換機的功能。主要提供loadbalancing(負載均衡)和 high-availability(高可用)功能,負載均衡實現須要依賴Linux的虛擬服務內核模塊(ipvs),而高可用是經過VRRP協議實現多臺機器之間的故障轉移服務。
上圖是Keepalived的功能體系結構,大體分兩層:用戶空間(user space)和內核空間(kernel space)。 內核空間:主要包括IPVS(IP虛擬服務器,用於實現網絡服務的負載均衡)和NETLINK(提供高級路由及其餘相關的網絡功能)兩個部分。
用戶空間:mysql
Keepalived的全部功能是配置keepalived.conf文件來實現的。web
[root@localhost ~]# yum install keepalived ipvsadm
[root@localhost ~]# rpm -ql keepalived
/etc/keepalived/keepalived.conf 主配置文件
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service 啓動腳本算法
[root@localhost ~]# cat /etc/keepalived/keepalived.confsql
! Configuration File for keepalived global_defs { router_id maiya #路由id,不能重複 } vrrp_instance lvs_inst { #定義vrrp實例名 state BACKUP #定義vrrp角色,分爲MASTER/BACKUP兩種 interface ens33 #指定網絡接口名 virtual_router_id 51 #同一組的vrrp成員,該id須要一致 priority 150 #優先級,範圍(0-255) nopreempt #不搶佔(只針對BACKUP生效) advert_int 1 #發送hello的時間間隔 authentication { #經過密碼身份驗證 auth_type PASS auth_pass 1111 } virtual_ipaddress { #定義虛擬IP(VIP) 10.18.42.123 } } virtual_server 10.18.42.123 80 { #定義VIP相關配置 delay_loop 6 lb_algo rr #使用rr調度算法(rr|wrr|lc |wlc|lblc|sh|dh) lb_kind DR #使用DR模式 (DR/NAT/TUN) persistence_timeout 50 #定義persistence保持時間 protocol TCP #tcp協議 real_server 10.18.42.42 80 { #定義real_server weight 1 #weight權重爲1 TCP_CHECK { #定義checker的方法(TCP/HTTP/SSL/MISC) connect_port 80 #定義tcp的port connect_timeout 3 #定義本次鏈接的超時時長爲3s nb_get_retry 3 #定義嘗試3次,若是3次都失敗則宣告本real_server失效 delay_before_retry 3 #定義重鏈接間隔時間爲3s } } real_server 10.18.42.6 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
HTTP_GET | SSL_GET{ url{ #根據url check,能夠指定多個 path / #定義要檢查的URI地址 digest <string> #檢查後的摘要信息 #(可使用genhash -s 目標服務器ip -p 端口號 status_code 200 -u uri地址獲得摘要信息) status_code 200 #檢查的返回狀態碼 } } notify_master /path/xx.sh #指定當切換到master 時執行的腳本 notify_backup /path/xx.sh #指定當切換到backup 時執行的腳本 notify_fault "path/xx.sh VG_1" #故障時執行的腳本 notify /path/xx.sh virtualhost <string> #檢查的web服務器的虛擬主機 sorry_server <IPADDR> <port> #備用機的IP,全部的realserver失效後啓用 notify_up <string> #檢測到服務器up後執行的腳本 notify_down <string> #檢測到服務器down後執行的腳本
1)、實現master與slave1兩臺主機的複製(AA複製)
2)、利用keepalived 的健康檢查功能,檢測本機的3306端口是否存活,若是端口失效,則自動執行自定義腳本
3)、自定義腳本的內容爲:kill 本機的keepalived進程,並刪除本機VIP;當本機keepalived進程被kill掉以後,另外一臺主機的keepalived進程便可得到虛擬IP,實現的故障轉移
4)、測試:客戶端鏈接keepalived提供的虛擬IP(mysql須要事先受權grant鏈接)bash
[root@localhost ~]# cat /etc/keepalived/keepalived.conf服務器
! Configuration File for keepalived global_defs { router_id teacher } vrrp_instance lvs_inst { state MASTER interface ens33 virtual_router_id 51 priority 250 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.18.42.123 } } virtual_server 10.18.42.123 3306 { delay_loop 6 lb_algo rr lb_kind DR #persistence_timeout 50 protocol TCP real_server 10.18.42.251 3306 { weight 1 notify_down /etc/keepalived/kill.sh TCP_CHECK { connect_port 3306 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } [root@localhost ~]# cat /etc/keepalived/kill.sh #!/bin/bash pkill keepalived #systemctl stop keepalived #儘可能使用此方式關閉keepalived ip addr del dev ens33 10.18.42.123/32
[root@localhost ~]# cat /etc/keepalived/keepalived.conf網絡
! Configuration File for keepalived global_defs { router_id teacher } vrrp_script chk_haproxy { script "lsof -i:80 | grep haproxy || exit 1" interval 2 fail 1 } vrrp_instance lvs_inst { state MASTER interface ens33 virtual_router_id 51 priority 250 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_haproxy } virtual_ipaddress { 10.18.42.124 } }