Redis集群模式高可用实践

  • Post author:
  • Post category:其他




一、序言

本文搭建Redis集群服务。

image-20211108171613912



二、单机模拟

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

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



(一)集群规划

节点 主机 主服务端口 从服务端口 备注
node01 127.0.0.1 7010 7011 物理机
node02 127.0.0.1 7020 7021 物理机
node03 127.0.0.1 7030 7031 物理机



(二)服务配置



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);
}


原文地址


喜欢本文点个♥️赞♥️支持一下,如有需要,可通过微信

dream4s

与我联系。相关源码在

GitHub

,视频讲解在

B站

,本文收藏在

博客天地




版权声明:本文为m0_63836794原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。