基于DOCKER安装Redis Sentinel 集群以及springboot连接Redis哨兵集群demo

基于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 初始从节点
  2. 安装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 123456

    127.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 123456

    127.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 123456

    127.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
    
  3. 安装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
    
  4. 基于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
    
  5. 这里有一个小小的问题没有解决

    因为我是在服务器使用docker部署的,但是本地远程的时候,sentinel集群返回的地址是docker内部配置的地址,如何指定返回对外的ip,sentinel announce-ip ip 这个配置是用来做什么的。?我一开始以为这个ip是用来指定返回的redis的ip,结果并不是

这个问题已解决
可以参考
https://blog.csdn.net/yingziisme/article/details/100088226

参考
[1] springboot案例代码参考

欢迎关注微信交流
在这里插入图片描述

你可能感兴趣的:(springboot,redis)