高可用可伸缩架构实用经验谈,Linux高可用之Ke

作者: 韦德国际1946  发布:2019-05-28

运维Sendmail的服务器会集可以在有竞争力的标价上提供高质量和高可用性。对于经验丰裕的系统管理员,这一定是常用的做法。本文描述了大家的钻研,量化和讲述达成高可用/可伸缩Sendmail 的主意。

2018年到庭手艺分享活动,7牛的三个技能简要的介绍了部分高可用可伸缩的一些经验之谈,听完将来受益匪浅,整理一下,首要分以下多少个部分:

简介

Keepalived是依据vrrp协议的一款高可用软件。Keepailived有1台主服务器和多台备份服务器,在主服务器和备份服务器上面陈设相同的劳务配置,使用一个虚拟IP地址对外提供劳动,当主服务器出现故障时,虚拟IP地址会活动漂移到备份服务器。

V途胜RP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议),VGL450RP是为了化解静态路由的高可用。VKugaRP的中坚架构
虚构路由器由几个路由器组成,每一个路由器都有独家的IP和协助实行的V中华VID(0-255),当中1个VLANDRP路由器通过公投成为MASTE揽胜,据有VIP,对外提供路由服务,别的成为BACKUP,MASTELX570以IP组播(组播地址:2二肆.0.0.1八)方式发送VRubiconRP协议包,与BACKUP保持心跳连接,若MASTE宝马X3不可用(或BACKUP接收不到V凯雷德RP协议包),则BACKUP通过公投爆发新的MASTE卡宴并传承对外提供路由服务,从而达成高可用。

vrrp协议的连锁术语:

    虚拟路由器:Virtual Router 
    虚拟路由器标识:VRID(0-255)
    物理路由器:
        master  :主设备
        backup  :备用设备
        priority:优先级
    VIP:Virtual IP 
    VMAC:Virutal MAC (00-00-5e-00-01-VRID)
    GraciousARP

有惊无险认证:

简单字符认证、HMAC机制,只对信息做认证
MD5(leepalived不支持)

办事格局:

主/备:单虚拟路径器;
主/主:主/备(虚拟路径器),备/主(虚拟路径器)

干活类型:

抢占式:当出现比现有主服务器优先级高的服务器时,会发送通告抢占角色成为主服务器
非抢占式:

咱俩商讨了Linux上Sendmail会集的几种配备,并对它们的相持质量实行了量化。大家经过调治Sendmail 的配备以及 Linux 操作系统中的参数,研讨并测试了国有属性。大家还一向不一个共享磁盘用于那个测试,因而大家将项指标界定限定在只囊括 SMTP 路由和排队。那是坐落专项使用网的边缘或当作当中国聚集国人民邮政总部公司件存款和储蓄的前端的Sendmail会集的常用配置。

入口层高可用

活动网络、云计算和大数据的多谋善算者和前进,让更加多的好主见能够在相当短的岁月内达成为产品。此时,假设用户须求抓得准,用户数量将很也许得到发生式拉长,而无需像往常同样必要精心运行几年的时日。但是用户数量的飞快增加(特别是长时间内的发生式增加),平时会让动用开垦者有些吃不消,不得不面前碰着一些 严苛的手艺挑战:怎么着制止因为单台机器当机导致服务不可用;怎么着幸免在劳动体量不足时,用户体验下落,等等。在系统创设之初就利用高可用和可伸缩架构,将 能有效制止这么些主题素材。

keepalived

虽说大家的硬件能源很常见,但我们相信这个针锋相对差别会使大家的结果对于这几个要达成基于Linux的 Sendmail服务器会集的系统架构划设想计师是分外首要的,因为大家的结果印证了Sendmail集结的统一筹划天性的相对主要性。

政工层高可用

怎么样营造高可用和可伸缩架构呢?7牛云存款和储蓄首席架构师李道兵在三月22的「开采者最好施行日」第9期沙龙活动上付出了团结的主见。他结缘本身多年的 实施经验,针对部分不太复杂的事情场景,从入口层、业务层、缓存层和数据库层多少个范畴细致讲述了哪些营造高可用和可伸缩系统。希望我们读完这篇小说,能认为高可用和可伸缩不是3个高雅的事物,投入不高的老本就能够在项目中期把高可用和可伸缩纳入框架结构划设想计之中。

