LVS结合Redis Sentinel哨兵模式的高可用设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 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机器资源,提高读的伸缩性。

看下面的架构图

扫描二维码关注公众号,回复: 4627769 查看本文章

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

猜你喜欢

转载自blog.csdn.net/nimasike/article/details/82181582