乐趣区

关于redis:Redis6安装下-集群与故障转移

Redis Cluster 搭建筹备工作

  1. 搭建集群之前,务必有一点须要留神就是选举,因为在现在很多的分布式中间件里,集群都会有选举这个概念,肯定要达到半数以上的节点,才可能发动偏心的投票,否则就会脑裂,比方 redis,zk,es 等,所以至多保障 3 个 master 节点,master 会发动选举投票的。这一点要须知。
  2. 配置 6 个节点的虚拟机(事后做好)

    • 192.168.1.221
    • 192.168.1.222
    • 192.168.1.223
    • 192.168.1.224
    • 192.168.1.225
    • 192.168.1.226
    • 192.168.1.227(新增 Master)
    • 192.168.1.228(新增 Slave)
  3. 每个节点搭建单机 redis,清理 aof 和 rdb 文件(事后做好)
  4. 如果为单实例的 Redis 设置了明码 password,那么每个节点都必须要设置 masterauth,也就是对应明码,这样是为了 master 挂掉当前,对应的 slave 能够降级为 master。
  5. 须要留神,选举的过程会短暂的对外不可用。

Redis Cluster 搭建实操演练

附:
敞开 redis

./redis-cli -p < 批改的端口号 > -a < 批改的明码 > shutdown 

开启 redis:

./redis-server redis.conf 

每个单实例中的 redis.conf 配置:

# 配置 redis 日志,便于查看
logfile /usr/local/redis/redis-221.log
 # 开启集群模式
cluster-enabled yes
# 每一个节点须要有一个配置文件,须要 6 份。每个节点处于集群的角色都须要告知其余所有节点,彼此晓得,这个文件用于存储集群模式下的集群状态等信息,这个文件是由 redis 本人保护,咱们不必管。如果你要从新创立集群,那么把这个文件删了就行
cluster-config-file nodes-221.conf
# 超时工夫,超时则认为 master 宕机,随后主备切换
cluster-node-timeout 5000
# 开启 AOF
appendonly yes 

创立集群,在任意节点运行如下命令一次:

#####
# 留神 1:如果你应用的是 redis3.x 版本,须要应用 redis-trib.rb 来构建集群,最新版应用 C 语言来构建了,这个要留神
# 留神 2:以下为新版的 redis 构建形式
#####

# 创立集群,主节点和从节点比例为 1,1- 3 为主,4- 6 为从,这也是最经典用的最多的集群模式。cluster-replicas 是几个 slave,- a 是执行机密。./redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1 -a 123456 


从上图中能够看到,slots 槽,用于装数据,主节点有,从节点没有。

在任意节点查看集群信息:

./redis-cli --cluster check 192.168.1.221:6379 -a 123456 

查看主从状态信息:

./redis-cli -a 123456
info replication 


搭建集群时的日志

M221 与 S225

M222 与 S226

M223 与 S224

从节点日志,次要进行复制:

cluster nodes 查看各个节点的信息

故障转移

如果一个 master 挂了,那么残余的 2 个 master 会发动投票选举,从挂了的 master 对应的 slave 中选举出一个新的 master,产生故障的 master 不会参加投票,这个要留神。

选举的时候须要半数以上的 master 都投票给同一个 slave,那么他才会成为新的 master。所以 redis 集群中至多须要 3 个主节点,2 个是不行的。而且咱们也是倡议在不同的物理节点下来进行配置,如果是伪分布式集群,那么可能会有问题。

故障转移的次要流程首先是主观下线,而后是主观下线,这个咱们在课程里有说过,要以主观为主,也就是半数以上的 master 都收不到某节点的心跳,则认为他宕机了,此时发动选举。

验证故障转移

  1. redis 宕机,进行某一台 master,察看日志,以及对应的从。

    上图中,225 降级为 master,原来的 221 下线。slots 主动重新分配。
  2. 重启原来的 221,能够发现,他退出到了 225 的麾下,成为他的 slave,并且进行了主从数据同步。

    在新的主 225 中能够看到 221 的退出 ask 询问同步等信息
  3. 间接敞开 225 服务器,间接关停,相当于服务器炸了。测试后发现,221 成为新的 master,也就是说不论是 redis 宕机还是服务器炸了,对应的 slave 都能被选举为新的 master,因为只有 master 集群主观认为你下线了,那么就会进行选举。

验证数据是否都在主从中获取

./redis-cli -a 123456 -c
 set name lee 


集群中设值与取值,须要加 -c
图中数据进入到了主 222 中,那么验证一下从某个从节点中能不能获取,他会跳转到 222 中去获取,因为当初是一个集群状态。

如果不加-c,以单实例模式去操作,那么会报错。

敞开主 222,察看原来设置的数据,在 slave226 转变为 master 后,数据是否存在:

因为数据会主从同步,所以 master 宕机后,slave 中还是会有他的数据。这些数据都是跟着 slot 走的。

master 宕机,他的 slave 降级为 master,再次宕机,看看残余的 2 主 2 从是否运行

