redis哨兵与集群

Redis哨兵模式

一、安装和配置

1.1 解压

tar zvxf redis-6.0.10.tar.gz

1.2 编译环境

升级gcc版本
yum install centos-release-scl
yum install devtoolset-7-gcc*

cd /opt/rh/devtoolset-7
source ./enable

或者scl enable devtoolset-7 bash

1.3 编译

cd /opt/redis-6.0.10
make
make install
或者 make install PREFIX=/usr/local/redis/

缺省情况下,redis被安装到/usr/local/bin下。

1.4 主从配置

主节点只用修改基本配置

# 绑定IP
bind 127.0.0.1 192.168.44.10
# 后台运行
daemonize yes
# 落盘文件位置可以考虑修改
dir ./
# 连接密码可以考虑修改
requirepass xxx

从节点配置额外需要修改

# 从节点 slaveof 后面跟主节点及端口号
slaveof 192.168.44.10 6379

# 因为政治目的slaveof这个说法有点敏感,修改成replicaof,可能老版本还是slaveof
# replicaof <masterip> <masterport>
replicaof 192.168.44.10 6379

1.5 哨兵配置

哨兵配置sentinel.conf解释:

# 哨兵sentinel实例运行的端口,默认26379  
port 26379
# 哨兵sentinel的工作目录
dir ./

# 哨兵sentinel监控的redis主节点的 
## ip:主机ip地址
## port:哨兵端口号
## master-name:可以自己命名的主节点名字(只能由字母A-z、数字0-9 、这三个字符".-_"组成。)
## quorum:当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了  
# sentinel monitor <master-name> <ip> <redis-port> <quorum>  
sentinel monitor mymaster 127.0.0.1 6379 2

# 当在Redis实例中开启了requirepass <foobared>,所有连接Redis实例的客户端都要提供密码。
# sentinel auth-pass <master-name> <password>  
sentinel auth-pass mymaster 123456  

# 指定主节点应答哨兵sentinel的最大时间间隔,超过这个时间,哨兵主观上认为主节点下线,默认30秒  
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000  

# 指定了在发生failover主备切换时,最多可以有多少个slave同时对新的master进行同步。这个数字越小,完成failover所需的时间就越长;反之,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为1,来保证每次只有一个slave,处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1  

# 故障转移的超时时间failover-timeout,默认三分钟,可以用在以下这些方面:
## 1. 同一个sentinel对同一个master两次failover之间的间隔时间。  
## 2. 当一个slave从一个错误的master那里同步数据时开始,直到slave被纠正为从正确的master那里同步数据时结束。  
## 3. 当想要取消一个正在进行的failover时所需要的时间。
## 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来同步数据了
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000

# 当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本。一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
# 对于脚本的运行结果有以下规则:  
## 1. 若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10。
## 2. 若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。  
## 3. 如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
# sentinel notification-script <master-name> <script-path>  
sentinel notification-script mymaster /var/redis/notify.sh

# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

哨兵节点主要配置:

port 26379

# 后台运行
daemonize yes

# 哨兵配置
# mymaster        为主节点名字,可以随便取,后面程序里边连接的时候要用到
# 192.168.44.10 6379 为主节点的 ip,port
# 1               后面的数字 1 表示选举主节点的时候,投票数。1表示有一个sentinel同意即可升级为master
sentinel monitor mymaster 192.168.44.10 6379 1

sentinel parallel-syncs mymaster 1 

哨兵模式下主节点redis.config配置

daemonize yes
pidfile "/var/run/redis-16379.pid"
logfile "/var/log/redis/redis-16379.log"
port 6379
bind 127.0.0.1 192.168.44.10
timeout 300
databases 16
dbfilename "dump-6379.db"
dir "/usr/local/redis-sentinel/redis-workdir"
masterauth "123456"
requirepass "123456"

如果要做 自动故障转移,建议所有的 redis.conf 都设置 masterauth。因为 自动故障 只会重写 主从关系,即 slaveof,不会自动写入 masterauth。如果 Redis 原本没有设置密码,则可以忽略。

哨兵模式下从节点redis.config配置

daemonize yes
pidfile /var/run/redis-6379.pid
logfile /var/log/redis/redis-6379.log
port 6379
bind 127.0.0.1 192.168.44.11
timeout 300
databases 16
dbfilename dump-6379.db
dir ./redis-workdir
masterauth 123456
requirepass 123456
slaveof 192.168.44.10 6379

