Redis-3-集群

三、 集群

1.Redis 集群的优势

自动分割数据到不同的节点上。
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

特点

主从复制

实现了高可用

数据分片存储

集群节点的 meet 过程

三个节点

六个节点

指派槽

image.png

客户端和槽

image.png

3. Redis 集群的安装

原生命令安装

步骤
  1. 配置开启集群节点

  2. 配置 meet

  3. 指派槽

  4. 配置主从

实例操作

准备两台虚拟机:
一台启动三个 Redis 实例作为 主节点
另一台启动三个 Redis 实例作为 从节点

架构图

集群拓扑图

实验步骤
  1. 先编辑一个集群的配置文件

编译配置文件 /etc/redis/cluster-redis-7001.conf, 添加如下内容:

bind 0.0.0.0
port 7001
daemonize yes

# 允许任何地址不使用密码访问我
protected-mode no
dir "/redis/data/"
logfile  "cluster-7001.log"
dbfilename "cluster-dump-7001.log"
cluster-enabled yes
cluster-config-file cluster-redis-7001.conf

# 不需要集群的全部节点完好才提供服务
cluster-require-full-coverage no

Redis集群配置参数
我们将创建一个示例集群部署。在继续之前,让我们介绍Redis Cluster在redis.conf文件中引入的配置参数。当您继续阅读时,有些会很明显,有些会更清晰。

cluster-enabled<yes/no>:如果是,则在特定的Redis实例中启用Redis Cluster支持。否则,该实例将像往常一样作为独立实例启动。
cluster-config-file:请注意,尽管有此选项的名称,但它不是用户可编辑的配置文件,而是Redis Cluster节点每次发生更改时都会自动保留集群配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了诸如群集中其他节点之类的内容,它们的状态,持久变量等等。通常,由于收到某些消息,此文件将被重写并刷新到磁盘上。
cluster-node-timeout:Redis群集节点不可用的最长时间(不被视为失败)。如果主节点无法访问的时间超过指定的时间长度,则其主节点将对其进行故障转移。此参数控制Redis Cluster中的其他重要事项。值得注意的是,在指定的时间内无法到达大多数主节点的每个节点都将停止接受查询。
cluster-slave-validity-factor:如果设置为零,则从服务器将始终认为自己是有效的,因此将始终尝试对主服务器进行故障转移,而与主服务器和从服务器之间的链接保持断开状态无关。如果该值为正,则将最大断开时间计算为节点超时值乘以此选项提供的因子,如果节点是从节点,则如果断开主链接的时间超过指定的时间,它将不会尝试启动故障转移。例如,如果节点超时设置为5秒,而有效性因子设置为10,则从服务器与主服务器断开连接超过50秒将不会尝试对其主服务器进行故障转移。请注意,如果没有从属设备可以对其进行故障转移,则任何非零的值都可能导致Redis群集在主设备发生故障后不可用。在这种情况下,只有当原始主服务器重新加入群集后,群集才会恢复可用。
cluster-migration-barrier:主机将保持连接的最小数量的从机,以便另一个从机迁移到不再受任何从机覆盖的主机。有关更多信息,请参见本教程中有关副本迁移的相应部分。
cluster-require-full-coverage<yes/no>:如果设置为yes,默认情况下,如果某个节点未覆盖一定比例的密钥空间,集群将停止接受写入。如果该选项设置为no,即使仅可以处理有关密钥子集的请求,群集仍将提供查询。
cluster-allow-reads-when-down<yes/no>:如果将其设置为no(默认情况下为默认值),则当Redis群集被标记为失败时,或者当节点无法到达时,Redis群集中的节点将停止为所有流量提供服务法定人数的主持人或未达到完全覆盖的情况。这样可以防止从不知道群集更改的节点读取可能不一致的数据。可以将此选项设置为yes,以允许在失败状态期间从节点进行读取,这对于希望优先考虑读取可用性但仍希望防止写入不一致的应用程序很有用。当仅使用一个或两个分片的Redis Cluster时,也可以使用它,因为它允许节点在主服务器发生故障但无法进行自动故障转移时继续为写入提供服务。

  1. 再创建其他集群的配置文件
    image.png
[root@s1 redis]# sed 's/7001/7002/g' cluster-redis-7001.conf > cluster-redis-7002.conf
[root@s1 redis]# sed 's/7001/7003/g' cluster-redis-7001.conf > cluster-redis-7003.conf
[root@s1 redis]# sed 's/7001/7011/g' cluster-redis-7001.conf > cluster-redis-7011.conf
[root@s1 redis]# sed 's/7001/7012/g' cluster-redis-7001.conf > cluster-redis-7012.conf
[root@s1 redis]# sed 's/7001/7013/g' cluster-redis-7001.conf > cluster-redis-7013.conf

拷贝从节点的配置文件到另外一台主机上

