搭建redis主从,哨兵配置,集成到springboot中配置读写分离

这篇具有很好参考价值的文章主要介绍了搭建redis主从,哨兵配置,集成到springboot中配置读写分离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

文章介绍Ubuntu系统搭建redis,并完成主从的读写分离配置,为主节点搭建三台哨兵服务,并集成到springboot中。
本篇文章是通过其他优秀博文学习后,用作学习记录使用。
大佬博客:
https://blog.csdn.net/Wei_Naijia/article/details/125704197
https://blog.csdn.net/lssqk/article/details/127220990

1.Ubuntu安装redis

(1)工具安装
sudo apt-get install -y gcc
sudo apt-get install -y g++
sudo apt-get install -y gcc automake autoconf libtool make
(2)安装redis

a. 到redis官网(链接: https://redis.io/download/)下载redis安装包,然后上传到服务器,解压安装包

# 切换到安装包存放目录
cd /data/redis-colony
# 解压安装包
tar -zxvf redis-6.2.12.tar.gz

解压成功后,进入解压目录可以看到下面的内容,其中,redis.conf就是redis的配置文件,sentinel.conf就是redis哨兵的配置文件,待会会用这两个
springbootredis哨兵配置,redis,spring bootb. 编译Makefile,安装redis

# 进入解压目录
cd redis-6.2.12/
# 编译Makefile
make
# 编译完成后会看到最下面的一行字 Hint: It's a good idea to run 'make test' ; )
# 安装redis,使用PREFIX指定安装目录,默认在/usr/local/bin下
make install PREFIX=/data/redis-colony/redis

c.安装完成后可以在安装目录的bin目录下看到下面内容
springbootredis哨兵配置,redis,spring boot
这个时候就可以用redis-server启动了,redis安装就到此完成了。

2.redis主从复制,读写分离

我这先在redis-colony目录下创建一个redis-cluster文件夹,统一管理主从redis的相关文件。

# 切换到目标目录,创建redis-cluster文件夹
cd /data/redis-colony
mkdir redis-cluster
# 切换到redis解压目录
cd /data/redis-colony/redis-6.2.12
# 复制redis配置文件到这个路径下面并改名
cp redis.conf /data/redis-colony/redis-cluster/redis-6380.conf
cp redis.conf /data/redis-colony/redis-cluster/redis-6381.conf
cp redis.conf /data/redis-colony/redis-cluster/redis-6382.conf

修改三个配置文件,我这里将6380作为主节点,6381和6382作为从节点

# bind 127.0.0.1 注释表示允许外机访问,不然就只能本机访问
protected-mode no # 关闭保护模式
port 6381 # 指定端口为6381

springbootredis哨兵配置,redis,spring boot

# 启动方式从前台启动改成后台启动(前台启动的话,终端关闭就会自动停止)
daemonize yes 
# 后续就是一些相关文件路径,文件名配置
# aof相关配置,这里没有配,可以根据需要进行配置
appendonly yes
appendfilename appendonly_6381.aof
# 连接密码配置,这里也没有配置,可以根据需要进行配置
requirepass <password>

springbootredis哨兵配置,redis,spring boot
springbootredis哨兵配置,redis,spring boot
springbootredis哨兵配置,redis,spring boot

# 从节点进行这项配置,主节点不用
replicaof <ip> 6380 # 指定当前从节点的主节点redis

springbootredis哨兵配置,redis,spring boot

# 主节点可以加一下配置
replica-read-only no # 标记当前节点可写

配置完成后就可以用redis-server启动了,我这里是想写的三个对应的启动脚本,这里拿6380示例

/data/redis-colony/redis/bin/redis-server /data/redis-colony/redis-cluster/redis-6380.conf

启动完成后,可以使用redis-cli进入主节点,查看当前主从情况

/data/redis-colony/redis/bin/redis-cli -p 6380
info replication

springbootredis哨兵配置,redis,spring boot

3.redis哨兵配置

前面提到了,sentinel.conf就是redis哨兵的配置,我们这里新建一个redis-sentinel文件夹,管理redis哨兵相关的文件。然后复制三个哨兵配置文件到这个路径下。

# 切换到解压文件夹下
cd /data/redis-colony/redis-6.2.12
# 复制哨兵配置文件到redis-sentinel路径下
cp sentinel.conf /data/redis-colony/redis-sentinel/sentinel-26380.conf
cp sentinel.conf /data/redis-colony/redis-sentinel/sentinel-26381.conf
cp sentinel.conf /data/redis-colony/redis-sentinel/sentinel-26382.conf

修改哨兵配置文件,三个哨兵配置文件一样,都是为主节点做哨兵配置,只是修改一下端口和相关文件即可,这里还是拿其中一个举例。

# 指定端口 26380
port 26380
# 改为后台启动
daemonize yes
# 指定文件路径
# ...
# 监控<ip> 6380 节点(将这台机器作为<ip> 6380的哨兵),命名为mymaster
# 这里的 1 代表优先级,我这给26380配置的1,其余两台分别是2和3,代表主节点宕机后,优先26380代替成为主节点
sentinel monitor mymaster <ip> 6380 1
# 设置主节点无响应时间代表挂了,默认是30s
sentinel down-after-milliseconds mymaster 30000
# 故障转移时间上限,默认是三分钟
sentinel failover-timeout mymaster 180000
# 发生故障时最多几台从节点对新master进行同步,值越小,故障响应处理越快
sentinel parallel-syncs mymaster 1
# 在监控节点配置下方的配置,这里的master-name指代的是前面配置的主节点名称,这里指mymaster,密码指主节点配置文件中的密码
# 当密码正确时,才能和主节点建立连接,监控主节点状态信息
sentinel auth-pass <master-name> <password>
# 这里为哨兵配置连接密码,按需要配置
requirepass <password>

springbootredis哨兵配置,redis,spring boot
springbootredis哨兵配置,redis,spring boot
springbootredis哨兵配置,redis,spring boot
springbootredis哨兵配置,redis,spring boot
springbootredis哨兵配置,redis,spring boot
完成配置后可以使用安装目录下的redis-sentinel启动哨兵服务

# 路径根据自己的来定
/data/redis-colony/redis/bin/redis-sentinel /data/redis-colony/redis-sentinel/sentinel-26380.con

4.springboot集成redis完成读写分离配置

(1)导入依赖

引入依赖(我这只引入了redis依赖,其余依赖看着来)

<!--spirngboot springdata对redis支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2)yml配置

