redis sentinel(哨兵) 配置详解-redis集群管理

1. redis sentinel(哨兵)
redis sentinel(哨兵)是对Redis系统的运行情况的监控,它是一个独立进程。它的功能有2个:
a、 监控主数据库和从数据库是否运行正常;
b、 主数据出现故障后自动将从数据库转化为主数据库;


2. 原理

单个redis sentinel(哨兵)架构:


多个redis sentinel(哨兵)架构:


多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。


3. 配置redis sentinel(哨兵)前的主从环境

当前处于一主多从的环境中:
[root@master redis-master-slave]# ps -ef | grep redis
root      2027     1  0 07:30 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6380                              
root      2031     1  0 07:31 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6381                              
root      2036     1  0 07:31 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6382


127.0.0.1:6380> info replication

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=113,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=113,lag=1
master_repl_offset:113
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:112


4. 配置哨兵

把源码中的sentinel.conf配置文件拷贝到指定目录,我这里是拷贝到/opt/redis/redis-master-slave
[root@master redis-master-slave]# cp /opt/redis/redis-3.2.1/sentinel.conf /opt/redis/redis-master-slave/


修改sentinel.conf:

sentinel monitor mymaster 127.0.0.1 6379 2
改为
sentinel monitor mymaster 127.0.0.1 6380 1


启动哨兵进程:

[root@master redis-master-slave]# /usr/local/bin/redis-sentinel /opt/redis/redis-master-slave/sentinel.conf

由上图可以看到:

1、 哨兵已经启动,它的id为236f14b361fc5a0dc0621cf88823ed6e6252b2f3
2、 为master数据库添加了一个监控
3、 发现了2个slave(由此可以看出,哨兵无需配置slave,只需要指定master,哨兵会自动发现slave)


5. 从Redis宕机测试

把其中一个从redis 的进程6382 kill掉,
[root@master hadoop]# ps -ef | grep redis
root      2027     1  0 07:30 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6380                              
root      2031     1  0 07:31 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6381                              
root      2036     1  0 07:31 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6382                              
root      2043  1937  0 07:32 pts/1    00:00:00 /usr/local/bin/redis-cli -p 6380
root      2044  1950  0 07:32 pts/2    00:00:00 /usr/local/bin/redis-cli -p 6381
root      2045  1965  0 07:32 pts/3    00:00:00 /usr/local/bin/redis-cli -p 6382
root      2461  1817  0 08:14 pts/0    00:00:00 /usr/local/bin/redis-sentinel *:26379 [sentinel]                        
root      2471  2179  0 08:18 pts/4    00:00:00 grep redis
[root@master hadoop]# kill -9 2036


30秒后哨兵的控制台输出:

2461:X 18 Jul 08:19:49.922 # +sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
说明已经监控到刚才我人kill掉的slave宕机了


启动刚才kill掉的6382

