1.1 redis高可用方案
在主从复制的场景下,当一个主节点宕机时为了不使整个redis服务受到影响需要挑一个从节点晋升成为主节点,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预,无法快速恢复服务而且成本巨大;
Redis Sentinel 是一种高可用的实现方案。Sentinel是一个管理多个redis示例的工具,他可以实现对redis的监控,通知自动故障转移
Sentinel 主要功能:
监控:Sentinel会不断的检查主服务器和从服务器是否 运行正常
提醒:当被监控的某个redis服务器出现问题Sentinel可以通过API向管理员或者其他应用程序发送通知
故障转移:当一个主服务器不能正常的工作时Sentinel会开始一次自动故障转移操作,他会将失效的主服务器其中一个从服务器升级为新的主服务器,并让失效的主服务器的其他从服务器改为复制新的住服务器,当客户端视图连接失效的主服务器时集群也会向客户端返回新的主服务器的地址,使得集群可以使用新的主服务器代替旧的失效服务器
故障转移过程:
-
主节点发生故障后,客户端(client)连接主节点失败,所有的从节点与主节点连接失败造成复制中断。
-
如果主节点无法正常启动,需要选出一个从节点,对其执行slaveof no one命令使其成为新的主节点。
-
原来的从节点成为新的主节点后,更新应用方的主节点信息,重新启动应用方。
-
客户端命令另一个从节点去复制新的主节点(new-master),slaveof host port
-
待原来的主节点恢复后,让它去复制新的主节点。
2. 哨兵模式
1. 启动master节点
redis-6379.conf配置:
#redis以守护进程方式运行
daemonize yes
#日志文件
logfile 6379.log
#rdb文件
dbfilename dump-6379.rdb
redis-sever redis-6379.conf
2. 启动从节点
#redis-6380.conf配置:
#redis以守护进程方式运行
daemonize yes
#日志文件
logfile "6380.log"
#rdb文件
dbfilename "dump-6380.rdb"
#设置主节点
slaveof 127.0.0.1 6379
redis-server redis-6380.conf
redis-server redis-6381.conf
3. 确认主从关系
info replication 或 role命令
4. 配置Sentinel节点
sentinel-26379.conf配置:
port 26379
daemonize yes
logfile "26379.log"
#sentinel monitor <master-name> <ip> <port> <quorum>
#监控127.0.0.1:6379这个主节点,别名my-master,至少2个Sentinel节点认为失败时做故障转移
sentinel monitor my-master 127.0.0.1 6379 2
#sentinel down-after-milliseconds <master-name> <times>
#超过指定秒没有收到节点回复,判为故障下线
sentinel down-after-milliseconds my-master 30000
#sentinel parallel-syncs <master-name> <nums>
#故障转移时的从节点向主节点发起并发复制请求的数量
sentinel parallel-syncs my-master 1
#sentinel failover-timeout <master-name> <times>
#故障转移超时时间
sentinel failover-timeout my-master 180000
5. 启动Sentinel节点。
两种方式启动Sentinel节点:
a、使用redis-sentinel命令:
redis-sentinel sentinel-26379.conf
b、使用redis-server命令加--sentinel参数:
redis-server sentinel-26379.conf --sentinel
6. 启动三个Sentinel节点
两种方式启动Sentinel节点:
a、使用redis-sentinel命令:
redis-sentinel sentinel-26379.conf
b、使用redis-server命令加--sentinel参数:
redis-server sentinel-26379.conf --sentinel
7. 确认
info sentinel
3.Redis集群
3.1 Redis的数据分区规则:
Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16383。集群中的每个主节点(Master)都负责处理16384个哈希槽中的一部分,当集群处于稳定状态时,每个哈希槽都只由一个主节点进行处理,每个主节点可以有一个到N个从节点(Slave),当主节点出现宕机或网络断线等不可用时,从节点能自动提升为主节点进行处理。
3.2 Redis集群的特点:
-
数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布
-
可扩展性,节点可动扩容与缩容
-
高可用性,部分节点不可用时,集群仍可用。通过增加Slave做standby数据副本,能够实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升
3.3 Redis集群与单机相比较在功能上存在一些限制:
-
key批量操作支持有限。如mset、mget,目前只支持具有相同slot值的key执行批量操作。对于映射为不同slot值的key由于执行mget、mget等操作可能存在于多个节点上因此不被支持。
-
key事务操作支持有限。同理只支持多key在同一节点上的事务操作,当多个key分布在不同的节点上时无法使用事务功能。
-
key作为数据分区的最小粒度,因此不能将一个大的键值对象如hash、list等映射到不同的节点。
-
支持多数据库空间。单机下的Redis可以支持16个数据库,集群模式下只能使用一个数据库空间,即db0。
-
复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构。
3.4 集群环境搭建
节点 | 角色 | 状态 | 工作 |
6379 | Master | online | 处理slot:0-5460 |
6380 | Master | online | 处理slot:5461-10922 |
6381 | Master | online | 处理slot:10923-16383 |
6382 | Slave | online | 复制6379节点 |
6383 | Slave | online | 复制6380节点 |
6384 | Slave | online | 复制6381节点 |
配置文件【 redis-{port}.conf 】:
port 6379
logfile log/6379.log
cluster-enabled yes
dir data
cluster-node-timeout 15000
cluster-config-file nodes-6379.conf
启动:
redis-server conf/redis-6379.conf
redis-server conf/redis-6380.conf
redis-server conf/redis-6381.conf
redis-server conf/redis-6382.conf
redis-server conf/redis-6383.conf
redis-server conf/redis-6384.conf
节点启动成功后会生成一个nodes-{port}.conf的集群配置文件。当集群内节点信息发生变化,如添加节点、节点下线、故障转移等。节点会自动保存集群状态到配置文件中。需要注意的是,Redis自动维护集群配置文件,不要手动修改。
启动后集群配置文件里显示的内容:
节点握手:节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。从6个节点中任意打开一个客户端输入:cluster meet{ip}{port}
例打开6379客户端
127.0.0.1:6379>cluster meet 127.0.0.1 6381
127.0.0.1:6379>cluster meet 127.0.0.1 6382
127.0.0.1:6379>cluster meet 127.0.0.1 6383
127.0.0.1:6379>cluster meet 127.0.0.1 6384
分配槽:Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。cluster addslots命令为节点分配槽。所有槽分配完成后集群的状态会变为ok。
主从复制:还有三个节点没有使用,作为一个完整的集群,每个负责处理槽的节点应该具有从节点,保证当它出现故障时可以自动进行故障转移。集群模式下,Reids节点角色分为主节点和从节点。首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽信息和相关的数据。
4. 使用redis-trib.rb搭建集群
redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装Ruby依赖环境。