keepalived是一個用於做雙機熱備(HA)的軟件,常和haproxy聯合起來做熱備+負載均衡,達到高可用。
運行原理
keepalived通過選舉(看服務器設置的權重)挑選出一台熱備服務器做MASTER機器,MASTER機器會被分配到一個指定的虛擬ip,外部程序可通過該ip訪問這台服務器,如果這台服務器出現故障(斷網,重啟,或者本機器上的keepalived crash等),keepalived會從其他的備份機器上重選(還是看服務器設置的權重)一台機器做MASTER並分配同樣的虛擬IP,充當前一台MASTER的角色。
選舉策略
選舉策略是根據VRRP協議,完全按照權重大小,權重最大(0~255)的是MASTER機器,下面幾種情況會觸發選舉
1. keepalived啟動的時候
2. master服務器出現故障(斷網,重啟,或者本機器上的keepalived crash等,而本機器上其他應用程序crash不算)
3. 有新的備份服務器加入且權重最大
配置實例
服務器兩台,兩台機器要通局域網,虛擬IP會被設置在他們共有的局域網內,不通的話兩台機器各設置各的虛擬IP
192.168.1.41 Ubuntu 10.04.1 LTS (32位)
192.168.1.135 Red Hat Enterprise Linux Server release 6.1 (Santiago)(64位)
下載源碼安裝,兩台服務器都要安裝和配置
注意可能需要安裝popt庫
ubuntu
sudo apt-get install libpopt-dev
redhat
sudo yum install popt-devel.x86_64
解壓安裝
tar -zxvf keepalived-1.2.2.tar.gz cd keepalived-1.2.2 ./configure --prefix=/usr/local/keepalived make make install
下面這幾步不是必須的,但是為了方便以后的操作建議做了
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
為keepalived創建配置文件存放路徑
mkdir -p /etc/keepalived/
打開配置文件
emacs /etc/keepalived/keepalived.conf
下面是每台服務器上的配置文件,配置項完全一樣,配置的值按在本機的具體情況,我這里就貼redhat的
global_defs { notification_email { baifanmvp@163.com } notification_email_from baifanmvp@163.com smtp_server 127.0.0.1 stmp_connect_timeout 30 router_id lnmp_node1 } vrrp_instance lnmp { state MASTER interface em1 virtual_router_id 100 priority 170 advert_int 5 track_interface { em1 } authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.1.200 } }
-
global_defs: 全局配置標識,表面下面的區域{}是全局配置
- notification_email: 里面填郵箱地址,如果keepalived在發生諸如切換操作時會的發郵件到配置上的郵箱,郵件地址可以多個,每行一個
- notification_email_from:表示發送通知郵件時郵件源地址是誰
- smtp_server:表示發送email時使用的smtp服務器地址,可以填127.0.0.1
- smtp_connect_timeout:連接smtp超時時間
- vrrp_instance:各服務器上實例配置域,這里按本服務器的具體情況填值
- state:本實例啟動狀態,MASTER/SLAVE,不管填MASTER/SLAVE,最終還是要看本機器的權重。
- interface:實例綁定的網卡,因為在配置虛擬IP的時候必須是在已有的網卡上添加的,這里按本機情況而定
- virtual_router_id:這里設置VRID,如果兩台機器是同一個備份組,設置一樣
- priority:設置本節點的優先級,優先級高的為master,不能超過255
- advert_int:組播信息發送間隔,同一個備份組兩個機器設置必須一樣,默認是1S
- authentication:驗證域,同組的機器auth_type(驗證類型)和auth_pass(驗證密碼)必須一樣
- virtual_ipaddress:VIP,為master機器設置的虛擬地址,和實例綁定的網卡(interface)設置到一個網段
配置好了就可以直接啟動了
ubuntu下啟動
/usr/local/keepalived/sbin/keepalived
redhat下可以按照ubuntu的啟動方式,也可以按照下面這樣啟動
sudo /etc/init.d/keepalived restart
啟動好以后可以用 ip a 命令看虛擬IP的綁定情況,我的配置是192.168.1.135上的權重高,所以VIP綁定到135上面
(ape2!1076)~(h135:135)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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether d4:ae:52:6c:74:69 brd ff:ff:ff:ff:ff:ff inet 192.168.1.135/24 brd 192.168.1.255 scope global em1 inet 192.168.1.200/32 scope global em1 inet6 fe80::d6ae:52ff:fe6c:7469/64 scope link
這時候就可以用192.168.1.200這個IP訪問135這台機器了
出現的問題記錄:
1. 在配好主從備份之后,發現虛擬IP能ping通,但是訪問虛擬IP對應機器上的服務(不是apache或者mysql之類的公用軟件)卻不成功,這是因為要訪問的服務綁定了主機上的一個實體IP不是INADDR_ANY地址,所以連接不上。
2.記得設置防火牆和關閉selinux策略
關閉selinux
vi /etc/sysconfig/selinux 修改: SELINUX=disabled #setenforce 0
配置iptables,添加VRRP通訊支持
iptables -A INPUT -d 224.0.0.18 -j ACCEPT