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
! Configuration File for keepalived
global_defs { #全局定义参数
notification_email { #出问题时给邮箱发邮件
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc #邮件报警,暂时可不设置,后期zabbix统一管理
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout
router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
vrrp_scripts chk_nginx{
scripts "/scripts/check_ng.sh" #检测服务是否正常,脚本的路径
interval 3 #检测间断3秒
}
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
}
vrrp_instance VI_1 {
state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
interface ens33 #通过ens33发送广播,centos6是eth0。
lvs_sync_daemon_inteface ens33 #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
virtual_router_id #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
priority #优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。
advert_int
authentication {
auth_type PASS #验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS,\
auth_pass #据说AH 使用时有问题。验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。
}
virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
192.168.200.100
192.168.200.17
192.168.200.18
track_scripts{
chk_nginx #加载脚本
}
}
}
virtual_server 192.168.200.100 { #虚拟IP,来源与上面的虚拟IP地址,后面加空格加端口号
delay_loop #健康检查间隔,单位为秒
lb_algo rr #负载均衡调度算法,一般用wrr、rr、wlc
lb_kind NAT #负载均衡转发规则。一般包括DR,NAT,TUN 3种。
persistence_timeout #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了。
protocol TCP #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP
real_server 192.168.201.100 { #真实服务器,包括IP和端口号
weight #权重,数值越大,权重越高
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout
nb_get_retry
delay_before_retry
}
}
}
virtual_server 10.10.10.2 {
delay_loop
lb_algo rr
lb_kind NAT
persistence_timeout
protocol TCP
sorry_server 192.168.200.200
real_server 192.168.200.2 {
weight
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout
nb_get_retry
delay_before_retry
}
}
real_server 192.168.200.3 {
weight
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout
nb_get_retry
delay_before_retry
}
}
}
virtual_server 10.10.10.3 {
delay_loop
lb_algo rr
lb_kind NAT
persistence_timeout
protocol TCP
real_server 192.168.200.4 {
weight
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout
nb_get_retry
delay_before_retry
}
}
real_server 192.168.200.5 {
weight
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout
nb_get_retry
delay_before_retry
}
}
}
编辑检测nginx 的脚本
vim /scripts/check_ng.sh脚本需要授权755的权限。
#!/bin/bash
#author:king
#blog:https://www.cnblogs.com/liang-io/
#usage:
#定义时间变量,用于纪录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx的进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果n为0,则启动nginx,并在次检测nginx,还是为0说明nginx无法启动,则关闭Keepalived
if [ $n -eq "" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "" ]; then
echo "$d nginx,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
启动keepalived服务,使用ps aux命令查看keepalived进程,检查nginx是否启动,启动后关闭nginx,再次查询它时会自动启动,说明脚本生效
[root@c- scripts]# systemctl start keepalived
[root@c- scripts]# ps -aux|grep keep
root 0.0 0.0 ? Ss : : /usr/sbin/keepalived -D
root 0.0 0.1 ? S : : /usr/sbin/keepalived -D
root 0.0 0.1 ? S : : /usr/sbin/keepalived -D
root 0.0 0.0 pts/ R+ : : grep --color=auto keep
[root@c- scripts]# ps -aux|grep nginx
root 0.0 0.1 ? Ss : : nginx: master process nginx
nginx 0.0 0.1 ? S : : nginx: worker process
nginx 0.0 0.1 ? S : : nginx: worker process
root 0.0 0.1 ? Ss : : nginx: master process /usr/sbin/nginx
nginx 0.0 0.1 ? S : : nginx: worker process
nginx 0.0 0.1 ? S : : nginx: worker process
root 0.0 0.0 pts/ R+ : : grep --color=auto nginx
[root@c- scripts]# systemctl stop nginx
[root@c- scripts]# ps -aux|grep nginx
root 0.0 0.1 ? Ss : : nginx: master process nginx
nginx 0.0 0.1 ? S : : nginx: worker process
nginx 0.0 0.1 ? S : : nginx: worker process
Keepalived服务日志在/var/log目录下的messages文件中,设置的VIP 100 使用ifcofng命令查看不到,需要使用 ip add 查看
[root@c- scripts]# ip add
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :0c::a8:f5:e5 brd ff:ff:ff:ff:ff:ff
inet 192.168.31.132/ brd 192.168.31.255 scope global noprefixroute dynamic ens33
valid_lft 1563sec preferred_lft 1563sec
inet 192.168.200.100/ scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.200.17/ scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.200.18/ scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::f19::205a:cb78/ scope link noprefixroute
valid_lft forever preferred_lft forever
设置Keepalived从服务器
配置文件keepalived.conf,是上面的配置文件,就是改了一个vip,权重从服务器都比主服务器低,nginx健康的脚本也是上面的。
[root@c- keepalived]# vim keepalived.conf #把priority 100 改为90,sed -i "s/priority 100/priority 90/g" /etc/keepalived/keepalived.conf
[root@c- keepalived]# egrep "priority" /etc/keepalived/keepalived.conf
priority
[root@c- 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)。
nginx集群架构的更多相关文章
- 网站集群架构(LVS负载均衡、Nginx代理缓存、Nginx动静分离、Rsync+Inotify全网备份、Zabbix自动注册全网监控)--技术流ken
前言 最近做了一个不大不小的项目,现就删繁就简单独拿出来web集群这一块写一篇博客.数据库集群请参考<MySQL集群架构篇:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高 ...
- 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
- Nginx集群之WCF大文件上传及下载(支持6G传输)
目录 1 大概思路... 1 2 Nginx集群之WCF大文件上传及下载... 1 3 BasicHttpBinding相关配置解析... 2 4 编写 ...
- Nginx集群之WCF分布式消息队列
目录 1 大概思路... 1 2 Nginx集群之WCF分布式消息队列... 1 3 MSMQ消息队列... 2 4 编写WCF服务.客户端程序... ...
- Nginx集群之SSL证书的WebApi微服务
目录 1 大概思路... 1 2 Nginx集群之SSL证书的WebApi微服务... 1 3 HTTP与HTTPS(SSL协议)... 1 4 Ope ...
- Nginx集群之SSL证书的WebApi身份验证
目录 1 大概思路... 1 2 Nginx集群之SSL证书的WebApi身份验证... 1 3 AuthorizeAttribute类... 2 4 ...
- linux集群架构
Linux集群架构 根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:heart ...
- Linux集群架构(二)
Linux集群架构(二) 目录 八.LVS DR模式搭建 九.keepalived + LVS 十.扩展 八.LVS DR模式搭建 1.实验环境: 四台机器: client: 10.0.1.50 Di ...
- Linux集群架构(一)
第二十八课 Linux集群架构(一) 目录 一. 集群介绍 二. keepalived介绍 三. 用keepalived配置高可用集群 四. 负载均衡集群介绍 五. LVS介绍 六. LVS调度算法 ...
随机推荐
- GStreamer基础教程12 - 常用命令工具
摘要 GStreamer提供了不同的命令行工具用于快速的查看信息以及验证Pipeline的是否能够正确运行,在平时的开发过程中,我们也优先使用GStreamer的命令行工具验证,再将Pipeline集 ...
- 使用asp.net core 3.0 搭建智能小车1
跟随.net core 3.0 一起发布的System.Device.Gpio 1.0已经可以让我们用熟悉的C#原汁原味的开发莓派上面的GPIO了.并且在 Iot.Device.Bindings这个包 ...
- 深入理解Kafka必知必会(上)
Kafka的用途有哪些?使用场景如何? 消息系统: Kafka 和传统的消息系统(也称作消息中间件)都具备系统解耦.冗余存储.流量削峰.缓冲.异步通信.扩展性.可恢复性等功能.与此同时,Kafka 还 ...
- window10系统下,彻底删除卸载mysql
本文介绍,在Windows10系统下,如何彻底删除卸载MySQL...1>停止MySQL服务开始->所有应用->Windows管理工具->服务,将MySQL服务停止.2> ...
- MIT线性代数:4.A的LU分解
- [BZOJ4553][HEOI2016/TJOI2016]序列
传送门 好像是DP再套个裸的CDQ? 树套树是不可能写树套树的,这辈子都不可能写树套树的 对于一个 \(i\) ,设它最小为 \(a_i\) ,原数为 \(b_i\) ,最大为 \(c_i\) \(f ...
- CSS(5)---通俗讲解盒子模型
CSS(5)---盒子模型 盒子模型四个关键字:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 一.概念 1. 概念 盒子 ...
- 单点登录 - API 认证系统 Passport(二)
安装 composer require laravel/passport=~4.0 notes: 1)确保系统安装unzip.zip等命令. 2)composer 安装出现 Authenticatio ...
- 「Usaco2005 Dec」清理牛棚(spfa秒杀线段树dp)
约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西. 约翰发现,如果要使这群有洁癖的奶牛满意,他不得不雇佣她们中的一些来清扫牛棚, 约翰的奶牛中有N(1≤N≤10000)头愿意通过清扫牛棚来挣一 ...
- Android Drawable 简析
Drawable 是开发中经常用到的一个概念,我们经常用它去设置 View 的背景,背景可以一个颜色值,也可以是一张资源图片,还可以是一个自定义的 Drawable等等.这篇文章就简单说下 Drawa ...