• 哨兵+redis主从部署架构docker部署


    架构图

    1. 哨兵的介绍
      sentinel , 中文是哨兵。
      哨兵是redis 集群架构中非常重要的一个组件,主要功能如下:
      (1)集群监控:负责监控reidis master 和slave 进程是否正常工作;
      (2)消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员;
      (3)故障转移:如果master node挂掉了,会自动转移到slave node上;
      (4)配置中心:如果故障转移发生了,通知client 客户端新的master 地址;
      哨兵本身也是分布式的作为一个哨兵集群去运行,互相协同工作;
      (1)故障转移时, 判断一个master node宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题;
      (2)即使部分哨兵节点挂了,哨兵集群还是能正常工作的,因为如果 一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就坑爹了;目前采用的是sentinel 2 版本,sentinel2 相对于 sentinel 1 来说,重写了很多代码,主要是让故障转移的机制和算法变得更加健壮和简单。
    2. 哨兵的核心知识
      (1)哨兵至少需要3个实例,来保证自己的健壮性;
      (2)哨兵+redis 主从的部署架构,是不会保证数据0丢失的,只能保证redis 集群的高可用性;
      (3)对于哨兵+redis主从这种负责的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练

    部署

    准备docker环境

    hostnamectl set-hostname  l-gz-txy-lyy-uat-redis-master-001
    
    sudo yum install -y yum-utils
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    	
    sudo yum install docker-ce docker-ce-cli containerd.io -y
    systemctl start docker
    systemctl enable docker
    

    三台虚拟机

    10.180.3.125:7000 主节点
    10.180.3.181:7000 从节点
    10.180.3.90:7000 从节点

    主节点创建redis data和conf目录

    mkdir -p /data/redis/7000
    mkdir /data/redis/7000/conf
    mkdir /data/redis/7000/data
    cd /data/redis/7000/conf
    

    修改redis.conf主要配置

    cat > /data/redis/7000/conf/redis.conf <<EOF
    port 7000
    masterauth "YACEheyuan@123"
    requirepass "YACEheyuan@123"
    protected-mode yes
    tcp-backlog 511
    timeout 0
    tcp-keepalive 300
    daemonize no
    supervised no
    pidfile /var/run/redis_6379.pid
    loglevel notice
    #logfile "/var/redis.log"
    databases 16
    always-show-logo yes
    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir ./
    replica-serve-stale-data yes
    replica-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
     repl-timeout 1
    repl-disable-tcp-nodelay no
    replica-priority 100
    maxmemory 1024000kb
    maxmemory-policy volatile-lru
    lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    replica-lazy-flush no
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 512mb
    aof-load-truncated yes
    aof-use-rdb-preamble yes
    lua-time-limit 5000
    cluster-enabled no
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    stream-node-max-bytes 4096
    stream-node-max-entries 100
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit replica 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    dynamic-hz yes
    aof-rewrite-incremental-fsync yes
    rdb-save-incremental-fsync yes
    EOF
    
    

    配置sentinel

    
    cat >/data/redis/7000/conf/sentinel.conf <<EOF
    port 27000
    daemonize yes
    sentinel monitor mymaster 10.180.3.125 7000 1
    sentinel auth-pass mymaster YACEheyuan@123
    EOF
    

    拷贝整个/data/redis目录到备节点

    scp -r /data/redis root@10.180.3.181:/data/

    主从节点都启动redis容器

    cat >start.sh<<EOF
    docker run -d -ti -p 7000:7000 -p 27000:27000 \
    -v /data/redis/7000/conf/redis.conf:/usr/local/etc/redis/redis.conf \
    -v /data/redis/7000/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
    -v /data/redis/7000/data:/data \
    -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
    --privileged=true --restart always --name redis_7000 \
    uhub.service.ucloud.cn/jackhe/redis-sentinel:latest redis-server /usr/local/etc/redis/redis.conf
    EOF
    chmod +x start.sh
    sh start.sh
    

    从节点进去容器,设置自己为从节点

    docker exec -it  redis_7000  bash
    redis-cli -h 127.0.0.1 -c -p 7000 -a YACEheyuan@123
    SLAVEOF 10.180.3.125 7000
    

    分别进去主从节点的容器,启动sentinel
    redis-sentinel /usr/local/etc/redis/sentinel.conf

    输入info查看是否设置成功

    image-20220107144302245

    启动完成后,关闭主节点redis容器,等待30秒查看备节点是否切换为主节点
    启动回主节点redis容器,查看主节点是否已经作为备节点连接上,同时启动sentinel

    部署逻辑

    docker 启动redis——》从节点声明为slave——》启动sentinel

    验证可用性

    • 在master上set key
    # Keyspace
    127.0.0.1:7000> set a 1
    OK
    127.0.0.1:7000> get a
    "1"
    
    • 在任意slave上get
    # Keyspace
    127.0.0.1:7000> get a
    "1"
    
    • 脚本测试
    from redis.sentinel import Sentinel
    sentinel = Sentinel([('10.180.3.198', 27000)], 
                        password='YACEheyuan@123',socket_timeout=0.5)
    master = sentinel.discover_master("mymaster")
    print(master)
    

    压测

    redis-benchmark -h 10.180.3.125 -p 27000 -a YACEheyuan@123 -c 100 -n 100000 -q

    如对您有帮助,支持下呗!

    微信

    支付宝

  • 相关阅读:
    继续Delphi调用Wcf
    我用 Windows Live Writer 写随笔
    "WCF 服务编程"刚到,第一印象,内纸张很差
    我的asp.net网站小项目,体现了我学习的几个阶段,现在学习到WCF阶段
    菜单设计
    求圆的面积
    dataGridView 批量更新
    Android简单实现对话框
    dephi 程序输入法中英文自动切换实现
    Delphi捕捉DLL执行所抛出的异常。(转)
  • 原文地址:https://www.cnblogs.com/Dev0ps/p/15775244.html
Copyright © 2020-2023  润新知