NGINX+keepalived+http(web服务器)高可用与负载均衡架构
一、服务器搭建策略
单机模式: 只有一台应用服务器,组成一个单机模式
优点:简单方便(搭建、运营、维护)
缺点:不能出故障(停电、断网、系统崩溃、硬件老化、性能瓶颈)
应用场景:小型项目(几十个人)
集群(cluster)模式:
有一个应用服务器集群(cluster),由很多应用服务器组成一个集群
二、服务器三高
高可用: 服务器能否能24*365不间断提供服务,服务器容灾性高
高并发: 同一时间上,服务器能够同时容纳的用户连接数
高性能: 服务器处理用户请求的速度,服务器的计算能力
三、服务器升级
纵向升级(对单台服务器做配置提升):
eg:换更强的cpu,加大内存和磁盘,加大网络带宽……
横向升级(堆服务器的数量):
节约成本,很廉价的机器都可以推入到集群(更受欢迎)
四、如何解决负载均衡高可用问题?
做备份
当主负载均衡服务器没有问题时,处于备用;当其出现问题时,备用服务器能够第一时间内顶替主负载均衡服务器的位置
难点:备份很容易,但是ip地址如何快速切换?
五、Keepalived实现备用机无缝顶替主机的原理:
多台nginx-----keepalived集群
keepalived集群中至少有两台机器
两台:一主一从
三台:一主二从…以此类推
为keepalived集群设置一个唯一的虚拟IP,虚拟IP默认会与master机器绑定在一起
即master机器将会有两个ip地址,一个是自己的源ip,一个是keepalived给的虚拟IP地址
非抢占模式下:
当master机器出现故障时,keepalived第一时间收回虚拟IP地址并分配给slave机器,此时相当于slave机器升级为master机器,此时用户只需要记住keepalived的虚拟IP地址即可
若master机器恢复正常,则不会被分配虚拟IP地址,直到slave机器出现故障后,master才会被分配虚拟IP地址
1.先NGINX负载均衡(2台)一模一样,
代理服务器:NGINX代理1+NGINX代理2
web服务器:http1+http2
客户端设置域名解析,负载均衡器的名称www.web.com
在NGINX1主负载均衡器上面配置keepalived
主master配置文件如下:::::::
[root@zabbix-agent ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
381347268@qq.com
}
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.110/24 dev eth0 label eth0:1
}
}
重启并开机自启:systemctl start keepalived && systemctl enable keepalived
slave从配置文件:
[root@nginx ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
381347268@qq.com
}
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.110/24 dev eth0 label eth0:1
}
}
重启并开机自启:systemctl start keepalived && systemctl enable keepalived
ifconfig //查看IP,此时备节点不会有VIP(只有当主挂了的时候,VIP才会飘到备节点)
客户端windows访问:
测试:停主留从,VIP跳转到从的机器上面了
访问没有问题:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Nginx的负载均衡实现
环境
主机 | ip | 用途 | 软件 |
---|---|---|---|
web1 | 192.168.50.60 | nginx-1 | httpd |
web2 | 192.168.50.61 | nginx-2 | httpd |
proxy | 192.168.50.62 | 负载均衡器 | nginx |
负载均衡策略
nginx的负载均衡用于upstream模板定义的后端服务器列表中选取一台服务器接收用户的请求。一个基本的upstream模块如下:
upstream [服务器组名称]{
server [IP地址]:[端口号];
server [IP地址]:[端口号];
....
}
在upstream模块配置完成后,要让指定的访问反向代理到服务器列表,格式如下:
location ~ .*$ {
index index.jsp index.html;
proxy_pass http://[服务器组名称];
}
这样就完成了最基本的负载均衡,但是这并不能满足实际需求。目前Nginx的upstream模块支持6种方式的负载均衡策略(算法):
轮询
最基本的配置方法,是upstream模块默认的负载均衡策略。每个请求会按时间顺序平均分配到不同的后端服务器。有如下参数:
fail_timeout与max_fails结合使用
max_fails在fail_timeout参数设置的时间内最大失败次数。如果在这个时间内,所有该服务器的请求都失败了,那么认为该服务器停机
fail_time服务器被认为停机的时长,默认10s(被认为停机的服务器尝试间隔?)
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里
down标记服务器永久停机
注意:1.down标记的服务器会自动剔除;2.缺省就是轮询;3.此策略适合服务器配置无状态且短平块的服务使用
weight
权重方式,在轮询策略的基础上指定轮询的几率。也可以认为是在轮询的基础上新增了一个weight的参数,此参数指定轮询的几率,值为number。upstream模块配置模板如下:
upstream [服务器组名称]{
server [IP地址]:[端口号] weight=2;
server [IP地址]:[端口号];
....
}
在该例子中,没有weight参数的服务器默认为1,weight的数值与访问比例成正比,所有weight值的总和为一个循环单位,服务器自身的weight值为循环单位内的轮询次数。
注意:1.权重越高分配到的请求越多; 2.此策略可以和least_conn策略、iphash策略结合使用; 3.此策略比较适合服务器硬件配置差距较大的情况。
ip_hash
依据ip分配方式,指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端请求一致发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。upstream模块配置模板如下:
upstream [服务器组名称]{
ip_hash;
server [IP地址]:[端口号] weight=2;
server [IP地址]:[端口号];
....
}
注意:1.nginx1.3.1之前的版本不能在ip_hash中使用权重(weight);2..ip_hash不能与backup同时使用;3.此策略适合有状态服务的程序,比如session;4.当有服务器需要剔除,必须手动down掉。
least_conn
最少连接方式,把请求发给链接数最少的后端服务器。轮询是把请求平均分配给各个后端,使它们的负载大致相同。但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。upstream模块配置模板如下:
upstream [服务器组名称]{
least_conn;
server [IP地址]:[端口号] weight=2;
server [IP地址]:[端口号];
....
}
注意:此策略适合请求处理时间长短不一造成的服务器过载情况。
fair
响应时间方式,按照服务器端的响应时间来分配请求,响应时间短的优先分配。upstream模块配置模板如下:
upstream [服务器组名称]{
server [IP地址]:[端口号] weight=2;
server [IP地址]:[端口号];
....
fair;
}
注意:需要安装第三方插件。
url_hash
url分配方式,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以在缓存中读取。upstream模块配置模板如下:
upstream [服务器组名称]{
hash $request_uri;
server [IP地址]:[端口号] weight=2;
server [IP地址]:[端口号];
....
}
注意:1.需要安装第三方插件;2.uri,是i,不是小写的L。
安装proxy
proxy 机器 编译安装nginx
工具包安装
wget http://nginx.org/download/nginx-1.14.2.tar.gz
yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
解压安装
tar xf nginx-1.14.1.tar.gz -C /usr/local/src/
cd /usr/local/src/nginx-1.14.1/
./configure --prefix=/usr/local/nginx \
--with-http_dav_module \
--with-http_stub_status_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_flv_module \
--with-http_mp4_module
make && make install
echo $?
参数说明:
--with-http_dav_module,启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启;
--with-http_stub_status_module,启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态);
--with-http_addition_module,启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求);
--with-http_sub_module,启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本);
--with-http_flv_module,启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件);
--with-http_mp4_module,启用对mp4文件支持(提供寻求内存使用基于时间的偏移量文件)。
生成nginx 用户
useradd -M -s /sbin/nologin nginx
启动和自启
/usr/local/nginx/sbin/nginx
echo /usr/local/nginx/sbin/nginx >> /etc/rc.local
chmod +x /etc/rc.d/rc.local
如果防火墙是开启的记得添加端口号firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
conf 文件修改
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server_tokens off;
upstream htmlservers {
server 192.168.50.60:80 weight=1;
server 192.168.50.61:80 weight=1;
}
upstream phpservers{
server 192.168.50.60:80 weight=1;
server 192.168.50.61:80 weight=1;
}
upstream picservers {
server 192.168.50.60:80 weight=1;
server 192.168.50.61:80 weight=1;
}
include vhosts/*.conf;
}
vim /usr/local/nginx/conf/vhosts/upstream.conf
server {
listen 80;
server_name localhost;
location / {
if ($request_uri ~* \.html$){
proxy_pass http://htmlservers;
}
if ($request_uri ~* \.php$){
proxy_pass http://phpservers;
}
proxy_pass http://picservers;
}
}
web服务器安装
安装
yum install httpd -y
设置主页文件并启动
echo web1 > /var/www/html/index.htmlecho web2 > /var/www/html/index.html echo php1 > /var/www/html/index.phpecho php2 > /var/www/html/index.phpecho jsp1 > /var/www/html/index.jspecho jsp2 > /var/www/html/index.jspsystemctl start httpd
如果防火墙是开启的,记得添加端口号firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
期待你的
分享
点赞
在看
添加博主
微信号|yfq940-
创作不易,支持一下呗