1. 分别执行以下命令开始`6370`和`6371`目录下的`sentinel.conf`文件。
~~~bash
vim /home/project/redis-5.0.5/sentinel.conf #编辑 6379 配置文件
vim /home/project/redis-6370/sentinel.conf #编辑 6370 配置文件
vim /home/project/redis-6371/sentinel.conf #编辑 6371 配置文件
~~~
2. 下面就是`sentinel.conf`中一些需要修改的相关配置文件:
~~~java
/** 统一默认配置(3 个文件都按照下面配置) **/
protected-mode no //网络是否允许对外访问,no 表示允许
daemonize yes //后台运行
sentinel monitor mymaster 127.0.0.1 6379 2 //mymaster 可以任意起名,保持一致即可,后面就是主节点的 ip 和端口,最后的 2 表示当前有 2 个 sentinel 认为 master 主观下线,则可以修改为客观下线
sentinel down-after-milliseconds mymaster 30000 //超时时间
sentinel parallel-syncs mymaster 1 //mymaster 保持一致
sentinel failover-timeout mymaster 180000 //mymaster 保持一直
/** 6379 端口即 redis-5.0.5 目录下配置 **/
port 26379 //这个是端口,需要设置的不一样 6370 目录改为 26380,6371 目录改为 26381
pidfile /var/run/redis-sentinel-26379.pid //最后的数字和上面一样分别改为 26380 和 26381
logfile "/home/project/redis-5.0.5/sentinel.log" //主要是 6370 和 6371 分别修改一下
dir "/home/project/redis-5.0.5" //同样的,这里也需要对应好 6370 和 6371
/** 6370 目录下配置 **/
port 26380 //这个是端口,需要设置的不一样 6370 目录改为 26380,6371 目录改为 26381
pidfile /var/run/redis-sentinel-26380.pid //最后的数字和上面一样分别改为 26380 和 26381
logfile "/home/project/redis-6370/sentinel.log" //主要是 6370 和 6371 分别修改一下
dir "/home/project/redis-6370" //同样的,这里也需要对应好 6370 和 6371
/** 6371 目录下配置 **/
port 26381 //这个是端口,需要设置的不一样 6370 目录改为 26380,6371 目录改为 26381
pidfile /var/run/redis-sentinel-26381.pid //最后的数字和上面一样分别改为 26380 和 26381
logfile "/home/project/redis-6371/sentinel.log" //主要是 6370 和 6371 分别修改一下
dir "/home/project/redis-6371" //同样的,这里也需要对应好 6370 和 6371
~~~
每个参数的具体含义见下表:
| 参数 | 说明 |
| --- | --- |
| protected-mode | 是否允许外部网络访问 |
| port | sentinel 端口 |
| pidfile | pid 文件 |
| logfile | 日志文件 |
| dir | sentinel 工作主目录 |
| sentinel monitor | 监控的 master 服务名称,ip 和端口,其中 ip 建议使用真实 ip 取代本机 ip |
| sentinel down-after-milliseconds | master 下线多少毫秒才会被 Sentinel 判定为主观下线 |
| sentinel parallel-syncs | 切换新的 master-slave 时,slave 需要从新的 master 同步数据,这个数字表示允许多少个 slave 同时复制数据 |
| sentinel failover-timeout | 故障转移超时时间,这个时间有 4 个含义 |
故障转移超时时间用在了以下`4`个地方:
* 同一个`sentinel`对同一个`master`两次`failover`之间的间隔时间。
* 从检测到`master`服务器故障开始,到被强制切换到新的`master`服务器并开始复制数据为止的时间。
* 取消已经在进行故障转移(没有产生任何配置更改的故障转移)所需的时间。
* 将所有`slave`配置新的`master`节点所需要的时间。超过这个时间如果仍然没有完成还是会继续进行,但是不一定会按照配置`parallel-syncs`所指定的并行数来进行。
3. 三个目录的`sentinel`都配置好之后,执行以下命令分别启动包括原`6379`在内的`3`个`sentinel`服务(如果`Redis`服务没启动也需要一并启动)。
~~~bash
# 启动 sentinel 服务
/home/project/redis-5.0.5/bin/./redis-server /home/project/redis-5.0.5/sentinel.conf --sentinel
/home/project/redis-6370/bin/./redis-server /home/project/redis-6370/sentinel.conf --sentinel
/home/project/redis-6371/bin/./redis-server /home/project/redis-6371/sentinel.conf --sentinel
# 启动 redis 服务
/home/project/redis-5.0.5/bin/redis-server /home/project/redis-5.0.5/redis.conf
/home/project/redis-6370/bin/redis-server /home/project/redis-6370/redis.conf
/home/project/redis-6371/bin/redis-server /home/project/redis-6371/redis.conf
~~~
4. 启动之后执行命令`ps -ef | grep redis`查看服务是否已经全部启动,如果全部启动成功,则应如下图所示有`6`个服务全部启动成功:
![](https://img.kancloud.cn/ae/ed/aeed25700f5ef3030b9c9fba423a3f4e_865x231.png)
5. 如果主从服务没有启动,那么这一步我们需要把主从服务进行启动配置(不会搭建`master-slave`集群的可以参考上一个实验)。
~~~bash
/home/project/redis-5.0.5/bin/redis-cli
replicaof no one
# 新开一个终端
/home/project/redis-6370/bin/redis-cli -p 6370
replicaof 127.0.0.1 6379
# 新开一个终端
/home/project/redis-6371/bin/redis-cli -p 6371
replicaof 127.0.0.1 6379
~~~
6. 打开任意一个`sentinel.log`文件查看,如执行命令`vim /home/project/redis-5.0.5/sentinel.log`查看,从日志当中可以很明显看到当前`3`个`sentinel`服务构成了一个集群,并且将主从`Redis`服务都进行了监控:
![](https://img.kancloud.cn/24/3d/243d665ea80d2b2733c4f0c60c3a891b_1180x350.png)
7. 现在让我们验证一下当`master`节点挂了之后,`sentinel`服务是否真的能实现主动切换。回到上面步骤`4`中查看进程的图中,我们看到`6379`服务的进程`id`为`204`,执行`kill -9 204`命令强制关掉`master`节点之后再执行进行查看命令:
![](https://img.kancloud.cn/92/57/92570005dc64e4df229558bc2d5a2d8c_793x215.png)
8. 稍等一小会之后,我们可以分别进入`6370`服务或者`6371`服务上再执行`info replication`命令进行查看。下图就是`6370`服务中查看到的信息,可以看到,`6371`服务已经自动升级为`master`节点了,`6371`节点成为了其`slave`节点:
![](https://img.kancloud.cn/d4/d1/d4d1627fa15a0ecd0731b3b1d1bae217_689x231.png)
9. 再执行命令`vim /home/project/redis-5.0.5/sentinel.log`查看一下`sentinel`日志(红框部分就是故障转移的过程日志):
![](https://img.kancloud.cn/b3/22/b3227d41b546089a180672e4e099d177_1053x252.png)
10. 最后,我们执行如下命令。
~~~bash
# 重新启动旧的 master
/home/project/redis-5.0.5/bin/redis-server /home/project/redis-5.0.5/redis.conf
# 连接 Redis 服务
/home/project/redis-5.0.5/bin/redis-cli
# 查看主从信息
info replication
~~~
![](https://img.kancloud.cn/47/26/47262000b5fde83d63c0f4721156943a_852x351.png)
可以看到,其已经从`master`角色转变成了`slave`角色。
- Redis 为什么这么快
- 什么是 Redis
- Redis 的安装
- Redis 到底有多快
- Redis 是单线程还是多线程
- Redis 为什么选择使用单线程来执行请求
- 什么是 IO 多路复用机制
- Redis 中 I/O 多路复用的应用
- 一个简单的字符串,为什么 Redis 要设计的如此特别
- Redis 的 9 种数据类型
- 二进制安全字符串
- sds 空间分配策略
- sds 和 C 语言字符串区别
- sds 是如何被存储的
- type 属性
- encoding 属性
- 通过牺牲速度来节省内存,Redis 是觉得自己太快了吗
- 什么是压缩列表
- ziplist 的存储结构
- entry 存储结构
- ziplist 数据示例
- ziplist 连锁更新问题
- 为了加快速度,Redis 都做了哪些“变态”设计
- 列表对象
- linkedlist
- linkedlist 和 ziplist 的选择
- quicklist
- 列表对象常用操作命令
- Redis 中哈希分布不均匀该怎么办
- 哈希对象
- hashtable
- ziplist
- ziplist 和 hashtable 的编码转换
- 哈希对象常用命令
- 同一份数据,Redis 为什么要存”两次”
- 五种基本类型之集合对象
- intset 编码
- 集合对象常用命令
- 五种基本类型之有序集合对象
- skiplist 编码
- ziplist 编码
- ziplist 和 skiplist 编码转换
- 有序集合对象常用命令
- 要想用活 Redis,Lua 脚本是绕不过去的坎
- 发布与订阅
- 基于频道的实现
- 基于模式的实现
- Lua 脚本
- Lua 脚本的调用
- Lua 脚本中执行 Redis 命令
- Lua 脚本摘要
- Lua 脚本文件
- 脚本异常
- 作为一款内存数据库,为什么断电后 Redis 数据不会丢失
- Redis 持久化机制
- RDB 持久化机制
- AOF 持久化机制
- 内存耗尽后 Redis 会发生什么
- 内存回收
- 过期策略
- 8 种淘汰策略
- LRU 算法
- LFU 算法
- 不能回滚的 Redis 事务还能用吗
- Redis 有事务吗
- Redis 事务实现原理
- Redis 事务 ACID 特性
- watch 命令
- watch 命令的作用
- watch 原理分析
- Redis 为什么不直接用 master-slave 集群
- Redis 集群方案
- 主从复制
- 配置一主两从 master-slave 集群
- 主从复制原理分析
- 主从服务的不足之处
- Sentinel(哨兵)机制为什么从神坛滑落
- 哨兵 Sentinel 机制
- Sentinel 原理分析
- 配置 Sentinel 集群
- Sentinel 机制实战
- Sentinel 机制的不足之处
- Redis Cluster 集群凭什么成为了最终的胜利者
- Redis 分布式集群方案
- 客户端实现分片
- 中间代理服务实现分片
- Redis Cluster 方案
- 手动配置一个 Redis Cluster 集群
- Redis Cluster 集群常用命令
- 客户端如何使用 Redis Cluster 集群
- Redis Cluster 的不足
- 如何从 10 亿数据中快速判断是否存在某一个元素
- 缓存雪崩
- 缓存击穿
- 缓存穿透
- 布隆过滤器(Bloom Filter)
- 布隆过滤器的 2 大特点
- 布隆过滤器的实现(Guava)
- 布隆过滤器的如何删除