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
posted on 2020-03-19 17:20  被遗忘的优雅  阅读(1801)  评论(4编辑  收藏  举报