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 配置
- sentinel monitor:固定关键字
- mymaster:给集群起的任意名称,自定义,但是注意 配置访问密码的时候,要和这个名称一致
- 192.168.200.100 6379:IP地址和端口
- 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