Redis集群Cluster部署

这篇Redis 集群部署笔记参考的书籍资料是:
《Redis入门指南》第二版,作者:李子骅 第8章
《Redis开发与运维》 作者:付磊 第10章
以及博客园的博文:https://www.cnblogs.com/kevingrace/p/7910692.html

以下是学习笔记,记录了Redis集群部署过程,这篇文档里,讲解通过使用Redis Commands 命令来部署集群,大家也可以用redis-trib.rb 这个集群管理工具,来操作Redis集群部署。

操作环境准备了6台虚拟机,因为Redis 集群里至少需要3个master数据库才能正常运行。 所以这个架构是3主3从。

IP 端口 功能
192.168.100.4 6379 master
192.168.100.5 6380 master
192.168.100.6 6381 master
192.168.100.7 6382 slave
192.168.100.8 6383 slave
192.168.100.9 6384 slave

各结点对应关系

master slave
192.168.100.4 192.168.100.7
192.168.100.5 192.168.100.8
192.168.100.6 192.168.100.9

1.部署前的准备工作

(1)确保每个redis 结点里没有数据。
(2)每台机器的防火墙,进行配置,或者关掉。(我在虚拟机里关掉了防火墙)
(3)每台redis 配置文件里,bind 127.0.0.1 这一行注释掉
(4)每个Redis结点的port 设置成不一样的。(多台机器里,这个看个人习惯)

2.正式部署集群

首先进行通用配置修改,在每台Redis结点的配置文件redis.conf 中修改如下配置内容:

port 6379        
daemonize yes    //开启守护进程
logfile "/var/log/server/redis.log"    //日志
requirepass lafenfen            //设置密码
masterauth lafenfen            //如果requirepass设置了,masterauth也必须要保持一样,否则无法同步。



cluster-enabled yes    //开启集群模式 
cluster-config-file nodes-6379.conf    //每台机器的集群配置文件,不需要人工修改,程序自动记录,这块名字可以根据端口号进行设置。
cluster-node-timeout 15000  //单位是毫秒,如果在15秒还没有响应,结点会被认为出了故障。

配置完成后,分别启动Redis服务

./redis-server ../config/redis.conf 

可以看到cluster字样

ps aux|grep redis |grep -v 'grep'

root      3008  0.0  0.6 156552  3300 ?        Ssl  06:12   0:04 ./redis-server *:6379 [cluster]

各台主机的Redis服务启动后,现在开始操作结点

3添加结点到集群

登陆192.168.100.4这台机器,连接redis

./redis-cli
auth lafenfen

127.0.0.1:6379> info cluster
# Cluster
cluster_enabled:1

使用CLUSTER MEET 命令,将其余五台服务器,添加到一个集群圈里。

127.0.0.1:6379> cluster meet 192.168.100.5 6380
OK
127.0.0.1:6379> cluster meet 192.168.100.6 6381
OK
127.0.0.1:6379> cluster meet 192.168.100.7 6382
OK
127.0.0.1:6379> cluster meet 192.168.100.8 6383
OK
127.0.0.1:6379> cluster meet 192.168.100.9 6384

然后输入命令 cluser nodes 查看当前结点关系

可以采用联想法在大脑里记忆,集群节点开大会。 meet就是会议的意思。

每个节点被添加后,都会随机产生一个角色(master或slave)

通过cluser nodes命令查看各节点的身份信息,6个节点都是master 这个角色。

image.png

一会将使用命令手动修改节点的角色,现在我开始准备分配插槽。

4.分配插槽

关于插槽的概念是这样的。
在Redis Cluster 将把所有的数据映射到16384个槽中。我们使用redis时,创建的每个key会映射到一个固
定的插槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。通过
cluster addslots命令为指定的master主节点分配插槽。

命令:CLUSTER ADDSLOTS slot [slot ...]

在未分配插槽前,cluster info 显示集群信息,下图红线处代表插槽分配数量为0

image.png

现在给100.4 100.5 100.6 这三台Redis结点分配插槽。登陆100.4服务器


先给100.4自己分配,IP地址直接用127.0.0.1 就行
./redis-cli -h 127.0.0.1 -p 6379 -a lafenfen cluster addslots {0..5461}

//其余两台注意,要加上IP地址,和指定端口号
./redis-cli -h 192.168.100.5 -a lafenfen -p 6380 cluster addslots {5462..10922}
./redis-cli -h 192.168.100.6 -a lafenfen -p 6381 cluster addslots {10923..16383}

执行命令时,会有下面的提示,可以忽略。
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

注意:上面的{0..5461} 表示范围时{}里是两个点(..),这块不要写错。

连接redis服务器,查看插槽分配情况

# 前两项代表插槽开始和结束的点
127.0.0.1:6379> cluster slots
1) 1) (integer) 0
   2) (integer) 5461
   3) 1) "192.168.100.4"
      2) (integer) 6379
      3) "cf685d370fb79383fa30832c4035d73b51d33d7a"

