1. 程式人生 > >HAProxy+Redis實現負載負載均衡(待實踐)

HAProxy+Redis實現負載負載均衡(待實踐)

返回 不同步 update 多個 連接 discus overflow 節點 識別

為什麽要使用HA,原因是可以聚合出一個VIP,也就是可以使用單一IP來訪問下面多個Redis的實例。

首先說明一下,如果基於3.0以後搭建的官方原始Redis Cluster方案,使用HAProxy是沒什麽效果的,打個比方,如果使用HA聚合出一個VIP,然後通過這個VIP訪問時,會根據Key返回MOVED的命令,然後客戶端通過協議識別MOVED命令去連接另一臺Redis取數據,那麽此時就會訪問原始IP,而不是HA的VIP,也就是繞過去了,造成HA是多余的一個點。所以HA對於這種模式是無效的。

參考:https://stackoverflow.com/questions/31785184/redis-cluster-via-haproxy

再次說明,原來Redis還可以通過HA實現負載均衡。

但是這種模式配置可能有點難以理解,比如:

1、如果是基於Redis的原生主從復制時,從節點寫的數據不會同步到主節點,那麽用HA也是沒什麽效果的。

2、如果不用主從復制,單純的部署多個Redis時,通過HA確實能負載多臺,但是會有這個現象,比如我寫的時候是A,而讀的時候到了B,也就造成數據不同步,寫時也會有這個現象。

那麽通過以上問題,看下下面的解決分析:

先說下以下兩篇文章提到的HA+Redis的實現:

http://blog.csdn.net/citi007/article/details/39636567

http://blog.csdn.net/ownfire/article/details/39373399

是不能用的,就單純的兩個Redis,期間沒有配置主從和哨兵或者Twemproxy的模式,是完全不能實現,所以以上是反面教材。

下面說下要實現HA來做負載均衡所要具備的條件和解決上述問題的分析:

1、一般HA是結合Twemproxy和哨兵模式一起使用。

2、如果使用Twemproxy時,本身T是一個代理層,用於分片算法,而T支持平行節點部署來達到T的集群,然後可以通過HA來做IP的聚合實現負載均衡指向T的集群。

3、如果基於哨兵模式的Redis集群時,那麽HA需要在負載均衡規則上做過濾條件,哨兵本身不能寫數據,就需要把所有的發送流量指向master,也就是主節點。

4、當然,再高可用就是HA+哨兵+T的組合。

下面這篇文章是Redis集群方案最全的一篇:

http://blog.csdn.net/shmilychan/article/details/73433804

下面這些文章是HA做負載均衡找到的突破口(留意規則的過濾):

https://karlstoney.com/2015/07/23/redis-sentinel-behind-haproxy/

https://discuss.pivotal.io/hc/en-us/articles/205309388-How-to-setup-HAProxy-and-Redis-Sentinel-for-automatic-failover-between-Redis-Master-and-Slave-servers

https://www.haproxy.com/blog/haproxy-advanced-redis-health-check/

https://serverfault.com/questions/772064/redis-haproxy-updated-configuration-settings

http://www.cnblogs.com/xiazh/archive/2012/11/13/2630846.html

http://blog.csdn.net/houzhe_adore/article/details/48262873

http://blog.csdn.net/houzhe_adore/article/details/48245435

http://www.cnblogs.com/tzm7614/p/5691912.html

http://blog.csdn.net/ownfire/article/details/39373399

HAProxy+Redis實現負載負載均衡(待實踐)