环境描述:两个接口服务器(负载均衡),两个数据库服务器(负载均衡)
问题:拔掉数据库1的网线后恢复,数据库2的连接数一直很高,数据库1虽然恢复但是连接数还是很少
查看了下负载均衡配置,如下:
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 60
protocol TCP
分析1:
查找资料后发现,persistence_timeout表示同一IP的链接在配置的时间内会被分配到同一台real_server,因此初步判断是因为我们的接口服务器会在60s内同数据库服务器建立连接,而数据库1就算断网恢复,但是因为之前的连接都未失效,所以下次还是连接数据库2,导致负载都在数据库2而没有分给数据库1。
解决方法1:
去掉persistence_timeout参数,经过测试发现,去掉后即可实现均衡分配。
分析2:
去掉了时间,查了下算法是rr,rr表示轮询,即把每项请求按顺序在真正服务器中分派。再用上述情景模拟一次,比如数据库1断网后数据库2连接数为100,数据库1恢复后又有100个连接,结果就是数据库1连接数为150,数据库2连接数为50。这样还是会导致一台数据库停用后就算恢复负载也不能均衡。
解决方法2:
我们的服务器都一样,即性能都一样,因此选用lc算法,lc 最少链接(Least Connections)调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
经过测试,假如数据库1短网,数据库2连接数为100,数据库1恢复后又有100个连接,此时的结果就是数据库1还是100连接,数据库2有100连接。符合我们的要求。
最终配置
delay_loop 6
lb_algo lc
lb_kind DR
protocol TCP