2) 1) (integer) 5462
   2) (integer) 10922
   3) 1) "192.168.100.5"
      2) (integer) 6380
      3) "1a73ba8c6367e4c592b49c60d7aef29ccf0687bb"

3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "192.168.100.6"
      2) (integer) 6381
      3) "177749c1c7988f5cf8edd32cc153f32ce596b445"

5.修改节点角色

通过命令修改指定节点的身份,让它从master变为slave

CLUSTER REPLICATE <master node_id>

登陆指定节点服务器,然后运行上面的命令,其中的node_id 就是指定主节点的运行ID

在我的规划里 3主3从的对应结点关系如下

master slave
192.168.100.4 192.168.100.7
192.168.100.5 192.168.100.8
192.168.100.6 192.168.100.9

现在100.4 的集群运行id 为 b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15
我要配置100.7 让它变成100.4 的slave结点

登陆100.7服务器上的redis
./redis-cli
cluster replicate  b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15
OK

这样就设置成功。其余100.8,100.9也依样修改操作。

最后各结点的对应关系如下:

cluster nodes
dd42566f143bdf4731fbaa22fb1160634b310a7a 192.168.100.5:6380@16380 master - 0 1623805285501 0 connected 5462-10922
646e942d30a4ad0b17eb805839b2462edcde57e3 192.168.100.8:6383@16383 slave dd42566f143bdf4731fbaa22fb1160634b310a7a 0 1623805288520 4 connected
76c42fc6a375283d5e13c264ed197070edafa2ba 192.168.100.7:6382@16382 slave b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15 0 1623805287514 3 connected
b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15 192.168.100.4:6379@16379 myself,master - 0 0 1 connected 0-5461
7cb96ccf3ae2acc59804e7e5be42d15bde5eea38 192.168.100.6:6381@16381 master - 0 1623805288017 2 connected 10923-16383
9a6cabdead853aa1da579d5984ef78ded0c4894e 192.168.100.9:6384@16384 slave 7cb96ccf3ae2acc59804e7e5be42d15bde5eea38 0 1623805289529 5 connected
127.0.0.1:6379> 

到此集群配置工作完成,可以开始使用了。

6、使用集群

Redis 将每个键的键名的有效部分使用CRC16算法计算出hash值,然后取16384的余数,使得每个键可以分配到16384个插槽中的某一个里。

其中有效部分是指:
(1) 键名包含{}符号时,例如 name:{zhangsan} 这种键名,将取zhangsan 做有效部分,然后CRC16算法计算出zhangsan的hash值
(2) 如果不满足上一条规则时,将么整个键 就被视为有效部分

在192.168.100.4 的Redis服务器上,执行set命令
127.0.0.1:6379> set a b
(error) MOVED 15495 192.168.100.6:6381
127.0.0.1:6379> 
提示a 这个变量写入,应该到100.6的机器上操作
在100.6服务器上执行命令

127.0.0.1:6381> set a b
OK

同时登陆它的从数据库100.9,可以看到数据在这里做了备份。
127.0.0.1:6384> keys *
1) "a"
127.0.0.1:6384> get a
(error) MOVED 15495 192.168.100.6:6381
127.0.0.1:6384> 

redis-cli客户端命令提供了参数 -c ,它支持自动重定向,比较方便。

Cluster 故障恢复

当某个master节点出现故障时,对应的slave节点会成为新的master节点。如果有多个slave节点时,会通过选举,选出一个做为新的master节点。

但是一个至少负责一个插槽的主数据库下线且没有相应的从数据库可以进行故障恢复时,整个集群会进入下线状态无法继续工作。

需要将下面的配置,改成no 就不会出现这种情况了。

cluster-require-full-coverage no

集群配置项

(1) cluster-enabled yes     开启集群运行模式

(2) cluster-config-file nodes-6379.conf    集群配置文件
这里记录的内容和执行 cluster nodes 命令看到的是一样的。
这个文件程序自动添加和更新,不需要人工处理。

dd42566f143bdf4731fbaa22fb1160634b310a7a 192.168.100.5:6380@16380 master - 0 1623805285501 0 connected 5462-10922

第1列:结点的运行ID,它是集群中的唯一标识。
第2列:IP和端口号
第3列:角色 master 或者slave
最后一列:是分配的插槽起始和结束范围。

(3)cluster-node-timeout 15000

单位:毫秒

集群中的各结点,会对其它结点进行ping操作,
当超出 cluster-node-timeout  选项的时间,还没有反应,就疑似这个结点出了故障。





(4)cluster-replica-validity-factor 10


(5)cluster-migration-barrier 1

(6)cluster-require-full-coverage yes
说明:
当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群下线,状态不可用。 
可以设置为no,将忽略这个影响。

这块有相关技术人员做了试验,可以看下链接:
https://www.qedev.com/bigdata/866.html




(7)cluster-replica-no-failover no

集群操作命令整理

集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键 。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容