着力零部件:

        vrrp stack:vrrp协议的实现
        ipvs wrapper:为集群内的所有节点生成IPVS规则
        checkers:对IPVS集群的各RS做健康状态检测
        控制组件:配置文件分析器,用来实现配置文件的分析和加载
        IO复用器
        内存管理组件,用来管理keepalived高可用是的内存管理

注意:

  1. 各节点时间必须共同
  2. 管教各节点的用来集群服务的接口援助MULTICAST通信(组播);

聚集结果

高可用可伸缩架构实用经验谈,Linux高可用之Keepalived。缓存层高可用

怎么着兑现高可用

安装

从CentOS 陆.四早先keepalived随系统base仓库提供,能够选择yun -y install keepalived安装。

Sendmail、LDAP 和 DNS 有成都百货上千配置选项,但大家只考虑那多少个对于该应用程序很要紧的选项。除非另有扬言,不然大家采用标准软件和缺省设置。在这几个选用中,我们开掘有少数要素能够对质量产生巨大影响,或然是实现可伸缩性不可缺少的,如 LogLevel 和 QueueDirectory。

数据库高可用

入口层

布局文件:
        主配置文件:/etc/keepalived/keepalived.conf
        主程序文件:/usr/sbin/keepalived
        提供校验码:/usr/bin/genhash
        Unit File:keepalived.service
        Unit File的环境配置文件:/etc/sysconfig/keepalived

最终,大家开采便是正确配置了 Sendmail,全数这一个关键成分也会报告大家三个实际:

入口层可伸缩

入口层,平日指Nginx和Apache等范畴的东西,担任利用(不管是Web应用如故移动采取)的劳务入口。大家平日会将劳动一定在多个IP,要是这几个IP对应的服务器当机了,那么用户的造访必将会因噎废食。此时,能够用keepalived来促成入口层的高可用。举个例子,机器A 的IP是 一.二.3.4,机器 B 的 IP 是 壹.二.叁.五, 那么再申请2个 IP 1.二.三.陆(称为⼼跳IP), 常常绑定在机器A上,若是A当机,IP会自动绑定在机器B上;假诺B当机,IP会自动绑定在机器A上。对于这种方式,我们将DNS绑定到心跳IP上,即可达成入口层的高可用。

配置

Sendmail 是磁盘密集型的,磁盘速度越快,Sendmail 的进度就越快。

事情层可伸缩

但这几个方案有一些小难题。第3,它的切换只怕会有一到两秒的中止,相当于说,借使不是讲求到特别严俊的纳秒级就不会有标题。第二,对进口的机器会有些浪费,因为买了两台机械的输入,大概就唯有一台机器用上。对部分长连接的应用大概会招致服务中断,那时候就必要客户端做同盟做一些重新创立连接的做事。 简来讲之,对于相比普通的专门的工作以来,这些方案就能够一挥而就部分主题材料。

主配置文件详解

! 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      #smtp的超时时间
   router_id LVS_DEVEL          #物理服务器的主机名
   vrrp_mcast_group4            #定义一个组播地址
   static_ipaddress
        {
        192.168.1.1/24 dev eth0 scope global
        }
        static_routes
        {
        192.168.2.0/24 via 192.168.1.100 dev eth0
        }

}
    vrrp_sync_group VG_1 {              #定义一个故障组,组内有一个虚拟路由出现故障另一个也会一起跟着转移,适用于LVS的NAT模型。
        group {
            VI1     # name of vrrp_instance (below)         
            VI2     # One for each moveable IP

             }
    }


