目录
常用的6种负载均衡算法
轮询算法(round robin)默认
权重(weight)
响应时间(fair)
连接数(least_conn)
IP_hash
url_hash(第三方)
开发优选:一致性哈希
安装步骤:
虚拟主机
常用的6种负载均衡算法
轮询算法(round robin)默认
轮询方式:依次将每个请求按时间顺序逐一分配到不同的后端服务器,如果服务器down掉,能自动删除
适用场景:后台机器性能配置一致的情况下。集群内的机器可以自动管理(恢复和剔除)
upstream 按需起名 {
server 127.0.0.1:6000;
server 127.0.0.1:6002;
}
权重(weight)
权重方式:根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比
适用场景:后端服务器配置(性能)不均的情况
upstream 按需起名 {
server 127.0.0.1:6000 weight=2;
server 127.0.0.1:6002 weight=1;
}
响应时间(fair)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
upstream 按需起域名 {
server 127.0.0.1:6000;
server 127.0.0.1:6002;
fair;
}
连接数(least_conn)
根据后端服务器的连接状况进行分配客户请求,连接最少的服务器将被有限分配客户端请求。
upstream 按需起域名 {
least_conn;
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
}
IP_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器。
适用场景:解决session共享问题。
upstream 按需起域名 {
ip_hash;
server 127.0.0.1:6000;
server 127.0.0.1:6002;
}
url_hash(第三方)
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包
upstream 按需起域名 {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
开发优选:一致性哈希
一致性哈希原理:小林图解https://xiaolincoding.com/os/8_network_system/hash.html
ngx_http_upstream_consistent_hash 模块是负载均衡器,使用一个内部一致性hash算法来选择 合适的后端节点。
ngx_http_upstream_consistent_hash 模块是一个第三方模块,需要我们下载安装后使用
安装步骤:
一、github下载ngx_http_upstream_consistent_hash
下载链接https://github.com/replay/ngx_http_consistent_hash
二、下载成功后,将下载的压缩包上传到nginx服务器,也可直接git clone
三、进入安装nginx的目录,进行编译安装
./configure —add-module=/root/ngx_http_consistent_hash-master
make && make install
四、在nginx.conf中配置负载均衡算法
upstream 按需起域名{
consistent_hash $request_uri;
server 127.0.0.1:6000;
server 127.0.0.1:6002;
}
该模块可以根据配置参数采取不同的方式将请求均匀映射到后端机器:
consistent_hash $remote_addr:可以根据客户端ip映射
consistent_hash $request_uri:根据客户端请求的uri映射
consistent_hash $args:根据客户端携带的参数进映射
虚拟主机
当网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
例如将http://www.test1.com和http://www.test2.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
server {
listen 80 default_server;
server_name _;
return 444; # 过滤其他域名的请求,返回444状态码
}
server {
listen 80;
server_name www.test1.com; # www.test1.com域名
location / {
proxy_pass http://localhost:8080; # 对应端口号8080
}
}
server {
listen 80;
server_name www.test2.com; # www.test2.com域名
location / {
proxy_pass http://localhost:8081; # 对应端口号8081
}
}
在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。
server_name支持匹配方式:
<1> 完整匹配
<2> 通配符匹配
<3> 通配符结束匹配
<4> 正则匹配