编写yml配置文件,我这里的就是无密码配置,主节点,从节点,哨兵这些都没有密码,如果有配置了密码,还需要进行密码配置。通过无密码配置中的日志配置方式可以看到redis操作时的读写操作从哪个节点进行。

a.无密码yml配置
spring:
  redis:
    # 哨兵模式配置
    sentinel:
      # 这里就是前面哨兵配置文件中指定的主节点名称
      master: mymaster
      nodes:
        - <ip>:26380
        - <ip>:26381
        - <ip>:26382
# 日志配置
logging:
  level:
    # 表示根 logger 的日志级别为 info
    root: info
    # 表示 io.lettuce.core 包(redis的核心驱动包)下的日志级别为 debug
    io.lettuce.core: debug
    org.springframework.data.redis: debug
b. 主从节点密码相同,哨兵密码相同yml配置
spring:
  redis:
    sentinel:
      master: mymaster
      nodes: sentinel-host1:26380,sentinel-host2:26381
      password: sentinel-password
    cluster:
      nodes: redis-host1:6380,redis-host2:6381,redis-host3:6382
      password: cluster-password
c. 主从节点,哨兵密码各不相同yml配置
spring:
  redis:
    sentinel:
      master: mymaster
      nodes: sentinel1:26380,sentinel2:26381
      node-passwords:
        - host: sentinel1
          port: 26380
          password: sentinel1-password
        - host: sentinel2
          port: 26381
          password: sentinel2-password
    cluster:
      nodes: cluster1:6380,cluster2:6381,cluster3:6382
      node-passwords:
        - host: cluster1
          port: 6380
          password: cluster1-password
        - host: cluster2
          port: 6381
          password: cluster2-password
        - host: cluster3
          port: 6382
          password: cluster3-password
(3)RedisConfig配置类

编写redis配置类(我这直接把大佬的粘过来,写得太详细了)

@Configuration
public class RedisConfiguration {

    /**
     *  配置redis序列化json
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    @Primary    //若有相同类型的Bean时,优先使用此注解标注的Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 为了开发方便,一般直接使用<String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 配置具体的序列化方式
        // JSON解析任意对象
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        // 设置日期格式
        om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();


        //key采用String的序列化
        template.setKeySerializer(stringRedisSerializer);
        //hash的key也采用String的序列化
        template.setHashKeySerializer(stringRedisSerializer);
        //value的序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        //设置所有配置
        template.afterPropertiesSet();

        return template;
    }

    /**
     * 配置读写分离
     * @param redisProperties
     * @return
     */
    @Bean
    public RedisConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties) {
        // 配置哨兵节点以及主节点
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(
                redisProperties.getSentinel().getMaster(), new HashSet<>(redisProperties.getSentinel().getNodes())
        );

        // 配置读写分离
        LettucePoolingClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder()
                // 读写分离,这里的ReadFrom是配置Redis的读取策略,是一个枚举,包括下面选择
                // MASTER   仅读取主节点
                // MASTER_PREFERRED   优先读取主节点,如果主节点不可用,则读取从节点
                // REPLICA_PREFERRED   优先读取从节点,如果从节点不可用,则读取主节点
                // REPLICA   仅读取从节点
                // NEAREST   从最近节点读取
                // ANY   从任意一个从节点读取
                .readFrom(ReadFrom.REPLICA_PREFERRED)
                .build();

        return new LettuceConnectionFactory(redisSentinelConfiguration, lettuceClientConfiguration);
    }

}
(4)测试

我个人习惯使用接口进行测试,不习惯用springboot测试方法,所以这里写的接口进行测试