vrrp_instance VI_1 {        #定义一个虚拟路由
    state MASTER|BACKUP     #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
    interface eth0          #绑定为当前虚拟路由器使用的物理接口;
    virtual_router_id 51    #当前虚拟路由器的惟一标识,范围是0-255;
    priority 100            #当前主机在此虚拟路径器中的优先级;范围1-254;
    advert_int 1            #通告发送间隔,包含主机优先级、心跳等。
    authentication {        #认证配置   
        auth_type PASS      #认证类型,PASS表示简单字符串认证
        auth_pass 1111      #密码,PASS密码最长为8位

   virtual_ipaddress {
    192.168.200.16          #虚拟路由IP地址,以辅助地址方式设置
    192.168.200.18/24 dev eth2 label eth2:1 #以别名的方式设置
    }

track_interface {
        eth0
        eth1

}                           #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
nopreempt                   #定义工作模式为非抢占模式;
preempt_delay 300           #抢占式模式下,节点上线后触发新选举操作的延迟时长;
   virtual_routes {     #配置路由信息,可选项
               #  src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope
       <SCOPE> tab
               src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
               192.168.112.0/24 via 192.168.100.254       192.168.113.0/24  via  192.168.200.254  or 192.168.100.254 dev eth1      blackhole 192.168.114.0/24
           }


    notify_master <STRING>|<QUOTED-STRING>       #当前节点成为主节点时触发的脚本。
    notify_backup <STRING>|<QUOTED-STRING>       #当前节点转为备节点时触发的脚本。
    notify_fault <STRING>|<QUOTED-STRING>        #当前节点转为“失败”状态时触发的脚本。
    notify <STRING>|<QUOTED-STRING>              #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知。
    smtp_alert                                   #如果加入这个选项,将调用前面设置的邮件设置,并自动根据状态发送信息 
}
virtual_server 192.168.200.100 443 {    #LVS配置段 ,设置LVS的VIP地址和端口
    delay_loop                          #服务轮询的时间间隔;检测RS服务器的状态。
    lb_algo rr                          #调度算法,可选rr|wrr|lc|wlc|lblc|sh|dh。
    lb_kind NAT                         #集群类型。
    nat_mask 255.255.255.0              #子网掩码,可选项。
    persistence_timeout 50              #是否启用持久连接,连接保存时长
    protocol TCP                        #协议,只支持TCP
    sorry_server <IPADDR> <PORT>        #备用服务器地址,可选项。

    real_server 192.168.201.100 443 {   #配置RS服务器的地址和端口
        weight 1                        #权重
     SSL_GET {                      #检测RS服务器的状态,发送请求报文
            url {
              path /                    #请求的URL
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #对请求的页面进行hash运算,然后和这个hash码进行比对,如果hash码一样就表示状态正常
              status_code <INT>         #判断上述检测机制为健康状态的响应码,和digest二选一即可。

            }                           #这个hash码可以使用genhash命令请求这个页面生成
            connect_timeout 3           #连接超时时间
            nb_get_retry 3              #超时重试次数
            delay_before_retry 3        #每次超时过后多久再进行连接
            connect_ip <IP ADDRESS>     #向当前RS的哪个IP地址发起健康状态检测请求
            connect_port <PORT>         #向当前RS的哪个PORT发起健康状态检测请求
            bindto <IP ADDRESS>         #发出健康状态检测请求时使用的源地址;
            bind_port <PORT>            #发出健康状态检测请求时使用的源端口;
        }
    }
}

不受控因素恐怕会潜移默化大家所感知到的属性。如,远程 DNS 服务器爆发故障,路由有失常态、队列填满和别的第一方难题。

缓存层可伸缩

此处要专注,keepalived在运用上会有部分限制。

正规状态检测机制
  1. HTTP_GET
  2. SSL_GET
  3. TCP_CHECK
  4. SMTP_CHECK
  5. MISS_CHECK #调用自定义脚本举办检查实验
TCP_CHECK {
        connect_ip <IP ADDRESS>         #向当前RS的哪个IP地址发起健康状态检测请求;
        connect_port <PORT>             #向当前RS的哪个PORT发起健康状态检测请求;
        bindto <IP ADDRESS>             #发出健康状态检测请求时使用的源地址;
        bind_port <PORT>                #发出健康状态检测请求时使用的源端口;
        connect_timeout <INTEGER>       #连接请求的超时时长;
}

图片 1

数据库可伸缩

  • 两台机器必须在同3个网段,不是在同一个网段,未有章程落到实处互动抢IP。

  • 内网服务也能够做心跳,但需求注意的是,以前为了安全我们会把内网服务绑定在内网IP上,防止出现安全主题素材。但为了利用keepalived,必 须监听在富有IP上(假如监听在心跳IP上,那么机器未有具有该IP时,服务无法起动),轻易的方案是启用 iptables, 幸免内网服务被外网访问。

  • 服务器利用率下跌,这时可以设想做混合配置来革新那或多或少。

落到实处LVS高可用集群

尝试主机
虚拟IP:192.168.166.100

2台CentOS 7.3

CentOS 7.3   主服务器,IP:192.168.166.130
CentOS 7.3-1 备份服务器,IP:192.168.166.132

2台CentOS 6.9

CentOS 6.9  IP:192.168.166.129
CentOS6.9-1 IP:192.168.166.131

图片 2

比较普遍的叁个指鹿为马是,假设有两台机械,三个公网IP,DNS上把域名还要一定到八个IP,就以为已经做了高可用了。那全然不是高可用,因为一旦1台机器当机,那么就有八分之四左右的用户不或者访问。

注:在布局服务前须求注意几台主机的防火墙计策,和SELinux配置。

主调治器配置

[root@CentOS7.3 ~]#yum -y install keepalived ipvsadm        #安装keepalived和LVS管理软件ipvsadm
[root@CentOS7.3 ~]#vim /etc/keepalived/keepalived.conf  #配置keepalived
! Configuration File for keepalived

global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1                    #邮件服务器的地址
   smtp_connect_timeout 30
   router_id CentOS7.3                      #主调度器的主机名
   vrrp_mcast_group4 224.26.1.1             #发送心跳信息的组播地址

}

