keepalived是由C语言编写的路由软件,是lvs的扩展项目,主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。
[root@HKBO ~]# more /etc/issue
CentOS release 5.9 (Final)
# mkdir /usr/local/keepalived
# cd /usr/local/src
# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
# tar -xvf keepalived-1.2.13.tar.gz
# cd keepalived-1.2.13
# ./configure --disable-fwmark --prefix=/usr/local/keepalived
...............
Keepalived configuration
------------------------
Keepalived version : 1.2.13
Compiler : gcc
Compiler flags : -g -O2 -DETHERTYPE_IPV6=0x86dd
Extra Lib : -lssl -lcrypto -lcrypt
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
fwmark socket support : No
Use VRRP Framework : Yes
Use VRRP VMAC : No
SNMP support: No
SHA1 support: No
Use Debug flags : No
# make && make install
# ls /usr/local/keepalived/ #查看安装完成后,生成了4个目录
bin etc sbin share
# cd /usr/local/keepalived/etc
[root@HKBO etc]# tree
.
|-- keepalived
| |-- keepalived.conf #keepalived的配置样例
| `-- samples
| |-- client.pem
| |-- dh1024.pem
| |-- keepalived.conf.HTTP_GET.port
| |-- keepalived.conf.IPv6
| |-- keepalived.conf.SMTP_CHECK
| |-- keepalived.conf.SSL_GET
| |-- keepalived.conf.fwmark
| |-- keepalived.conf.inhibit
| |-- keepalived.conf.misc_check
| |-- keepalived.conf.misc_check_arg
| |-- keepalived.conf.quorum
| |-- keepalived.conf.sample
| |-- keepalived.conf.status_code
| |-- keepalived.conf.track_interface
| |-- keepalived.conf.virtual_server_group
| |-- keepalived.conf.virtualhost
| |-- keepalived.conf.vrrp
| |-- keepalived.conf.vrrp.localcheck
| |-- keepalived.conf.vrrp.lvs_syncd
| |-- keepalived.conf.vrrp.routes
| |-- keepalived.conf.vrrp.scripts
| |-- keepalived.conf.vrrp.static_ipaddress
| |-- keepalived.conf.vrrp.sync
| |-- root.pem
| `-- sample.misccheck.smbcheck.sh
|-- rc.d
| `-- init.d
| `-- keepalived
`-- sysconfig
`-- keepalived
# cd /usr/local/keepalived/sbin
# ./keepalived --help #获取keepalived的一些帮助
Usage: ./keepalived [OPTION...]
-f, --use-file=FILE Use the specified configuration file
-P, --vrrp Only run with VRRP subsystem
-C, --check Only run with Health-checker subsystem
-l, --log-console Log messages to local console
-D, --log-detailDetailed log messages
-S, --log-facility=[0-7] Set syslog facility to LOG_LOCAL[0-7]
-V, --dont-release-vrrp Don't remove VRRP VIPs and VROUTEs on daemon stop
-I, --dont-release-ipvs Don't remove IPVS topology on daemon stop
-R, --dont-respawn Don't respawn child processes
-n, --dont-fork Don't fork the daemon process
-d, --dump-conf Dump the configuration data
-p, --pid=FILE Use specified pidfile for parent process
-r, --vrrp_pid=FILE Use specified pidfile for VRRP child process
-c, --checkers_pid=FILE Use specified pidfile for checkers child process
-v, --version Display the version number
-h, --help Display this help message
# mkdir /etc/keepalived/
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
# service keepalived restart
Stopping keepalived: [FAILED]
Starting keepalived: [ OK ]
# service keepalived status
keepalived (pid 12092) is running...
# chkconfig keepalived on
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
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:
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:84:04:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.66/24 brd 192.168.1.255 scope global eth0
inet 192.168.200.16/32 scope global eth0
inet 192.168.200.17/32 scope global eth0
inet 192.168.200.18/32 scope global eth0
inet6 fe80::250:56ff:fe84:42c/64 scope link
valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
[root@HKBO keepalived]# more keepalived.conf
! Configuration File for keepalived
#全局定义块,包含邮件定义部分,
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL //负载均衡器标识,在一个网络内,它应该是唯一的
}
#VRRP实例定义块,负责负载均衡器之间的失败切换
vrrp_instance VI_1 {
state MASTER //只有MASTER和BACKUP 2种状态,主为MASTER,从为BACKUP,使用大写
interface eth0 //监控的网络接口
virtual_router_id 51 //同一实例下virtual_router_id必须相同
priority 100 //定义优先级,数字越大,优先级越高
advert_int 1 //MASTER与BACKUP负载均衡器之间同步检查的
时间间隔,单位是秒
authentication { //验证类型和密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { //虚拟
IP地址virtual_ipaddress,可以定义多个
192.168.200.16
192.168.200.17
192.168.200.18
}
}
#虚拟
服务器定义块
virtual_server 192.168.200.100 443 { //定义虚拟服务器
delay_loop 6 //delay_loop,健康检查时间间隔,单位是秒
lb_algo rr//负载调度算法,这里设置为rr,即轮询算法,互联网应用常使用wlc或rr
lb_kind NAT //负载均衡转发规则。一般包括DR,NAT,TUN3种,在我的方案中,都使用DR的方式
nat_mask 255.255.255.0 //子网掩码
persistence_timeout 50 //会话保持时间,单位是秒(可以适当延长时间以保持session)
protocol TCP //转发协议类型,有tcp和udp两种
real_server 192.168.201.100 443 { //真实服务器IP及端口
weight 1 //默认为1,0为失效
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}