单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离
但是,当master节点宕机后,我们就不能写数据到Redis,所以需要搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。
哨兵的结构如图:
图片
共包含6个节点,一个主两个从和三个哨兵。这里我们会在同一台虚拟机中开启6个redis实例,模拟主从集群,信息如下:
IP | PORT | 角色 |
192.168.150.102 | 6380 | master |
192.168.150.102 | 6381 | slave |
192.168.150.102 | 6382 | slave |
192.168.150.102 | 26379 | sentinel |
192.168.150.102 | 26380 | sentinel |
192.168.150.102 | 26381 | sentinel |
哨兵的作用如下:
要在同一台虚拟机开启6个实例,必须准备6份不同的配置文件和目录,配置文件所在目录也就是工作目录。 确保下面的配置已经更改(位置也别错)
# master
mkdir -p /redis-master-slave-sentinel/redis/master/config /redis-master-slave-sentinel/redis/master/data
cd /redis-master-slave-sentinel/redis/master/config
curl -O -L http://download.redis.io/releases/redis-6.0.20.tar.gz
tar -zxvf redis-6.0.20.tar.gz
cp /redis-master-slave-sentinel/redis/master/config/redis-6.0.20/redis.conf /redis-master-slave-sentinel/redis/master/config/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /redis-master-slave-sentinel/redis/master/config/redis.conf
# slave-1
mkdir -p /redis-master-slave-sentinel/redis/slave-1/config /redis-master-slave-sentinel/redis/slave-1/data
cd /redis-master-slave-sentinel/redis/slave-1/config/
cp /redis-master-slave-sentinel/redis/master/config/redis-6.0.20/redis.conf /redis-master-slave-sentinel/redis/slave-1/config/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /redis-master-slave-sentinel/redis/slave-1/config/redis.conf
# slave-2
mkdir -p /redis-master-slave-sentinel/redis/slave-2/config /redis-master-slave-sentinel/redis/slave-2/data
cd /redis-master-slave-sentinel/redis/slave-2/config/
cp /redis-master-slave-sentinel/redis/master/config/redis-6.0.20/redis.conf /redis-master-slave-sentinel/redis/slave-2/config/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /redis-master-slave-sentinel/redis/slave-2/config/redis.conf
#redis-sentinel-1
mkdir -p /redis-master-slave-sentinel/sentinel/redis-sentinel-1 /redis-master-slave-sentinel/sentinel/redis-sentinel-1/s1
cd /redis-master-slave-sentinel/sentinel/redis-sentinel-1
cat >> /redis-master-slave-sentinel/sentinel/redis-sentinel-1/sentinel.conf <> /redis-master-slave-sentinel/sentinel/redis-sentinel-2/sentinel.conf <> /redis-master-slave-sentinel/sentinel/redis-sentinel-3/sentinel.conf < sentinel.conf说明
port 26379
dir /tmp
sentinel monitor mymaster 192.168.150.102 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yessentinel.conf解读
如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!
创建名称为docker-compose-redis-master-slave-sentinel.yml用于安装Redis哨兵集群docker-compose文件
version: '3'
# 网桥redis -> 方便相互通讯
networks:
redis:
services:
# ============================ ↓↓↓↓↓↓ redis ↓↓↓↓↓↓ ============================
# 主
redis-master:
image: redis:6.0.20 # 镜像'redis:6.0.20'
container_name: redis-master # 容器名为'redis-master'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: redis-server /etc/redis/redis.conf --port 6380 --requirepass 123456 --masterauth 123456 --appendonly no # 启动redis服务并添加密码为:123456, 当主redis下线重启后变成从redis时认证主redis密码:123456, 默认不开启redis-aof方式持久化配置
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "/redis-master-slave-sentinel/redis/master/data:/data"
- "/redis-master-slave-sentinel/redis/master/config/redis.conf:/etc/redis/redis.conf" # `redis.conf`文件内容`http://download.redis.io/redis-stable/redis.conf`
ports: # 映射端口
- "6380:6380"
# 从1
redis-slave-1:
image: redis:6.0.20 # 镜像'redis:6.0.20'
container_name: redis-slave-1 # 容器名为'redis-slave-1'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: redis-server /etc/redis/redis.conf --port 6381 --requirepass 123456 --appendonly no --slaveof 192.168.150.102 6380 --masterauth 123456 # 启动redis服务并添加密码为:123456,默认不开启redis-aof方式持久化配置,连接并认证master节点
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "/redis-master-slave-sentinel/redis/slave-1/data:/data"
- "/redis-master-slave-sentinel/redis/slave-1/config/redis.conf:/etc/redis/redis.conf" # `redis.conf`文件内容`http://download.redis.io/redis-stable/redis.conf`
ports: # 映射端口
- "6381:6381"
depends_on:
- redis-master
links:
- redis-master
# 从2
redis-slave-2:
image: redis:6.0.20 # 镜像'redis:6.0.20'
container_name: redis-slave-2 # 容器名为'redis-slave-2'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: redis-server /etc/redis/redis.conf --port 6382 --requirepass 123456 --appendonly no --slaveof 192.168.150.102 6380 --masterauth 123456 # 启动redis服务并添加密码为:123456,默认不开启redis-aof方式持久化配置,连接并认证master节点
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "/redis-master-slave-sentinel/redis/slave-2/data:/data"
- "/redis-master-slave-sentinel/redis/slave-2/config/redis.conf:/etc/redis/redis.conf" # `redis.conf`文件内容`http://download.redis.io/redis-stable/redis.conf`
ports: # 映射端口
- "6382:6382"
depends_on:
- redis-master
links:
- redis-master
# ============================ ↓↓↓↓↓↓ sentinel ↓↓↓↓↓↓ ============================
redis-sentinel-1:
image: redis:6.0.20 # 镜像'redis:6.0.20'
container_name: redis-sentinel-1 # 容器名为'redis-sentinel-1'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: redis-sentinel /etc/redis/sentinel.conf
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports:
- "26379:26379"
volumes:
- "/redis-master-slave-sentinel/sentinel/redis-sentinel-1/sentinel.conf:/etc/redis/sentinel.conf" # `sentinel.conf`文件内容`http://download.redis.io/redis-stable/sentinel.conf`
depends_on:
- redis-master
- redis-slave-1
- redis-slave-2
links:
- redis-master
- redis-slave-1
- redis-slave-2
redis-sentinel-2:
image: redis:6.0.20 # 镜像'redis:6.0.20'
container_name: redis-sentinel-2 # 容器名为'redis-sentinel-2'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: redis-sentinel /etc/redis/sentinel.conf
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports:
- "26380:26379"
volumes:
- "/redis-master-slave-sentinel/sentinel/redis-sentinel-2/sentinel.conf:/etc/redis/sentinel.conf" # `sentinel.conf`文件内容`http://download.redis.io/redis-stable/sentinel.conf`
depends_on:
- redis-master
- redis-slave-1
- redis-slave-2
- redis-sentinel-1
links:
- redis-master
- redis-slave-1
- redis-slave-2
redis-sentinel-3:
image: redis:6.0.20 # 镜像'redis:6.0.20'
container_name: redis-sentinel-3 # 容器名为'redis-sentinel-3'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: redis-sentinel /etc/redis/sentinel.conf
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports:
- "26381:26379"
volumes:
- "/redis-master-slave-sentinel/sentinel/redis-sentinel-3/sentinel.conf:/etc/redis/sentinel.conf" # `sentinel.conf`文件内容`http://download.redis.io/redis-stable/sentinel.conf`
depends_on:
- redis-master
- redis-slave-1
- redis-slave-2
- redis-sentinel-1
- redis-sentinel-2
links:
- redis-master
- redis-slave-1
- redis-slave-2运行 -- 哨兵模式(sentinel监视redis主从服务,当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求 -- 即主节点切换)
docker-compose -f docker-compose-redis-master-slave-sentinel.yml -p redis up -d
图片
# 连接redis-sentinel-1
docker exec -it redis-sentinel-1 redis-cli -p 26379sentinel master mymaster
图片
sentinel slaves mymaster
图片
docker logs -f redis-sentinel-1
图片
docker exec -it redis-master redis-cli -h 192.168.150.102 -p 6381 -a 123456
图片
docker stop redis-master发现主节点从master节点,转换为slave-2节点
图片
docker exec -it redis-master redis-cli -h 192.168.150.102 -p 6382 -a 123456info replication发现现在从节点只剩一个
图片
docker start redis-master
图片
info replication发现master节点添加回来了,但是变成了从节点
图片
docker-compose -f docker-compose-redis-master-slave-sentinel.yml -p redis down哨兵master自己从当前集群中的slave节点中选出一个新的master,原则是
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
图片
Sentinel的三个作用是什么
Sentinel如何判断一个redis实例是否健康