vrrp_instance VI_1 {
    state MASTER                            #主调度器的初始角色
    interface eth0                          #虚拟IP工作的网卡接口
    virtual_router_id 66                    #虚拟路由的ID
    priority 100                            #主调度器的选举优先级
    advert_int 1
    authentication {
        auth_type PASS                      #集群主机的认证方式
        auth_pass 123456                    #密钥,最长8位
    }
    virtual_ipaddress {
        192.168.166.100                     #虚拟IP
    }
}

virtual_server 192.168.166.100 80 {         #LVS配置段,VIP
    delay_loop 6
    lb_algo rr                              #调度算法轮询
    lb_kind DR                              #工作模式DR
    nat_mask 255.255.255.0
#    persistence_timeout 50                  #持久连接,在测试时需要注释,否则会在设置的时间内把请求都调度到一台RS服务器上面
    protocol TCP
    sorry_server 127.0.0.1 80               #Sorry server的服务器地址及端口
#Sorry server就是在后端的服务器全部宕机的情况下紧急提供服务。
    real_server 192.168.166.129 80 {        #RS服务器地址和端口
        weight 1                            #RS的权重
        HTTP_GET {                          #健康状态检测方法
            url {
              path /
              status_code 200               #状态判定规则
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

[root@CentOS7.3 keepalived]#systemctl start keepalived          #启动keepalived
[root@CentOS7.3 keepalived]#ip a l eth0                         #查看虚拟路由绑定的网卡    
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b9:7d:cb brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.130/24 brd 192.168.166.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.166.100/32 scope global eth0                   #虚拟IP已经绑定在了eth网卡上
       valid_lft forever preferred_lft forever
    inet6 fe80::50fe:a3f3:83a0:d38a/64 scope link 
       valid_lft forever preferred_lft forever

备份调节器的安插

[root@centos7.3-1 ~]#yum -y install keepalived ipvsadm 

! Configuration File for keepalived

global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3-1                #备份调度器的主机名
   vrrp_mcast_group4 224.26.1.1         #这个组播地址需与集群内的其他主机相同

}

vrrp_instance VI_1 {
    state BACKUP                        #初始角色,备份服务器需设置为BACKUP
    interface eth0
    virtual_router_id 66                #虚拟路由的ID一定要和集群内的其他主机相同
    priority 90                         #选举优先级,要比主调度器地一些
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456                #密钥需要和集群内的主服务器相同
    }
    virtual_ipaddress {
        192.168.166.100
    }
}
                #余下配置和主服务器相同
virtual_server 192.168.166.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 50              
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
[root@centos7.3-1 ~]#systemctl start keepalived         #启动备份keepalived
[root@centos7.3-1 ~]#ip a l eth0                        #查看虚拟路由绑定的网卡接口
[root@centos7.3-1 ~]#ip a l eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:7e:ec:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.132/24 brd 192.168.166.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9aab:52b3:cc1e:fbef/64 scope link 
       valid_lft forever preferred_lft forever

测试虚拟IP地址漂移

关门主服务器的keepalived,并查阅eth0接口

图片 3

image.png

翻开备份服务器的eth0接口,地址早就上浮到了备份服务器上边

图片 4

image.png

能够见见上海教室提醒有新邮件。使用mail命令查看邮件列表,都未来端服务器状态检测的邮件,表达配置的告警邮件生效了。应为后端服务器还不曾配备所以检验的地方全部是down。

图片 5

image.png

起步主服务器,地址又漂移回了主服务器

图片 6

image.png

配置RS服务器

RS1配置

[root@CentOS6.9 ~]#yum -y install httpd                 #安装httpd服务
[root@CentOS6.9 ~]#vim lvs.sh                           #创建一个配置脚本
#!/bin/bash
vip=192.168.166.100                                     #VIP地址
mask=255.255.255.255                    
dev=eth0:1
case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ifconfig $dev $vip netmask $mask broadcast $vip up
        route add -host $vip dev $dev
;;
stop)
        ifconfig $dev down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
        echo "Usage: $(basename $0) start|stop"
        exit 1
;;
esac

[root@CentOS6.9 ~]#bash lvs.sh start
[root@CentOS6.9 ~]#ip a l eth0:0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:23:38:c9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.129/24 brd 192.168.166.255 scope global eth0
    inet 192.168.166.100/32 brd 192.168.166.100 scope global eth0:1
    inet6 fe80::20c:29ff:fe23:38c9/64 scope link 
       valid_lft forever preferred_lft forever
[root@CentOS6.9 ~]#echo WebServer1 > /var/www/html/index.html
[root@CentOS6.9 ~]#cat /var/www/html/index.html 
WebServer1
[root@CentOS6.9 ~]#service httpd start

应用ipvsadm 命令查看lvs配置音信,本田UR-VS1服务器已经调整器增多进集群。

图片 7

image.png

RS2配置

[root@CentOS6.9-1 ~]#yum -y install httpd
[root@CentOS6.9-1 ~]#vim lvs.sh
[root@CentOS6.9-1 ~]#echo WebServer2 > /var/www/html/index.html
[root@CentOS6.9-1 ~]#cat /var/www/html/index.html 
WebServer2
[root@CentOS6.9-1 ~]#service httpd start

第1台奥迪Q5S服务器上线

图片 8

image.png

客户端测试

因为使用的是轮询算法,所以会在Web1和Web二之间往来调节。

图片 9

image.png

上面来分层介绍进行措施。

除了keepalive,lvs也能用来减轻入口层的高可用难点。不过,与keepalived比较,lvs会更复杂一些,门槛也会高级中学一年级些。

留神:借使在测试是敞开了lvs的长连接,会招致在设置的年月内把客户端直接调解到同1台宝马7系S服务器上面。

关闭主调治器

图片 10

image.png

客户端访问

图片 11

image.png

入口层高可用

业务层

小编们仍是能够动用那几个主机配置来两套LVS高可用,做2个双主模型

第二套LVS信息

VIP:192.168.166.200

率先台调治器为备份服务器

其次台调解器为主服务器

率先台调治器配置

! Configuration File for keepalived

global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.26.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.166.100
    }
}

