LVS結合Redis Sentinel哨兵模式的高可用設計
Redis哨兵模式配置與原理不在這裡敘述,網上已經有很多文章可供參考。
下面給出哨兵模式Java客戶端的一段程式碼。
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(10); jedisPoolConfig.setMaxIdle(5); jedisPoolConfig.setMinIdle(5); Set<String> sentinels = new HashSet<>(Arrays.asList( "192.168.80.112:26379", "192.168.80.113:26379", "192.168.80.114:26379" )); GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); poolConfig.setMaxTotal(10); poolConfig.setMaxIdle(5); poolConfig.setMinIdle(5); JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels, jedisPoolConfig); HostAndPort hostAndPort = pool.getCurrentHostMaster(); System.out.println(hostAndPort.getHost() + "|" + hostAndPort.getPort()); String key1 = "key111"; try (Jedis jedis = pool.getResource()) { jedis.set(key1, "222"); System.out.println(jedis.get(key1)); } catch (Exception e) { e.printStackTrace(); }
112,113,114這三個IP是哨兵叢集的ip地址,客戶端不需要直連redis,而是連線到哨兵的ip,客戶端通過哨兵獲取redis主節點的地址,然後在與redis主節點通訊,這樣就解決了redis高可用的問題。
但是這裡面有一個地方不好,就是Java客戶端所有的讀寫請求全部都走主redis,而從redis只擔當熱備的角色。
比如我有三臺redis伺服器,一個master,二個slave。那麼讀寫全部走master,slave只擔當熱備,這樣slave資源全部浪費。
那麼有沒有一種設計,能夠讓slave也發揮作用呢?,即寫請求走master, 讀請求走slave。這樣就能夠利用slave機器資源,提高讀的伸縮性。
看下面的架構圖
1、在Java客戶端,所有寫請求通過哨兵 連線master節點,寫全部通過master完成,這也是哨兵預設的行為。
2、在redis叢集上新增LVS代理+加健康檢查,所有讀請求通過LVS轉發到redis叢集,這樣3臺redis機器都可以處理讀請求。
具體配置細節不在這裡說明,這個文章只提供一個思路
配置可參考
LVS-DR(Virtual Server via Direct Routing)原理說明與配置用例
CentOS7 Keepalived+LVS 負載均衡 後臺節點健康檢查
技術交流群:212320390