zoukankan      html  css  js  c++  java
  • 主机Redis服务迁移到现有Docker Overlay环境

    记录最后一次对中型2C企业级项目的容器化改造

    hello, 好久不见,之前文章记录了一个实战的2C分布式项目的改造过程,结果如下:

    其中Redis并未完成容器化改造(目前是主机单点),本文记录将Redis升级到容器化Redis-Sentinel集群

    升级思路:

    1. 《Docker-compose搭建Redis高可用哨兵集群》,这里将Redis-Sentinel容器接入现有Docker Swarm overlay网络,规避Redis ClientApp访问不同网络的Redis-Sentinel引发的混乱(因NAT转换和Port映射)。
    2. 利用主机上现有Redis dump.rdb持久化文件快速启动Redis哨兵集群
      (1 master:2slave:3 sentinel)
    3. 修改receiverapp的Redis连接字符串,验证

    注意事项

    • 现有的应用程序处于Docker Swarm Overlay网络,默认是不允许附加其他容器,这里我们需要将该Overlay网络配置成可附加,方便Redis-Sentinel接入该网络,所有容器同网络。
    ......
    # 下面生成的overlay网络名称是:eqidstack_webnet
    networks:
      webnet:
        driver: overlay
        attachable: true   // 应用程序Docker swarm overlay网络配置可附加容器
    .....
    
    • 官方Redis镜像持久化数据存储在:/data, 本处我们需要将现有的主机Redis dump.rdb文件外挂进Master容器。
    # 下面是master/slave docker-compose.yml文件
    version: '3.7'
    services:
      master:
        image: redis
        container_name: redis-master
        command: redis-server  --requirepass zxcde@1  --masterauth zxcde@1
        volumes:
          - /home/redis-sentinel/redis/data:/data
        ports:
          - "6380:6379"
        networks:
          - webnet
    
      slave1:
        image: redis
        container_name: redis-slave-1
        ports:
          - "6381:6379"
        command:  redis-server --slaveof redis-master 6379 --masterauth zxcde@1  --requirepass zxcde@1
        networks:
          - webnet
    
      slave2:
        image: redis
        container_name: redis-slave-2
        ports:
          - "6382:6379"
        command: redis-server --slaveof redis-master 6379 --masterauth zxcde@1 --requirepass zxcde@1
        networks:
          - webnet
    networks:
      webnet:
        external: true
        name: eqidstack_webnet
    
    • 对于Redis哨兵高可用集群,Redis ClientApp 只需要知道 哨兵的IP、Port即可, 故我们可以给哨兵容器固定IP,
      例如下面的每个sentinel容器固定静态IP (在Overlay网段内)
    version: '3'
    services:
      sentinel1:
        image: redis
        container_name: redis-sentinel-1
        ports:
          - 26379:26379
        command: redis-sentinel /usr/local/etc/redis/sentinel.conf
        volumes:
          - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
        networks:
          eqidstack_webnet:
            ipv4_address: 10.0.7.41
      sentinel2:
        image: redis
        container_name: redis-sentinel-2
        ports:
        - 26380:26379
        command: redis-sentinel /usr/local/etc/redis/sentinel.conf
        volumes:
          - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
        networks:
          eqidstack_webnet:
            ipv4_address: 10.0.7.42
      sentinel3:
        image: redis
        container_name: redis-sentinel-3
        ports:
          - 26381:26379
        command: redis-sentinel /usr/local/etc/redis/sentinel.conf
        volumes:
          - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
        networks:
          eqidstack_webnet:
            ipv4_address: 10.0.7.43
    
    networks:
      default:
        external:
          name: eqidstack_webnet
    
    
    • 经过验证,最新版本StackExchange.Redis 2.1.58 可以更简洁的方式支持Redis-sentinel, 只需更改连接字符串,其中10.0.7.41:26379,10.0.7.42:26379,10.0.7.43:26379是sentinel容器ip,serviceName配置主节点名称。
    "redis": "10.0.7.41:26379,10.0.7.42:26379,10.0.7.43:26379,serviceName=mymaster1,password=zxcde@1,abortConnect=false,connectTimeout=10000,writeBuffer=40960"
    

    后记

    将主机上现有单点Redis服务容器化,并搭建哨兵高可用集群;
    且将Redis集群与应用程序放在同一Overlay网络,便于同网络段容器通信;
    对于Redis哨兵集群,RedisClient APP 只需要知道哨兵IP,Port, 故这里对哨兵容器指定了容器IP.

  • 相关阅读:
    Windows下安装ZooKeeper
    解决不同库之间$对象的冲突
    Entity Framework的基本操作
    IIS6与IIS7中的w3wp工作进程
    Asp.Net网站的的编译与发布原理
    MVC中JavaScript和CSS的自动打包与压缩
    EF CodeFirst示例
    EF CodeFirst下的自动迁移
    分布式调度平台XXL-JOB源码分析-时序图
    分布式调度平台XXL-JOB源码分析-执行器端
  • 原文地址:https://www.cnblogs.com/JulianHuang/p/13190881.html
Copyright © 2011-2022 走看看