virtual_server 192.168.166.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#   persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
#第二套虚拟路由
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88            #ID不要和第一套虚拟路由相同
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
   virtual_ipaddress {
        192.168.166.200         
    }
}

virtual_server 192.168.166.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#   persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

nigix多个 keeplive保活 心跳做好。

业务层平时是由PHP、Java、Python、Go等写的逻辑代码构成的,必要借助于后台数据库及部分缓存层面包车型客车事物。如何促成业务层的高可用呢?最核心的正是,业务层不要有情形,将气象分散到缓存层和数据库。这段时间大家常见喜欢将以下二种多少放入业务层。

其次台的布署这里就不列出了,把第一台服务器的配置文件修改一下。下图是布署好的结果。

第一台服务器

图片 12

image.png

第二台服务器

图片 13

image.png

RS配置

#!/bin/bash
vip=192.168.166.100
mask=255.255.255.255
dev=eth0:1                      
vip2=192.168.166.200        #添加一个VIP2
mask2=255.255.255.255
dev2=eth0:2                 #再添加一个eth0:2别名
case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ifconfig $dev $vip netmask $mask broadcast $vip up
        ifconfig $dev2 $vip2 netmask $mask2 broadcast $vip2 up      #设置地址
        route add -host $vip dev $dev
        route add -host $vip2 dev $dev2

;;
stop)
        ifconfig $dev down
        ifconfig $dev2 down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
        echo "Usage: $(basename $0) start|stop"
        exit 1
