nginx 之upstream模块研究 - 在负载均衡及mysql读写分离上的应用

一、upstream的作用:

upstream可使nginx跨越单机的限制,完成网络数据的接收、处理和转发

二、语法

upstream语法:

# nginx.conf:
http {
	....
	# 在配置文件的http下建立
	upstream custName { 
	      server address [parameters]
	      ...
	}
}
# upstream中server指令语法如下:
# address必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。
# parameters是可选参数,可以是如下参数:
#	down:表示当前server已停用
#	backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。
#	weight:表示当前server负载权重,权重越大被请求几率越大。默认是1.
#	max_fails和fail_timeout:一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。
# 示例:
upstream backend {
     server    backend1.example.com    weight=5;
     server    127.0.0.1:8080          max_fails=3 fail_timeout=30s;
     server    unix:/tmp/backend3;           
}

三、upstream基础设置:单个upstream用于自动负载均衡

自动负载均衡分配方式5种分配方式
其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:

1、轮询         
        轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,
        如果某个后端服务器down掉后,能自动剔除。
        upstream backend {
            server 192.168.1.101:8888;
            server 192.168.1.102:8888;
            server 192.168.1.103:8888;
        }
2、weight        
        轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。
        upstream backend {
            server 192.168.1.101 weight=1;
            server 192.168.1.102 weight=2;
            server 192.168.1.103 weight=3;
        }
3、ip_hash        
        每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,
        这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
        upstream backend {
            ip_hash;
            server 192.168.1.101:7777;
            server 192.168.1.102:8888;
            server 192.168.1.103:9999;
        }
4、fair        
        fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,
        响应时间短即rt小的后端服务器优先分配请求。
        upstream backend {
            server 192.168.1.101;
            server 192.168.1.102;
            server 192.168.1.103;
            fair;
        }
5、url_hash
        与ip_hash类似,但是按照访问url的hash结果来分配请求,
        使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
        upstream backend {
            server 192.168.1.101;
            server 192.168.1.102;
            server 192.168.1.103;
            hash $request_uri;
            hash_method crc32;
        }
        其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。

四、使upstream在反向代理中生效

前面的upstream只是设置好了其选项,要使其生效,需要靠nginx反向代理功能。

# 和其他反向代理的用法基本一致。
# 被代理的地址直接使用:http://upstreamName,如下:
location  /router/
{
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 以下可以解决只有一个合法的业务域名的问题(需结合上面的配置)
location /test/router
    {
        proxy_pass http: //www.xxx.com/router;
        proxy_set_header Host $host;
        proxy_set_header X - Real_IP $remote_addr;
        proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;
    }

五、upstream分组,用于自定义负载均衡

upstream分组后,可以通过在location 中指定upstream分组,从而实现自定义负载均衡。
示例:nginx实现MySQL读写分离

一、nginx反向代理,读写分离
编辑conf/nginx.conf文件

# 设置权重weight
# 192.168.0.2 读操作
# 192.168.0.2 写操作

	####读服务器组  B
	upstream read {
		    server 192.168.0.1:88 weight=2 max_fails=2 fail_timeout=2;
		    server 192.168.0.2:88 weight=3 max_fails=2 fail_timeout=2;
	}
	####写服务器组  A
	upstream write {  
		   server 192.168.0.2:88;
		   server 127.0.0.1:80 backup;
	}

二、配置接口server

	server {
        listen       80;
        server_name  www.xxx.com;
        location / {
			proxy_pass  http://read;
            if ( $request_method = "POST" ){    ####在这里判断用户是否执行的是写操作
                 proxy_pass http://write;
            } 
            index  index.html index.htm;
			#nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
			proxy_connect_timeout 2s;
			#nginx发送给上游服务器(真实访问的服务器)超时时间
            proxy_send_timeout 2s;
			#nginx接受上游服务器(真实访问的服务器)超时时间
            proxy_read_timeout 2s;
        }
    }

注:此方法是通过POST/GET判断是否为读写,不一定准确。
同理,可以通过url等变量,来实现自定义。

参考:
https://blog.csdn.net/daily886/article/details/84313917
https://www.kanzhun.com/jiaocheng/620474.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值