SpringBoot集成Docker下的Redis哨兵(一主两从一哨兵)

目录

前言

一、Redis

配置

配置简介 

redis.conf

sentinel.conf

最终文件结构

启动

docker启动一主俩从

docker启动redis哨兵

二、SpringBoot配置Redis

引入maven依赖

yml配置

测试类测试


前言

好记性不如烂笔头

docker操作redis随笔

如有错误请指出 谢谢

一、Redis

配置

配置简介 

主从配置
节点简写端口docker名称
主机master6379redis
从机slave6380redisA
从机slave6380redisB
哨兵配置
节点简写端口docker名称
哨兵sentinel26379redisS

redis.conf

master 6379配置如下

# 保护模式,有bind和requirepass开启
protected-mode no
# 启动端口号
port 6379
# 可以访问的IP
# bind 0.0.0.0
# 以守护进程在后台运行
# daemonize yes
# daemonize开启时进程号写入文件
pidfile /var/run/redis_6379.pid
# 日志级别, 选项有debug, verbose, notice, warning
loglevel notice
# 日志写入文件, 用相对路径会在工作目录dir下生成
# logfile redis.log
# 快照文件
dbfilename dump.rdb
# 工作目录 默认./
dir ./
# 开启aof日志, 默认no
appendonly yes
# aof日志文件
appendfilename "appendonly.aof"
# 每秒钟调用一次fsync函数将AOF日志强制从内核缓存刷到磁盘, always是每条修改指令都调用, no从不
appendfsync everysec
# Redis4.0后RDB AOF混合持久化, 将快照文件写入AOF文件的开头部分
aof-use-rdb-preamble yes
# 慢日志执行时间, 10000 microseconds = 10 milliseconds
slowlog-log-slower-than 10000
# 提升master时的优先级, 默认100, 0:永远不会提升为master
replica-priority 100
# master写数据 未达到以下俩个要求不允许写入
# 至少1个节点正常工作
min-replicas-to-write 1
# 10s内接受到响应
min-replicas-max-lag 10
# 保存数据到磁盘 按照下列条件
save 3600 1
save 300 100
save 60 10000
# 密码
requirepass ssx123
#连接master密码
masterauth ssx123
slave-serve-stale-data yes
#对外ip
replica-announce-ip 47.xx.xx.xx1
#slave连接master
#replicaof <master ip> <master port>

 slave 6380、6381配置与master差异如下

# 启动端口号 6380 6381
port 6380
#slave连接master
replicaof 47.xx.xx.xx1 6379

sentinel.conf

哨兵sentinel.conf 配置文件如下

# 自定义集群名 ip 端口 多哨兵时哨兵最少投票数
sentinel monitor mymaster 4x.xx.xx.xx1 6379 1
# redis master 密码
sentinel auth-pass mymaster "ssx123"
# sentinel密码
requirepass "ssx123"

最终文件结构

[root@ssxyyds redis]# ls
6379  6380  6381  sentinel.conf
[root@ssxyyds redis]# ls 6379 6380 6381
6379:
redis.conf

6380:
redis.conf

6381:
redis.conf

启动

docker启动一主俩从

# 6379 master
docker run -d -p 6379:6379 --name redis -v /redis/6379:/usr/local/etc/redis redis redis-server /usr/local/etc/redis/redis.conf
# 6380 slave
docker run -d -p 6380:6380 --name redisA -v /redis/6380:/usr/local/etc/redis redis redis-server /usr/local/etc/redis/redis.conf
# 6381 slave
docker run -d -p 6381:6381 --name redisB -v /redis/6381:/usr/local/etc/redis redis redis-server /usr/local/etc/redis/redis.conf

启动成功

[root@ssxyyds redis]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS
             NAMES
7bcb7641ab05   redis     "docker-entrypoint.s…"   4 seconds ago    Up 2 seconds    6379/tcp, 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp   redisB
1ea3124a6835   redis     "docker-entrypoint.s…"   7 seconds ago    Up 6 seconds    6379/tcp, 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp   redisA
3fc2f4676fe6   redis     "docker-entrypoint.s…"   13 seconds ago   Up 12 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp             redis

