做者:JackTian
公众号:杰哥的IT之旅(ID:Jake_Internet)html
这是我参与更文挑战的第 3 天,活动详情查看:更文挑战nginx
当一台服务器的访问量越大时,服务器所承受的压力也就越大,超出自身所指定的访问压力就会崩掉,避免发生此类事情的发生,所以也就有了负载均衡来分担服务器的压力。web
那么究竟什么是负载均衡
呢?通俗些讲,就是咱们有几十台、几百台甚至更多服务器,将这些服务器组成一个服务器集群,当客户端访问某台设备的数据时,首先发送的请求先到一台中间服务器,并经过中间服务器在服务器集群中平均分摊到其余服务器中
,所以,当用户每次所发送的请求都将会保证服务器集群中的设备均与平摊,以此来分担服务器的压力,从而保持服务器集群的整理性能最优
,避免出现有崩溃的现象。算法
转发功能
:Nginx 会按照必定的算法轮询、权重将客户端发来的请求转发至不一样的应用服务器上,同时减轻单台服务器的压力,提升服务器的并发量;故障迁移
:当一台服务器出现了故障时,客户端发来的请求将自动发送到其余服务器; * 添加恢复
:当故障服务器恢复正常工做时,将自动添加处处理用户请求中;客户端发出的每一个请求将按照时间顺序逐一分配到不一样的后端服务器,如后端服务器down掉,能自动剔除。apache
upstream backserver {
server 192.168.1.10;
server 192.168.1.11;
}
复制代码
weight 表明权重,默认为1,权重越高被分配的客户端也就越多。bootstrap
指定轮询概率,weight
和访问
比率成正比,用于后端服务器性能不均的状况,也就是说:哪一个 server 的链接数少,路由就到哪一个 server 中去。vim
upstream backserver {
server 192.168.1.10 weight=3;
server 192.168.1.11 weight=7;
}
复制代码
每一个请求按访问 IP 的hash
结果分配,每一个访客固定访问一个后端服务器,可解决session
的问题。后端
upstream backserver {
ip_hash;
server 192.168.1.10:80;
server 192.168.1.11:88;
}
复制代码
按后端服务器的响应时间来分配请求,响应时间短的优先分配。浏览器
upstream backserver {
server server1;
server server2;
fair;
}
复制代码
按访问url
的hash
结果来分配请求,使每一个url
定向到同一个后端服务器,后端服务器为缓存时比较有效。缓存
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
复制代码
将下图进行拆分,其常见互联网分布式架构,主要分为:
所以,能够看出,从一台客户端发出的请求到最终的数据层,上游均可以访问到下游,实现最终的均匀平摊。
客户端层到反向代理层的负载均衡,经过DNS轮询
实现,在DNS
服务器上对应的域名
配置多个IP
,当客户端发出的请求到DNS
服务器时,会轮询
返回对应域名配置的 IP,保证解析的IP
是必须与Nginx
服务器的IP
是相同的,以此Nginx
服务器的请求分配也将是均衡的。
反向代理层到服务器站点层的负载均衡,经过Nginx
实现,修改nginx.conf
配置文件,实现多种负载均衡策略;
PS:这里咱们经过
nginx.conf
配置文件的方式进行实现,其主要实现的方式可参考上述:3、Nginx负载均衡的几种方式(主要包括:轮询、weight、ip_hash、fair(第三方)、url_hash(第三方)的相关描述)
服务器站点层到服务层的负载均衡,是经过服务链接池
实现的,上游链接池会创建与下游服务多个链接,每次请求将会随机
选取链接来访问下游服务。
服务层到数据层时,数据量很大的状况下,数据层(db,cache)会涉及数据的水平切分,因此数据层的负载均衡会更加复杂一些,分为数据的均衡
与请求的均衡
。
数据的均衡
:是指水平切分后的每一个服务(db,cache)
,数据量
是均匀的。请求的均衡
:是指水平切分后的每一个服务(db,cache)
,请求量
是均匀的。常见的水平切分方式有两种:
第一种:按照range水平切分
每个数据服务,存储必定范围的数据
user0 服务,存储 uid 范围:1-1kw
;user1 服务,存储 uid 范围:1kw-2kw
;这个方案的好处
是:
规则简单
,service 只需判断一下 uid 范围就能路由到对应的存储服务;数据均衡性较好
;易扩展
,可随时加一个 uid [2kw,3kw] 的数据服务;这个方案的不足
是:
请求的负载不必定均衡,对新用户会比老用户更活跃,大 range 的服务请求压力会更大。
第二种:按照 id 哈希水平切分
每个数据服务,存储某个 key 值 hash 后的部分数据
user0 服务,存储偶数 uid 数据
;user1 服务,存储奇数 uid 数据
;这个方案的好处
是:
规则简单
,service 需对 uid 进行 hash 能路由到对应的存储服务;数据均衡性较好
;请求均匀性较好
;这个方案的不足
是:
在浏览器地址栏中输入http://192.168.1.10/abc/20200320.html
,负载均衡效果平均到端口号8080
和8081
中。
1) 准备两台Tomcat
服务器,一台服务器为8080
,另外一台服务器为8081
。
2) 分别在两台Tomcat
服务器中的webapps
目录中,建立名称是abc
文件夹,在abc
文件夹中建立页面20200320.html
,进行测试。
在上一篇文章中,咱们对其两台Tomcat
服务建立好了8080
和8081
,因此这里咱们就无需在建立了,而且分别查看8080
和8081
服务下webapps
目录中是否都存在测试页面文件,如没有可自行建立便可。
Tomcat8080
# cat /root/tomcat8080/apache-tomcat-7.0.70/webapps/abc/20200320.html
<h1>welcome to tomcat 8080!</h1>
复制代码
Tomcat8081
# cd /root/tomcat8081/apache-tomcat-7.0.70/webapps/
# mkdir abc
# cd abc/
# vim 20200320.html
<h1>welcome to tomcat 8081!</h1>
复制代码
切换到/root/tomcat8081/apache-tomcat-7.0.70/bin/
目录下,启动8081
的Tomcat
服务。
# ./startup.sh
Using CATALINA_BASE: /root/tomcat8081/apache-tomcat-7.0.70
Using CATALINA_HOME: /root/tomcat8081/apache-tomcat-7.0.70
Using CATALINA_TMPDIR: /root/tomcat8081/apache-tomcat-7.0.70/temp
Using JRE_HOME: /usr
Using CLASSPATH: /root/tomcat8081/apache-tomcat-7.0.70/bin/bootstrap.jar:/root/tomcat8081/apache-tomcat-7.0.70/bin/tomcat-juli.jar
Tomcat started.
复制代码
测试验证
在客户端浏览器中分别测试Tomcat8080
:http://192.168.1.10/abc/20200320.html
和Tomcat8081
:http://192.168.1.10:8081/abc/20200320.html
进行验证。
Tomcat8080
Tomcat8081
3) 在 Nginx 的配置文件中进行负载均衡的配置;
在http
模块下添加upstream myserver
配置、server_name 由原来的localhost
改成Nginx
服务器地址,在location
下添加proxy_pass http://myserver;
便可;
# vim /usr/local/nginx/conf/nginx.conf
17 http {
18 ......
34 upstream myserver {
35 server 192.168.1.10:8080;
36 server 192.168.1.10:8081;
37 }
38
39 server {
40 listen 80;
41 server_name 192.168.1.10;
42
43 #charset koi8-r;
44
45 #access_log logs/host.access.log main;
46
47 location / {
48 proxy_pass http://myserver;
49 root html;
50 index index.html index.htm;
51 }
52 ......
复制代码
操做完 Nginx 文件的负载均衡的配置后,重启Nginx
服务,出现以下问题:
# ./nginx -s stop
nginx: [warn] conflicting server name "192.168.1.10" on 0.0.0.0:80, ignored
# ./nginx
复制代码
意思是重复绑定了server name
,该警告不会影响到服务器运行。并且,这个重复绑定的意思是如今运行的Nginx
服务和将要加载的新配置中的重复,因此,这个警告实际上是没必要的。
测试验证
在客户端浏览器中输入:http://192.168.1.10/abc/20200320.html
,不断刷新,观察变化,这就是在将客户端发出的请求分担到不一样的Tomcat
服务中去,也就是所谓负载均衡
的一个效果。
负载均衡所实现的效果
经过本篇文章介绍了什么的负载均衡
、Nginx负载均衡的做用
、Nginx负载均衡的几种策略方式
、常见的负载均衡方案
、Nginx负载均衡配置实例
等;负载均衡是分布式系统架构设计中必须考虑的因素之一,一般是指:将请求/数据均匀分摊到多个操做单元上执行,其的关键在于均匀:
反向代理层
的负载均衡,是经过DNS轮询
实现;服务器站点层
的负载均衡,是经过Nginx
实现;服务层
的负载均衡,是经过服务链接池
实现;数据层
的负载均衡,要考虑数据的均衡
与请求的均衡
两点,其常见的方式有按照范围水平切分
与hash水平切分
原创不易,若是你以为这篇文章对你有点用的话,麻烦你为本文点个赞、评论或转发一下,由于这将是我输出更多优质文章的动力,感谢!
咱们下期再见!