CentOS 5.9 下使用LVS+Keepalived构建高可用linux集群

很久之前就写过类似这样的文章,那时我还很年轻,很天真,心想运维也就那么回事吧。直到工作后被各种问题折磨的欲仙欲死,才发现,哦,原来运维不是那么那么回事。如今,早已看淡些东西,知道自己目前想要的是什么,不想要的是什么,再次来写这样一篇博客,我该如何动笔呢?

一:安装

1 就像所有的运维文章一样,安装是必不可少的

a 安装ipvsadm
ln -sv /usr/src/kernels/2.6.18-348.el5-x86_64 /usr/src/linux
tar zxvf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make && make install

b 安装keepalived
tar zxvf keepalived-1.2.8.tar.gz
 cd keepalived-1.2.8
 ./configure --prefix=/usr/local/keepalived/
 make &&  make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

c 开启集群内内核包转发功能(根据需要开启)
echo "1" > /proc/sys/net/ipv4/ip_forward

一:配置

LVS_M:
#全局配置部分
global_defs {
   #运行keepalived机器的一个标示
   router_id LVS   
}

#vrrp实例组配置
vrrp_sync_group VG_1 {
   group {
      VI_1
   }   
}
#vrrp实例配置
vrrp_instance VI_1 {
    #制定实例的初始状态,在两台router都启动后,马上发生竞选
    #高priority的会竞选为Master,所以这里的state并不表示这台就一直是Master
    state MASTER 
    #state BACKUP
    #nopreempt
    #指定HA检测网络的端口  
    interface eth0   
    # lvs syncd绑定的网卡
    lvs_sync_daemon_inteface eth0  
    #虚拟路由表示,这个表示是一个数字,同一个vrrp实例使用唯一的标示
    virtual_router_id 51
    #高优先级竞选为Master,Master要高于Backup至少50
    priority 180    
    #检查间隔,3s
    advert_int 3    
    #设置认证
    authentication {
         #设定验证类型,主要有PASS和AH两种
         auth_type PASS    
         #设置密码,在同一个vrrp_instance下,MASTER和BACKUP必须使用相同的密码才能正常通信
         auth_pass zQKoFseIhO    
    }
    #设置虚拟IP地址,可以为多个虚拟IP地址,每行一个
    virtual_ipaddress {      
    192.168.245.133
    }
}

#LVS配置
#设置虚拟服务器,需要指定虚拟IP地址和服务器端口,IP与端口之间用空格隔开
virtual_server 192.168.245.133 80 {    
    #设置运行情况检查时间,单位是秒
    delay_loop 6   
    #设置负载调度算法 加权最少连接
    #lb_algo wlc    
    #轮询
    lb_algo rr    
    #设置LVS 实现负载均衡的调度机制,有NAT 、TUN和DR三个模式
    lb_kind DR   
    #会话保持时间,单位是秒
    persistence_timeout 120  
    #指定转发协议的类型
    protocol TCP   
    #HTTP_GET做健康检查时,检查的web服务器的虚拟主机(即Host:头)
    virtualhost peiqiang.net

    #每台RealServer都需要一个下面的配置项
    real_server 192.168.245.129 80 {
        #服务节点的权值
        weight 100  
         #健康检查方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
         HTTP_GET {
            #HTTP/SSL检查的URL,这里可以指定多个URL
            url {
            #检查的url路径
            path /do_not_delete/do_not_delete.php
            #检查后的摘要信息(genhash工具算出)
            digest e0aa021e21dddbd6d8cecec71e9cf564 
            #返回状态码
            status_code 200
            }
            #连接超时时间
            connect_timeout 10
            #重连次数
            nb_get_retry 3
            #重连间隔时间
            delay_before_retry 3
           #健康检查端口
           connect_port 80
           }
        }

    #每台RealServer都需要一个下面的配置项
    real_server 192.168.245.130 80 {
        #服务节点的权值
        weight 105  
         #健康检查方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
         HTTP_GET {
            #HTTP/SSL检查的URL,这里可以指定多个URL
            url {
            #检查的url路径
            path /do_not_delete/do_not_delete.php
            # 检查后的摘要信息(genhash工具算出)
            digest e0aa021e21dddbd6d8cecec71e9cf564
            #返回状态码
            status_code 200
            }
            #连接超时时间
            connect_timeout 10
            #重连次数
            nb_get_retry 3
            #重连间隔时间
            delay_before_retry 3
            #健康检查端口
            connect_port 80
           }
        }
}


