基于DOCKER安装Redis Sentinel 集群

  1. 配置规划
    首先创建redis网络:docker network create --subnet=192.168.100.0/24 redisnet

host

ip

port

remark

redis-6001

192.168.100.11

6001:6379

初始主节点

redis-6002

192.168.100.12

6002:6379

初始从节点

redis-6003

192.168.100.13

6003:6379

初始从节点

  1. 安装Redis
第一步,使用docker运行3个redis实例
docker run --name redis-6001 -p 6001:6379 --hostname=redis-6001 --net=redisnet --ip=192.168.100.11 -v /home/redis/6001:/home/redis/6001 -d redis:4.0.11 --requirepass 123456

docker run --name redis-6002 -p 6002:6379 --hostname=redis-6002 --net=redisnet --ip=192.168.100.12 -v /home/redis/6002:/home/redis/6002 -d redis:4.0.11 --requirepass 123456

docker run --name redis-6003 -p 6003:6379 --hostname=redis-6003 --net=redisnet --ip=192.168.100.13 -v /home/redis/6003:/home/redis/6003 -d redis:4.0.11 --requirepass 123456
第二步,配置主节点
进入redis-6001 容器内部
[root@izwz90o0w65t1ogj9cpmiqz 6001]# docker exec -it redis-6001 bash
登陆redis
root@8901264ee28f:/data# redis-cli -a 123456
 设置主认证密码
 127.0.0.1:6379> config set masterauth 123456127.0.0.1:6379> info replication
#Replication

role:master
connected_slaves:0
master_replid:96a0f831a4042335e5e8b291cbeffa61a21c13b0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
第三步,配置从节点1
[root@izwz90o0w65t1ogj9cpmiqz 6001]# docker exec -it redis-6002 bash
 root@0a468d860576:/data# redis-cli -a 123456127.0.0.1:6379> slaveof 192.168.100.11 6379
127.0.0.1:6379> config set masterauth 123456
127.0.0.1:6379> info replication
Replication

role:slave
master_host:192.168.100.11
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:16f389a9af7388e6a687dccb7c4d8372c7daf4ce
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
第四步,配置从节点2
[root@izwz90o0w65t1ogj9cpmiqz 6001]# docker exec -it redis-6003 bash
 root@0a468d860576:/data# redis-cli -a 123456127.0.0.1:6379> slaveof 192.168.100.11 6379
127.0.0.1:6379> config set masterauth 123456
第五步,测试
在redis-6001存入键值对
127.0.0.1:6379> SET test aaa
在redis-6002和redis-6003查询
127.0.0.1:6379> get test
 “aaa”在redis-6002或者redis-6003存入
127.0.0.1:6379> set test bbb
 (error) READONLY You can’t write against a read only slave.
  1. 也可以通过配置文件来配置
    master的配置文件
# 指定Redis监听端口,默认端口为6379
# 如果指定0端口,表示Redis不监听TCP连接
port 6001
# Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
# 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
# redis开启守护进程会导致docker容器启动失败
daemonize no
# 当master服务设置了密码保护时,slav服务连接master的密码
# 下文的“requirepass”配置项可以指定密码
masterauth 123456
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
# 因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
# 指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec

slave的配置文件,其他和master一样,只是多了下面这一个

# 设置当本机为slav服务时,设置master服务的ip地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof 192.168.100.11 6379

docker的启动命令

docker run --name redis6001 -p 6001:6001 --hostname=redis6001 --net=redisnet --ip=192.168.100.11 -v /home/redis/6001:/home/redis/6001 -d redis:4.0.11 redis-server /home/redis/6001/redis.conf

docker run --name redis6002 -p 6002:6002 --hostname=redis6002 --net=redisnet --ip=192.168.100.12 -v /home/redis/6002:/home/redis/6002 -d redis:4.0.11 redis-server /home/redis/6002/redis.conf

docker run --name redis6003 -p 6003:6003 --hostname=redis6003 --net=redisnet --ip=192.168.100.13 -v /home/redis/6003:/home/redis/6003 -d redis:4.0.11 redis-server /home/redis/6003/redis.conf
  1. 安装Redis Sentinel
    哨兵可以直接在redis里面运行,也可以单独运行,但是为了环境隔离,不让redis影响哨兵集群,单独用docker运行哨兵集群
第一步,配置哨兵的配置文件
# redisgroup:自定义集群名,如果需要监控多个redis集群,只需要配置多次并定义不同的<master-name> <master-redis-ip>:主库ip <master-redis-port>:主库port <quorum>:最小投票数,由于有三台redis-sentinel实例,所以可以设置成2
sentinel monitor redisgroup 192.168.100.11 6379 2

# 注:redis主从库搭建的时候,要么都不配置密码(这样下面这句也不需要配置),不然都需要设置成一样的密码
sentinel auth-pass redisgroup 123456

# 添加后台运行
daemonize yes
第二步,启动哨兵集群
docker run -it --name sentinel-1 --net=redisnet --ip=192.168.100.21 -v /home/redis/6001/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis:4.0.11 /bin/bash
docker run -it --name sentinel-2 --net=redisnet --ip=192.168.100.22 -v /home/redis/6002/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis:4.0.11 /bin/bash
docker run -it --name sentinel-3 --net=redisnet --ip=192.168.100.23 -v /home/redis/6003/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis:4.0.11 /bin/bash
第三步,分别进去三个容器启动哨兵
redis-sentinel /usr/local/etc/redis/sentinel.conf
第四步,进入哨兵查看状态,哨兵默认端口是26379
127.0.0.1:26379> sentinel master redisgroup
1) "name"
 2) "redisgroup"
 3) "ip"
 4) "192.168.100.11"
 5) "port"
 6) "6379"
 7) "runid"
 8) "42d53c0f9f270f5c36d5043cb280e3860c634df9"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "325"
