随着用户量的上升,系统须要使用keepalived,haproxy和VIP来实现负载均衡html
其中keepalived主要实现了高可用,在一台haproxy机器当机以后能够当即切换到备用机以保证集群的高可用性。前端
不少同窗可能会有疑问,为啥不选用nginx?这里主要是出于如下几种状况综合考虑得出的结论node
1.Nginx是工做在网络的7层之上,不支持TCP协议的转发,1.9 之后能够经过stream模块实现了tcp代理功能可是稳定性仍是有所欠缺。而公司现有的系统有部分协议是ICE的所以若是不支持TCP协议改动会比较大。linux
2.Nginx不支持健康检查,虽而后来淘宝出了个nginx_upstream_check_module可是须要额外安装插件,另外这个插件也只是支持http的不支持TCP的。因此有必定的局限性。nginx
*什么是健康检查?简单来讲就是负载均衡服务器定时调用负载服务器某个HTTP接口或ping一下tpc端口检查服务是否可用。这个对实现系统高可用很是有用,健康检测能够自定义脚原本检测后端服务,这有利于那些常常出现假死,没法经过常规判断端口来检测后台是否正常的问题。 好比,RabbitMQ,业务程序自定义检查等。目前HA支持3种形式检查c++
1)经过监听端口进行健康检测 。这种检测方式,haproxy只会去检查后端server的端口,并不能保证服务的真正可用。web
例如:vim
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2后端
2)经过URI获取进行健康检测 。检测方式,是用过去GET后端server的的web页面,基本上能够表明后端服务的可用性。服务器
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk GET /index.html
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
3)经过request获取的头部信息进行匹配进行健康检测 。这种检测方式,则是基于高级,精细的一些监测需求。经过对后端服务访问的头部信息进行匹配检测。
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www.xxx.com
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
3.haproxy内置负载监控界面,能够很清晰看到负载状况。
这里并非说Nginx比不上Haproyx只是相对而言Haproxy提供咱们想要的功能,并且无需安装其它插件,相对而言比较简单。所以综合考虑咱们决定采用Haproyx+keepalive实现高可用。
下图就是整个负载均衡的架构图:
Haproxy安装:
#下载 #http://www.haproxy.org/download/1.7/src/haproxy-1.7.8.tar.gz #cd /data/nfs/download #yum install gcc gcc-c++ autoconf automake -y #安装haproxy tar -axf haproxy-* && cd ./haproxy-* make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproyx 安装成功后,查看版本 /usr/local/haproyx/sbin/haproxy -v
复制haproxy文件到/usr/sbin下
由于下面的haproxy.init启动脚本默认会去/usr/sbin下找,固然你也能够修改,不过比较麻烦。
cp /usr/local/haproxy/sbin/haproxy /usr/sbin/
复制haproxy脚本,到/etc/init.d下
cp ./examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy
建立系统帐号
useradd -r haproxy
建立配置文件
mkdir /etc/haproxy
vi /etc/haproxy/haproxy.cfg
在配置文件haproxy.cfg中添加以下设置:
#全局配置
global
#设置日志
log 127.0.0.1 local3 info
chroot /usr/local/haproxy
#用户与用户组
user haproxy
group haproxy
#守护进程启动
daemon
#最大链接数
maxconn 4000
#默认配置
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
#前端配置,http_front名称可自定义
frontend http_front
# 发起http请求道80端口,会被转发到设置的ip及端口
bind *:80
#haproxy的状态管理页面,经过/haproxy?stats来访问
stats uri /haproxy?stats
default_backend http_back
#后端配置,http_back名称可自定义
backend http_back
#负载均衡方式
#source 根据请求源IP
#static-rr 根据权重
#leastconn 最少链接者先处理
#uri 根据请求的uri
#url_param 根据请求的url参数
#rdp-cookie 据据cookie(name)来锁定并哈希每一次请求
#hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
#roundrobin 轮询方式
balance roundrobin
#设置健康检查页面
option httpchk GET /index.html
#传递客户端真实IP
option forwardfor header X-Forwarded-For
# inter 2000 健康检查时间间隔2秒
# rise 3 检测多少次才认为是正常的
# fall 3 失败多少次才认为是不可用的
# weight 30 权重
# 须要转发的ip及端口
server node1 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30
server node2 192.168.179.131:8082 check inter 2000 rise 3 fall 3 weight 30
keepalive安装
yum -y install keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id NodeA
}
vrrp_instance VI_1 {
state MASTER #指定A节点为主节点 备用节点上设置为BACKUP便可
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须同样,以指明各个节点属于同一VRRP组
priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须同样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP, 两个节点设置必须同样
192.168.1.220
}
}
interface eth0 这个的网卡名称必定别弄错了,要弄成本身的。可使用 ip a 命令查看
启动keepalive
/etc/init.d/keepalived start