进入redis(master)查看详情 

# docker进入容器
docker exec -it redis redis-cli -a ssx123
# 查看节点详情
info replication

可以看到有两个从机 6380和 6381

[root@ssxyyds redis]# docker exec -it redis redis-cli -a ssx123
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=47.xx.xx.xx1,port=6380,state=online,offset=70,lag=0
slave1:ip=47.xx.xx.xx1,port=6381,state=online,offset=70,lag=0
master_failover_state:no-failover
master_replid:7b07d5960c1eae10dcc12548465050fa61ac68db
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70

输入三个key进行测试

127.0.0.1:6379> set t1 test1
OK
127.0.0.1:6379> set t2 test2
OK
127.0.0.1:6379> set t3 test3
OK
127.0.0.1:6379> keys *
1) "t1"
2) "t3"
3) "t2"

退出master进入从机redisA(6380)查看数据

[root@ssxaly ~]# docker exec -it redisA redis-cli -p 6380 -a ssx123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6380> keys *
1) "t2"
2) "t1"
3) "t3"

set k1 kk 出错是因为从机不能写入值 只能读取

127.0.0.1:6380> set k1 kk
(error) READONLY You can't write against a read only replica.

查看节点信息

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:4x.xx.xx.xx1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:3311
slave_repl_offset:3311
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
min_slaves_good_slaves:0
master_failover_state:no-failover
master_replid:7b07d5960c1eae10dcc12548465050fa61ac68db
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3311
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3311

 redisB(6381)测试结果一致 就不赘述了

docker启动redis哨兵

docker run -it -p 26379:26379 --name redisS -v /redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf r
edis redis-sentinel /usr/local/etc/redis/sentinel.conf

 查看启动状态

[root@ssxaly ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                                     NAMES
230a8d6f8a97   redis     "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26379->26379/tcp, :::26379->26379/tcp   redisS
7bcb7641ab05   redis     "docker-entrypoint.s…"   17 hours ago         Up 17 hours         6379/tcp, 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp       redisB
1ea3124a6835   redis     "docker-entrypoint.s…"   17 hours ago         Up 17 hours         6379/tcp, 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp       redisA
3fc2f4676fe6   redis     "docker-entrypoint.s…"   17 hours ago         Up 17 hours         0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                 redis

 哨兵启动后打印出从机信息

二、SpringBoot配置Redis

引入maven依赖

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

yml配置

spring:
  redis:
    lettuce:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
    timeout: 10000
    database: 0
    sentinel:
      master: mymaster              #哨兵(sentinel.conf)文件中自定义集群名
      nodes: 4x.xx.xx.xx1:26379     #哨兵ip 端口
      password: ssx123              #哨兵密码
    password: ssx123                #redis密码

测试类测试

@Controller
@RequestMapping("/redis")
@Log4j2
public class RedisController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("/test")
    @ResponseBody
    public String test() {
        Set<String> keys = stringRedisTemplate.keys("*");
        assert keys != null;
        log.info(keys.toString());
        return keys.toString();
    }
}

访问接口测试

 重启master(6379)测试哨兵自动切换功能

哨兵自动切换6380为主机

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=4x.xx.xx.xx1,port=6381,state=online,offset=848462,lag=0
slave1:ip=4x.xx.xx.xx1,port=6379,state=online,offset=848462,lag=0
master_failover_state:no-failover
master_replid:1fb85facaa163fc5728ebd7eb10a7ff9d9d6e012
master_replid2:7b07d5960c1eae10dcc12548465050fa61ac68db
master_repl_offset:848462
second_repl_offset:183732
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:848462

 控制台自动输出连接信息

再次访问接口测试结果

成功!

 注:主机掉线后哨兵切换主从期间操作redis的数据可能会丢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值