九零不老心
发布于 2019-09-12 / 14 阅读 / 0 评论 / 0 点赞

创建redis sentinel单机伪集群

# 创建redis sentinel 单机伪集群
    # 提前安装好docker和docker-compose
    # 拉取相应镜像
        docker pull redis
        docker pull joshula/redis-sentinel
    # 创建伪redis的数据目录,持久化redis数据
        mkdir -p /opt/redis-sentinel-cluster/data/{master,slave1,slave2,sentinel1,sentinel2,sentinel3}
    # 创建三个哨兵的配置文件
        # monitor     指的是初始化的监控主切点,ip和端口,后面的数字2代表,必须2个sentinel才能判断主节点是否失败
        # down-after-milliseconds   指的是超过5000秒,且没有回复,则判定主节点不可达
        # failover-timeout    指的是故障转移时间
        # parallel-syncs   指的是故障转移到新的主节点时,从节点的复制节点数量
        cat <<EOF > /opt/redis-sentinel-cluster/sentinel1.conf
port 26379
dir "/data"
sentinel monitor mymaster localhost 16379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
EOF
        cat <<EOF > /opt/redis-sentinel-cluster/sentinel2.conf
port 26380
dir "/data"
sentinel monitor mymaster localhost 16379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
EOF
        cat <<EOF > /opt/redis-sentinel-cluster/sentinel3.conf
port 26381
dir "/data"
sentinel monitor mymaster localhost 16379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
EOF
    #  创建docker-compose.yml文件
        cat <<EOF > /opt/redis-sentinel-cluster/docker-compose.yml
version: '3.7'
services:
  master:
    image: redis:latest
    container_name: redis-master
    restart: always
    network_mode: "host"
    volumes:
      - /opt/redis-sentinel-cluster/data/master:/data
    command: redis-server --port 16379
  slave1:
    image: redis:latest
    container_name: redis-slave1
    restart: always
    network_mode: "host"
    volumes:
      - /opt/redis-sentinel-cluster/data/slave1:/data
    command: redis-server --port 16380 --slaveof localhost 16379
  slave2:
    image: redis:latest
    container_name: redis-slave2
    restart: always
    network_mode: "host"
    volumes:
      - /opt/redis-sentinel-cluster/data/slave2:/data
    command: redis-server --port 16381 --slaveof localhost 16379
  sentinel1:
    image: joshula/redis-sentinel
    container_name: sentinel1
    restart: always
    network_mode: "host"
    volumes:
      - /opt/redis-sentinel-cluster/sentinel1.conf:/etc/redis/sentinel.conf
      - /opt/redis-sentinel-cluster/data/sentinel1:/data
  sentinel2:
    image: joshula/redis-sentinel
    container_name: sentinel2
    restart: always
    network_mode: "host"
    volumes:
      - /opt/redis-sentinel-cluster/sentinel2.conf:/etc/redis/sentinel.conf
      - /opt/redis-sentinel-cluster/data/sentinel2:/data
  sentinel3:
    image: joshula/redis-sentinel
    container_name: sentinel3
    restart: always
    network_mode: "host"
    volumes:
      - /opt/redis-sentinel-cluster/sentinel3.conf:/etc/redis/sentinel.conf
      - /opt/redis-sentinel-cluster/data/sentinel3:/data
