Redis之集群环境搭建

Redis集群

一、Redis集群相关概念

1.Redis集群介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:

1.自动分割数据到不同的节点上。

>2.整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

2.Redis分片策略

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有==16384==个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

节点 A 包含 0 到 5500号哈希槽.

节点 B 包含5501 到 11000 号哈希槽.

节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

3.Redis的主从复制模型

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.

在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.

然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了

不过当B和B1 都失败后,集群是不可用的.

二、Redis集群搭建

1.集群的结构

根据官网描述要让redis集群环境正常运行我们必须准备至少3个主节点,所以在本文中的集群环境我们准备3个主节点实例及对应的给每个主节点准备一个从节点实例,一共6个redis实例。正常需要6个虚拟机节点,本文我们在一个虚拟机上模拟。

2.集群的环境准备

搭建集群需要使用到官方提供的ruby脚本。

需要安装ruby的环境。

安装ruby

yum -yinstallrubyyum -yinstallrubygemsgeminstallredis

错误处理

[root@hadoop-node01 src]# gem install redisERROR:  Error installing redis:    redis requires Ruby version >=2.2.2.

解决方式参考此链接:https://blog.csdn.net/qq_38526573/article/details/87220510

解决完成后再次执行gem install redis命令

[root@hadoop-node01 ~]#geminstallredisFetching:redis-4.1.0.gem(100%)Successfullyinstalledredis-4.1.0Parsingdocumentationforredis-4.1.0Installingridocumentationforredis-4.1.0Doneinstallingdocumentationforredisafter1seconds1geminstalled

注意ruby对应的redis版本是4.1.0

各版本下载地址

http://download.redis.io/releases/

3.搭建集群环境

3.1创建实例

在/opt目录下创建redis-cluster目录,并在该目录下创建6个redis实例

3.2修改配置文件

分别修改6个实例的配置文件

1.修改端口号

2.打开cluster-enable前面的注释

3.注释掉绑定ip

4.保护模式修改为no

5.设置日志存储路径

注意重复修改6次。

3.3复制ruby脚本

3.4启动6个实例

启动实例时可能报错

Ps:[ERR]Node172.168.63.202:7001isnotempty.Eitherthenodealreadyknowsothernodes(checkwithCLUSTERNODES)orcontainssome

解决办法:

将每个节点下aof、rdb、nodes.conf本地备份文件删除;

编写简单脚本启动

start-all.sh

cd/opt/redis-cluster/redis7001rm -rf dump.rdb nodes.conf appendonly.aofsrc/redis-server redis.confcd/opt/redis-cluster/redis7002rm -rf dump.rdb nodes.conf appendonly.aofsrc/redis-server redis.confcd/opt/redis-cluster/redis7003rm -rf dump.rdb nodes.conf appendonly.aofsrc/redis-server redis.confcd/opt/redis-cluster/redis7004rm -rf dump.rdb nodes.conf appendonly.aofsrc/redis-server redis.confcd/opt/redis-cluster/redis7005rm -rf dump.rdb nodes.conf appendonly.aofsrc/redis-server redis.confcd/opt/redis-cluster/redis7006rm -rf dump.rdb nodes.conf appendonly.aofsrc/redis-server redis.conf

改变文件脚本权限模式:

chmod 777 start-all.sh

然后再启动:

./start-all.sh

3.5创建集群

现在我们已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。

通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作

./redis-trib.rbcreate--replicas 1 192.168.88.121:7001 192.168.88.121:7002 192.168.88.121:7003 192.168.88.121:7004 192.168.88.121:7005 192.168.88.121:7006

命令说明

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

之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave

redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 ==yes==, redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:

