Redis-Cluster

Redis Cluster是一个高性能高可用的分布式系统。由多个Redis实例组成的整体,数据按照一致性哈希算法存储分布在多个Redis实例上,并对使用虚拟槽(Slot)对一致性哈希算法进行改进,通过Gossip协议来进行节点之间通信。

关于一致性哈希,可以看这篇文章 http://www.zsythink.net/archives/1182

Redis集群一般由多个节点组成,节点数量至少为6个(3主3从)才能保证组成完整高可用的集群。

1.Redis Cluster集群搭建

1.1准备各节点配置文件(配置项参考文末的说明)
[root@VM_41_201_centos redis.d]# ls -l
总用量 344
-rw-r--r-- 1 root root 46748 5月   7 15:36 redis-6379.conf
-rw-r--r-- 1 root root 46748 5月   7 15:41 redis-6380.conf
-rw-r--r-- 1 root root 46748 5月   7 15:42 redis-6381.conf
-rw-r--r-- 1 root root 46748 5月   7 15:43 redis-6382.conf
-rw-r--r-- 1 root root 46748 5月   7 15:43 redis-6383.conf
-rw-r--r-- 1 root root 46748 5月   7 15:44 redis-6384.conf
-rw-r--r-- 1 root root 46730 5月   7 14:30 redis.conf
-rw-r--r-- 1 root root  7355 5月   7 14:30 redis-sentinel.conf
1.2启动各redis节点(各节点以cluster方式启动,但彼此并不知道其它节点的存在需要使用meet命令握手通信)
[root@VM_41_201_centos redis.d]# redis-server redis-6379.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6380.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6381.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6382.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6383.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6384.conf
[root@VM_41_201_centos redis.d]# ps -ef | grep redis
root       475     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6379 [cluster]
root       494     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6380 [cluster]
root       498     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6381 [cluster]
root       502     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6382 [cluster]
root       506     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6383 [cluster]
root       565     1  0 15:45 ?        00:00:00 redis-server 127.0.0.1:6384 [cluster]
root       576 31779  0 15:45 pts/1    00:00:00 grep --color=auto redis
root     28350 27811  0 14:35 pts/0    00:00:00 vim redis-6379.conf
1.3各节点握手,建立集群(此时未分配slot,处于fail状态,还不能正常工作)
127.0.0.1:6379>cluster meet 127.0.0.1 6380
127.0.0.1:6379>cluster meet 127.0.0.1 6381
127.0.0.1:6379>cluster meet 127.0.0.1 6382
127.0.0.1:6379>cluster meet 127.0.0.1 6383
127.0.0.1:6379>cluster meet 127.0.0.1 6384
1.4执行addslots.sh,手动为各节点添加slot
[root@VM_41_201_centos redis.d]# ./addslots.sh 6379 0 5461
...
[root@VM_41_201_centos redis.d]# ./addslots.sh 6380 5462 10922
...
[root@VM_41_201_centos redis.d]# ./addslots.sh 6381 10923 16383
...
1.5再次查看cluster info信息
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:2
cluster_stats_messages_sent:24495
cluster_stats_messages_received:24495
1.6再次查看cluster nodes信息
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 cluster nodes
5a6b4ea16d2064c7298acda98fb2984eb3c784b6 127.0.0.1:6383 master - 0 1494155309857 4 connected
ac9c04d13e3c6fd8dbce0333679345da6583b1ca 127.0.0.1:6381 master - 0 1494155312871 3 connected 10923-16383
54d92a13eca6aeb2bd4a0c0a51a59250133d833a 127.0.0.1:6379 myself,master - 0 0 2 connected 0-5461
0d50552bab86a522937a7943f0843d86945e2894 127.0.0.1:6380 master - 0 1494155311864 1 connected 5462-10922
d0de26e8ec68996f404091e729688b41c5068231 127.0.0.1:6382 master - 0 1494155307847 5 connected
e3b11cd3ec0e4d6f67d010dd9cf2a3dabf6030f9 127.0.0.1:6384 master - 0 1494155313883 0 connected
1.7简单测试
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 set hello redis
OK
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 get hello
"redis"
[root@VM_41_201_centos redis.d]#

至此,模拟的3主3从的cluster集群就创建成功了。

redis实例配置文件关于cluster的主要配置项:

#节点端口
port 6379
# 开启集群模式
cluster-enabled yes
# 节点超时时间, 单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6379.conf"

addslots.sh:

#!/bin/bash
# cluster addslots(循环添加)
# $1:port
# $2:start
# $3:end
for((i=$2;i<=$3;i++))
do
        redis-cli -h 127.0.0.1 -p $1 cluster addslots $i
done

2.集群伸缩

Redis集群提供了灵活的节点扩容和收缩方案,在不影响集群对外提供服务的情况下可以为集群添加节点进行扩容,也可以下线部分节点进行缩容。

3.请求路由

在Redis Cluster集群模式下,Redis接收任何键相关命令时首先计算键对应的槽,再根据槽找出所对应的节点,如果节点是自身,则处理键命令;否则回复MOVED重定向错误,通知客户端请求正确的节点。

使用redis-cli命令时,可以加入-c参数支持自动重定向,简化手动发起重定向操作。redis-cli自动帮我们连接到正确的节点执行命令,这个过程是在redis-cli内部维护,实质上是client端接到MOVED信息之后再次发起请求,并不在Redis节点中完成请求转发。

大多数开发语言的Redis客户端都采用Smart客户端支持集群协议。Smart客户端通过在内部维护slot→node的映射关系,本地就可实现键到节点的查找,从而保证IO效率的最大化,而MOVED重定向负责协助Smart客户端更新slot→node映射。

进阶文章:唯品会Redis cluster大规模生产实践经验

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