@RequestMapping("/test/redis")
@RestController
@Api(tags = "redis测试")
@Slf4j
public class RedisTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @PostMapping("/save")
    @ApiOperation("保存")
    public Result save(@ApiParam("key") @RequestParam("key") String key, @ApiParam("value") @RequestParam("value") String value) {
        log.info("key-> {}, value -> {}", key, value);
        redisTemplate.opsForValue().set(key, value, 30, TimeUnit.SECONDS);
        return Result.success();
    }

    @GetMapping("/get")
    @ApiOperation("取值")
    public Result<String> get(@RequestParam("key") String key) {
        log.info("取值:key -> {}", key);
        Object o = redisTemplate.opsForValue().get(key);
        log.info("redisTemplate取值:value -> {}", o);
        Object o1 = redisUtils.get(key);
        log.info("redisUtils取值:value -> {}", o1);
        return Result.success(o);
    }
}

然后通过swagger进行接口测试,查看日志(这里就不放日志截图了),可以看到调用存值接口的时候,使用的6380,调用取值接口的时候,使用的6381,至此完成redis主从配置,读写分离,哨兵配置,并集成到springboot项目中。文章来源地址https://www.toymoban.com/news/detail-707200.html

到了这里,关于搭建redis主从,哨兵配置,集成到springboot中配置读写分离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搭建Redis主从集群和哨兵

    说明:单机的Redis存在许多的问题,如数据丢失问题、高并发问题、故障恢复问题、海量数据的存储能力问题,针对这四个问题,对应解决方式有:数据持久化(参考:http://t.csdn.cn/SSyBi)、搭建主从集群、Redis哨兵和搭建分片集群; 本文介绍搭建Redis主从集群和哨兵,用以解

    2024年02月16日
    浏览(36)
  • Redis——主从复制+集群搭建(非哨兵)

    主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower); 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。 默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个

    2024年02月12日
    浏览(31)
  • Redis主从复制和哨兵架构图,集成Spring Boot项目实战分享

    Redis 主从复制和哨兵架构是 Redis 集群的重要组成部分,用于提高 Redis 集群的可用性和性能。以下是 Redis 主从复制和哨兵架构的详细介绍,包括架构图和 Java 代码详解。 Redis 主从复制是通过节点间的异步复制实现的。在 Redis 集群中,每个主节点可以有多个从节点,每个从节

    2024年02月13日
    浏览(41)
  • 搭建Redis主从集群+哨兵+代理predixy

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 搭建了一个 Redis 服务器集群(主从复制+哨兵模式+代理),实现了主从配置和容灾部署,使得主机出现故障时,可自动进行容灾切换,现详细记录下搭建过程

    2024年02月02日
    浏览(62)
  • Docker 搭建MySQL主从复制-读写分离

    MySQL主从复制是一种常用的数据库高可用性解决方案,通过在主数据库上记录的数据变更,同步到一个或多个从数据库,实现数据的冗余备份和读写分离。在Docker环境下搭建MySQL主从复制和读写分离,不仅方便管理,还能充分发挥Docker的轻量、可移植性等特性。 在开始搭建之

    2024年02月22日
    浏览(41)
  • Redis 主从配置、哨兵、集群模式

    目录 Redis 主从复制  主从复制的作用: 主从复制流程: 搭建Redis 主从复制 安装 Redis 环境准备 修改内核参数 安装redis 创建redis工作目录 环境变量 定义systemd服务管理脚本 修改 Redis 配置文件(Master节点操作) 修改 Redis 配置文件(Slave节点操作) 验证主从效果 Redis 哨兵模式

    2024年02月12日
    浏览(56)
  • Linux Redis主从复制 | 哨兵监控模式 | 集群搭建 | 超详细

    4.1 环境部署 4.2 安装Redis(主从服务器) 4.3 修改Master节点Redis配置文件 (192.168.163.100) 4.4 修改Slave节点Redis配置文件 (192.168.163.110 192.168.163.120) 4.5 验证结果 5.1 哨兵模式的原理 5.2 哨兵模式的作用 5.3哨兵模式的结构 哨兵结构由两部分组成, 哨兵节点 和 数据节点 : 哨兵节点:

    2023年04月14日
    浏览(43)
  • 基于k8s搭建mysql5.7主从集群实现读写分离

    一,准备工作 1,拥有一个运行中的k8s集群 2,拥有一个ceph分布式存储集群,此mysql集群基于ceph块存储,部署方案可参考我前面的rook部署ceph方案 二,集群搭建 1,创建存储类storageclass       将此 StorageClass 定义保存为 storageclass.yaml : 创建存储类   2,MySQL 部署包含一个 Con

    2024年02月08日
    浏览(39)
  • springboot如何集成redis哨兵集群?

    redis主从集群和redis sentinel集群都配置完毕了, 现在我们需要了解spring boot 如何连接上该集群 才能用上这两个集群带来的便利 为什么需要关注这个问题? 怎么配置? 记住. 本章是针对redis已经配置了主从集群和哨兵集群的, 而非cluster集群模式 没有 Redis Sentinel 架构之前,如果主节

    2024年02月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包