rediscluster

1. Cluster installation and configuration

[root@server1 local]# pwd
/usr/local
[root@server1 local]# mkdir rediscluster
[root@server1 local]# cd rediscluster/
[root@server1 rediscluster]# mkdir 7001
[root@server1 rediscluster]# mkdir 7002
[root@server1 rediscluster]# mkdir 7003
[root@server1 rediscluster]# mkdir 7004
[root@server1 rediscluster]# mkdir 7005
[root@server1 rediscluster]# mkdir 7006
[root@server1 rediscluster]# sysctl -a | grep range
net.ipv4.ip_local_port_range = 32768    61000
net.ipv4.ping_group_range = 1   0
[root@server1 rediscluster]# cd 7001/
[root@server1 7001]# vim redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes       ##打入后台
[root@server1 7001]# cp redis.conf ../7002/ ##更改端口为7002
[root@server1 7001]# cp redis.conf ../7003/ ##更改端口为7003
[root@server1 7001]# cp redis.conf ../7004/ ##更改端口为7004
[root@server1 7001]# cp redis.conf ../7005/ ##更改端口为7005
[root@server1 7001]# cp redis.conf ../7006/ ##更改端口为7006
[root@server1 7001]# redis-server redis.conf
[root@server1 7002]# redis-server redis.conf
[root@server1 7003]# redis-server redis.conf
[root@server1 7004]# redis-server redis.conf
[root@server1 7005]# redis-server redis.conf
[root@server1 7006]# redis-server redis.conf

[root@server1 redis]# cd redis-4.0.8/src/
[root@server1 src]# file redis-trib.rb 
redis-trib.rb: a /usr/bin/env ruby script text executable
[root@server1 src]# cp redis-trib.rb /usr/local/bin/
[root@server1 ~]# yum install ruby -y
[root@server1 ~]# yum install -y rubygems-1.3.7-5.el6.noarch.rpm
[root@server1 ~]# gem list ##未添加

*** LOCAL GEMS ***
[root@server1 ~]# yum install libyaml-0.1.3-4.el6_6.x86_64.rpm -y
[root@server1 ~]# yum update ruby-2.2.3-1.el6.x86_64.rpm -y
[root@server1 ~]# gem install --local redis-4.0.1.gem
[root@server1 ~]# gem list ##添加成功

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
redis (4.0.1)
test-unit (3.0.8)

2. Add a cluster

[root@server1 ~]# redis-trib.rb create --replicas 1 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 127.0.0.1:7006

查看
[root@server1 ~]# redis-cli -c -p 7001
127.0.0.1:7001> CLUSTER INFO        ##打印集群的信息

127.0.0.1:7001> CLUSTER NODES       ##列出集群当前已知的所有节点(node),以及这些节点的相关信息


