Redis 在Java企业级项目中基本是必备的,没有哪个项目会放弃这么好用的一个高性能内存性数据库。通常我们个人使用,可能只是部署单机版就行的。
但是公司的项目一般并发比较高,需要考虑性能,会考虑读写分离,也就是主从配置,主节点用于写,从节点用于读。通常有一主一从,一主多从。然后一主多从配置好了,可能还是不能满足性能需求,那就弄多个主从。
大致是如下架构图
本文先介绍一下如何使用 docker 配置一主多从,同时配置哨兵,实现主从切换。
1.新建 docker-compose.yml
内容如下
名词解释
version docker文件的版本
image 指定容器镜像就是之前拉取的redis镜像
container_name 给这个镜像起一个别名
restart always:表名开机自启动
command 相当于执行一些命令 (--requirepass 指定redis密码 --appendonly yes 这个命令是用于开启redis数据持久化)
ports 端口映射,将容器的端口映射到对应宿主机的端口
volumes 数据卷的映射.因为一旦容器停止了那么里面的数据也没有.所以我们需要把这个数据文件放在外面,然后映射到容器中
2.docker-compose 常用命令
创建并启动所有容器 docker-compose up -d
停止并删除所有容器 docker-compose down
查看所有容器日志 docker-compose logs
查看容器状态 docker-compose ps
其他命令就不说了,可以直接用 docker 命令替代
3.创建并启动 Redis 容器
docker-compose up -d
可以使用 redis-cli 去连接,或者可以配合 rdm 工具查看
redis-cli -h 指定ip -p 指定端口 -a 指定密码
1.先连接一下 master 节点
redis-cli -h 127.0.0.1 -p 6379 -a 123456
写入一条数据
然后连接一些从节点 slave-1,可以读数据
2.测试一些从节点能不能写数据
显然不能写,可以通过 info replication 命令查看 redis 节点信息,可以知道当前节点是 master 还是 slave
1.新建sentinel-1.conf
内容如下
IP查看可以通过 docker inspect redis-master 来查看
这里说明下:
然后复制两份该文件,命名为 sentinel-2.conf 和 sentinel-3.conf
内容一模一样,无需修改
2.新建 docker-compose.yml
内容如下
3.创建并启动容器
docker-compose up -d
4.然后我们可以通过 docker ps 查看所有正在运行的容器
最终文件结构如下
1.我们先看下目前状态
分别连接三个 redis
redis-cli -h 127.0.0.1 -p 6379 -a 123456
redis-cli -h 127.0.0.1 -p 6379 -a 123456
redis-cli -h 127.0.0.1 -p 6379 -a 123456
然后分别使用
info replication 查看 role 信息
2.测试一下主从同步
没问题,能正常同步
3.尝试让主节点宕机,测试主从切换
docker stop redis-master
4.然后我们再次启动 redis-master 节点
docker start redis-master
该节点以 slave 角色加入集群
已经将配置文件上传到 GitHub,需要的朋友自取
https://github.com/saysky/redis-sentinel/
但是公司的项目一般并发比较高,需要考虑性能,会考虑读写分离,也就是主从配置,主节点用于写,从节点用于读。通常有一主一从,一主多从。然后一主多从配置好了,可能还是不能满足性能需求,那就弄多个主从。
大致是如下架构图
本文先介绍一下如何使用 docker 配置一主多从,同时配置哨兵,实现主从切换。
一、创建 redis 集群
1.新建 docker-compose.yml
内容如下
- version: '2'
- services:
- master:
- image: redis
- container_name: redis-master
- command: redis-server --requirepass 123456 --appendonly yes
- ports:
- - "6379:6379"
- volumes:
- - "./redis-master/data:/data"
- networks:
- - sentinel-master
- slave1:
- image: redis
- container_name: redis-slave-1
- command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456 --appendonly yes
- ports:
- - "6380:6379"
- volumes:
- - "./redis-slave-1/data:/data"
- depends_on:
- - master
- networks:
- - sentinel-master
- slave2:
- image: redis
- container_name: redis-slave-2
- command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456 --appendonly yes
- ports:
- - "6381:6379"
- volumes:
- - "./redis-slave-2/data:/data"
- depends_on:
- - master
- networks:
- - sentinel-master
- networks:
- sentinel-master:
名词解释
version docker文件的版本
image 指定容器镜像就是之前拉取的redis镜像
container_name 给这个镜像起一个别名
restart always:表名开机自启动
command 相当于执行一些命令 (--requirepass 指定redis密码 --appendonly yes 这个命令是用于开启redis数据持久化)
ports 端口映射,将容器的端口映射到对应宿主机的端口
volumes 数据卷的映射.因为一旦容器停止了那么里面的数据也没有.所以我们需要把这个数据文件放在外面,然后映射到容器中
2.docker-compose 常用命令
创建并启动所有容器 docker-compose up -d
停止并删除所有容器 docker-compose down
查看所有容器日志 docker-compose logs
查看容器状态 docker-compose ps
其他命令就不说了,可以直接用 docker 命令替代
3.创建并启动 Redis 容器
docker-compose up -d
二、测试一下主从
可以使用 redis-cli 去连接,或者可以配合 rdm 工具查看
redis-cli -h 指定ip -p 指定端口 -a 指定密码
1.先连接一下 master 节点
redis-cli -h 127.0.0.1 -p 6379 -a 123456
写入一条数据
然后连接一些从节点 slave-1,可以读数据
2.测试一些从节点能不能写数据
显然不能写,可以通过 info replication 命令查看 redis 节点信息,可以知道当前节点是 master 还是 slave
三、创建哨兵集群
1.新建sentinel-1.conf
内容如下
- port 26379
- dir /tmp
- sentinel monitor mymaster 172.18.0.2 6379 2
- sentinel auth-pass mymaster 123456
- sentinel down-after-milliseconds mymaster 30000
- sentinel parallel-syncs mymaster 1
- sentinel failover-timeout mymaster 10000
- sentinel deny-scripts-reconfig yes
IP查看可以通过 docker inspect redis-master 来查看
这里说明下:
第三行表示Redis监控一个叫做mymaster的运行在172.28.0.3:6379的master,投票达到2则表示master以及挂掉了。
第四行设置主节点的密码
第五行表示在一段时间范围内sentinel向master发送的心跳PING没有回复则认为master不可用了。
第六行的parallel-syncs表示设置在故障转移之后,同时可以重新配置使用新master的slave的数量。数字越低,更多的时间将会用故障转移完成,但是如果slaves配置为服务旧数据,你可能不希望所有的slave同时重新同步master。因为主从复制对于slave是非阻塞的,当停止从master加载批量数据时有一个片刻延迟。通过设置选项为1,确信每次只有一个slave是不可到达的。
第七行表示10秒内mymaster还没活过来,则认为master宕机了。
然后复制两份该文件,命名为 sentinel-2.conf 和 sentinel-3.conf
内容一模一样,无需修改
2.新建 docker-compose.yml
内容如下
- version: '2'
- services:
- sentinel-1:
- image: redis
- container_name: redis-sentinel-1
- ports:
- - "26379:26379"
- command: redis-sentinel /usr/local/etc/redis/sentinel.conf
- volumes:
- - "./sentinel-1.conf:/usr/local/etc/redis/sentinel.conf"
- sentinel-2:
- image: redis
- container_name: redis-sentinel-2
- ports:
- - "26380:26379"
- command: redis-sentinel /usr/local/etc/redis/sentinel.conf
- volumes:
- - "./sentinel-2.conf:/usr/local/etc/redis/sentinel.conf"
- sentinel-3:
- image: redis
- container_name: redis-sentinel-3
- ports:
- - "26381:26379"
- command: redis-sentinel /usr/local/etc/redis/sentinel.conf
- volumes:
- - ./sentinel-3.conf:/usr/local/etc/redis/sentinel.conf
- networks:
- default:
- external:
- name: redis_sentinel-master
3.创建并启动容器
docker-compose up -d
4.然后我们可以通过 docker ps 查看所有正在运行的容器
最终文件结构如下
四、测试主从切换
1.我们先看下目前状态
分别连接三个 redis
redis-cli -h 127.0.0.1 -p 6379 -a 123456
redis-cli -h 127.0.0.1 -p 6379 -a 123456
redis-cli -h 127.0.0.1 -p 6379 -a 123456
然后分别使用
info replication 查看 role 信息
2.测试一下主从同步
没问题,能正常同步
3.尝试让主节点宕机,测试主从切换
docker stop redis-master
4.然后我们再次启动 redis-master 节点
docker start redis-master
该节点以 slave 角色加入集群
五、配置文件地址
已经将配置文件上传到 GitHub,需要的朋友自取
https://github.com/saysky/redis-sentinel/
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