紧接下面的,接着敞开新主 226,残余 2 主 2 从,查看状态,你会发现出错,提醒说 slots 调配不平均,因为有一对主从没有的 slot 都没了。

随后在任意节点去查问数据,提醒说以后集群不可用,咱们须要复原了。

多 master 宕机数超过半数以上,集群不可用

同时有 2 个 redis-master 都宕机,那么无奈达到半数以上,此时无奈选举,以后集群不可用。因为速度比拟快,虚拟机里难以演示,所以此处意会一下哈~
(如果半数以上 Master 处于敞开状态那么整个集群处于不可用状态。)

集群节点通信 gossip 理解即可,无需深究

redis 集群模式下的几个节点之间也会互相通信,他们的通信协议是 gossip,各个节点之间会有 ping pong 等音讯类型,每个节点也保护着 redis 的元数据,一旦产生更改会互相发送。

redis 程度扩容,减少节点,从新 shard 调配 slot

新增 192.168.1.227
批改 redis.conf 文件后,启动服务。查看分片信息:

比照现有的 master

比照后他本人尽管标识 master,然而没起作用,也没退出到现有的集群

这个时候须要应用如下命令,把节点退出到以后集群:

# 增加一个新的节点到现有的集群中。第一个 ip 为新节点,第二个 ip 为现有集群中的某个节点 ip
新增 192.168.1.227
./redis-cli --cluster add-node 192.168.1.227:6379 192.168.1.221:6379 -a 123456 


如上图,新节点,退出胜利。

这个时候新退出的节点为 master 了,然而从图中看的进去,并没有 slot 槽位信息,咱们还须要从新分槽,能力应用。

# ip 端口是集群中任意一个节点和对应端口号
./redis-cli --cluster reshard  ip:port -a 明码 


询问须要迁徙多少个 slots,迁徙之后,原来的数据还是存在与 slots 中的,因为哈希后取模的接口还是对应某个 slot,数据还在。

填入须要迁徙的节点 id,也就是新增的 master 的 id,复制进去。

随后输出 all,示意从每个现有 master 中都取出肯定的 slot 进行迁徙。(done 的话是从指定的节点中拿出一部分 slot 来迁徙)
而后再 yes,示意执行 reshard 操作。

期待一段时间迁徙后,迁徙胜利。从新查看集群信息。这个时候 227 中有 2000 个 slot,别离都是从其余节点迁徙的一部分独特组合的。

如此一来,新的 master 节点退出到集群了。

之前的 name 是在别的 master 中,因为 slot 迁徙了,这个时候再查问的时候,他会路由到 227 节点,阐明了数据不会因为节点减少而失落,都会跟着 slot 走。

测试敞开这台新的 master,因为 slot 不残缺,集群不可用。其实也就是说明了整个集群状态下,总数 16384 个哈希槽必须都存在,短少了就不残缺了。所以就必然须要应用高可用,每个 master 下都要挂在至多 1 个 slave。

新加 slave,把他安顿到某个特定的 master 之下

执行如下命令:

./redis-cli --cluster add-node --cluster-slave --cluster-master-id [master-id] [slave-ip:port] [master-ip:port] 


增加节点胜利。
这个时候查看,能够看到 228 退出到集群,并且成为了 slave:

228 的分片信息 slave 归属为 227,如此一来 slave 增加到某个 master 下胜利了。

Redis 集群总结

  1. 读写都是在 master,slave 退出集群,会进行数据同步,连贯集群中的任意主或从节点去读写数据,都会依据 key 哈希取模后路由到某个 master 节点去解决。slave 不提供读写服务,只会同步数据。
  2. 敞开任意一主,会导致局部写操作失败,是因为从节点不能执行写操作,在 Slave 降级为 Master 期间会有大量的失败。
  3. 敞开从节点对于整个集群没有影响
  4. 某个主节点和他麾下的所有从节点全副挂掉,咱们集群就进入 faill 状态,不可用。因为 slot 不残缺。
  5. 如果集群超过半数以上 master 挂掉,无论他们是否有对应 slave,集群进入 fail 状态,因为无奈选举。
  6. 如果集群中的任意 master 宕机,且此 master 没有 slave。集群不可用。(同 3)
  7. 投票选举过程是集群中所有 master 参加,如果半数以上 master 节点与 master 节点通信超时(cluster-node-timeout),认为以后 master 节点挂掉。
  8. 选举只会针对某个 master 下的所有 slave 选举,而不是对所有全量的 slave 选举。
  9. 原先的 master 从新复原连贯后,他会成为新 master 的从服务器。因为主从同步,客户端的写入命令,有可能会失落(为啥?参考主从复制原理 AOF 与 RDB)。redis 并非强一致性,因为主从个性,所以最初一部分数据会失落。CAP 实践。
  10. 集群只实现了主节点的故障转移;从节点故障时只会被下线,不会进行故障转移。因而,应用集群时,个别不会应用读写拆散技术,因为从节点故障会导致读服务不可用,可用性变差了。所以不要在集群里做读写拆散。


退出移动版