查看的方法(得确定集群入口,任意一个都可以)
[root@server1 ~]# redis-trib.rb info 127.0.0.1:7001
127.0.0.1:7001 (bade9576...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (b23f2af5...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7003 (13be79bf...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

查看的方法
[root@server1 ~]# redis-trib.rb check 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: bade95761f0dc0eb9962f9e99c66084f7ce21acf 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 00748939f46541df6edea999b4fa2a174aa280fb 127.0.0.1:7005
   slots: (0 slots) slave
   replicates bade95761f0dc0eb9962f9e99c66084f7ce21acf
S: 4fcf8252d1c8e25c919b161125b79d1cc1ccfd81 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 13be79bfaea70ca739ce1b833e3fd84e32589174
M: b23f2af5911e1559034a62d441d13cae9ff0d386 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: f9ba798573b1d0cc494cf2a53657d352959157ae 127.0.0.1:7006
   slots: (0 slots) slave
   replicates b23f2af5911e1559034a62d441d13cae9ff0d386
M: 13be79bfaea70ca739ce1b833e3fd84e32589174 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


当宕掉一个的时候,其相对应的slave就会自动生成master
再次删除集群停止工作(因为其槽有空余没分发出去,需重新启动宕机服务器或者重新分配)
停机超过一时集群自动停止工作(方法是增加工作机器数量)

3. Common operations of cluster

1. Add a master node

[root@server1 7007]# redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001       ##添加主节点,后跟集群中任一节点

可以看到.使用addnode命令来添加节点,第一个参数是新节点的地址,第二个参数是任意一个已经存在的节点的IP和端口. 我们可以看到新的节点已经添加到集群中:

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

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

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

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

2. Add slave node

[root@server1 7008]# redis-trib.rb add-node --slave  127.0.0.1:7008 127.0.0.1:7007  ##添加从节点,后跟集群中任一节点,系统随机分配主节点
[root@server1 7008]# redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000 ##添加从节点,指定添加从节点的主节点

也可以使用CLUSTER REPLICATE 命令添加.这个命令也可以改变一个从节点的主节点。
例如,要给主节点 127.0.0.1:7005添加一个从节点,该节点哈希槽的范围1423-16383, 节点 ID 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,我们需要链接新的节点(已经是空的主节点)并执行命令:
redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
我们新的从节点有了一些哈希槽,其他的节点也知道(过几秒后会更新他们自己的配置),可以使用如下命令确认:
$ redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a

3. Remove the node

[root@server1 7008]# redis-trib del-node 127.0.0.1:7000 `<node-id>`         ##移除一个结点,前为任一节点,后为要删除节点

使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这个节点的数据重新分片到其他主节点上.
替代移除主节点的方法是手动执行故障恢复,被移除的主节点会作为一个从节点存在,不过这种情况下不会减少集群节点的数量,也需要重新分片数据.

4. Migration from Node

从节点的迁移
在Redis集群中会存在改变一个从节点的主节点的情况,需要执行如下命令 :
CLUSTER REPLICATE <master-node-id>
在特定的场景下,不需要系统管理员的协助下,自动将一个从节点从当前的主节点切换到另一个主节 的自动重新配置的过程叫做复制迁移(从节点迁移),从节点的迁移能够提高整个Redis集群的可用性.

5. Cluster resharding

现在, 让我们来试试对集群进行重新分片操作。在执行重新分片的过程中, 请让你的 example.rb 程序处于运行状态, 这样你就会看到, 重新分片并不会对正在运行的集群程序产生任何影响, 你也可以考虑将 example.rb 中的 sleep 调用删掉, 从而让重新分片操作在近乎真实的写负载下执行 重新分片操作基本上就是将某些节点上的哈希槽移动到另外一些节点上面, 和创建集群一样, 重新分片也可以使用 redis-trib 程序来执行 执行以下命令可以开始一次重新分片操作:

./redis-trib.rb reshard 127.0.0.1:7000

你只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。
目前 redis-trib 只能在管理员的协助下完成重新分片的工作, 要让 redis-trib 自动将哈希槽从一个节点移动到另一个节点, 目前来说还做不到

1. The following commands are unique to Redis Cluster clusters. To execute the following commands, you need to log in to redis first:

[root@manage redis]# redis-cli -c -p 6382 -h 192.168.10.12
192.168.10.12:6382>

//集群(cluster) 
CLUSTER INFO 打印集群的信息 
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  

//节点(node) 
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。 
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。 
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)。  

//键 (key) 
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。 
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。

Second, add nodes

1)新配置二个测试节点
# cd /etc/redis 

//新增配置 
# cp redis-6379.conf redis-6378.conf && sed -i "s/6379/6378/g" redis-6378.conf 
# cp redis-6382.conf redis-6385.conf && sed -i "s/6382/6385/g" redis-6385.conf 

//启动 
# redis-server /etc/redis/redis-6385.conf > /var/log/redis/redis-6385.log 2>&1 & 
# redis-server /etc/redis/redis-6378.conf > /var/log/redis/redis-6378.log 2>&1 & 

2)添加主节点
# redis-trib.rb add-node 192.168.10.219:6378 192.168.10.219:6379 
注释:
192.168.10.219:6378是新增的节点
192.168.10.219:6379集群任一个旧节点

3)添加从节点
# redis-trib.rb add-node --slave --master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.220:6385 192.168.10.219:6379 
注释:
--slave,表示添加的是从节点
--master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2,主节点的node id,在这里是前面新添加的6378的node id
192.168.10.220:6385,新节点
192.168.10.219:6379集群任一个旧节点

4)重新分配slot
# redis-trib.rb reshard 192.168.10.219:6378               //下面是主要过程 
How many slots do you want to move (from 1 to 16384)? 1000 //设置slot数1000 
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新节点node id 
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                                      //表示全部节点重新洗牌 
Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认重新分 

新增加的主节点,是没有slots的,
M: 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.219:6378
slots:0-332,5461-5794,10923-11255 (0 slots) master
主节点如果没有slots的话,存取数据就都不会被选中。
可以把分配的过程理解成打扑克牌,all表示大家重新洗牌;输入某个主节点的node id,然后在输入done的话,就好比从某个节点,抽牌。