LVS_B:
#全局配置部分
global_defs {
   #运行keepalived机器的一个标示
   router_id LVS   
}

#vrrp实例组配置
vrrp_sync_group VG_1 {
   group {
      VI_1
   }   
}
#vrrp实例配置
vrrp_instance VI_1 {
    #制定实例的初始状态,在两台router都启动后,马上发生竞选
    #高priority的会竞选为Master,所以这里的state并不表示这台就一直是Master
    #state MASTER 
    state BACKUP
    #nopreempt
    #指定HA检测网络的端口  
    interface eth0   
    # lvs syncd绑定的网卡
    lvs_sync_daemon_inteface eth0  
    #虚拟路由表示,这个表示是一个数字,同一个vrrp实例使用唯一的标示
    virtual_router_id 51
    #高优先级竞选为Master,Master要高于Backup至少50
    priority 100    
    #检查间隔,3s
    advert_int 3    
    #设置认证
    authentication {
         #设定验证类型,主要有PASS和AH两种
         auth_type PASS    
         #设置密码,在同一个vrrp_instance下,MASTER和BACKUP必须使用相同的密码才能正常通信
         auth_pass zQKoFseIhO    
    }
    #设置虚拟IP地址,可以为多个虚拟IP地址,每行一个
    virtual_ipaddress {      
    192.168.245.133
    }
}

#LVS配置
#设置虚拟服务器,需要指定虚拟IP地址和服务器端口,IP与端口之间用空格隔开
virtual_server 192.168.245.133 80 {    
    #设置运行情况检查时间,单位是秒
    delay_loop 6   
    #设置负载调度算法 加权最少连接
    #lb_algo wlc    
    #轮询
    lb_algo rr
    #设置LVS 实现负载均衡的调度机制,有NAT 、TUN和DR三个模式
    lb_kind DR   
    #会话保持时间,单位是秒
    persistence_timeout 120  
    #指定转发协议的类型
    protocol TCP   
    #HTTP_GET做健康检查时,检查的web服务器的虚拟主机(即Host:头)
    virtualhost peiqiang.net

    #每台RealServer都需要一个下面的配置项
    real_server 192.168.245.129 80 {
        #服务节点的权值
        weight 100  
         #健康检查方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
         HTTP_GET {
            #HTTP/SSL检查的URL,这里可以指定多个URL
            url {
            #检查的url路径
            path /do_not_delete/do_not_delete.php
            #检查后的摘要信息(genhash工具算出)
            digest e0aa021e21dddbd6d8cecec71e9cf564 
            #返回状态码
            status_code 200
            }
            #连接超时时间
            connect_timeout 10
            #重连次数
            nb_get_retry 3
            #重连间隔时间
            delay_before_retry 3
           #健康检查端口
           connect_port 80
           }
        }

    #每台RealServer都需要一个下面的配置项
    real_server 192.168.245.130 80 {
        #服务节点的权值
        weight 105  
         #健康检查方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
         HTTP_GET {
            #HTTP/SSL检查的URL,这里可以指定多个URL
            url {
            #检查的url路径
            path /do_not_delete/do_not_delete.php
            # 检查后的摘要信息(genhash工具算出)
            digest e0aa021e21dddbd6d8cecec71e9cf564
            #返回状态码
            status_code 200
            }
            #连接超时时间
            connect_timeout 10
            #重连次数
            nb_get_retry 3
            #重连间隔时间
            delay_before_retry 3
            #健康检查端口
            connect_port 80
           }
        }
}


REAL_SERVER:
#!/bin/bash
VIP=192.168.245.133
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

三:是时候结束了

自言自语:

哎,说好的,这篇文章要好好的写,结果从月初推到了月尾,还是一笔烂帐,迷迷糊糊,一无所成。本想着详细的去分析下lvs数据包的流向,无奈功力不够,有些地方还是不理解,等抽时间把《tcp/ip 详解》好好看过后,再分析吧。

参考资料:

我的老博客:http://budongzhenren.blog.51cto.com/2288320/893270

lvs官网:http://www.linuxvirtualserver.org/

keepalived 官网:http://www.keepalived.org/