19) "last-ping-reply"
20) "325"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "3697"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "134157"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379> sentinel slaves redisgroup
1)  1) "name"
    2) "192.168.100.13:6379"
    3) "ip"
    4) "192.168.100.13"
    5) "port"
    6) "6379"
    7) "runid"
    8) "437b3c24e6429ed2f27f6eac2acacbbe4df3e049"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "685"
   19) "last-ping-reply"
   20) "685"
   21) "down-after-milliseconds"
   22) "30000"
   23) "info-refresh"
   24) "1545"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "152062"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.100.11"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "50620"
2)  1) "name"
    2) "192.168.100.12:6379"
    3) "ip"
    4) "192.168.100.12"
    5) "port"
    6) "6379"
    7) "runid"
    8) "20f0b9d44d91010ecde12d6e5ee98cf92f5b02c9"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "685"
   19) "last-ping-reply"
   20) "685"
   21) "down-after-milliseconds"
   22) "30000"
   23) "info-refresh"
   24) "1545"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "152060"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.100.11"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "50620"
退出查看配置文件,集群信息自动写入
# 添加后台运行
daemonize yes
# Generated by CONFIG REWRITE
port 26379
dir "/data"
sentinel monitor redisgroup 192.168.100.11 6379 2
sentinel auth-pass redisgroup 123456
sentinel config-epoch redisgroup 0
sentinel leader-epoch redisgroup 0
sentinel known-slave redisgroup 192.168.100.12 6379
sentinel known-slave redisgroup 192.168.100.13 6379
sentinel known-sentinel redisgroup 192.168.100.23 26379 b9e1cfe422175372d4b51ed6ca8b026eeeee1a59
sentinel known-sentinel redisgroup 192.168.100.22 26379 9b1f7c2ea39b1337501d2abe187bd742420c5230
sentinel current-epoch 0
第五步,下线master节点,查看信息,默认超时时间是30s,之后查看配置文件
# redisgroup:自定义集群名,如果需要监控多个redis集群,只需要配置多次并定义不同的<master-name> <master-redis-ip>:主库ip <master-redis-port>:主库port <quorum>:最小投票数,由于有三台redis-sentinel实例,所以可以设置成2
sentinel myid 3273c4b5cc35df7052156ab162d673b09bed3d61

# 注:redis主从库搭建的时候,要么都不配置密码(这样下面这句也不需要配置),不然都需要设置成一样的密码
sentinel deny-scripts-reconfig yes

# 添加后台运行
daemonize yes
# Generated by CONFIG REWRITE
port 26379
dir "/data"
sentinel monitor redisgroup 192.168.100.12 6379 2
sentinel auth-pass redisgroup 123456
sentinel config-epoch redisgroup 1
sentinel leader-epoch redisgroup 1
sentinel known-slave redisgroup 192.168.100.11 6379
sentinel known-slave redisgroup 192.168.100.13 6379
sentinel known-sentinel redisgroup 192.168.100.23 26379 b9e1cfe422175372d4b51ed6ca8b026eeeee1a59
sentinel known-sentinel redisgroup 192.168.100.22 26379 9b1f7c2ea39b1337501d2abe187bd742420c5230
sentinel current-epoch 1
  1. 同样sentinel也可以用配置文件启动
    配置文件改为
port 7001
sentinel announce-ip 3xx.1xx.1xx.1xx
# redisgroup:自定义集群名,如果需要监控多个redis集群,只需要配置多次并定义不同的<master-name> <master-redis-ip>:主库ip <master-redis-port>:主库port <quorum>:最小投票数,由于有三台redis-sentinel实例,所以可以设置成2
sentinel monitor redisgroup 192.168.100.11 6379 2

# 注:redis主从库搭建的时候,要么都不配置密码(这样下面这句也不需要配置),不然都需要设置成一样的密码
sentinel auth-pass redisgroup 123456

sentinel down-after-milliseconds mymaster 1000
sentinel failover-timeout mymaster 60000

# 添加后台运行
daemonize no

docker 容器的启动命令改为

docker run -it --name sentinel-1 -p 7001:7001 --net=redisnet --ip=192.168.100.21 -v /home/redis/6001/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis:4.0.11 redis-sentinel /usr/local/etc/redis/sentinel.conf

docker run -it --name sentinel-2 -p 7002:7002 --net=redisnet --ip=192.168.100.22 -v /home/redis/6002/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis:4.0.11 redis-sentinel /usr/local/etc/redis/sentinel.conf

docker run -it --name sentinel-3 -p 7003:7003 --net=redisnet --ip=192.168.100.23 -v /home/redis/6003/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis:4.0.11 redis-sentinel /usr/local/etc/redis/sentinel.conf
  1. 基于springboot的配置和使用
    在spring下面使用很简单,只需要将配置文件中redis配置哨兵集群的地址即可
spring:
  application:
    name: redis-demo
  redis:
    lettuce:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
    timeout: 10000
    database: 0
    sentinel:
      master: redisgroup
      nodes: 192.168.100.21:7001,192.168.100.21:7002,192.168.100.21:7003
    password: 123456
server:
  port: 10001
  1. 这里有一个小小的问题没有解决
    因为我是在服务器使用docker部署的,但是本地远程的时候,sentinel集群返回的地址是docker内部配置的地址,如何指定返回对外的ip,sentinel announce-ip ip 这个配置是用来做什么的。?我一开始以为这个ip是用来指定返回的redis的ip,结果并不是

这个问题已解决
可以参考