Linux&&LVS+Keepalived高可用羣集
瞭解
用途:
判斷LVS負載調度器、節點服務器的可用性,及時隔離並替換爲新的服務器,當故障主機恢復後將其重新加入羣集。
官方網站:
http://www.keepalived.org/
實現功能:
- 雙主熱備
- DNS負載均衡
- keepalived跟蹤服務(web)
- inotify+rsync數據同步
keepalived的熱備方式
keepalived採用VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)熱備份協議,以軟件的方式實現Linux服務器的多機熱備功能。
VRRP是針對路由器的一種備份解決方案-----由多臺路由器組成一個熱備組,通過共用的虛擬IP地址對外提供服務;每個熱備組內同一時刻只有一臺主路由器提供服務,其他路由器處於冗餘狀態,若當前在線的路由器失效,則其他路由器會自動接替(優先級決定接替順序)虛擬IP地址,以繼續提供服務。
熱備組內的每臺路由器都可能成爲主路由器,虛擬路由器的IP地址(VIP)可以在熱備組內的路由器之間進行移動,所以也成爲漂移IP地址。
使用keepalived時,漂移地址的實現不需要手動建立虛接口配置文件(如eth0:0),而是由keepalived根據配置文件自動管理。
部署
預安裝內核開發支持庫:
yum -y install kernel-devel openssl-devel popt-devel
yum -y ipvsadm
#編譯安裝keepalived
tar zxf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64
make && make install
#使用keepalived服務。執行make install操作以後,會自動生成/etc/init.d/keepalived腳本文件,但換需要手動添加爲系統服務,這樣就可以使用service、chkconfig工具來對keepalived服務程序進行管理了。
ls -l /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on
使用keepalived實現雙機熱備
基於VRRP協議的熱備方式,keepalived可用作服務器的故障切換,每個熱備組可以有多臺服務器。
在雙機熱備方案中,故障切換主要針對虛擬IP地址的漂移來實現,so能夠適用於各種應用服務器(web、ftp、mail、ssh、dns)
以下基於web服務進行部署、測試
主服務器配置
#編寫httpd服務監控腳本
vim /opt/chk_httpd.sh
service httpd status &> /dev/null
if [ $? -ne 0 ];then
service httpd restart &> /dev/null
service httpd status &> /dev/null
if [ $? -ne 0 ];then
killall keepalived
fi
fi
chmod +x /opt/chk_httpd.sh
#進入keepalived服務的配置目錄
cd /etc/keepalived/
#備份並編輯主配置文件
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
#指定全局參數
global_defs {
route_id HA_TEST_R1 //本路由器(服務器)的名稱
}
#定義httpd服務監控腳本並設置別名爲chk_http_port
vrrp_script chk_http_port {
script "/opt/chk_httpd.sh" //檢測nginx狀態的腳本路徑
interval 2
}
#指定VRRP熱備參數
vrrp_instance dfq { //定義VRRP熱備實例
state MASTER //熱備狀態,MASTER表示主服務器
interface eth0 //承載VIP地址的物理網卡接口
virtual_route_id 1 //虛擬路由器的ID號,每個熱備組保持一致
priority 100 //優先級,數值越大優先級越高
advert_int 1 //通告間隔秒數(心跳頻率)
authentication { //認證信息,每個熱備組保持一致
auth_type PASS //認證類型
auth_pass 123456 //密碼字串
}
#調用監控別名
track_script {
chk_http_port
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多個
172.16.16.172
}
}
#指定VRRP熱備組2
vrrp_instance dfq2 { //定義VRRP熱備實例2
state BACKUP //熱備狀態,MASTER表示主服務器
interface eth0 //承載VIP地址的物理網卡接口
virtual_route_id 2 //虛擬路由器的ID號,每個熱備組保持一致
priority 90 //優先級,數值越大優先級越高
advert_int 1 //通告間隔秒數(心跳頻率)
authentication { //認證信息,每個熱備組保持一致
auth_type PASS //認證類型
auth_pass 123456 //密碼字串
}
#調用監控別名
track_script {
chk_http_port
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多個
172.16.16.173
}
}
#啓動keepalived服務。實際狀態爲MASTER的主服務器將爲eth0接口自動添加VIP地址,通過ip命令可以查看(ifconfig命令看不到)
service keepalived start
ip addr show dev eth0
#實現ssh免交互登錄
ssh-keygen -t rsa
ssh-copy-id [email protected]
#安裝inotify
tar zxf inotify-tools-3.14.tar.gz -C /usr/src
cd /usr/src/inotify-tools-3.14/
./configure && make && make install
vim /opt/rsync.sh
inotify_cmd="inotifywait -mrq -e create,delete,move,modify,attrb /var/www/html"
rsync_cmd="rsync -za --delete /var/www/html/ [email protected]:/var/www/html/"
#inotify_cmd | while read a b c
do
if [ $(pgrep ^rsync$| wc -l) -le 0 ];then
$rsync_cmd
done
chown a+x /opt/rsync.sh
/opt/rsync.sh &
priority 高的就是主服務器,即便state爲MASTER
備用服務器配置
- router_id : 路由器名稱,建議爲相同熱備組的不同服務器配置不同路由器(服務器)的名稱
- state : 熱備狀態,至少存在一臺狀態爲MASTER的主服務器,存在多臺狀態爲BACKUP的備用服務器。
- priorit : 優先級,數值越大則取得VIP控制權的優先級越高,因此主服務器的優先級應設爲最高;其他備用服務器的優先級可以依次遞減,但不要相同,避免在爭奪VIP控制權時發生衝突。
#預安裝內核開發支持庫:
yum -y install kernel-devel openssl-devel popt-devel
yum -y ipvsadm
#編譯安裝keepalived
tar zxf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64
make && make install
#使用keepalived服務。執行make install操作以後,會自動生成/etc/init.d/keepalived腳本文件,但換需要手動添加爲系統服務,這樣就可以使用service、chkconfig工具來對keepalived服務程序進行管理了。
ls -l /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on
service ipstables stop
#編寫httpd服務監控腳本
vim /opt/chk_httpd.sh
service httpd status &> /dev/null
if [ $? -ne 0 ];then
service httpd restart &> /dev/null
service httpd status &> /dev/null
if [ $? -ne 0 ];then
killall keepalived
fi
fi
chmod +x /opt/chk_httpd.sh
cd /etc/keepalived
#備份並編輯主配置文件
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
#指定全局參數
global_defs {
route_id HA_TEST_R2 //本路由器(服務器)的名稱
}
#定義httpd服務監控腳本並設置別名爲chk_http_port
vrrp_script chk_http_port {
script "/opt/chk_httpd.sh" //檢測nginx狀態的腳本路徑
interval 2
}
#指定VRRP熱備參數
vrrp_instance dfq { //定義VRRP熱備實例
state BACKUP //熱備狀態,MASTER表示主服務器
interface eth0 //承載VIP地址的物理網卡接口
virtual_route_id 1 //虛擬路由器的ID號,每個熱備組保持一致
priority 99 //優先級,數值越大優先級越高
advert_int 1 //通告間隔秒數(心跳頻率)
authentication { //認證信息,每個熱備組保持一致
auth_type PASS //認證類型
auth_pass 123456 //密碼字串
}
#調用監控別名
track_script {
chk_http_port
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多個
172.16.16.172
}
}
#指定VRRP熱備組2
vrrp_instance dfq { //定義VRRP熱備實例2
state MASTER //熱備狀態,MASTER表示主服務器
interface eth0 //承載VIP地址的物理網卡接口
virtual_route_id 2 //虛擬路由器的ID號,每個熱備組保持一致
priority 100 //優先級,數值越大優先級越高
advert_int 1 //通告間隔秒數(心跳頻率)
authentication { //認證信息,每個熱備組保持一致
auth_type PASS //認證類型
auth_pass 123456 //密碼字串
}
#調用監控別名
track_script {
chk_http_port
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多個
172.16.16.173
}
}
#啓動keepalived服務。實際狀態爲MASTER的主服務器將爲eth0接口自動添加VIP地址,通過ip命令可以查看(ifconfig命令看不到)
service keepalived start
ip addr show dev eth0
DNS負載均衡配置
yum clean all
yum -y install bind bind-chroot
vim /etc/named.rfc1912.zones
zone "test.com" in {
type master;
file "test.com";
}
cd /var/named
cp -p named.localhost test.com
vim test.com
$TTL 1D
@ IN SOA @ rname.invalid. (
0
1D
1H
1W
3H )
IN NS dns
dns in a 172.16.16.170
www in a 172.16.16.172
www in a 172.16.16.173
service named restart
測試雙機熱備功能
LVS+Keepalived高可用羣集
優勢:
對LVS負載調度器實現熱備切換,提高可用性;對服務器池中的節點進行健康檢查,自動移除失效節點,恢復後再重新加入。
配置主調度器
全局配置、熱備配置:
爲主、從調度器實現熱備功能,漂移地址使用LVS羣集的VIP地址
#加載ip_vs模塊
modprobe ip_vs
#重複上個環境的安裝
--snip--
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
sysctl -p
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_HA_R1 //主調度器名稱
}
vrrp_instance VI_1 {
state MASTER //主調度器的熱備狀態
interface eth0
virtual_router_id 1
priority 100 //主調度器的優先級
advert_int 1
authentication { //主、從熱備認證信息
auth_type PASS //認證類型
auth_pass 123456 //密碼字串
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多個
172.16.16.172
}
}
web服務器池配置:
vim /etc/keepalived/keepalived.conf
--snip--
virtual_server 172.16.16.172 80 { //虛擬服務器地址(VIP)、端口
delay_loop 15 //健康檢查的間隔時間(秒)
lb_algo rr //輪詢(rr)調度算法
lb_kind DR //直接路由(DR)羣集工作模式
!persistence 60 //連接保持時間(秒),若啓用請去掉!號
protocol TCP //應用服務採用的是TCP協議
real_server 172.16.16.177 80 { //第一個web節點的地址、端口
weight 1 //節點的權重
TCP_CHECK { //健康檢查方式
connect_port 80 //檢查的目標端口
connect_timeout 3 //連接超時(秒)
nb_get_retry 3 //重試次數
delay_before_retry 4 //重試間隔(秒)
}
}
real_server 172.16.16.178 80 { //第二個web節點的地址、端口
weight 1 //節點的權重
TCP_CHECK { //健康檢查方式
connect_port 80 //檢查的目標端口
connect_timeout 3 //連接超時(秒)
nb_get_retry 3 //重試次數
delay_before_retry 4 //重試間隔(秒)
}
}
real_server 172.16.16.179 80 { //第三個web節點的地址、端口
weight 1 //節點的權重
TCP_CHECK { //健康檢查方式
connect_port 80 //檢查的目標端口
connect_timeout 3 //連接超時(秒)
nb_get_retry 3 //重試次數
delay_before_retry 4 //重試間隔(秒)
}
}
}
#重啓keepalived服務
service keepalived restart
配置從調度器
全局配置、熱備配置:
爲主、從調度器實現熱備功能,漂移地址使用LVS羣集的VIP地址
#加載ip_vs模塊
modprobe ip_vs
#重複上個環境的安裝
--snip--
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
sysctl -p
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_HA_R2 //從調度器名稱
}
vrrp_instance VI_1 {
state BACKUP //從調度器的熱備狀態
interface eth0
virtual_router_id 1
priority 99 //從調度器的優先級
advert_int 1
authentication { //主、從熱備認證信息
auth_type PASS //認證類型
auth_pass 123456 //密碼字串
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多個
172.16.16.172
}
}
web服務器池配置:
vim /etc/keepalived/keepalived.conf
--snip--
virtual_server 172.16.16.172 80 { //虛擬服務器地址(VIP)、端口
delay_loop 15 //健康檢查的間隔時間(秒)
lb_algo rr //輪詢(rr)調度算法
lb_kind DR //直接路由(DR)羣集工作模式
!persistence 60 //連接保持時間(秒),若啓用請去掉!號
protocol TCP //應用服務採用的是TCP協議
real_server 172.16.16.177 80 { //第一個web節點的地址、端口
weight 1 //節點的權重
TCP_CHECK { //健康檢查方式
connect_port 80 //檢查的目標端口
connect_timeout 3 //連接超時(秒)
nb_get_retry 3 //重試次數
delay_before_retry 4 //重試間隔(秒)
}
}
real_server 172.16.16.178 80 { //第二個web節點的地址、端口
weight 1 //節點的權重
TCP_CHECK { //健康檢查方式
connect_port 80 //檢查的目標端口
connect_timeout 3 //連接超時(秒)
nb_get_retry 3 //重試次數
delay_before_retry 4 //重試間隔(秒)
}
}
real_server 172.16.16.179 80 { //第三個web節點的地址、端口
weight 1 //節點的權重
TCP_CHECK { //健康檢查方式
connect_port 80 //檢查的目標端口
connect_timeout 3 //連接超時(秒)
nb_get_retry 3 //重試次數
delay_before_retry 4 //重試間隔(秒)
}
}
}
#重啓keepalived服務
service keepalived restart
#查看雙機熱備運行情況
ipvsadm -ln
配置web節點服務器
#設置迴環地址爲VIP地址
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=172.16.16.172
NETMASK=255.255.255.255
ifup lo:0
#修改內核參數
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
#添加路由規則
route add -host 172.16.16.172 dev lo:0
service httpd restart