;;
esac

图片 14

先是个是session,即用户登陆相关的数量,但好的做法是将session放在数据Curry,也许贰个比较牢固的缓存系统中。

注:上边这份脚本LacrosseS1和PRADOS二通用

RS

图片 15

image.png

RS2

图片 16

image.png

调度器LVS规则

图片 17

image.png

测试

图片 18

image.png

图片 19

image.png

使用心跳技术:keeplive提供这一个本事

其次个是缓存,在走访数据库时,假诺3个查询异常的慢,就梦想将这么些结果权且停放进度里,下一次再做询问时就无须再拜访数据库了。这种做法带来的主题素材是,当业务层服务器不只一台时,数据很难达成一律,从缓存得到的多少就或然是似是而非的。。

高可用双主Nginx

配置Nginx主机

[root@centos7.3 ~]#yum -y install nginx                 #安装nginx,nginx在epel源。
[root@centos7.3 ~]#vim /etc/nginx/nginx.conf            #修改nginx主配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

upstream web {                          #在http上下文中添加一个服务器组,web是组名。
    server 192.168.166.129:80;              #后端服务器的地址和端口
    server 192.168.166.132:80;
}

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

概念多少个Nginx虚拟主机

[root@centos7.3 nginx]#vim /etc/nginx/conf.d/host.conf 
server {
        server_name www.test.com;
        listen 80;
        index index.html;
        root /app/web;
        location / {
        proxy_pass http://web;

        }
}

比如机器A IP是一.二.3.四,机器B IP是一.二.三.伍,那么再申请1个IP (一.2.三.陆)大家称之为心跳IP,平常绑定再A上边,假使A宕机,那么IP会自动绑定到B上边

2个大约的尺度正是业务层不要有气象。在业务层没有动静时,1台业务层服务器当掉了随后,Nginx/Apache会自动将兼具的伸手打到别的壹台 业务层的服务器上。由于并未有动静,两台服务器并没有其余差异,所以用户完全感受不到。若是把session放在业务层里面包车型客车话,那么面对的难点是,这么些用户 从前是登陆在1台机器上的,这一个进度死掉后,用户就能被登出了。

zhu注:以上内容两台主机一样

配置keepalived
第一台

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}

第二台Nginx

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3-1
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }

测试

图片 20

image.png

keepalived能够调用外部的赞助脚本举办财富监察,并依照监察的结果情形能实现优先动态调解;

先定义叁个本子

vrrp_script <SCRIPT_NAME> {                  #定义脚本
    script "killall -0 sshd"                 #可以在引号内调用命令或者脚本路径,如果脚本执行成功则不变,如果失败则执行下面的命令
    interval INT                         #检测间隔时间
    weight -INT                              #减掉权重
    fall    2                                #检测几次判定为失败
    rise    2                                #检测几次判定为成功
}

killall -0 只是测试,并不实施操作,用来测试进程是不是运维如常
调用此脚本

track_script {
    SCRIPT_NAME_1               #调用脚本
    SCRIPT_NAME_2  weight  -2    #如果脚本健康状态检测失败优先级减2
}

布局文件

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}
vrrp_script nginx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -15
        fall 2
        rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
   track_script {
        nginx
   }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}

测试

图片 21

image.png

图片 22

image.png

图片 23

image.png

图片 24

image.png

DNS 层面绑定到心跳IP就能够

友谊提醒:有一段时间相比较流行cookie session,就是将session中的数据加密之后放在客户的cookie里,然后下发到客户端,那样也能成就与服务端完全无状态。但这里面有诸多坑,假如能绕过那些坑就能够这么使用。第二个坑是怎么确定保障加密的密钥不走漏,壹旦走漏就代表攻击者能够伪造任哪个人的身份。第2个坑是重播攻击,如何防止旁人通过保留 cookie 去不停地品尝的验证码,当然也还会有别的一些攻击花招。借使未有好措施消除那两地点的问题,那么cookie session尽量慎用。最棒是将session放在一本性质比较好的数据库中。若是数据库质量非常,那么将session放在缓存中也比位居 cookie里要好一点。

两台机械必须在同一网段

缓存层

本文由韦德国际1946发布于韦德国际1946,转载请注明出处:高可用可伸缩架构实用经验谈,Linux高可用之Ke

关键词: 伟德 日记本 开发 架构 伸缩架构