[root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/6382/redis.conf


观察sentinel控制台输出:

2461:X 18 Jul 08:24:27.580 * +reboot slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:24:27.631 # -sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380


可以看出,slave重新加入到了主从复制中。-sdown:说明是恢复服务。

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=67317,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=67184,lag=0
master_repl_offset:67317
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:67316


6. 主Redis宕机测试

把主redis的进程kill掉,观察sentinel控制台输出信息:
2461:X 18 Jul 08:29:19.276 #   +sdown master mymaster 127.0.0.1 6380【 master服务已经宕机
2461:X 18 Jul 08:29:19.276 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
2461:X 18 Jul 08:29:19.276 # +new-epoch 1
2461:X 18 Jul 08:29:19.276 #   +try-failover master mymaster 127.0.0.1 6380【尝试恢复master】
2461:X 18 Jul 08:29:19.282 # +vote-for-leader 236f14b361fc5a0dc0621cf88823ed6e6252b2f3 1 投票选举哨兵leader,现在就一个哨兵所以leader就自己
2461:X 18 Jul 08:29:19.282 # +elected-leader master mymaster 127.0.0.1 6380 【选出leader】
2461:X 18 Jul 08:29:19.282 # +failover-state-select-slave master mymaster 127.0.0.1 6380 【选中其中的一个slave当做master】
2461:X 18 Jul 08:29:19.345 #   +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380【选中6381当master】
2461:X 18 Jul 08:29:19.345 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【发送slaveof no one命令】
2461:X 18 Jul 08:29:19.401 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【等待升级master】
2461:X 18 Jul 08:29:20.291 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【升级6381为master】
2461:X 18 Jul 08:29:20.291 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.361 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.666 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.694 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.770 #   +failover-end master mymaster 127.0.0.1 6380【 故障恢复完成
2461:X 18 Jul 08:29:21.770 #   +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381【master 从6380切换到6381】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381 【添加6382为6381的从库】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【添加6380为6381的从库】
2461:X 18 Jul 08:29:51.828 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 发现6380已经宕机,等待6380的恢复


查看主从复制信息可以看出,现在6381为master,有一个从库

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=35213,lag=1
master_repl_offset:35346
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:35345


把6380恢复

[root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/6380/redis.conf
观察sentinel控制台输出信息:
2461:X 18 Jul 08:42:35.202 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2461:X 18 Jul 08:42:45.207 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381


查看主从复制信息:

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6382,state=online,offset=56432,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=56432,lag=0
master_repl_offset:56432
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56431


7. 配置多个哨兵

编辑sentinel.conf,设置两个监听
sentinel monitor mymaster2 127.0.0.1 6381 2
sentinel monitor mymaster 127.0.0.1 6381 1


启动sentinel服务

[root@master redis-master-slave]# /usr/local/bin/redis-sentinel /opt/redis/redis-master-slave/sentinel.conf


[root@master redis-master-slave]# ps -ef | grep redis

root      2031     1  0 07:31 ?        00:00:05 /usr/local/bin/redis-server 127.0.0.1:6381  
root      2486     1  0 08:24 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6382  
root      2536     1  0 08:42 ?        00:00:01 /usr/local/bin/redis-server 127.0.0.1:6380                              
root      2579  1817  0 08:58 pts/0    00:00:00 /usr/local/bin/redis-sentinel *:26379 [sentinel]                        
root      2603  2179  0 09:01 pts/4    00:00:00 grep redis


kill掉一个从redis 6382,观察sentinel控制台输出信息  

2579:X 18 Jul 09:01:56.999 # +sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:01:56.999 # +sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
恢复6382
2579:X 18 Jul 09:10:40.223 * +reboot slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:10:40.275 # -sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:10:40.478 * +reboot slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:10:40.561 # -sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381


停止主redis

2579:X 18 Jul 09:12:29.324 # +sdown master mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:12:29.324 # +sdown master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.324 # +odown master mymaster 127.0.0.1 6381 #quorum 1/1
2579:X 18 Jul 09:12:29.324 # +new-epoch 2
2579:X 18 Jul 09:12:29.324 # +try-failover master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.329 # +vote-for-leader 236f14b361fc5a0dc0621cf88823ed6e6252b2f3 2
2579:X 18 Jul 09:12:29.329 # +elected-leader master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.329 # +failover-state-select-slave master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.382 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.382 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.459 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.113 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.113 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.162 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.338 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:31.343 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:31.410 # +failover-end master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:31.410 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380
2579:X 18 Jul 09:12:31.411 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2579:X 18 Jul 09:12:31.411 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380


查看主从复制信息

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=3671,lag=1
master_repl_offset:3671
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:3670


书生整理于网络


2019-03-19 22:00

redis知识点

redis快速入门

reids常用命令

redis数据结构

java_API_客户端

Jedis

Tlcache

redis_持久化

AOF

RDB

发布订阅(pub/sub)

redis_事件

redis事务

redis通讯协议

RESP(Redis Serialization Protocol)

redis高可用

redis哨兵

监控(Monitoring) 提醒(Notification) 自动故障迁移(Automatic failover)

redis主从复制

  • 复制模式

    1. 主从复制
    2. 从从复制
  • 复制过程

    • slave向master发送sync命令;
    • master开启子进程执行bgsave写入rdb文件;
    • master发送缓存和RDB文件给slave;
    • master发送数据发送给slave完成复制;

redis集群(Redis_Cluster)

知识点

相关教程

更多

redis sentinel.conf详解-redis集群管理

sentinel.conf详解  官方完整示例

redis安装-redis集群管理

安装redis  [root@master opt]# mkdir /opt/redis  [root@master opt]# cd /opt/redis  [root@master redis]# mv /opt/redis-3.2.1.tar.gz .  [root@master redis]# ls  redis-3.2.1.tar.gz [root@master redis]# tar

redis主从复制的原理-redis集群管理

复制的过程原理  1、 当从库和主库建立master-slave关系后,会向主数据库发送SYNC命令;  2、 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来;  3、 当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis;  4、 从Redis接收到后,会载入快照文件并且执行收到的缓存的命令;  5、 之后,主Redis每当

Redis配置文件详解

redis是一款开源的、高性能的键-值存储(key-value store),和memcached类似,redis常被称作是一款key-value内存存储系统或者内存数据库,同时由于它支持丰富的数据结构,又被称为一种数据结构服务器(data structure server)。   编译完redis,它的配置文件在源码目录下 redis.conf ,将其拷贝到工作目录下即可使用,下面具体解释red

基于linux下redis安装与配置

编译源程序:make install,复制可执行文件,Redis的启动,Redis随机启动

redis 集群环境搭建-redis集群管理

集群架构 (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.  (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.  (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可  (4)redis-cluster把所有的物理节点映射到[0-16383]slot(插槽)上,cl

redis新增集群节点-redis集群管理

新增一个节点6383,并启动 执行redis-trib.rb add-node命令添加节点  redis-trib.rb add-node new_host:new_port existing_host:existing_port  [root@master redis-cluster]# /opt/redis/redis-3.2.1/src/redis-trib.rb add-node 192.

redis主从从架构搭建-redis集群管理

主从从架构 [root@master redis-master-slave]# vim 6382/redis.conf  slaveof 127.0.0.1 6381  分别启动三台redis-server  [root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/638

redis删除集群节点-redis集群管理

先查看一下集群节点信息:  192.168.56.101:6382> cluster nodes  03596d92625f1b778f29eb4a9128d92809dfd79a 192.168.56.101:6381 master - 0 1468857421626 2 connected 5795-10922  e6d316a0dcd7cfcc98de645d86989d5527e86

redis集群出现宕机没法访问-redis集群管理

先来查看集群节点信息  192.168.56.101:6382> cluster nodes  03596d92625f1b778f29eb4a9128d92809dfd79a 192.168.56.101:6381 master - 0 1468858392134 2 connected 5795-10922  b1939026deb80fedde7bdb22c1df3ecfaa72f60

redis集群插槽分配-redis集群管理

使用cluster nodes命令查看当前集群信息  192.168.56.101:6382> cluster nodes  8c45a68a798aed7c1ed5e636f2899709717952c8 192.168.56.101:6380 master - 0 1468819900949 1 connected 0-5460  c9267b81af4bb2c186d07c5ebc77

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

redis 集群使用主从复制架构-redis集群管理

redis集群使用主从架构如下图,能有效解决集群中节点连接不上造成集群挂掉的情况  a) 在Redis集群中可以使用主从模式实现某一个节点的高可用  b) 当该节点(master)宕机后,集群会将该节点的从数据库(slave)转变为(master)继续完成集群服务; 创建主从集群  参考前面的主从复制和集群环境搭建,启动6个redis实例,分别是:  6380(主) 6480(从)  6381(主

redis主从复制(读写分离)-redis集群管理

主从复制的好处:  1、 避免redis单点故障  2、 构建读写分离架构,满足读多写少的应用场景 主从架构 [root@master redis]# mkdir redis-master-slave  创建6380、6381、6382三个目录,分别将安装目录下的redis.conf拷贝到这三个目录下(我直接从单机安装那里拷贝过来,因为我那里已人改过daemonize了)  [root@maste

Redis 哈希(Hash)详解

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案