0
点赞
收藏
分享

微信扫一扫

Redis集群模式高可用实践

追风骚年 2022-02-15 阅读 50

一、序言

本文搭建Redis集群服务。

image-20211108171613912

二、单机模拟

单机模拟是指在单台物理机或者虚拟机上模拟操作,最大化还原本方案中间过程,适用于学习或者开发阶段使用。

为了简化操作,Redis服务做如下约定:数据不持久化到磁盘;服务实例以前台进程方式运行;节点的配置文件以默认配置文件为模版;无密码验证。

(一)集群规划

节点主机主服务端口从服务端口备注
node01127.0.0.170107011物理机
node02127.0.0.170207021物理机
node03127.0.0.170307031物理机

(二)服务配置

1、随机主从初始化集群

节点的初始配置文件以默认配置文件为模版,为了快速搭建集群环境,这里采用随机分配主从关系方案。

/usr/local/redis/bin/redis-cli --cluster create  \
127.0.0.1:6390 127.0.0.1:6391  \
127.0.0.1:6392 127.0.0.1:6393  \
127.0.0.1:6394 127.0.0.1:6395   --cluster-replicas 1
2、自定义主从初始化集群

手动指定主从关系,生产环境下采用手动指定主从服务的位置,确保同一组实例的主从不分布在同一台物理主机上。

(三)服务管理

测试或者学习时,建议采用前台进程管理服务,便于模拟单点故障、查看日志观察主从切换。

生产条件下建议使用Supervisor管理服务,不仅易于管理而且能够实现服务异常终止后自动重启。高可用场景下使用的是三台物理机。

1、Redis实例
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6390.conf --port 6390 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6391.conf --port 6391 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6392.conf --port 6392 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6393.conf --port 6393 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6394.conf --port 6394 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6395.conf --port 6395 --save '' --daemonize no

三、客户端整合

客户端实现是指基于SpringBoot的整合分为两步实现:一是完成作为基础的整合;二是结合生产需要补充新特性。

(一)基础整合

基础整合的内容是以Java客户端连接高可用哨兵模式Redis服务,实现单节点故障服务正常运行的要求。

1、全局配置文件

全局配置文件添加的配置信息有:master参数为哨兵服务名,此处为默认值;nodes参数为哨兵服务列表(不是Redis实例服务列表);database参数为数据库。

spring:
  redis:
    cluster:
      max-redirects: 3
      nodes:
        - 192.168.181.171:6390
        - 192.168.181.171:6391
        - 192.168.181.171:6392
        - 192.168.181.171:6393
        - 192.168.181.171:6394
        - 192.168.181.171:6395
2、配置类

集成进SpringBoot体系,最核心的是创建LettuceConnectionFactory连接工厂。

@Configuration
public class RedisClusterConfig {    
    @Autowired
    private RedisProperties redisProperties;
    
    @Bean
    public RedisConnectionFactory lettuceConnectionFactory() {
        RedisProperties.Cluster cluster = redisProperties.getCluster();
        List<String> nodes = cluster.getNodes();
        RedisClusterConfiguration configuration = new RedisClusterConfiguration(nodes);
        configuration.setMaxRedirects(cluster.getMaxRedirects());
        return new LettuceConnectionFactory(configuration);
    }
}

四、读写分离

基础整合仅仅是实现了高可用Redis服务的流程,生产环境下仍需要增加其他配置:修改自定义连接数据库序号;授权连接;连接池配置;读写分离。

在高可用前提下,衍生出读写分离的特性,主库完成写请求;从库完成读请求(从库不允许写)。

@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceClientCustomizer() {
    // 配置读写分离
    return builder -> builder.readFrom(ReadFrom.REPLICA);
}

在这里插入图片描述

原文地址

举报

相关推荐

0 条评论