zoukankan      html  css  js  c++  java
  • docker 安装 redis 并通过 sentinel(哨兵模式) 实现一主两从集群,实现高可用

    1,创建三台 redis,实现主从集群

    1,选择并创建本地数据卷目录

    cd /ussr/local
    mkdir docker
    cd docker
    mkdir redis
    cd redis
    mkdir data                 # 存放持久化数据和日志文件的数据卷目录
    touch redis1.conf          # 配置文件
    touch redis2.conf          # 配置文件
    touch redis3.conf          # 配置文件
    touch docker-compose.yml   # docker-compose 构建工具的配置文件
    

    2,三个 redis 配置文件基本相同,除了端口分别为 6379 6380 6381 其它完全相同,下面只贴上一个配置文件

    # 实例化多少个数据库
    databases 1
    
    # 监听的端口
    port 6379
    
    # 访问本机需要的密码 和 作为从机访问主机的密码
    requirepass 920619
    masterauth 920619
    
    # 持久化文件的保存位置
    dir /data
    
    # 持久化文件名
    dbfilename dump.rdb
    
    # 指定存储至本地数据库时是否压缩数据
    rdbcompression yes
    
    # 持久化策略:一定时间内(S) 有多少条数据更新 就触发保存
    # 如 第一条就是 900 秒内有 1 条数据更新 就触发保存
    save 900 1
    save 300 10
    save 60  10000
    
    # 日志文件的保存地址
    logfile redis.log
    

    关于 redis 的更多配置,你点击这里查看,redis 常见配置与说明
    关于以容器启动的 redis 为什么要修改容器启动时监听的端口,这里有一个很坑的问题,正常情况下,容器和容器之间是隔离开的,我们为了节省成本在一台主机
    上模拟启动多台redis,只需要端口映射到主机时做区分即可,一开始笔者也是这么干的,但是后来启动哨兵模式监听的时候,发现出现了各种稀奇古怪的问题,比如,
    明明有两台从机,但是程序中值会发现一台,三台,或者四台,就是没有正常的两台,明明连接的是主机,居然没有写权限等等,后来折腾了半天,发现把容器内部运
    行的端口修改了之后,就一切正常了,至于原因,初步认为是 哨兵程序 也是启动在容器中的,由于是在一台主机,ip 肯定相同,容器中的 端口可能是作为集群的唯
    一区分,如果容器内的端口一致,可能出现冲突,这纯属个人猜测,由于部署生产时不会在一台主机装多个实例,这里不再深究

    3,docker-compose.yml 文件中写入,这里注意除了暴漏 redis 的连接端口外,还要暴漏 集群端口,这个端口比连接端口大 10000

    version: '3.1'
    services:
    
      master:
        image: redis
        container_name: redis-master
        ports:
          - 6379:6379
          - 16379:16379
        volumes:
          - ./redis1.conf:/etc/redis.conf
          - ./data-master:/data
        command: redis-server /etc/redis.conf
        
      slave1:
        image: redis
        container_name: redis-slave1
        ports:
          - 6380:6380
          - 16380:16379
        volumes:
          - ./redis2.conf:/etc/redis.conf
          - ./data-slave1:/data
        command: redis-server /etc/redis.conf --slaveof 192.168.200.100 6379
        
      slave2:
        image: redis
        container_name: redis-slave2
        ports:
          - 6381:6381
          - 16381:16379
        volumes:
          - ./redis3.conf:/etc/redis.conf
          - ./data-slave2:/data
        command: redis-server /etc/redis.conf --slaveof 192.168.200.100 6379
    

    4,启动 redis

    cd /usr/local/docker/redis
    docker-compose up -d    # docker-compoe 启动命令
    docker ps               # 查看容器是否正常启动
    

    5,查看主从集群,是否启动成功,我们先查看 主服务,redis-master

    docker exec -it redis-master bash
    redis-cli
    auth 920619
    info
    

    出现如下信息为启动成功

    6,我们插入一个值,测试从机是否能从主机获取数据

    set id 123
    

    7,我们进入一台从机,这里选择 redis-slave1

    docker exec -it redis-slave1 bash
    redis-cli -p 6380    # 默认端口是 6379,如果不是需要用 -p 指出具体端口 
    auth 920619
    get id               # 如果能获取到 在主机插入的数据,说明主从赋值也配置成功
    

    2,创建三台 sentinel 哨兵

    1,选择并创建本地数据卷目录

    cd /usr/local/docker
    mkdir sentinel
    cd sentinel 
    mkdir logs            # 存放日志的本地数据卷
    touch sentinel1.conf  # 配置文件
    touch sentinel2.conf  # 配置文件
    touch sentinel3.conf  # 配置文件
    

    2,三个配置文件的内容完全一致,但是由于启动哨兵模式时,会重写配置文件,所以必须创建三个

    # 禁止保护模式
    protected-mode no
    
    # 端口
    port 26379
    
    # 工作目录
    dir "/data"
    
    # 日志文件名
    logfile "sentinel.log"
    
    # 配置需要监听的 redis 集群,并起一个名称,这里只需要配置主机的地址即可
    sentinel monitor mymaster 192.168.200.100 6379 2
    
    # 访问 redis 的密码
    sentinel auth-pass mymaster 920619
    

    这里重点说一下 sentinel monitor mymaster 192.168.200.100 6379 2 配置

    1. sentinel monitor:固定关键字
    2. mymaster:给集群起的任意名称,自定义,但是注意 配置访问密码的时候,要和这个名称一致
    3. 192.168.200.100 6379:IP地址和端口
    4. 2:当有两个哨兵程序认为 redis 失效之后,就下掉 该 redis 主机,重从机中新选举主机,这里应为要启动三台哨兵,所以配置为 2

    3,docker-compose.yml 文件中写入

    version: '3.1'
    services:
    
      sentinel1:
        image: redis
        container_name: redis-sentinel-1
        ports:
          - 26379:26379
        volumes:
          - ./sentinel1.conf:/etc/sentinel.conf
        command: redis-sentinel /etc/sentinel.conf
    
      sentinel2:
        image: redis
        container_name: redis-sentinel-2
        ports:
          - 26380:26379
        volumes:
          - ./sentinel2.conf:/etc/sentinel.conf
        command: redis-sentinel /etc/sentinel.conf
    
      sentinel3:
        image: redis
        container_name: redis-sentinel-3
        ports:
          - 26381:26379
        volumes:
          - ./sentinel3.conf:/etc/sentinel.conf
        command: redis-sentinel /etc/sentinel.conf
    

    4,启动 sentinel

    cd /usr/local/docker/sentinel/
    docker-compose up -d   # docker-compoe 启动命令
    docker ps              # 查看容器是否正常启动
    

    5,验证是否监听成功,随便选择一台 sentinel 进入,这里选择 redis-sentinel-3

    docker exec -it redis-sentinel-3 bash
    sentinel master mymaster  # 查看主服务
    sentinel slaves mymaster  # 查看从服务
    info                      # 查看完整信息
    

    3,集成到 spring-boot 项目中的配置

    spring:
      redis:
        sentinel:
          # 哨兵配置文件中起的名称
          master: mymaster      
          # 三台哨兵的连接地址            
          nodes: 192.168.200.100:26379,192.168.200.100:26380,192.168.200.100:26381
        password: 920619
    
  • 相关阅读:
    Elasticsearch拼音分词和IK分词的安装及使用
    Java同步、异步区别
    Elasticsearch深入搜索之全文搜索及JavaAPI使用
    Elasticsearch学习笔记
    Elasticsearch拼音和ik分词器的结合应用
    Elasticsearch深入搜索之结构化搜索及JavaAPI的使用
    Java反射的理解
    打印三个长宽不同的矩形
    是非人生 — 一个菜鸟程序员的5年职场路 第23节
    是非人生 — 一个菜鸟程序员的5年职场路 第35节
  • 原文地址:https://www.cnblogs.com/lovling/p/12525655.html
Copyright © 2011-2022 走看看