[root@hadoop-node01 redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.88.121:7001192.168.88.121:7002192.168.88.121:7003192.168.88.121:7004192.168.88.121:7005192.168>>> Creating clusterInvalid IPorPort (given as192.168) - useIP:Port format[root@hadoop-node01 redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.88.121:7001192.168.88.121:7002192.168.88.121:7003192.168.88.121:7004192.168.88.121:7005192.168.88.121:7006>>> Creating cluster>>> Performing hash slots allocation on6nodes...Using3masters:192.168.88.121:7001

192.168.88.121:7002

192.168.88.121:7003

Adding replica 192.168.88.121:7005 to 192.168.88.121:7001

Adding replica 192.168.88.121:7006 to 192.168.88.121:7002

Adding replica 192.168.88.121:7004 to 192.168.88.121:7003

>>> Trying to optimize slaves allocation for anti-affinity[WARNING] Some slaves areinthe same host as their masterM:f97aa0b15e5a7f51c69f26543e7b785d52479afe192.168.88.121:7001slots:0-5460(5461slots) masterM:8e4a66caac1f738e9d951d212a5ba2a00e675acd192.168.88.121:7002slots:5461-10922(5462slots) masterM:1528779486cb926b11cb996c5682c6b749d26bc1192.168.88.121:7003slots:10923-16383(5461slots) masterS:ea08ca738d621c5161a0ecfe838ed8fd89f5c0c5192.168.88.121:7004replicates8e4a66caac1f738e9d951d212a5ba2a00e675acdS:0ac234a10f28e24173ffc4e686073fa7710dd264192.168.88.121:7005replicates1528779486cb926b11cb996c5682c6b749d26bc1S:d560e0e3da9a715fb4aae5910cf5533cec2f815f192.168.88.121:7006replicates f97aa0b15e5a7f51c69f26543e7b785d52479afeCan I set the above configuration? (type'yes'to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaitingforthe cluster to join......>>> Performing Cluster Check (using node192.168.88.121:7001)M:f97aa0b15e5a7f51c69f26543e7b785d52479afe192.168.88.121:7001slots:0-5460(5461slots) master1additional replica(s)S:d560e0e3da9a715fb4aae5910cf5533cec2f815f192.168.88.121:7006slots:(0slots) slave  replicates f97aa0b15e5a7f51c69f26543e7b785d52479afeM:1528779486cb926b11cb996c5682c6b749d26bc1192.168.88.121:7003slots:10923-16383(5461slots) master1additional replica(s)M:8e4a66caac1f738e9d951d212a5ba2a00e675acd192.168.88.121:7002slots:5461-10922(5462slots) master1additional replica(s)S:0ac234a10f28e24173ffc4e686073fa7710dd264192.168.88.121:7005slots:(0slots) slave  replicates1528779486cb926b11cb996c5682c6b749d26bc1S:ea08ca738d621c5161a0ecfe838ed8fd89f5c0c5192.168.88.121:7004slots:(0slots) slave  replicates8e4a66caac1f738e9d951d212a5ba2a00e675acd[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All16384slots covered.

这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。

4.测试集群

登录命令

redis7001/src/redis-cli -h 192.168.88.121 -p 7001 -c

添加一个key被分配到7002节点上,注意连接的端口变为了7002。

5.查看集群环境

命令说明

cluster info打印集群的信息

cluster nodes列出集群当前已知的所有节点( node),以及这些节点的相关信息。节点

cluster meet <ip> <port>将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。

cluster forget从集群中移除 node_id 指定的节点。

cluster replicate将当前节点设置为 node_id 指定的节点的从节点。

cluster saveconfig将节点的配置文件保存到硬盘里面。槽(slot)

cluster addslots

[slot ...]

将一个或多个槽( slot)指派( assign)给当前节点。

cluster delslots

[slot ...]

移除一个或多个槽对当前节点的指派。

cluster flushslots移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。

cluster setslot

node

将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。

cluster setslot

migrating

将本节点的槽 slot 迁移到 node_id 指定的节点中。

cluster setslot

importing

从 node_id 指定的节点中导入槽 slot 到本节点。

cluster setslot <slot> stable取消对槽 slot 的导入( import)或者迁移( migrate)。键

cluster keyslot <key>计算键 key 应该被放置在哪个槽上。

cluster countkeysinslot

返回槽 slot 目前包含的键值对数量。

cluster getkeysinslot

返回 count 个 slot 槽中的键

cluster info命令

cluster nodes

6.增加节点

添加新的节点的基本过程就是添加一个空的节点然后移动一些数据给它,有两种情况,添加一个主节点和添加一个从节点(添加从节点时需要将这个新的节点设置为集群中某个节点的复制)

添加一个新的实例

启动新的7007节点,使用的配置文件和以前的一样,只要把端口号改一下即可,过程如下:

在终端打开一个新的标签页.

进入redis-cluster 目录.

复制并进入redis7007文件夹.

和其他节点一样,创建redis.conf文件,需要将端口号改成7007.

最后启动节点 ../redis-server ./redis.conf

如果正常的话,节点会正确的启动.

1.添加主节点

./redis-trib.rbadd-node192.168.88.121:7007192.168.88.121:7001

第一个参数是新节点的地址,第二个参数是任意一个已经存在的节点的IP和端口

新节点现在已经连接上了集群, 成为集群的一份子, 并且可以对客户端的命令请求进行转向了, 但是和其他主节点相比, 新节点还有两点区别:

新节点没有包含任何数据, 因为它没有包含任何哈希槽.

尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中。

接下来, 只要使用 redis-trib 程序, 将集群中的某些哈希桶移动到新节点里面, 新节点就会成为真正的主节点了。

重新分配slot

./redis-trib.rb reshard 192.168.88.121:7001

只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点

7007节点被分类slot,成了真正意义上的主节点

2.添加从节点

添加的从节点被随机的配置任意的主节点

./redis-trib.rb add-node--slave 192.168.88.121:7008 192.168.88.121:7001

将从节点添加给指定的主节点

./redis-trib.rb add-node--slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000

7.删除节点

使用del-node命令移除节点。

./redis-trib.rb del-node 192.168.2.11:7007

第一个参数:任意集群中现有的地址192.168.88.121:7001

第二个参数:你想移除的节点id ab853f5e95f1e32e0ee40543a9687d60fc3bd941 (该id可以在想要移除的节点nodes.conf文件中找到)

关闭redis

redis7001/redis-cli -p 7001 shutdown

./redis-cli shutdown

pkill -9 redis-server –关闭所有的redis服务

~好了redis的集群操作就介绍到此,

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

推荐阅读更多精彩内容

  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,265评论 0 36
  • redis集群分为服务端集群和客户端分片,redis3.0以上版本实现了集群机制,即服务端集群,3.0以下使用客户...
    hadoop_null阅读 1,583评论 0 6
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,958评论 2 27
  • 由于redis集群需要使用ruby命令,所以我们需要安装ruby(所有的操作都是在单机部署的伪集群模式下进行) (...
    蜗牛docom阅读 445评论 0 2
  • 我所理解的生活就是除了造谣以外,去造其他一切东西。我心中的造化,就是创造了多少文化。 我所理解的生活就是做着自己喜...
    EutyDing阅读 626评论 2 12