目录:
一. 集群介绍
1、传统web访问模型
(1)传统web访问模型完成一次请求的步骤
- 1)用户发起请求
- 2)服务器接受请求
- 3)服务器处理请求(压力最大)
- 4)服务器响应请求
(2)传统模型缺点
- 单点故障;
- 单台服务器资源有限(客户端则是无限的);
- 单台服务器处理耗时长(客户等待时间过长);
(3)传统模型优化——单点故障解决方案
- 优化方案一:部署一台备份服务器,宕机直接切换
- 该方案可以有效解决服务器故障导致的单点故障,但且服务器利用率低、成本高,切换不及时,且无法解决服务器业务压力问题。
- 优化方案二:部署多台服务器,根据DNS的轮询解析机制去实现用户分发
- 优势是用户处理速度得到了提升,但是当其中一台故障,dns并不会知道它故障了,依然将请求分给这个服务器,导致一部分用户访问不了业务。
2、并行处理解决方案
- 1)DNS轮询解析方案
- 2)多机阵列——集群模式
图中,前面两台服务器负责接受请求和分发请求,它自己并不处理请求,将请求分发给后面的业务服务器来处理。业务服务器处理完请求后,将请求发还给分发器,再由分发器将请求发送给客户,因此分发器还承担了响应请求的任务。
由此可见之前传统模型中服务器端需要承担的服务器接收请求和响应请求都交给分发器处理了,而业务压力最大的处理请求则交给业务服务器完成。
分发器和dns虽然都是进行了分发的工作,但不同点在于分发器是自己部署的服务器,而DNS都是使用的运营商的,因此可以调整分发器的逻辑判断规则。
3、集群
计算机集群简称集群,是一种计算机系统,
它通过一组松散集成的计算机软件或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。 (百度解释)将多个物理机器组成一个逻辑计算机,实现负载均衡和容错。
组成要素:
- 1)VIP: 给分发器的一个虚IP
- 2)分发器:nginx
- 3)数据服务器:web服务器
4、Nginx集群原理
- 在Nginx集群中Nginx扮演的角色是:分发器。
- 任务:接受请求、分发请求、响应请求。
- 功能模块:
- 1)ngx_http_upstream_module:基于应用层(七层)分发模块
- 2)ngx_stream_core_module:基于传输层(四层)分发模块(1.9开始提供该功能)
(1)Nginx集群的实质
- Nginx集群其实是:虚拟主机+反向代理+upstream分发模块组成的。
- 虚拟主机:负责接受和响应请求。
- 反向代理:带领用户去数据服务器拿数据。
- upstream:告诉nginx去哪个数据服务器拿数据。
(2)数据走向(请求处理流程)
- 1)虚拟主机接受用户请求
- 2)虚拟主机去找反向代理(问反向代理去哪拿数据)
- 3)反向代理让去找upstream
- 4)upstream告诉一个数据服务器IP
- 5)Nginx去找数据服务器,并发起用户的请求
- 6)数据服务器接受请求并处理请求
- 7)数据服务器响应请求给Nginx
- 8)Nginx响应请求给用户
二、使用Nginx分发器构建一个WEB集群
1、环境准备
实验机 : Vmware 虚拟机 2核4G
网卡:桥接
系统:centos7.5
防火墙:关闭
Selinux:关闭
网段:192.168.31.0/24
准备四台实验机:都安装nginx服务,两台当作分发器,两台当作web服务器。
2、配置web业务机器
(1)nginx安装脚本
#!/bin/bash
nginx_pkg='nginx-1.5.1.tar.gz'
nginx_prefix=/usr/local/nginx
html=/var/nginx
log=/var/log/nginx
check13 () {
[ $UID -ne 0 ] && echo "need to be root to that" && exit 1
[ ! -f $nginx_pkg ] && echo "not found source packager" && exit 1
[ ! -d $html ] && mkdir -p $html
[ ! -d $log ] && mkdir -p $log
}
nginx_install () {
source_pkg=`echo $nginx_pkg|awk -F ".tar" '{print $1}'`
[ -d /usr/src/$source_pkg ]&&rm -rf /usr/src/$source_pkg
tar xf $nginx_pkg -C /usr/src
cp nginxd /usr/src/$source_pkg
if [ $? -eq 0 ];then
cd /usr/src/$source_pkg
if [ $? -eq 0 ];then
yum -y install gcc-* pcre pcre-devel zlib zlib-devel openssl-* &> /dev/null
[ $? -ne 0 ]&&"YUM set error" && exit 1
./configure --prefix=$nginx_prefix
if [ $? -eq 0 ];then
make
if [ $? -eq 0 ];then
make install
if [ $? -eq 0 ];then
ln -s -f $nginx_prefix/conf/nginx.conf /etc/
ln -s -f $nginx_prefix/logs/ $log/logs
ln -s -f $nginx_prefix/html $html/html
ln -s -f $nginx_prefix/sbin/ /usr/sbin/
cp nginxd /etc/init.d/nginx;chmod 755 /etc/init.d/nginx
else
exit 1
fi
else
exit 1
fi
else
exit 1
fi
else
exit 1
fi
else
exit 1
fi
[ $? -eq 0 ]&&clear||exit
echo -e "\n\033[32m Nginx Install Success: \033[0m"
echo -e "\n"
echo -e "\tNginx_conf: /etc/nginx.conf"
echo -e "\tNginx_html: $html/html"
echo -e "\tNginx_access_log: $log/logs/access.log"
echo -e "\tNginx_error_log: $log/logs/error.log\n\n\n\n"
read -n1 -p "press any key and exit...."
echo
}
check13
nginx_install
(2)配置web服务器操作
[root@web02 ~]# sh nginx_install # 脚本安装nginx
[root@web02 ~]# echo web02 > /usr/local/nginx/html/index.html # 写入页面
[root@web02 ~]# yum -y install elinks &>/dev/null # 安装文本浏览器
[root@web02 ~]# /usr/local/nginx/sbin/nginx # 启动nginx
[root@web02 ~]# elinks http://localhost -dump
web02
3、配置分发器(轮询方式分发)
# 清除空行和注释项
$ sed -i '/#/d' nginx.conf
$ sed -i '/^$/d' 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;
upstream web{ # 名为web的反向代理群组
server 192.168.31.42;
server 192.168.31.43;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web; # 去找反向代理
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4、集群分发测试(默认轮询)
客户端访问分发器地址,默认按照轮询的方式来进行分发。
[root@web02 ~]# elinks http://192.168.31.40 -dump
web01
[root@web02 ~]# elinks http://192.168.31.40 -dump
web02
[root@web02 ~]# elinks http://192.168.31.40 -dump
web01
[root@web02 ~]# elinks http://192.168.31.40 -dump
web02