基于DOCKER安装Redis Sentinel 集群
配置规划
首先创建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 | 初始从节点 |
安装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.
也可以通过配置文件来配置
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
安装Redis Sentinel
哨兵可以直接在redis里面运行,也可以单独运行,但是为了环境隔离,不让redis影响哨兵集群,单独用docker运行哨兵集群
第一步,配置哨兵的配置文件
# redisgroup:自定义集群名,如果需要监控多个redis集群,只需要配置多次并定义不同的
:主库ip :主库port :最小投票数,由于有三台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集群,只需要配置多次并定义不同的
:主库ip :主库port :最小投票数,由于有三台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
同样sentinel也可以用配置文件启动
配置文件改为
port 7001
sentinel announce-ip 3xx.1xx.1xx.1xx
# redisgroup:自定义集群名,如果需要监控多个redis集群,只需要配置多次并定义不同的 :主库ip :主库port :最小投票数,由于有三台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
基于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
这里有一个小小的问题没有解决
因为我是在服务器使用docker部署的,但是本地远程的时候,sentinel集群返回的地址是docker内部配置的地址,如何指定返回对外的ip,sentinel announce-ip ip 这个配置是用来做什么的。?我一开始以为这个ip是用来指定返回的redis的ip,结果并不是
这个问题已解决
可以参考
https://blog.csdn.net/yingziisme/article/details/100088226
参考
[1] springboot案例代码参考
欢迎关注微信交流