A4-1-Linux下 Redis 集群使用(一)

cd /usr/local/redis-cluster/
./redis-cli --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1

create,表示创建一个新的集群。选项 --replicas 1 表示为集群中的每个主节点创建一个从节点。之后跟着的其他参数则是实例的地址列表, 指定使用这些地址所指示的实例来创建新集群。

redis linux 重启 linux redis集群重启_Redis

“All 16384 slots covered.”表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。从打印出来的信息也可以看出10.0.0.12:20001、10.0.0.12:20003、10.0.0.13:30002是主节点,其它三个是从节点。

二、客户端连接集群

命令:

./redis-cli -c -h 10.0.0.12 -p 20001

任意一个客户端都可以连接集群。即可使用整个集群信息。故而一个集群只能为一个项目提供缓存数据库。

redis linux 重启 linux redis集群重启_客户端_02

三、关闭集群

命令:

pkill redis-server
或逐个关闭
./redis-cli -c -h 10.0.0.12 -p 20001 shutdown
检查:./redis-cli --cluster check 10.0.0.12:20003

redis linux 重启 linux redis集群重启_客户端_03

从节点自动升级为主节点

四、重启集群

重启:
(保留原有集群的)重启:
不需要再执行(形如下这样的)集群生成指令

/redis-cli -a <password> --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1

集群生成指令。

  • 第一步:先关闭各个Redis节点。
  • 第二步:再启动各个Redis节点即可。 

(删除原有集群的)重启:
需要执行(形如下这样的)集群生成指令。

/redis-cli -a <password> --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
  • 第一步:先关闭各个Redis节点。
  • 第二步:删除各个Redis安装目录下的节点配置文件nodes.conf、数据文件dump.rdb。 

详细见:

五、集群使用测试

简单测试:set、get

redis linux 重启 linux redis集群重启_客户端_04

如果不使用集群连接“-c”,则会MOVED错误

redis linux 重启 linux redis集群重启_redis linux 重启_05

get取值

redis linux 重启 linux redis集群重启_linux_06

可以看到,客户端连接加-c选项的时候,存储和提取key的时候不断在各节点之间跳转,这个称为客户端重定向。之所以发生客户端重定向,是因为Redis Cluster中的每个Master节点都会负责一部分的槽(slot),存取的时候都会进行键值空间计算定位key映射在哪个槽(slot)上,如果映射的槽(slot)正好是当前Master节点负责则直接存取,否则就跳转到其他Master节点负的槽(slot)中存取,这个过程对客户端是透明的。继续看下文的集群分区原理。

六、集群分区原理

槽(slot)的基本概念
从上面集群的简单操作中,我们已经知道redis存取key的时候,都要定位相应的槽(slot)。
Redis 集群键分布算法使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 它们的编号为0、1、2、3……16382、16383,这个槽是一个逻辑意义上的槽,实际上并不存在。redis中的每个key都属于这 16384 个哈希槽的其中一个,存取key时都要进行key->slot的映射计算。
下面我们来看看启动集群时候打印的信息:

redis linux 重启 linux redis集群重启_客户端_07

从上面信息可以看出,创建集群的时候,哈希槽被分配到了三个主节点上,从节点是没有哈希槽的。10.0.0.12:20001负责编号为0-5460 共5461个 slots,10.0.0.12:20003负责编号为 5461-10922共5462 个 slots,10.0.0.13:30002负责编号为10923-16383 共5461个 slots。

键-槽映射算法
和memcached一样,redis也采用一定的算法进行键-槽(key->slot)之间的映射。memcached采用一致性哈希(consistency hashing)算法进行键-节点(key-node)之间的映射,而redis集群使用集群公式来计算键 key 属于哪个槽:

HASH_SLOT(key)= CRC16(key) % 16384


其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。key经过公式计算后得到所对应的哈希槽,而哈希槽被某个主节点管理,从而确定key在哪个主节点上存取,这也是redis将数据均匀分布到各个节点上的基础。

redis linux 重启 linux redis集群重启_linux_08

七、集群分区好处

无论是memcached的一致性哈希算法,还是redis的集群分区,最主要的目的都是在移除、添加一个节点时对已经存在的缓存数据的定位影响尽可能的降到最小。redis将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点

 比如说:

  • 如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
  • 与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。

因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线,从而保证集群的可用性。下面我们就来学习下集群中节点的增加和删除。