需要保证另一台主机上有目录 /etc/redis/, 因为这里计划把所有的配置文件放在此目录下

[root@s1 redis]# scp -r cluster-redis-701*  root@172.16.153.179:/etc/redis/


  1. 首先,需要启动主节点的服务进程
[root@s1 ~]# redis-server  /etc/redis/cluster-redis-7001.conf
[root@s1 ~]# redis-server  /etc/redis/cluster-redis-7002.conf
[root@s1 ~]# redis-server  /etc/redis/cluster-redis-7003.conf
  1. 之后,再启动从节点的服务进程

image.png

[root@s2 ~]# mkdir -p /redis/data
[root@s2 ~]# redis-server  /etc/redis/cluster-redis-7011.conf
[root@s2 ~]# redis-server  /etc/redis/cluster-redis-7012.conf
[root@s2 ~]# redis-server  /etc/redis/cluster-redis-7013.conf

检查进程

ps   -ef  | grep  redis-server

假设你现在去连接到任意一个节点上执行操作会返回集群目前是没有启动的信息。

原因是目前集群各节点之间没有进行 meet 操作,都是各自孤立的状态。

image.png

可以使用如下命令查看集群的相关信息

image.png

还可以查看某一个集群节点信息,第一列是集群节点 ID

image.png

创建集群

redis-trib.rb 工具已经弃用

使用如下命令创建集群

redis-cli --cluster create --cluster-replicas 1 主节点1的IP:端口    主节点2的IP:端口    主节点3的IP:端口   从节点1的IP:端口    从节点2的IP:端口    从节点3的IP:端口  

选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

redis-cli --cluster create --cluster-replicas 1 172.16.153.178:7001 172.16.153.178:7002 172.16.153.178:7003 172.16.153.179:7011 172.16.153.179:7012 172.16.153.179:7013


image.png
image.png
image.png

验证

[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7002 -c set name xiguatian
OK
[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7002 -c get name
"xiguatian"
[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7003 -c get name
"xiguatian"
[root@ela2 ~]# redis-cli -h 192.168.122.218 -p 7013 -c get name
"xiguatian"


4. 深入集群

集群的伸缩

添加节点(扩容)
  1. 准备节点
    image.png

启动两个新的 redis 实例, 分别监听不同端口 比如 70047014

我这里是分别在两台主机上启动 redis 实例

[root@s1 redis]# cp cluster-redis-7001.conf cluster-redis-7004.conf
[root@s1 redis]# sed -i 's/7001/7004/g' cluster-redis-7004.conf
[root@s1 redis]# redis-server cluster-redis-7004.conf
 [root@s2 redis]# cp cluster-redis-7011.conf cluster-redis-7014.conf
 [root@s2 redis]# sed -i 's/7011/7014/g' cluster-redis-7014.conf
 [root@s2 redis]# redis-server cluster-redis-7014.conf

2.加入集群中

添加一个新的节点为主节点

redis-trib.rb   add-node        new_host:new_port existing_host:existing_port

//     new_host:new_port 为新添加的节点信息
//    existing_host:existing_port 集群中任意节点的信息

添加一个新节点为从节点

redis-trib.rb   add-node     --slave  --master-id 主节点的 ID       new_host:new_port existing_host:existing_port


主节点 ID 可以使用如下命令查看,此命令还同时输出了各个节点的角色

redis-trib.rb    check           host:port

//  host:port 为集群中任意节点的信息

image.png

例如:
加入一个主节点到集群中
[root@s1 redis]# redis-trib.rb add-node 172.16.153.182:7004  172.16.153.182:7002


加入一个从节点到集群中
  • 获取刚才新加入的主节点信息
[root@s1 redis]# redis-trib.rb check 172.16.153.182:7002

image.png

  • 添加从节点到集群中,并指定他的主节点
[root@s1 redis]# redis-trib.rb add-node    --slave  --master-id 7be2d3d7d25112178ea5cdd3c218bbb2298b62ee         172.16.153.181:7014  172.16.153.182:7001


image.png

  1. 向新加入的主节点中分配槽

image.png

image.png

  1. 完成后观察各主节点的数据槽的分配情况

image.png

减少节点(缩容)

image.png

缩容时的迁移槽

image.png

忘记节点操作

image.png

实验

命令:

./redis-trib.rb  reshard --from   下线节点 ID  --to  集群中的任意主节点 ID  --slots   迁移到槽数   目前集群中任意节点 IP:端口


注意:
需要把下线节点的槽数平均迁移到剩余的所有节点,所以需要分批分次执行上面的命令。
并且,每次都集群中的主节点应该不同。

删除节点

当我们使用 redis-trib.rb 工具时,只需要在目前集群中的任意一个节点中执行如下命令即可。

注意:
你应该始终先删除从节点,再删除主节点

image.png

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shark_西瓜甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值