這篇文章簡單介紹利用keepalived軟件,實現(xiàn)對nginx服務器的高可用,即實現(xiàn)故障自動切換。假設你已經(jīng)安裝好nginx,下面介紹keepalived的安裝和使用。
keepalived安裝
- yum install openssl-devel
- cd /tmp
- wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
- tar xzf keepalived-1.2.2.tar.gz
- cd keepalived-1.2.2
- ./configure
- make && make install
- cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
- cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
- chmod +x /etc/init.d/keepalived
- chkconfig --add keepalived
- chkconfig keepalived on
- mkdir /etc/keepalived
- ln -s /usr/local/sbin/keepalived /usr/sbin/
keepalived的配置
更詳細的keepalived配置文件說明可以執(zhí)行man keepalived.conf查看。
我們假設主服務器IP:192.168.1.103,從服務器ip:192.168.1.101 虛擬ip:192.168.1.110
下面對主服務器的keepalived進行配置:
- vi /etc/keepalived/keepalived.conf
- global_defs {
- notification_email {
- admin@centos.bz
- }
- notification_email_from keepalived@domain.com
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id LVS_DEVEL
- }
- vrrp_script chk_http_port {
- script "/opt/nginx_pid.sh"
- interval 2
- weight 2
- }
- vrrp_instance VI_1 {
- state MASTER ############ 輔機為 BACKUP
- interface eth0
- virtual_router_id 51
- mcast_src_ip 192.168.1.103
- priority 102 ########### 權值要比 back 高
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- chk_http_port ### 執(zhí)行監(jiān)控的服務
- }
- virtual_ipaddress {
- 192.168.1.110
- }
- }
從服務器:
- global_defs {
- notification_email {
- admin@centos.bz
- }
- notification_email_from keepalived@domain.com
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id LVS_DEVEL
- }
- vrrp_script chk_http_port {
- script "/opt/nginx_pid.sh"
- interval 2
- weight 2
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface eth0
- virtual_router_id 51
- mcast_src_ip 192.168.1.101
- priority 101 ##########權值 要比 master 低。。
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- chk_http_port ### 執(zhí)行監(jiān)控的服務
- }
- virtual_ipaddress {
- 192.168.1.110
- }
- }
之后分別在主從服務器建立nginx的監(jiān)控腳本:
- vi /opt/nginx_pid.sh
- #!/bin/bash
- A=`ps -C nginx --no-header |wc -l`
- if [ $A -eq 0 ];then
- /usr/local/nginx/sbin/nginx
- sleep 3
- if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
- killall keepalived
- fi
- fi
然后分別啟動主從服務器的keepalived:
- service keepalived start
keepalived的測試
我們在主服務器上執(zhí)行命令ip a,顯示如下:
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
- link/ether 00:0c:29:aa:a1:e4 brd ff:ff:ff:ff:ff:ff
- inet 192.168.1.103/24 brd 255.255.255.255 scope global eth0
- inet 192.168.1.110/32 scope global eth0
證明主服務器已經(jīng)綁定了虛擬ip 192.168.1.110
在從服務器上執(zhí)行命令ip a,顯示如下:
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
- link/ether 00:0c:29:2b:94:3b brd ff:ff:ff:ff:ff:ff
- inet 192.168.1.101/24 brd 255.255.255.255 scope global eth0
顯示表明從服務器上沒有綁定vip 192.168.1.110,只有本機真實ip192.168.1.101
下面我們停止主服務器的nginx進程,再看看ip綁定情況:
主服務器的情況:
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
- link/ether 00:0c:29:aa:a1:e4 brd ff:ff:ff:ff:ff:ff
- inet 192.168.1.103/24 brd 255.255.255.255 scope global eth0
從服務器的情況:
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
- link/ether 00:0c:29:2b:94:3b brd ff:ff:ff:ff:ff:ff
- inet 192.168.1.101/24 brd 255.255.255.255 scope global eth0
- inet 192.168.1.110/32 scope global eth0
由此可見vip已經(jīng)指向了從服務器。
參考:http://www.keepalived.org/pdf/UserGuide.pdf