写在前面:
很早之前就知道用keepalived和haproxy可以实现负载和高可用性,一直都没有亲手实践。最近闲来没事,自己就按照网上的教程配置了一下,加深了对于keepalived和haproxy的理解。
本人所有的环境都是基于linux虚拟机的,1台linux安装了Apache+mysql+php,1台安装了Nginx+mysql+php,环境如下:
Apache:192.168.150.131 8080
Nginx:192.168.150.130 80
这里因为之前的一些历史问题,两台web服务器绑定的端口并不一致,其实更好的做法是把Nginx绑定的80端口释放出来,留作haproxy使用。为什么要释放80呢?因为为了方便,我们让用户使用默认的80端口来访问haproxy所做的代理服务,所以要把80留给haproxy使用。不过我这里懒得改了,反正大家自己是新处理的web服务器,建议改成非80的端口,反正也是对用户可见的。
两台服务器的VIP都是192.168.150.140
第一步:130和131都安装haproxy
# cd /usr/local/src
# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz
# tar zxvf haproxy-1.4.24.tar.gz
# cd haproxy-1.4.24
# make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
#编译参数参考README,其中TARGET是指定内核版本,ARCH指定CPU架构, PREFIX 安装之后所在的目录
# make install PREFIX=/usr/local/haproxy
第二步:创建启动文件
# useradd -s /sbin/nologin haproxy
# passwd haproxy
# chown -R haproxy.haproxy /usr/local/haproxy
# cd /usr/local/haproxy
# mkdir /etc/haproxy
# cp examples/haproxy.cfg /etc/haproxy
# cp examples/haproxy.init /etc/init.d/haproxy
# chmod +x /etc/init.d/haproxy
# ln -s /usr/local/sbin/haproxy /usr/sbin/
第三步:编辑配置文件
# vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /usr/local/haproxy
user haproxy
group haproxy
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
timeout check 2000 #心跳检测超时
frontend www
bind *:8000 #我这里的haproxy使用8000代理服务器,更好的是用80
default_backend server_pool
backend server_pool
mode http
balance roundrobin
option forwardfor
option httpclose
option httpchk GET /haproxy.html #这个文件必须存在在两台web服务器,用来检测服务器的状态的,如果不存在,会被认为相应的服务器不可用
server s1 192.168.150.130:8080 cookie app1inst1 check inter 2000 rise 2 fall 5 #一台真实的服务器指向130
server s2 192.168.150.131:80 cookie app1inst3 check inter 2000 rise 2 fall 5 #另一台真实的服务器指向131
第四步:启动服务
# service haproxy start
# 查看服务是否起来
# ps aux| grep haproxy
第五步:130和131都安装keepalived
# wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
# tar zxvf keepalived-1.2.7.tar.gz
# cd keepalived-1.2.7
# ./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/
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
第六步:130配置keepalived.conf
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# notification_email {
# [email protected]
# [email protected]
# [email protected]
# }
# notification_email_from [email protected]
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #此处表明此机器具有优先获取vip请求的能力
interface eth0
virtual_router_id 51
priority 100 #此优先级必须比131中的要高,要不然131会有优先获取vip请求的能力
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.150.140
#192.168.200.17
#192.168.200.18
# 可以绑定多个IP
}
}
#当系统中安装了haproxy,virtual_server不是必须的,因为keepalived的主要目的是虚拟出一个相同的ip给到不同的机器,用户通过虚拟IP,keepalived通过竞争使其中一台真实的服务器响应用户的请求,此请求通过端口被haproxy监听,提供服务,而且我个人在未使用haproxy的情况下试验virtual_server中的real_server提供的服务器,发现一直没有成功,通过查看发现8888端口并没有被任何程序绑定,不知为何。望知情的小伙伴不吝指教。
#所以此处就权当写着玩吧
virtual_server 192.168.150.140 8888 {
delay_loop 6
lb_algo rr
protocol TCP
real_server 192.168.150.130 80 {
weight 1
TCP_CHECK {
connect_timeout 5
connect_port 8000
}
}
}
第七步:131配置keepalived
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# notification_email {
# [email protected]
# [email protected]
# [email protected]
# }
# notification_email_from [email protected]
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP #此处表明此机器是个备份机器,当MASTER不可用的时候才出手
interface eth0
virtual_router_id 51
priority 99 #此优先级必须比130中的要低,要不然就反客为主了
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.150.140
#192.168.200.17
#192.168.200.18
# 可以绑定多个IP
}
}
# 当系统中安装了haproxy,virtual_server不是必须的,因为keepalived的主要目的是虚拟出一个相同的ip给到不同的机器,用 户通过虚拟IP,keepalived通过竞争使其中一台真实的服务器响应用户的请求,此请求通过端口被haproxy监听,提供服务,而且我个人在未使 用haproxy的情况下试验virtual_server中的real_server提供的服务器,发现一直没有成功,通过查看发现8888端口并没有 被任何程序绑定,不知为何。望知情的小伙伴不吝指教。
#所以此处就权当写着玩吧
virtual_server 192.168.150.140 8888 {
delay_loop 6
lb_algo rr
protocol TCP
real_server 192.168.150.130 80 {
weight 1
TCP_CHECK {
connect_timeout 5
connect_port 8000
}
}
}
第八步:130和131上启动keepalived
# service keepalived start
# 查看网卡是否绑定了vip
# ip addr
这里可能要等个一两秒钟,之前我太心急发现没有绑定,又去折腾配置文件,发现白搭,老老实实的等绑定成功吧,如果成功应该能看到类似以下的信息:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ad:a4:8a brd ff:ff:ff:ff:ff:ff
inet 192.168.150.131/24 brd 192.168.150.255 scope global eth0
inet 192.168.150.140/32 scope global eth0
inet6 fe80::20c:29ff:fead:a48a/64 scope link
valid_lft forever preferred_lft forever
表明140已经成功绑定到网卡eth0上了,130也是一样的。
第九步:测试
通过浏览器访问 http://192.168.150.140:8000, 不停的狂刷新,你会发现页面的内容时而改变,说明haproxy根据负载的情况选择了不同的web服务器来相应用户的请求。
停掉130上的keepalived服务器
# service keepalived stop
再次访问,发现访问的服务器只是131上的
同理,停掉131的keepalived,只能访问130的服务。
想要测试haproxy是否工作了,将某一台服务器上的web服务器停掉即可。
总结:
通过keepalived和haproxy可以增加程序的健壮性,扩展起来也不复杂,所以对于一般的用户来讲,实在是出门旅行,强身健体的不二之选。
整个请求的流程大致如下:
1:用户打电话到XXX酒店说要定一个满汉全席(XXX酒店是个连锁酒店,旗下有上百间店面)
2:XXX酒店一看有活干了,挺高兴的,但是作为老大(开了上百间大酒店),不能自己亲自干活啊,所以大手一挥,随便(通过一定的机制)叫了个小弟(某一个酒店)接手了
3:小弟一看用户要的是满汉全席,好办,通知大厨(haproxy)准备开工
4:大厨作为一个大厨,手上业务也很多,除了会做满汉全席(apache,ngxin),还会做法国大餐(mysql)等。大厨作为一个有经验的大厨,发现满汉全席很火爆,一个人搞不定,于是雇佣了一帮小弟,大厨拿到业务之后,就看看其中的某个小弟是否可以做(是否空闲),如果是的话,就把订单丢个小弟了,小弟一想闲着也是闲着,就做了。