二、Springboot下集成redis哨兵模式

2.1 主要依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.2 主要配置

配置哨兵的master名字和所有哨兵节点ip:port

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 192.168.44.10:26379,192.168.44.11:26379,192.168.44.12:26379

三、Redis监控

四、Redis Sentinel的主要功能特性

Sentinel 的主要功能包括 主节点存活检测主从运行情况检测自动故障转移failover)、主从切换RedisSentinel 最小配置是 一主一从

RedisSentinel 系统可以用来管理多个 Redis 服务器,该系统可以执行以下四个任务:

  • 监控

Sentinel 会不断的检查 主服务器从服务器 是否正常运行。

  • 通知

当被监控的某个 Redis 服务器出现问题,Sentinel 通过 API 脚本管理员 或者其他的 应用程序 发送通知。

  • 自动故障转移

主节点 不能正常工作时,Sentinel 会开始一次 自动的 故障转移操作,它会将与 失效主节点主从关系 的其中一个 从节点 升级为新的 主节点,并且将其他的 从节点 指向 新的主节点

  • 配置提供者

Redis Sentinel 模式下,客户端应用 在初始化时连接的是 Sentinel 节点集合,从中获取 主节点 的信息。

4.3. 主观下线和客观下线

默认情况下,每个 Sentinel 节点会以 每秒一次 的频率对 Redis 节点和 其它Sentinel 节点发送 PING 命令,并通过节点的 回复 来判断节点是否在线。

  • 主观下线

主观下线 适用于所有 主节点从节点。如果在 down-after-milliseconds 毫秒内,Sentinel 没有收到 目标节点 的有效回复,则会判定 该节点主观下线

  • 客观下线

客观下线 只适用于 主节点。如果 主节点 出现故障,Sentinel 节点会通过 sentinel is-master-down-by-addr 命令,向其它 Sentinel 节点询问对该节点的 状态判断。如果超过 <quorum> 个数的节点判定 主节点 不可达,则该 Sentinel 节点会判断 主节点客观下线

4.4. Sentinel的通信命令

Sentinel 节点连接一个 Redis 实例的时候,会创建 cmdpub/sub 两个 连接Sentinel 通过 cmd 连接给 Redis 发送命令,通过 pub/sub 连接到 Redis 实例上的其他 Sentinel 实例。

SentinelRedis 主节点从节点 交互的命令,主要包括:

命令 作 用
PING SentinelRedis 节点发送 PING 命令,检查节点的状态
INFO SentinelRedis 节点发送 INFO 命令,获取它的 从节点信息
PUBLISH Sentinel 向其监控的 Redis 节点 __sentinel__:hello 这个 channel 发布 自己的信息主节点 相关的配置
SUBSCRIBE Sentinel 通过订阅 Redis 主节点从节点__sentinel__:hello 这个 channnel,获取正在监控相同服务的其他 Sentinel 节点

SentinelSentinel 交互的命令,主要包括:

命令 作 用
PING Sentinel 向其他 Sentinel 节点发送 PING 命令,检查节点的状态
SENTINEL:is-master-down-by-addr 和其他 Sentinel 协商 主节点 的状态,如果 主节点 处于 SDOWN 状态,则投票自动选出新的 主节点

4.5. Redis Sentinel的工作原理

每个 Sentinel 节点都需要 定期执行 以下任务:

  • 每个 Sentinel每秒钟 一次的频率,向它所知的 主服务器从服务器 以及其他 Sentinel 实例 发送一个 PING 命令。
  • 如果一个 实例instance)距离 最后一次 有效回复 PING 命令的时间超过 down-after-milliseconds 所指定的值,那么这个实例会被 Sentinel 标记为 主观下线
  • 如果一个 主服务器 被标记为 主观下线,那么正在 监视 这个 主服务器 的所有 Sentinel 节点,要以 每秒一次 的频率确认 主服务器 的确进入了 主观下线 状态。
  • 如果一个 主服务器 被标记为 主观下线,并且有 足够数量Sentinel(至少要达到 配置文件 指定的数量)在指定的 时间范围 内同意这一判断,那么这个 主服务器 被标记为 客观下线
  • 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率,向它已知的所有 主服务器从服务器 发送 INFO 命令。当一个 主服务器Sentinel 标记为 客观下线 时,Sentinel下线主服务器 的所有 从服务器 发送 INFO 命令的频率,会从 10 秒一次改为 每秒一次
  • Sentinel 和其他 Sentinel 协商 主节点 的状态,如果 主节点 处于 SDOWN 状态,则投票自动选出新的 主节点。将剩余的 从节点 指向 新的主节点 进行 数据复制
  • 当没有足够数量的 Sentinel 同意 主服务器 下线时, 主服务器客观下线状态 就会被移除。当 主服务器 重新向 SentinelPING 命令返回 有效回复 时,主服务器主观下线状态 就会被移除。

