redis3.0更高版本
redis的cluster提供了数据自动在多个redis节点上的分片。
redis cluster的tcp端口
每个集群节点需要2个tcp连接打开,一个端口用于客户端,比如6379一个端口加上10000,比如16379用于集群总线,就是节点间的内部传输,主要
有失败检测,配置更新,故障转移授权等。这两个端口的偏移量是固定的,总是10000.
redis cluster数据分片
redis cluster不使用一致性hash,而是使用成为hash slot的概念。在redis cluster中有16384个hash slot,为了计算key的槽位,只是对key进行crc16计算然后模16384.
每一个节点负责一部分的槽位,比如有3个节点的集群。
Node A contains hash slots from 0 to 5500.
Node B contains hash slots from 5501 to 11000.
Node C contains hash slots from 11001 to 16383.
redis cluster支持一个命令中包含的多键值都属于一个hash槽位,用户可以使用hash tags来强制多键分配到相同的槽位上。
redis cluster的master-slave模式
这种结构与mongodb的架构一样。
redis cluster的一致性保证
redis cluster不能保证强一致性,在某些场景下会丢失写,redis cluster使用的是异步的复制。redis cluster也能支持同步写,使用wait命令,这只是使写丢失的发生情况减少了些。还是不能完全保证一致性。
在脑裂的情况下也可能会发生写丢失的情况。比如有三个master节点a,b,c 三个slave节点a1,b1,c1,一个客户端z1,在脑裂发生的时候,如果一个
集群由a,c,a1,b1,c1,另外的集群只包含b,z1,z1还是能向b写入数据的(这个跟rac的处理不同,rac中有仲裁,需要确认谁是真正的集群,另外的不正常的集群通过io fencing是无法向共享存储写入数据的。)如果分裂在短时间能能正常,那么集群能继续正常运行,但是如果分裂的时间很长,b1在提升为master后,那么这段时间写入b的数据就丢失了。
有一个z1写入b的最大窗口,如果数量多的集群在提升slave为master时间过长,在数量少的集群中的master会停止接受写入。这个时间成为node超时。
在到达超时后,master节点被认为是失败状态,会被从库替换。超时时间过后,master节点还是不能被大多数的master识别,那么会进入失效状态停止接受写入。
创建并使用集群
1 已cluster状态启动空的redis实例,示例配置文件
port 7000
cluster-enabled yes
cluster-config-file nodes.conf –此文件不需要人工干预,cluster自动更新的。
cluster-node-timeout 5000
appendonly yes
最小化的集群需要3个master节点。
在用上面的配置文件启动后,会分配节点node id,节点之间的识别是通过node id来识别的,不是通过ip 端口。
2在src目录下运行redis-trib工具,需要先安装gem install redis,使用下面的命令创建集群
./redis-trib.rb create –replicas 1 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
如果不想使用手工的方式创建集群,还可以使用脚本创建,在util目录下有create-cluster脚本
create-cluster start
create-cluster create
create-cluster stop.
使用集群
redis-cli -c -p 7000
重新分片,重新分片使用redis-trib工具,
./redis-trib.rb reshard 127.0.0.1:7000
分片的时候按照提示的问题输入你的答案。
查看节点的node id
redis-cli -p 7000 cluster nodes | grep myself
在分片完成之后,使用下面的命令确认集群是正常状态
./redis-trib.rb check 127.0.0.1:7000
重新分片的功能也可以使用下面的脚本自动进行
./redis-trib.rb reshard –from –to –slots –yes :
获取集群中的master
redis-cli -p 7000 cluster nodes | grep master
获取集群的节点信息
redis-cli -p 7000 cluster nodes
添加节点
先部署一个空的节点,启动
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
第一个参数是新加节点,第二个参数是集群中已经存在的节点。
然后登陆到新节点查看是否已经添加到集群中去
redis 127.0.0.1:7006> cluster nodes
添加一个slave
./redis-trib.rb add-node –slave 127.0.0.1:7006 127.0.0.1:7000 这个命令会随机的给master添加一个slave,一般是slave少的master
如果需要明确指定master,使用
./redis-trib.rb add-node –slave –master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
删除节点
./redis-trib del-node 127.0.0.1:7000 <node-id>
第一个参数是集群中的任意一个节点,第二个参数是需要移除的节点id,在移除master的时候,需要master中是空的。