您当前的位置:首页 > 电脑百科 > 数据库 > Redis

redis哨兵docker部署及springboot运行

时间:2021-01-05 09:30:11  来源:  作者:

redis的主从模式,如果主机挂掉,要手动切换及修改链接,这种操作在生产环境上基本是不可能,一般都会中断服务,然后再通过重启来完成。但在redis 2.8之后可以用哨兵模式来解决这个问题。

redis哨兵docker部署及springboot运行

哨兵网络图

一、哨兵模式简介

sentinel是redis高可用的解决方案,sentinel系统(N个sentinel实例,N >= 1)可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。

sentine哨兵l本质上是一个特殊的redis服务,所以初始化的时候跟redis服务初始化差不多,不过有几点不一样;首先sentinel不会载入RDB或者AOF文件,因为sentinel根本不使用数据库,其次,sentinel不能使用数据库键值对方面的命令,例如set、del、flushdb等等,同时,sentinel也不能使用事务、脚本、RDB或者AOF持久化命令,最后,复制命令,发布与订阅命令,文件事件处理器,时间事件处理器等只能在sentinel内部使用。

二、哨兵模式提供主要功能

Redis 的 Sentinel 的最小配置是一主一从。Sentinel 的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移 (failover)、主从切换。

1、监控

Sentinel 会不断的检查 主服务器 和 从服务器 是否正常运行。

2、通知

当被监控的某个 Redis 服务器出现问题,Sentinel 通过 API 脚本 向 管理员 或者其他的 应用程序 发送通知。

3、自动故障转移

当 主节点 不能正常工作时,Sentinel 会开始一次 自动的 故障转移操作,它会将与 失效主节点 是 主从关系 的其中一个 从节点 升级为新的 主节点,并且将其他的 从节点 指向 新的主节点。

4、配置提供者

在 Redis Sentinel 模式下,客户端应用 在初始化时连接的是 Sentinel 节点集合,从中获取 主节点 的信息。

三、Docker部署图

我们在测试的时候,将进行3个sentinel和3个redis实例,redis实例为1主2从。

redis哨兵docker部署及springboot运行

部署实例

具体部署成功后,如下图所示:

redis哨兵docker部署及springboot运行

部署完成后实例

四、docker部署过程

1、环境准备

在主机上安装好docker,本实例机器ip为:192.168.197.24,redis的版本为:3.2

各redis的ip和端口如下:

redis主节点:p:6379

redis从节点:ip:6380,ip:6381

sentinel:ip:26379,ip:26380,ip:26381

2、部署主从redis

如果网卡不存在先创建网卡 docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 host (host一般会存在)

执行下面命令创建redis实例:

sudo docker run --name redis6379 --net=host -v $PWD/data6379:/data  -d redis:3.2 redis-server --port 6379  --slave-read-only no
sudo docker run --name redis6380 --net=host -v $PWD/data6380:/data  -d redis:3.2 redis-server --slaveof 192.168.197.24  6379 --port 6380 --slave-read-only no
sudo docker run --name redis6381 --net=host -v $PWD/data6381:/data  -d redis:3.2 redis-server --slaveof 192.168.197.24  6379 --port 6381 --slave-read-only no

注意添加:--slave-read-only no

否则会出现下面错误:

READONLY You can't write against a read only slave.

3、执行命名查看redis 同步情况

docker logs redis6379
docker logs redis6380
docker logs redis6381

 

redis哨兵docker部署及springboot运行

日志

4、部署sentinel

新建文件 sentinel-26379.conf、sentinel-26380.conf、sentinel-26381.conf


protected-mode no
bind 0.0.0.0
port 26379
daemonize yes
sentinel monitor mymaster 192.168.2.139 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
logfile "/var/log/redis/redis.log"
protected-mode no
bind 0.0.0.0
port 26380
daemonize yes
sentinel monitor mymaster 192.168.197.24 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
logfile "/var/log/redis/redis.log"
protected-mode no
bind 0.0.0.0
port 26381
daemonize yes
sentinel monitor mymaster 192.168.197.24  6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
logfile "/var/log/redis/redis.log"

如下:

redis哨兵docker部署及springboot运行

sentinel配置文件

5、启动3台sentinel命令:

sentinel1

先:sudo docker run -it --name sentinel-26379 --net=host -v $PWD/sentinel-26379.conf:/usr/local/etc/redis/sentinel.conf -d redis:3.2 /bin/bash 

再:sudo docker exec -it sentinel-26379 /bin/bash

最后在容器里设置激活哨兵模式:redis-sentinel /usr/local/etc/redis/sentinel.conf 

sentinel2

先:sudo docker run -it --name sentinel-26380 --net=host -v $PWD/sentinel-26380.conf:/usr/local/etc/redis/sentinel.conf -d redis:3.2 /bin/bash 

再:sudo docker exec -it sentinel-26380 /bin/bash

最后在容器里设置激活哨兵模式:redis-sentinel /usr/local/etc/redis/sentinel.conf 

sentinel3

先:sudo docker run -it --name sentinel-26381 --net=host -v $PWD/sentinel-26381.conf:/usr/local/etc/redis/sentinel.conf -d redis:3.2 /bin/bash 