注意:一个有效的 PING 回复可以是:+PONG-LOADING 或者 -MASTERDOWN。如果 服务器 返回除以上三种回复之外的其他回复,又或者在 指定时间 内没有回复 PING 命令, 那么 Sentinel 认为服务器返回的回复 无效non-valid)。

五、Sentinel时客户端命令

  • 检查其他 Sentinel 节点的状态,返回 PONG 为正常。
> PING sentinel
  • 显示被监控的所有 主节点 以及它们的状态。
> SENTINEL masters
  • 显示指定 主节点 的信息和状态。
> SENTINEL master <master_name>
  • 显示指定 主节点 的所有 从节点 以及它们的状态。
> SENTINEL slaves <master_name>

返回指定 主节点IP 地址和 端口。如果正在进行 failover 或者 failover 已经完成,将会显示被提升为 主节点从节点IP 地址和 端口

> SENTINEL get-master-addr-by-name <master_name>
  • 重置名字匹配该 正则表达式 的所有的 主节点 的状态信息,清除它之前的 状态信息,以及 从节点 的信息。
> SENTINEL reset <pattern>
  • 强制当前 Sentinel 节点执行 failover,并且不需要得到其他 Sentinel 节点的同意。但是 failover 后会将 最新的配置 发送给其他 Sentinel 节点。
>SENTINEL failover <master_name>

六、Redis常规参数

Redis 配置文件主要参数解析参考:

# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid
# redis进程的端口号
port 6379
# 绑定的主机地址
bind 127.0.0.1
# 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
timeout 300
# redis日志级别,可用的级别有debug.verbose.notice.warning
loglevel verbose
# log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
logfile stdout
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
databases 16
# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件
save <seconds> <changes>
# 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储
rdbcompression yes
# 指定本地数据库文件名
dbfilename dump.db
# 指定本地数据问就按存放位置
dir ./
# 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
slaveof <masterip> <masterport>
# 当master设置了密码保护时,slave服务连接master的密码
masterauth <master-password>
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass footbared
# 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients 128
# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory<bytes>
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。
appendonly no
# 指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);
appendfsync everysec

七、Redis Cluster配置

redis cluster至少需要三注三从

7.1 常规配置

# redis后台运行
daemonize yes
# 绑定的主机端口
bind 127.0.0.1
# 数据存放目录
dir /usr/local/redis-cluster/data/redis-6379
# 进程文件
pidfile /var/run/redis-cluster/${自定义}.pid
# 日志文件
logfile /usr/local/redis-cluster/log/${自定义}.log
# 端口号
port 6379
# 开启集群模式,把注释#去掉
cluster-enabled yes
# 集群的配置,配置文件首次启动自动生成
cluster-config-file /usr/local/redis-cluster/conf/${自定义}.conf
# 请求超时,设置10秒
cluster-node-timeout 10000
# aof日志开启,有需要就开启,它会每次写操作都记录一条日志
appendonly yes

7.2 构建集群

至少6台设备用来构建集群,不用在从机的配置中加上replicaof或slaveof语句,现在高版本都是自动的。

1. 先分别启动所有redis
2. 通过命令构建集群
redis-cli --cluster create 192.168.44.10:6379 192.168.44.10:6380 192.168.44.11:6379 192.168.44.11:6380 192.168.44.12:6379 192.168.44.12:6380 --cluster-replicas 1

3. --cluster-replicas 1 指示给定的创建节点列表是以主节点+从节点对组成的。

集群命令

$ redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN --cluster-replicas <arg> check          host:port --cluster-search-multiple-owners
  info           host:port
  fix            host:port --cluster-search-multiple-owners --cluster-fix-with-unreachable-masters
  reshard        host:port --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters --cluster-timeout <arg>
                 --cluster-simulate --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <arg> del-node       host:port node_id
  call           host:port command arg arg .. arg set-timeout    host:port milliseconds
  import         host:port --cluster-from <arg>
                 --cluster-copy --cluster-replace
  backup         host:port backup_directory
  help
  
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