EOF
    # 启动redis sentienl cluster
        cd /opt/
        # 安装并后台启动
          docker-compose up -d
          # 校验结果
            # 连接哨兵
              docker exec -it sentinel1 redis-cli -h localhost -p 26379
                localhost:26379> info
                # Server
                redis_version:2.8.16
                redis_git_sha1:00000000
                redis_git_dirty:0
                redis_build_id:9b6f16e360929887
                redis_mode:sentinel
                os:Linux 3.10.0-957.12.2.el7.x86_64 x86_64
                arch_bits:64
                multiplexing_api:epoll
                gcc_version:4.8.2
                process_id:1
                run_id:de77486594c6860852d587adea86cd0dc86f97a8
                tcp_port:26379
                uptime_in_seconds:664
                uptime_in_days:0
                hz:10
                lru_clock:7996744
                config_file:/etc/redis/sentinel.conf

                # Sentinel
                sentinel_masters:1
                sentinel_tilt:0
                sentinel_running_scripts:0
                sentinel_scripts_queue_length:0
                master0:name=mymaster,status=ok,address=::1:16379,slaves=2,sentinels=3
                  # 查看master
                    localhost:26379> sentinel masters
                    1)  1) "name"
                        2) "mymaster"
                        3) "ip"
                        4) "::1"
                        5) "port"
                        6) "16379"
                        7) "runid"
                        8) "502cd09af60f1f49dd570b223028356e15714ac1"
                        9) "flags"
                      10) "master"
                      11) "pending-commands"
                      12) "0"
                      13) "last-ping-sent"
                      14) "0"
                      15) "last-ok-ping-reply"
                      16) "1068"
                      17) "last-ping-reply"
                      18) "1068"
                      19) "down-after-milliseconds"
                      20) "5000"
                      21) "info-refresh"
                      22) "3932"
                      23) "role-reported"
                      24) "master"
                      25) "role-reported-time"
                      26) "14020"
                      27) "config-epoch"
                      28) "4"
                      29) "num-slaves"
                      30) "2"
                      31) "num-other-sentinels"
                      32) "2"
                      33) "quorum"
                      34) "2"
                      35) "failover-timeout"
                      36) "5000"
                      37) "parallel-syncs"
                      38) "1"
                  # 查看slaves
                    localhost:26379> sentinel slaves mymaster
                    1)  1) "name"
                        2) "[::1]:16380"
                        3) "ip"
                        4) "::1"
                        5) "port"
                        6) "16380"
                        7) "runid"
                        8) "5d2f70bb455426c542af074014c54448bf805704"
                        9) "flags"
                      10) "slave"
                      11) "pending-commands"
                      12) "0"
                      13) "last-ping-sent"
                      14) "0"
                      15) "last-ok-ping-reply"
                      16) "942"
                      17) "last-ping-reply"
                      18) "942"
                      19) "down-after-milliseconds"
                      20) "5000"
                      21) "info-refresh"
                      22) "3330"
                      23) "role-reported"
                      24) "slave"
                      25) "role-reported-time"
                      26) "93778"
                      27) "master-link-down-time"
                      28) "0"
                      29) "master-link-status"
                      30) "ok"
                      31) "master-host"
                      32) "::1"
                      33) "master-port"
                      34) "16379"
                      35) "slave-priority"
                      36) "100"
                      37) "slave-repl-offset"
                      38) "15873"
                    2)  1) "name"
                        2) "[::1]:16381"
                        3) "ip"
                        4) "::1"
                        5) "port"
                        6) "16381"
                        7) "runid"
                        8) "f377550544a6a1e59ea2b24c3cc78dff570a74a8"
                        9) "flags"
                      10) "slave"
                      11) "pending-commands"
                      12) "0"
                      13) "last-ping-sent"
                      14) "0"
                      15) "last-ok-ping-reply"
                      16) "528"
                      17) "last-ping-reply"
                      18) "528"
                      19) "down-after-milliseconds"
                      20) "5000"
                      21) "info-refresh"
                      22) "3330"
                      23) "role-reported"
                      24) "slave"
                      25) "role-reported-time"
                      26) "93778"
                      27) "master-link-down-time"
                      28) "0"
                      29) "master-link-status"
                      30) "ok"
                      31) "master-host"
                      32) "::1"
                      33) "master-port"
                      34) "16379"
                      35) "slave-priority"
                      36) "100"
                      37) "slave-repl-offset"
                      38) "15873"
            # 主可以写入数据,从不可以
              docker exec -it redis-master redis-cli -h localhost -p 16379
                localhost:16379> set test_name test
                OK
                localhost:16379> 
              docker exec -it redis-slave1 redis-cli -h localhost -p 16380
                localhost:16380> get test_name
                "test"
                localhost:16380> set test_aget 20
                (error) READONLY You can't write against a read only replica.
            # 关闭master,看是否切换(已由master的16379切换为slave1的16380)
              docker stop redis-master
              docker exec -it sentinel1 redis-cli -h localhost -p 26379
              localhost:26379> sentinel masters
              1)  1) "name"
                  2) "mymaster"
                  3) "ip"
                  4) "::1"
                  5) "port"
                  6) "16380"
                  7) "runid"
                  8) "6c9cb99e35505ce70dedca96fce8f72b0e57269f"
                  9) "flags"
                10) "master"
                11) "pending-commands"
                12) "0"
                13) "last-ping-sent"
                14) "0"
                15) "last-ok-ping-reply"
                16) "263"
                17) "last-ping-reply"
                18) "263"
                19) "down-after-milliseconds"
                20) "5000"
                21) "info-refresh"
                22) "3971"
                23) "role-reported"
                24) "master"
                25) "role-reported-time"
                26) "34139"
                27) "config-epoch"
                28) "1"
                29) "num-slaves"
                30) "2"
                31) "num-other-sentinels"
                32) "2"
                33) "quorum"
                34) "2"
                35) "failover-timeout"
                36) "5000"
                37) "parallel-syncs"
                38) "1"
        # 卸载
          docker-compose down -v
        # 启动
          docker-compose start
        # 停止
          docker-compose stop