负载均衡散记

nginx - header

1
2
3
4

header 里面的key-value 推荐不要带下滑线:如 RF_RPC: JSON_STUB
nginx 默认会去掉下划线, 导致访问404
underscores_in_headers on # 也可以开启支持下划线

haproxy 实现会话保持

会话保持基本流程:后端生成session-id 以及存储一些数据,返回给浏览器以cookies方式存储,下次前端请求带上cookies里面到值session-id,后端根据session-id获取到对应客户端到数据。

三种方式实现:

1
2
3
- 地址hash
- cookies
- stick-table

基于haproxy-cookies实现会话保持

场景:后端session-id 对应缓存用户信息在本地内存,后端多实例场景下,需要实现每次请求击中同一服务器实例。

nginx session stick模块基于cookies实现会话保持

核心配置如下,原理:后端生成cookie 返回给前端,前端后面的请求http带上cookie值,nginx根据cookie值击中到后端固定服务,实现会话保持.

1
2
sticky name=JSESSIONID domain=cmrh.com hash=index;
server 10.244.17.10:9900 weight=1 max_fails=1 fail_timeout=10s;

haproxy-cookies实现会话保持几种模式:

1
2
3
4
- insert: 在回复中本模块通过Set-Cookie头直接插入相应名称的cookie。

- prefix: 不会生成新的cookie,但会在响应的cookie值前面加上特定的前缀,当浏览器带着这个有特定标识的cookie再次请求时,模块在传给后端服务前先删除加入的前缀,后端服务拿到的还是原来的cookie值,这些动作对后端透明。如:"Cookie: NAME=SRV~VALUE"。
- rewrite: 使用服务端标识覆盖后端设置的用于session sticky的cookie。如果后端服务在响应头中没有设置该cookie,则认为该请求不需要进行session sticky,使用这种模式,后端服务可以控制哪些请求需要sesstion sticky,哪些请求不需要。

sesssion 共享实现会话保持

现在多采用微服务架构,后端分布式多实例。将session对应到数据缓存到本地存在弊端。

目前主流session共享实现方式:

1
2
3
4
将session-id 对应到数据存储到远端,任何实例和服务都可根据客户端cookies传过来的session-id获取对应客户端用户的数据。

- redis
- memercache

nginx 性能优化

1
2
- worker_connections  1024  # 最大链接数量 默认1024
- worker_processes 8 # 进程数 一般设置为cpu内核数