5)查看一下,集群情况
[root@slave2 redis]# redis-trib.rb check 192.168.10.219:6379 
Connecting to node 192.168.10.219:6379: OK 
Connecting to node 192.168.10.220:6385: OK 
Connecting to node 192.168.10.219:6378: OK 
Connecting to node 192.168.10.220:6382: OK 
Connecting to node 192.168.10.220:6383: OK 
Connecting to node 192.168.10.219:6380: OK 
Connecting to node 192.168.10.219:6381: OK 
Connecting to node 192.168.10.220:6384: OK 
>>> Performing Cluster Check (using node 192.168.10.219:6379) 
M: 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 192.168.10.219:6379 
 slots:5795-10922 (5128 slots) master 
 1 additional replica(s) 
S: 9c240333476469e8e2c8e80b089c48f389827265 192.168.10.220:6385 
 slots: (0 slots) slave 
 replicates 03ccad2ba5dd1e062464bc7590400441fafb63f2 
M: 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.219:6378 
 slots:0-332,5461-5794,10923-11255 (1000 slots) master 
 1 additional replica(s) 
M: 19b042c17d2918fade18a4ad2efc75aa81fd2422 192.168.10.220:6382 
 slots:333-5460 (5128 slots) master 
 1 additional replica(s) 
M: b2c50113db7bd685e316a16b423c9b8abc3ba0b7 192.168.10.220:6383 
 slots:11256-16383 (5128 slots) master 
 1 additional replica(s) 
S: 6475e4c8b5e0c0ea27547ff7695d05e9af0c5ccb 192.168.10.219:6380 
 slots: (0 slots) slave 
 replicates 19b042c17d2918fade18a4ad2efc75aa81fd2422 
S: 1ee01fe95bcfb688a50825d54248eea1e6133cdc 192.168.10.219:6381 
 slots: (0 slots) slave 
 replicates b2c50113db7bd685e316a16b423c9b8abc3ba0b7 
S: 9a2a1d75b8eb47e05eee1198f81a9edd88db5aa1 192.168.10.220:6384 
 slots: (0 slots) slave 
 replicates 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 
[OK] All nodes agree about slots configuration. 
>>> Check for open slots... 
>>> Check slots coverage... 
[OK] All 16384 slots covered.

3. Change the master of the slave node


//查看一下6378的从节点 
# redis-cli -p 6378 cluster nodes | grep slave | grep 03ccad2ba5dd1e062464bc7590400441fafb63f2 

//将6385加入到新的master 
# redis-cli -c -p 6385 -h 192.168.10.220 
192.168.10.220:6385> cluster replicate 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052  //新master的node id 
OK 
192.168.10.220:6385> quit 

//查看新master的slave 
# redis-cli -p 6379 cluster nodes | grep slave | grep 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052

Fourth, delete the node

1)删除从节点
# redis-trib.rb del-node 192.168.10.220:6385 '9c240333476469e8e2c8e80b089c48f389827265' 

2)删除主节点
如果主节点有从节点,将从节点转移到其他主节点
如果主节点有slot,去掉分配的slot,然后在删除主节点
# redis-trib.rb reshard 192.168.10.219:6378                             //取消分配的slot,下面是主要过程 
How many slots do you want to move (from 1 to 16384)? 1000              //被删除master的所有slot数量 
What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收6378节点slot的master 
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:03ccad2ba5dd1e062464bc7590400441fafb63f2                //被删除master的node-id 
Source node #2:done  

Do you want to proceed with the proposed reshard plan (yes/no)? yes    //取消slot后,reshard 


新增master节点后,也进行了这一步操作,当时是分配,现在去掉。反着的。
# redis-trib.rb del-node 192.168.10.219:6378 '03ccad2ba5dd1e062464bc7590400441fafb63f2' 

新的master节点被删除了,这样就回到了,就是这篇文章开头,还没有添加节点的状态

5. Redis cache cleaning

1)登陆redis
# src/redis-cli -c -h 192.168.1.100 -p 6379

2)执行:
192.168.1.100:6379> dbsize

3192.168.1.100:6379> flushall

================================================================
redis集群指定key值得缓存清理:
1)登录至指定端口的redis服务器
# src/redis-cli -c -h 192.168.1.100 -p 6379

2)查看所有key值 (或者使用info命令也能查看出来)
keys *

3)删除指定索引的值
del key

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326041053&siteId=291194637