按照官方教程在测试机上搭建,并测试创建集群、增加Master节点,增加replica节点,Master节点间迁移数据,移除Master节点,移除Slave节点。
记录要点
- 每个Node使用两个端口,一个提供对外服务端口,默认6379,另一个用于集群间同步数据通知,端口号是在对外服务端口上加10000,即默认为16379.
- 所有key 分布在16384个hash slot上,数据分组及迁移都是以hash slot为单位。使用CRC16算法计算一个key应该落在哪个hash slot上。
- 可在key中包括类似“{xxx}”字符串的方式保证某些key落在同一个hash slot上,如“aflsdkjf{aaaaa}sdfdfadsf”, 即所有包含aaaa的key都存储在同一个hash slot, 这样就可以在操作一类数据时只需要连接一个分片节点,提高效率,节省时间。
- redis cluster的拓扑结构,由3个以上Master节点形成数据分片集群,覆盖所有16384个hash slots, 数据只能在Master节点间以slot为单位迁移。每个Master可以有多个replica节点(即slave), 以防灾备,当master宕机时,集群会通过选举晋升这个master的一个slave节点变为master, 继续提供服务。
- master宕机可能会丢失写的数据。因为master在接收请求处理完后会立即返回客户端,master如果在同步到slave之前就down了,就会lose write.(机制决定,不可避免)
- 性能与数据一致性需要平衡。
- redis cluster 配置参数:
1. cluster-enabled <yes/no> : 是否开户集群 cluster-config-file <filename> : 保存集群配置状态信息,不用人为干涉 cluster-node-timeout <ms> : 节点检测超时设置,毫秒 cluster-slave-validity-factor <factor> : slave节点检测因数,开始failover的超时时限是通过factor与timeout的乘积来确定的。 cluster-require-full-coverage <yes/no> : 如果某一些key space没有被集群中任何节点覆盖,集群将停止接受写入。 cluster-migration-barrier <count>: 数据迁移的副本临界数,这个参数表示的是,一个主节点在拥有多少个好的从节点的时候就要割让一个从节点出来给另一个没有任何从节点的主节点。
- redis cluster 管理脚本为ruby所写,即需要安装ruby 及 gem 环境,1.9.x及以上的版本。
- 常用的命令格式
启动实例:../redis-server ./redis.conf
创建集群:./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
重新分片(交互):./redis-trib.rb reshard 127.0.0.1:7000 #迁移数据
重新分片(非交互):./redis-trib.rb reshard : --from --to --slots --yes
查看各节点信息:redis-cli -p 7000 cluster nodes
检查节点:./redis-trib.rb check 127.0.0.1:7000
手动failover: cluster failover #可用于测试灾备,或切换主从
添加新master node: ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
添加新replica node: ./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
为指定Master添加slave节点:./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
切换slave的主(在slave上执行):redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
删除Master节点(删除前需要先把数据迁移走):./redis-trib del-node 127.0.0.1:7000 - 问题:目前还没有好的redis client(node.js, php, java)完全支持redis3.0 cluster特性。