再:sudo docker exec -it sentinel-26381 /bin/bash

最后在容器里设置激活哨兵模式:redis-sentinel /usr/local/etc/redis/sentinel.conf 

6、sentenel会根据master的数据自动把其他salve和sentenel找出来写到自己的配置文件

查看配置文件cat sentinel-26379.conf

redis哨兵docker部署及springboot运行

sentinel会自动找到配置

发现配置文件多了东西。

五、springboot配置及运行

1、新建springboot项目xml为:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.eujian</groupId>
    <artifactId>redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>redis</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <JAVA.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、配置文件配置redis的方式

spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.197.24:26379,192.168.197.24:26380,192.168.197.24:26381

3、创建类用于访问

@RequestMApping
@RestController
public class Controller {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("getkey")
    public String getkey(String key){
        String result = stringRedisTemplate.opsForValue().get(key);
        return result;
    }

    @GetMapping("setkey")
    public void setkey(String key, String value){
        stringRedisTemplate.opsForValue().set(key, value);
    }
}
}

4、具体的代码目录为

redis哨兵docker部署及springboot运行

springboot项目代码

六、测试及演练

启动springboot项目,即可以访问:

1、设置redis值:

http://localhost:8080/setkey?key=aa&value=789

2、查询redis值:

http://localhost:8080/getkey?key=aa

返回

redis哨兵docker部署及springboot运行

 

设置一个值入去,就可以查到。



Tags:redis哨兵   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
redis的主从模式,如果主机挂掉,要手动切换及修改链接,这种操作在生产环境上基本是不可能,一般都会中断服务,然后再通过重启来完成。但在redis 2.8之后可以用哨兵模式来解决这个问...【详细内容】
2021-01-05  Tags: redis哨兵  点击:(165)  评论:(0)  加入收藏
Redis 主从复制的作用中有这么一句话“主从复制是高可用的基石”,那什么是高可用呢?高可用就是减少系统不能提供的时间,也就是常听到的以 6 个 9 为基准。实现高可用必不可少的...【详细内容】
2020-06-24  Tags: redis哨兵  点击:(76)  评论:(0)  加入收藏
1、上篇文章已经分享了Redis主从服务构建,接下来分享Redis哨兵服务构建,基础配置在上篇文章已经说过了,不明白的小伙伴可以翻看上篇文章Redis主从,因本文比较简单,大神级可以飘过...【详细内容】
2019-09-19  Tags: redis哨兵  点击:(182)  评论:(0)  加入收藏
▌简易百科推荐
来源: my.oschina.net/xiaomu0082/blog/2990388首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应...【详细内容】
2021-12-08  Java识堂    Tags:Redis   点击:(16)  评论:(0)  加入收藏
我不知道为什么你会选择对特定数量的“错误”(或警告)如此具体。听起来您正在寻找将要发布到 Yahoo! 的某些文章的内容。 Insider (N Foos to Blah for the BlahBlah)。那说:...【详细内容】
2021-12-07  富集云科技有限公司    Tags:Redis   点击:(14)  评论:(0)  加入收藏
目录 一、背景 二、步骤 0.理论支持 1、获取数据 2、结果 3、分析数据并评估大小 三、关于repl-backlog-size 一、背景 repl-backlog-size控制这个环形缓冲区. ​ 主从断...【详细内容】
2021-11-05  弈秋的美好生活    Tags:redis   点击:(41)  评论:(0)  加入收藏
Redis 性能测试是通过同时执行多个命令实现的。1,Redis-benchmarkRedis性能命令:redis性能命令格式: redis-benchmark [option] [option value] redis 性能测试工具可选参数如...【详细内容】
2021-11-02  川石信息    Tags:Redis   点击:(41)  评论:(0)  加入收藏
1 概述数据结构和内部编码 无传统关系型数据库的 Table 模型schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。 key...【详细内容】
2021-11-01  JavaEdge    Tags:Redis   点击:(28)  评论:(0)  加入收藏
普通java中使用引用Java redis 驱动,即可连接:import redis.clients.jedis.Jedis; public class RedisTestJava { public static void main(String[] args) { //连...【详细内容】
2021-10-13  faesuite    Tags:Redis   点击:(34)  评论:(0)  加入收藏
Redis常用的数据结构有 string list set zset hashstringstring 是 Redis 的基本的数据类型,一个 key 对应一个 value。string 类型是二进制安全的,Redis的string可以包含任...【详细内容】
2021-10-12  语霖    Tags:Redis   点击:(36)  评论:(0)  加入收藏
列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。> LPUSH fruit apple(integer) 1> RPUSH fruit banana(integer)...【详细内容】
2021-09-17  深夜敲代码    Tags:Redis   点击:(54)  评论:(0)  加入收藏
Redis持久化意义 是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你的redis整个挂了,然后redis就不可用了,你要做的事情是让redis变得可用,尽快变得可用 大量的请...【详细内容】
2021-08-12  小李说IT    Tags:Redis   点击:(77)  评论:(0)  加入收藏
当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据...【详细内容】
2021-07-30  随便t    Tags:缓存穿透   点击:(90)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条