最原始的服务部署,为单点部署,即直接把服务部署在一个服务器上。如果服务器出现故障,或者服务因为某个异常而挂掉,则服务就会发生中断。单点部署出现故障的概率最高。
后来,出现了网关,比如 nginx kong 等。如下图所示:
这样,所有客户请求都会经过网关,再由网关转发到各个服务。如果由服务出现故障,则网关会自动跳过故障服务,把请求分发到可用服务。因为网关只是起到服务转发的功能,所以网关出现故障的概率比应用出现故障的概率低很多。
http{upstream myserver {server 192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s;server 192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s;server 192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s;}server{listen 80;server_name www.domain.com 192.168.12.189;index index.htm index.html;root /ixdba/web/wwwroot;location / {proxy_pass http://myserver;proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;include /opt/nginx/conf/proxy.conf;}}}
但是,网关并非会永远不宕机,如果遭遇入侵,或者机房断电。网关服务出现故障,则不管下面的应用服务部署了多少个都没用。
于是就出现了第三种集群。如下图所示,借助keeplived部署2个以上的nginx 网关。这样网关出现故障导致服务中断的机率将大大降低。
这里主从nginx服务的配置是一样的。
3.keepalive的配置:/etc/keepalived/keepalivec.conf
主节点(Master节点配置)
(1)修改/etc/keepalived/keepalivec.conf 配置文件global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc#当前主机ipsmtp_server 192.168.17.129smtp_connect_timeout 30# 重点1:通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL,host文件路径:/etc/hostsrouter_id LVS_DEVEL }#重点2:检测脚本,目的是定时执行,检测nginx的状态,如果挂了尝试重启,如果启动失败,则停止该节点的nginx和keepaivevrrp_script chk_http_port {script "/usr/local/src/nginx_check.sh" # 执行脚本所在的位置,自定义脚本后面会提及interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本weight 2 #脚本执行满足,权重加2,这里其实没搞明白..}#重点3:主备节点的区别配置 vrrp_instance VI_1 {state MASTER # 备份服务器上将 MASTER 改为 BACKUPinterface ens33 # 绑定的网卡,通过ipconfig查看virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小(比如主机100,备机90)advert_int 1 #每隔一秒发送一次心跳,确保从服务器(keepalive)是否还活着authentication { # 心跳检测需要的密码auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.17.50 # VRRP H 虚拟地址(重点:虚拟ip配置,客户端通过该ip进行访问,主节点和备用节点谁占有这个ip,谁提供反向代理服务)}}(2)在/usr/local/src 添加检测脚本nginx_check.sh,检查Nginx是否还活着#!/bin/bash#查看ningx的进程号,并统计数量A=`ps -C nginx –no-header |wc -l`#等于0时,即nginx挂了,尝试重启if [ $A -eq 0 ];then/usr/local/nginx/sbin/nginx #Nginx启动命令的位置sleep 2#启动失败,杀掉keepaliveif [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillall keepalivedfifi