版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nimasike/article/details/82181582
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)原理说明与配置用例
https://blog.csdn.net/nimasike/article/details/53820844
CentOS7 Keepalived+LVS 负载均衡 后台节点健康检查
https://blog.csdn.net/nimasike/article/details/51932674
技术交流群:212320390