- A+
所属分类:linux技术
最原始的服务部署,为单点部署,即直接把服务部署在一个服务器上。如果服务器出现故障,或者服务因为某个异常而挂掉,则服务就会发生中断。单点部署出现故障的概率最高。
后来,出现了网关,比如 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.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #当前主机ip smtp_server 192.168.17.129 smtp_connect_timeout 30 # 重点1:通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL,host文件路径:/etc/hosts router_id LVS_DEVEL } #重点2:检测脚本,目的是定时执行,检测nginx的状态,如果挂了尝试重启,如果启动失败,则停止该节点的nginx和keepaive vrrp_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 改为 BACKUP interface ens33 # 绑定的网卡,通过ipconfig查看 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小(比如主机100,备机90) advert_int 1 #每隔一秒发送一次心跳,确保从服务器(keepalive)是否还活着 authentication { # 心跳检测需要的密码 auth_type PASS auth_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 #启动失败,杀掉keepalive if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi