redis cluster管理

使用端口

redis cluster默认使用2个接口,6379用于处理客户端请求, *cluster bus port默认在数据端口上加10000,也可以用cluster-port指定端口

创建redis-cluster

在redis.conf加最少配置

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

To enable cluster mode, set the cluster-enabled directive to yes

每个实例还包含一个文件路径,用于节点的配置存储, 默认是node.conf

一个最小的cluster集群, 至少包括3个master节点

正式环境,推荐6个节点, 3个master,3个replicas

可以按照如下步骤创建6节点的cluster

创建目录

mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

在每个节点下创建redis.conf 文件,按照前面最小配置的例子,只是端口不同从7000-7005

参考如下命令启动每个实例

cd 7000
redis-server ./redis.conf

会看到如下的日志

[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1

创建cluster

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

这个命令是创建一个cluster, --cluster-replicas=1表示给每个master分配一个replica

redis-cli 会弹出一个配置确认,输入yes之后,就是执行集群配置和节点加入, 最终会看到如下内容:

[OK] All 16384 slots covered

Interact with the cluster

To connect to Redis Cluster, you'll need a cluster-aware Redis client

参考文档 https://redis.io/docs/connect/clients/

使用redis-cli:

redis-cli $ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7002> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"    

Reshard the cluster

使用redis-cli开始reshard

redis-cli --cluster reshard 127.0.0.1:7000

会出现如下确认

How many slots do you want to move (from 1 to 16384)?

We can try to reshard 1000 hash slots, 在上面交互提示中输入 1000

然后会提示输入要迁移这个1000个slot到哪个节点:

What is the receiving node ID?

我们选择127.0.0.1:7000这个节点,获取node id

$ redis-cli -p 7000 cluster nodes | grep myself
97a3a64667477371c4479320d683e4c8db5858b1 :0 myself,master - 0 0 0 connected 0-5460

输入node id之后, 会提示选择从哪些节点迁移slot

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:

我们输入all, 从其他所有节点迁移

然后会提示确认迁移计划,确认之后执行迁移

可以使用如下命令查看迁移结果

redis-cli --cluster check 127.0.0.1:7000

在迁移slot的过程中,客户端的访问不受影响

也可以使用非交互式的迁移命令

redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes

目前还没有根据key的分布自动rebalance的机制

Test the failover

$ redis-cli -p 7002 debug segfault
Error: Server closed the connection

failover期间, redis节点不能接受请求。有可能出现数据不一致,但是发生的概率很小,because Redis sends the reply to the client, and the commands to replicate to the replicas, about at the same time, so there is a very small window to lose data

Manual failover

先对应master的一个replica发送命令

redis-cli -p 7001 CLUSTER FAILOVER

Manual failover, 不影响客户端访问

添加节点

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

这个命令第一个参数指定了要加入的新节点127.0.0.1:7006, 第二个参数为集群中已有的任意一个节点

实际上这里redis-cli做了很少的事情,只是给节点发送了 CLUSTER MEET message

现在可以在集群中看到新加入的节点了

redis 127.0.0.1:7006> cluster nodes
3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 127.0.0.1:7001 master - 0 1385543178575 0 connected 5960-10921
3fc783611028b1707fd65345e763befb36454d73 127.0.0.1:7004 slave 3e3a6cb0d9a9a87168e266b0a0b24026c0aae3f0 0 1385543179583 0 connected
f093c80dde814da99c5cf72a7dd01590792b783b :0 myself,master - 0 0 0 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543178072 3 connected
a211e242fc6b22a9427fed61285e85892fa04e08 127.0.0.1:7003 slave 97a3a64667477371c4479320d683e4c8db5858b1 0 1385543178575 0 connected
97a3a64667477371c4479320d683e4c8db5858b1 127.0.0.1:7000 master - 0 1385543179080 0 connected 0-5959 10922-11422
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7005 master - 0 1385543177568 3 connected 11423-16383

需要留意,新加入的节点可以转发客户端的请求了,但是还是和其他节点不同

  • 没有数据,没有分配hash slots

  • 作为一个没有hash slots的master, 不参与选举

然后就可以使用前面的reshard步骤给这个新节点分配hash slots了

添加新的replica

还是使用add-node命令, 只是加上--cluster-slave

没有指定新加的节点作为哪个节点的replica,所以会随机选一个replica数量最小的master,作为它的replica

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave

指定master节点,加为它的replica

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

也可以先把新节点加入成为一个空的master, 然后再转为某个节点的replica

redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

还可以用这个命令,把一个master的replica转位另一个master的replica

Remove a node

删除一个replica

redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`

该命令的第一个参数是集群中的任意节点,第2个参数是要删除的node id

也可以使用该命令删除一个master节点,但是要求该master节点必须是空节点(可以先reshard走该节点的数据)

另外一个删除master节点的方法是 manual failover把它转为replica,再删除

Replica migration

在redis cluster中,你可以随时把一个master的replica重新配置为另一个master replica, 使用如下命令

CLUSTER REPLICATE <master-node-id>

redis cluster可以自动迁移master的replica,配置参数cluster-migration-barrier

Upgrade nodes in a Redis Cluster

更新slave很简单, 直接重启就可以了

更新master复杂些

  1. Use CLUSTER FAILOVER to trigger a manual failover of the master to one of its replicas

  2. Wait for the master to turn into a replica

  3. Finally upgrade the node as you do for replicas

  4. 如果还想原来的节点做回master,再来一次clsuter failover

Migrate to Redis Cluster

迁移需要留意:

若果使用了 Multiple keys operations, transactions, Lua scripts 包含多key, 并且这些key没有指定相同的hash tag,会有问题,应用需要做相应的调整

确认应用兼容之后,可以按照如下步骤迁移:

  1. 停止访问redis, 现在还没有在线迁移的支持

  2. 使用BGREWRITEAOF命令,给所有master节点生成append only file, 等待这些文件生成好

  3. Save your AOF files from aof-1 to aof-N somewhere, 然后可以关闭旧的redis节点了

  4. 创建一个redis cluster, N masters and zero replicas. Make sure all your nodes are using the append only file for persistence.

  5. stop掉cluster中的所有redis节点,并替换它们的append only file

  6. Restart your Redis Cluster nodes with the new AOF files, They'll complain that there are keys that should not be there according to their configuration.

  7. Use redis-cli --cluster fix command in order to fix the cluster so that keys will be migrated according to the hash slots each node is authoritative or not.

  8. Use redis-cli --cluster check at the end to make sure your cluster is ok

  9. Restart your clients modified to use a Redis Cluster aware client library

另外一种前一方法是使用 redis-cli --cluster import

这个命令会move所有旧实例的key到新的redis cluster(旧实例的keys会被删除)

redis 2.8操作会比较慢, 使用这个操作最好先升到3.x的版本

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

推荐阅读更多精彩内容