nginx集群架构
Linux集群从功能分类
- 高可用集群,高可用集群通常为俩台服务器,一台工作,另一台冗余,当提供服务器的服务器宕机时候,冗余服务器将接替宕机的服务器继续提供服务。实现高可用的集群开源软件有Heatbeat和Keepalived。
- 负载均衡集群,需要有一台服务器作为分发器,它负载把用户的请求分发给后端的服务器处理,在负载均衡集群中,除分发器外,就是给用户提供服务的服务器了,这些服务器的数量至少是俩台。实现负载均衡的开源软件有很多,如:LVS,keepalived,Haproxy,Nginx,商业版有F5和Netscaler,商业版的优势在于并发量高,拥有很好的稳定性。
Keepalived的VRRP协议
Keepalived是通过VRRP协议来实现高可用的,VRRP协议会将多台功能相同的路由器组成一个组,这个组里有一个master角色和N(N>1)个backup角色,master会通过组播的组播的形式向各个backup发送VRRP协议的数据包,当backup不会受到master发来的VRRP数据包时,就会认为master宕机了,就会根据backup的优先级来决定谁是master。
Keepalived的有三个模块,core,check和VRRP,core模块是keepalived的核心,负责主进程的启动,维护,以及全局配置文件的加载和解析,check模块负责健康检查,VRRP模块用来实现VRRP协议。
集群准备,哈哈,来战
准备俩台虚拟机,ip为192.168.31.132的主机S-32作为master,ip为192.168.31.139的主机c-39作为backup,俩台虚拟主机同时安装keepalived和nginx。
yum install keepalived nginx -y systemctl stop firewalld systemctl enable firewalld
设置Keepalived主服务器
查看keepalived的配置文件vim /etc/keepalived/keepalived.conf
1 ! Configuration File for keepalived 2 3 global_defs { #全局定义参数 4 notification_email { #出问题时给邮箱发邮件 5 acassen@firewall.loc 6 failover@firewall.loc 7 sysadmin@firewall.loc #邮件报警,暂时可不设置,后期zabbix统一管理 8 } 9 notification_email_from Alexandre.Cassen@firewall.loc 10 smtp_server 192.168.200.1 11 smtp_connect_timeout 30 12 router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。 13 vrrp_scripts chk_nginx{ 14 scripts "/scripts/check_ng.sh" #检测服务是否正常,脚本的路径 15 interval 3 #检测间断3秒 16 } 17 vrrp_skip_check_adv_addr 18 vrrp_strict 19 vrrp_garp_interval 0 20 vrrp_gna_interval 0 21 } 22 23 vrrp_instance VI_1 { 24 state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。 25 interface ens33 #通过ens33发送广播,centos6是eth0。 26 lvs_sync_daemon_inteface ens33 #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。 27 virtual_router_id 51 #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。 28 priority 100 #优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。 29 advert_int 1 30 authentication { 31 auth_type PASS #验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS,\ 32 auth_pass 1111 #据说AH 使用时有问题。验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。 33 } 34 virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致! 35 192.168.200.100 36 192.168.200.17 37 192.168.200.18 38 track_scripts{ 39 chk_nginx #加载脚本 40 } 41 } 42 } 43 44 virtual_server 192.168.200.100 443 { #虚拟IP,来源与上面的虚拟IP地址,后面加空格加端口号 45 delay_loop 6 #健康检查间隔,单位为秒 46 lb_algo rr #负载均衡调度算法,一般用wrr、rr、wlc 47 lb_kind NAT #负载均衡转发规则。一般包括DR,NAT,TUN 3种。 48 persistence_timeout 50 #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了。 49 protocol TCP #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP 50 51 real_server 192.168.201.100 443 { #真实服务器,包括IP和端口号 52 weight 1 #权重,数值越大,权重越高 53 SSL_GET { 54 url { 55 path / 56 digest ff20ad2481f97b1754ef3e12ecd3a9cc 57 } 58 url { 59 path /mrtg/ 60 digest 9b3a0c85a887a256d6939da88aabd8cd 61 } 62 connect_timeout 3 63 nb_get_retry 3 64 delay_before_retry 3 65 } 66 } 67 } 68 69 virtual_server 10.10.10.2 1358 { 70 delay_loop 6 71 lb_algo rr 72 lb_kind NAT 73 persistence_timeout 50 74 protocol TCP 75 76 sorry_server 192.168.200.200 1358 77 78 real_server 192.168.200.2 1358 { 79 weight 1 80 HTTP_GET { 81 url { 82 path /testurl/test.jsp 83 digest 640205b7b0fc66c1ea91c463fac6334d 84 } 85 url { 86 path /testurl2/test.jsp 87 digest 640205b7b0fc66c1ea91c463fac6334d 88 } 89 url { 90 path /testurl3/test.jsp 91 digest 640205b7b0fc66c1ea91c463fac6334d 92 } 93 connect_timeout 3 94 nb_get_retry 3 95 delay_before_retry 3 96 } 97 } 98 99 real_server 192.168.200.3 1358 { 100 weight 1 101 HTTP_GET { 102 url { 103 path /testurl/test.jsp 104 digest 640205b7b0fc66c1ea91c463fac6334c 105 } 106 url { 107 path /testurl2/test.jsp 108 digest 640205b7b0fc66c1ea91c463fac6334c 109 } 110 connect_timeout 3 111 nb_get_retry 3 112 delay_before_retry 3 113 } 114 } 115 } 116 117 virtual_server 10.10.10.3 1358 { 118 delay_loop 3 119 lb_algo rr 120 lb_kind NAT 121 persistence_timeout 50 122 protocol TCP 123 124 real_server 192.168.200.4 1358 { 125 weight 1 126 HTTP_GET { 127 url { 128 path /testurl/test.jsp 129 digest 640205b7b0fc66c1ea91c463fac6334d 130 } 131 url { 132 path /testurl2/test.jsp 133 digest 640205b7b0fc66c1ea91c463fac6334d 134 } 135 url { 136 path /testurl3/test.jsp 137 digest 640205b7b0fc66c1ea91c463fac6334d 138 } 139 connect_timeout 3 140 nb_get_retry 3 141 delay_before_retry 3 142 } 143 } 144 145 real_server 192.168.200.5 1358 { 146 weight 1 147 HTTP_GET { 148 url { 149 path /testurl/test.jsp 150 digest 640205b7b0fc66c1ea91c463fac6334d 151 } 152 url { 153 path /testurl2/test.jsp 154 digest 640205b7b0fc66c1ea91c463fac6334d 155 } 156 url { 157 path /testurl3/test.jsp 158 digest 640205b7b0fc66c1ea91c463fac6334d 159 } 160 connect_timeout 3 161 nb_get_retry 3 162 delay_before_retry 3 163 } 164 } 165 }
编辑检测nginx 的脚本
vim /scripts/check_ng.sh脚本需要授权755的权限。
1 #!/bin/bash 2 #author:king 3 #blog:https://www.cnblogs.com/liang-io/ 4 #usage: 5 #定义时间变量,用于纪录日志 6 d=`date --date today +%Y%m%d_%H:%M:%S` 7 #计算nginx的进程数量 8 n=`ps -C nginx --no-heading|wc -l` 9 #如果n为0,则启动nginx,并在次检测nginx,还是为0说明nginx无法启动,则关闭Keepalived 10 if [ $n -eq "0" ]; then 11 systemctl start nginx 12 n2=`ps -C nginx --no-heading|wc -l` 13 if [ $n2 -eq "0" ]; then 14 echo "$d nginx,keepalived will stop" >> /var/log/check_ng.log 15 systemctl stop keepalived 16 fi 17 fi
启动keepalived服务,使用ps aux命令查看keepalived进程,检查nginx是否启动,启动后关闭nginx,再次查询它时会自动启动,说明脚本生效
1 [root@c-32 scripts]# systemctl start keepalived 2 [root@c-32 scripts]# ps -aux|grep keep 3 root 7390 0.0 0.0 123008 1408 ? Ss 11:27 0:00 /usr/sbin/keepalived -D 4 root 7391 0.0 0.1 133980 3384 ? S 11:27 0:00 /usr/sbin/keepalived -D 5 root 7392 0.0 0.1 133848 2656 ? S 11:27 0:00 /usr/sbin/keepalived -D 6 root 7408 0.0 0.0 6824 196 pts/0 R+ 11:27 0:00 grep --color=auto keep 7 [root@c-32 scripts]# ps -aux|grep nginx 8 root 6748 0.0 0.1 120896 2104 ? Ss 10:03 0:00 nginx: master process nginx 9 nginx 6749 0.0 0.1 121292 3564 ? S 10:03 0:00 nginx: worker process 10 nginx 6750 0.0 0.1 121292 3328 ? S 10:03 0:00 nginx: worker process 11 root 7013 0.0 0.1 120908 2280 ? Ss 10:09 0:00 nginx: master process /usr/sbin/nginx 12 nginx 7014 0.0 0.1 121312 3344 ? S 10:09 0:00 nginx: worker process 13 nginx 7015 0.0 0.1 121312 3588 ? S 10:09 0:00 nginx: worker process 14 root 7410 0.0 0.0 8988 216 pts/0 R+ 11:27 0:00 grep --color=auto nginx 15 [root@c-32 scripts]# systemctl stop nginx 16 [root@c-32 scripts]# ps -aux|grep nginx 17 root 6748 0.0 0.1 120896 2104 ? Ss 10:03 0:00 nginx: master process nginx 18 nginx 6749 0.0 0.1 121292 3564 ? S 10:03 0:00 nginx: worker process 19 nginx 6750 0.0 0.1 121292 3328 ? S 10:03 0:00 nginx: worker process
Keepalived服务日志在/var/log目录下的messages文件中,设置的VIP 100 使用ifcofng命令查看不到,需要使用 ip add 查看
1 [root@c-32 scripts]# ip add 2 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 3 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 4 inet 127.0.0.1/8 scope host lo 5 valid_lft forever preferred_lft forever 6 inet6 ::1/128 scope host 7 valid_lft forever preferred_lft forever 8 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 9 link/ether 00:0c:29:a8:f5:e5 brd ff:ff:ff:ff:ff:ff 10 inet 192.168.31.132/24 brd 192.168.31.255 scope global noprefixroute dynamic ens33 11 valid_lft 1563sec preferred_lft 1563sec 12 inet 192.168.200.100/32 scope global ens33 13 valid_lft forever preferred_lft forever 14 inet 192.168.200.17/32 scope global ens33 15 valid_lft forever preferred_lft forever 16 inet 192.168.200.18/32 scope global ens33 17 valid_lft forever preferred_lft forever 18 inet6 fe80::f19:5632:205a:cb78/64 scope link noprefixroute 19 valid_lft forever preferred_lft forever
设置Keepalived从服务器
配置文件keepalived.conf,是上面的配置文件,就是改了一个vip,权重从服务器都比主服务器低,nginx健康的脚本也是上面的。
1 [root@c-139 keepalived]# vim keepalived.conf #把priority 100 改为90,sed -i "s/priority 100/priority 90/g" /etc/keepalived/keepalived.conf 2 [root@c-139 keepalived]# egrep "priority" /etc/keepalived/keepalived.conf 3 priority 90 4 [root@c-139 keepalived]#
区分主从nginx服务
主服务器和从服务器都安装了nginx,根据安装的nginx,web目录来写个html测试,ip来访问就可以了,
LVS负载均衡,算法
负载均衡集群有LVS,Keepalived,Haporxy,Nginx等开源软件实现,LVS基于4层,(OSI网络7层模型),nginx基于7层,Haporxy既可以做4层也可以做7层,Keepalived的负载均衡功能就是LVS,LVS(4层)负载均衡可以分发TCP协议,web服务器是80端口,除分发80端口外,它还可以分发其他端口通信,比如:mysql负载均衡也可以用LVS去实现,而nginx不支持这个功能,仅支持http,https,mail,相比较而言,LVS这种4层的结构更稳定,能承载的并发量更高,而nginx这种7层结构更加灵活,能够实现更多的个性化需求。
lvs有三种工作模式,分别是NAT模式,DR模式,IP Tunnel模式,lvs架构中有一个核心的角色叫作分发器,用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server简称RS)。
lvs的NAT模式是借助于iptables的nat来表示实现的,用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发的后端的RS上,RS设定的网关为分发器的内网ip,用户请求的数据包全部经过分发器,所以分发器成为瓶颈,在NAT模式中,分发器有公网ip即可,所以比较节省公网ip资源
lvs ip Tunnel模式需要有一个公网ip配置在分发器和所有的RS上,我们称之为VIP,客户端请求的目标ip为VIP,分发器接受到请求数据包会对数据做加工处理,把目标ip改为RS的ip,这样数据包就到了RS上,RS接受数据包后,会还原原始的数据包,这样目标的ip就为VIp,因为所有的RS配置了这个VIP,所以他的任务就是他自己
lvs DR模式需要一个公网的ip配置在分发器和所有的RS上,也就是VIP,和ipTunnel不同的是,他会把数据包的mac地址修改为RS的mac地址,rs接受数据包后,会还原原始数据包,这样目标ip就为VIP,因为所有的RS上配置的了这个VIP,所以他会认为是他自己。
LVS 支持的算法包括 8 种:轮询(Round-Robin,简称 rr)、加权轮询(Weight Round-Robin,简称wrr)、最小连接(Least-Connection,简称lc)、加权最小连接(Weight Least-Connection,简称 wlc)、基于局部性的最小连接(Locality-Based Least Connections,简称 lblc)、带复制的基于局部性最小连接(Locality-Based Least Connections with Replication,简称lblcr)、目标地址散列调度(Destination Hashing,简称dh)和源地址散列调度(Source Hashing,简称sh)。