Redis 集群

https://www.jianshu.com/p/faf342b9f01b

三、 集群

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<filename>:请注意,尽管有此选项的名称,但它不是用户可编辑的配置文件,而是Redis Cluster节点每次发生更改时都会自动保留集群配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了诸如群集中其他节点之类的内容,它们的状态,持久变量等等。通常,由于收到某些消息,此文件将被重写并刷新到磁盘上。
cluster-node-timeout<milliseconds>:Redis群集节点不可用的最长时间(不被视为失败)。如果主节点无法访问的时间超过指定的时间长度,则其主节点将对其进行故障转移。此参数控制Redis Cluster中的其他重要事项。值得注意的是,在指定的时间内无法到达大多数主节点的每个节点都将停止接受查询。
cluster-slave-validity-factor<factor>:如果设置为零,则从服务器将始终认为自己是有效的,因此将始终尝试对主服务器进行故障转移,而与主服务器和从服务器之间的链接保持断开状态无关。如果该值为正,则将最大断开时间计算为节点超时值乘以此选项提供的因子,如果节点是从节点,则如果断开主链接的时间超过指定的时间,它将不会尝试启动故障转移。例如,如果节点超时设置为5秒,而有效性因子设置为10,则从服务器与主服务器断开连接超过50秒将不会尝试对其主服务器进行故障转移。请注意,如果没有从属设备可以对其进行故障转移,则任何非零的值都可能导致Redis群集在主设备发生故障后不可用。在这种情况下,只有当原始主服务器重新加入群集后,群集才会恢复可用。
cluster-migration-barrier<count>:主机将保持连接的最小数量的从机,以便另一个从机迁移到不再受任何从机覆盖的主机。有关更多信息,请参见本教程中有关副本迁移的相应部分。
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

查看节点信息

image.png

创建集群

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

完全配置好后,可以观察集群的数据槽的分配情况

redis-cli -p 7011 cluster  slots

最后用客户端登录集群的方式登录到集群中的任意一个节点,设置键值对进行测试。

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-cli --cluster help

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

redis-cli --cluster   add-node   new_host:new_port existing_host:existing_port

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

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

redis-cli --cluster add-node 从节点 IP:端口   集群中任意一个节点 ip:端口 --cluster-slave  --cluster-master-id 集群中某一个主节点id


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

redis-cli  --cluster  check     127.0.0.1:7001
  1. 向新加入的主节点中分配槽

目前redis cli只能在管理员支持的情况下执行reshard, 需要我们自己指定希望重新分配多少插槽

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)?

假设,我们这里重新分配 1000 个

How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID?

接着,我们应该告诉 Redis 谁接收这次哈希插槽,需要提供某个 master 的 ID

How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? 6ab8f7fdfba1758c969e62cf07e584faca657bd5
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:

这里的意思是重新分配的 1000 插槽由哪些节点提供,这里我们输入 all, 表示当前集群中所有由插槽的节点都提供一部分。

    Moving slot 11254 from 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7
    Moving slot 11255 from 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7
Do you want to proceed with the proposed reshard plan (yes/no)? yes

键入 yes

你将会看到分配的过程

  1. 完成后观察各主节点的数据槽的分配情况
M: 72dd63854cf5cb9ab43d0bf4ca5fa32d5d5e098e 127.0.0.1:7001
   slots:[333-5460] (5128 slots) master
   1 additional replica(s)
M: 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7 192.168.122.230:7003
   slots:[11256-16383] (5128 slots) master
   1 additional replica(s)
M: 6ab8f7fdfba1758c969e62cf07e584faca657bd5 192.168.122.230:7004
   slots:[0-332],[5461-5794],[10923-11255] (1000 slots) master
   1 additional replica(s)
   replicates 6ab8f7fdfba1758c969e62cf07e584faca657bd5
M: 4a749969bb98334c5bc950823753c1376179e4b5 192.168.122.230:7002
   slots:[5795-10922] (5128 slots) master

减少节点(缩容)

image.png

缩容时的迁移槽

image.png

忘记节点操作

image.png
实验

分配插槽的命令:

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


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

删除节点

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

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

redis-cli --cluster del-node 127.0.0.1:7001 8e23a7c0006584ec487c3c8493d53ca519cc68900

测试故障转移

我们可以通过以下命令识别主机并使其崩溃:

redis-cli -p 主节点端口 debug segfault

被执行的 节点会被 down 掉,服务会停止

此时,其对应的从节点会成为主节点。
当被 down 掉的主节点重新上线后会成为新主节点的从节点。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349