7.3 客户端连接

命令行多加一个-c

-c 选项指定以Cluster模式运行redis-cli
redis-cli -h 192.168.44.12 -p 6379 -c

所有get set等命令都会被重新定向到该key所在的服务器

注意keys *命令不能正确返回所有key

7.4 重启集群

(保留原有集群的)重启:

  • 不需要再执行(形如redis-cli --cluster create 192.168.44.10:6379 192.168.44.10:6380 192.168.44.11:6379 192.168.44.11:6380 192.168.44.12:6379 192.168.44.12:6380 --cluster-replicas 1这样的)集群生成指令。
  • 第一步:*关闭*各个Redis节点。
  • 第二步:*启动*各个Redis节点即可。(注意:启动redis服务时请在上次成功启动服务的目录启动,即已经生成rdb,conf的目录,否则该节点加入不了集群)

(删除原有集群的)重启:

  • 需要再执行(形如redis-cli -a ds123 --cluster create 10.8.109.24:6379 10.8.109.36:6379 10.8.109.49:6379 10.8.109.49:6380 10.8.109.24:6380 10.8.109.36:6380 --cluster-replicas 1这样的)集群生成指令。
  • 第一步:*关闭*各个Redis节点。
  • *第二步:*删除各个Redis安装目录下的*节点配置文件nodes.conf**数据文件dump.rdb*

说明:此方式相当于重置到刚刚创建集群的时候了,所以需要删除节点配置文件nodes.conf、还需要删除数据存储文件dump.rdb。

7.5 关闭集群

  • 方式一:进入redis后,使用SHUTDOWN指令或SHUTDOWN SAVE指令或SHUTDOWN NOSAVE指令。
  • 方式二:通过redis的客户端程序redis-clishutdown命令
redis-cli -p 6380 shutdown

使用shell脚本批量关闭

#!/bin/bash 
redis-cli -h 192.168.44.10 -p 6379 shutdown
redis-cli -h 192.168.44.10 -p 6380 shutdown
redis-cli -h 192.168.44.11 -p 6379 shutdown
redis-cli -h 192.168.44.11 -p 6380 shutdown
redis-cli -h 192.168.44.12 -p 6379 shutdown
redis-cli -h 192.168.44.12 -p 6380 shutdown

7.6 查看集群信息

使用redis-cli -c连入任意server

  • 使用cluster info
192.168.44.10:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:9
cluster_my_epoch:1
cluster_stats_messages_ping_sent:95
cluster_stats_messages_pong_sent:94
cluster_stats_messages_fail_sent:3
cluster_stats_messages_sent:192
cluster_stats_messages_ping_received:94
cluster_stats_messages_pong_received:91
cluster_stats_messages_fail_received:1
cluster_stats_messages_received:186
  • 使用cluster nodes

    这个命令很重要,可以查看是否故障,是否完成故障转移

192.168.44.10:6379> cluster nodes
249f41fda5a29551b54f84e189cefc07003b777a 192.168.44.11:6380@16380 slave dae7dacfd2828bbc485f4f5f31f755665704b511 0 1625732773268 1 connected
710d7a7e5339e21d52bfcfb464b0d59f55f01242 192.168.44.10:6380@16380 master - 0 1625732774288 9 connected 10923-16383
88b39d88f9feaf5a18896233e00282f1a008616a 192.168.44.12:6380@16380 slave e05b09bd0949ca46baea67c45c1886716562a091 0 1625732771000 3 connected
78738770dd492fbe402467b8a80478d32b11a898 192.168.44.12:6379@16379 slave 710d7a7e5339e21d52bfcfb464b0d59f55f01242 0 1625732771235 9 connected
dae7dacfd2828bbc485f4f5f31f755665704b511 192.168.44.10:6379@16379 myself,master - 0 1625732770000 1 connected 0-5460
e05b09bd0949ca46baea67c45c1886716562a091 192.168.44.11:6379@16379 master - 0 1625732773000 3 connected 5461-10922

八、生产环境中注意要点

各类配置文件的文件名最好带端口号。

posted @ 2021-12-07 09:46  我是属车的  阅读(290)  评论(0编辑  收藏  举报