redis - 集群(一)

Redis Cluster

在redis集群,好比有三个redis实例,redis集群会把key按照必定的算法,分布到这三个redis实例中,达到了水平扩展的功能,同时,也支持在这三个redis中配置slave节点,在master出现故障的时候,自动的切换到slave节点,因此他集合了主从哨兵的两个功能,一样的,redis集群也不保证数据的一致性,数据从master到slave的过程的异步的,这个和redis - 哨兵(数据丢失的处理)同样。
每一个集群除了正常的TCP端口,好比6379,还须要另一个端口,正常是在前面的端口加1000,也就是16379端口,这个端口是用来故障检测、配置更新、故障转移受权等,为了让redis集群的正常运行,这个端口的访问权限是须要开放的。node

数据分片

在redis中,并无用一致性哈希来作数据分片的,而是用哈希槽。redis中有16384个哈希槽,因此每一个key经过CRC16计算后,对16384进行取模,而后落入相应的哈希槽,redis集群的每一个节点都有对应的哈希槽集合,好比节点A包含从0到5500的哈希槽,节点B包含从5501到11000的哈希槽,节点C包含从11001到16383的哈希槽。
image.png
经过这种方式,新增或者移除节点就很是方便了。好比想加一个节点D,咱们只须要移动相应的哈希槽就行了。一样的,当咱们减小一个节点时,只要把他的哈希槽移动到其余的节点就行了。由于将哈希槽从一个节点移动到另外一个节点不须要中止操做,因此添加和删除节点,或者改变节点持有哈希槽的百分比,不须要任何停机时间。redis

简单示例

配置信息以下:算法

port 7000 #端口
cluster-enabled yes #开启集群
cluster-config-file nodes_7000.conf#存储此节点配置的文件
cluster-node-timeout 5000 # 超时时间

另外还有7100,7200,7001,7101,7201的配置,跟上面的配置同样,改了相应的端口和cluster-config-file的文件名。
进入src目录,执行如下目录,启动每一个节点。segmentfault

./redis-server ../conf/cluster_7000.conf &
./redis-server ../conf/cluster_7001.conf &
./redis-server ../conf/cluster_7100.conf &
./redis-server ../conf/cluster_7101.conf &
./redis-server ../conf/cluster_7200.conf &
./redis-server ../conf/cluster_7201.conf &

成功后打印信息以下:
image.png
因为没有node.conf文件,每一个节点都建立了本身的id,好比上面截图的id为7f466898761e66fdf84cac1e73660766e22d32c8。这个ID将被这个特定的实例永远使用,以便该实例在集群上下文中具备惟一的名称。每一个节点记住使用这个id的其余节点,而不是经过IP或端口。IP地址和端口可能会改变,可是惟一的节点标识符在节点的整个生命周期中不会改变。咱们称这个标识符为节点ID。
我当前的版本是6.0.8,因此直接使用redis-cli开启集群功能,若是是3或4版本,就须要使用redis-trib.rb命令。create后面是6个地址,因为设置cluster-replicas为1,因此是一主一从,那六个地址中,前面3个就是master,后面是对应的slave,好比7000对应着7001,后面以此类推。异步

./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7100 \
127.0.0.1:7200 127.0.0.1:7001 127.0.0.1:7101 127.0.0.1:7201 \
--cluster-replicas 1

咱们也能够不用上面那样,启动每一个节点,而后再用redis-cli开启集群功能,好比使用下面这些命令:spa

`create-cluster start`
`create-cluster create`
`create-cluster stop`.

使用redis-cli命令,进入7000端口的redis,开始执行其余命令3d

./redis-cli -c -p 7000

第一次set name的时候,因为对应的槽是5798,因此会到7100里执行。
第二次set hello的时候,因为对应的槽是866,因此会到7000里执行。
第三次get name的时候,因为对应的槽是5798,因此会到7100里执行。code

127.0.0.1:7000> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1:7100
OK
127.0.0.1:7100> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
127.0.0.1:7000> get name
-> Redirected to slot [5798] located at 127.0.0.1:7100
"zhangsan"

从新分片

从新分片,咱们能够用如下的命令,好比咱们想给7000这个节点多1000个槽,那2的位置就输入1000,说明要移动1000个槽,3的位置输入的是7000的id,说明这1000的目标是7000,4这个有两种,这边是all,说明其余因此节点都分一些槽出来给7000。第四个步骤执行完输入yes。server

./redis-cli --cluster reshard 127.0.0.1:7000

image.png
image.png
输入如下命令查看当前各个节点的状况blog

./redis-cli --cluster check 127.0.0.1:7000

此时7000有6501的槽,7200有4889的槽,7100有4994的槽。
image.png
再演示一个,从7200拿6个槽给7100,与上面的差别是第四个步骤先输入7200的id,而后再输入done。
image.png
输入如下命令查看当前各个节点的状况

./redis-cli --cluster check 127.0.0.1:7000

image.png

其余命令

除了从新分片,还有其余命令以下(仍是已6.0.8版本为例):

新增节点

新增master节点,第一个地址是新增的节点,第二个地址是已经在集群中的随机节点。

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

新增slave节点,第一个地址是新增的节点,第二个地址是已经在集群中的随机节点。此时并无他指定master节点,redis集群将从slave节点较少的master做为新增slave的master节点。

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

固然也能够直接指定master节点:

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

为某个master新增slave还有其余方式,新增新的slave节点,在这个节点中执行如下命令:

cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

移除节点

第一个参数只是集群中的一个随机节点,第二个参数是要删除的节点的ID。在删除以前,要确保他的槽是空的。

redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`
相关文章
相关标签/搜索