Redis3.0已经发布一段时间了,趁着周末抓紧研究下,重点关注下相关的新功能及稳定性。性能及压力测试情况后续慢慢更新。目前公司使用的是2.8.7版本,非常的稳定。
Redis Cluster:
支持多节点数据集自动分片
提供一定程度的分区可用性,部分节点挂掉或者无法连接其他节点后,服务可以正常运行
集群中的每个Redis节点需要2个TCP连接端口,如6379端口用于Client连接,16379端口用于集群数据通信
集群采用Hash Slot方案,而不是一致性哈希,共16384个Hash slot。如果有3台机器,那么NodeA在0-5500,NodeB 在5501-11000,NodeC在11001-16384.这种设计下,添加,删除新Node比较方便。
例如添加新节点D,只需移动A,B,C上的slot到节点D即可。
如需移除节点A,将A上的slot迁移到B和C即可。
由于HashSlot在节点间的迁移无需停止操作,集群新增或者删除节点,改变集群内部节点占用的Slot比例等都可在线完成。
Redis Cluster Master-Slave Model
为保证某些节点挂掉或无法连接其他节点的情况下可正常提供服务,Redis Cluster提供了主从模式的数据副本机制,每个Hash Slot都可以设置1-N个从节点。
由A,B,C三节点组成的集群中,可以设置A1,B1,C1分别为A,B,C的从节点,如B挂掉后,原B1从节点被提升为主节点,从而保证集群服务正常。
集群在一致性方面的问题,可能存在写数据丢失情况发生,如
1.Client写入数据到NodeA
2.NodeA答复Client写入成功
3.NodeA在写入从节点A1时蹦溃掉了
4.A1被提升为Master节点后,但是数据丢失了!!!
为解决这个问题,Redis集群提供了同步写支持。
集群配置参数
所有的集群配置参数都存在于redis.conf中,主要几个如下:
Cluster-enabled:是否开启集群模式
Cluster-config-file:集群配置变更后会自动写入改文件
Cluster-node-timeout:节点超时时间,超过该时间无法连接主要Master节点后,会停止接受查询服务
Cluster-slave-validity-factor:控制从节点FailOver相关的设置
设为0,从节点会一直尝试启动FailOver.
设为正数,失联大于一定时间(factor*节点TimeOut),不再进行FailOver
Cluster-migration-barrier:最小从节点连接数
Cluster-require-full-coverage:默认为Yes,丢失一定比例Key后(可能Node无法连接或者挂掉),集群停止接受写操作
设置为No,集群丢失Key的情况下仍提供查询服务
集群环境搭建方式一:
集群环境至少需要3个节点。推荐使用6个节点配置,即3个主节点,3个从节点。
首先启动6个独立Redis节点,然后进行集群关联配置。
最小化的Redis配置文件:
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
1.创建6个空的文件夹
mkdir cluster-test cd cluster-test mkdir 7000 7001 7002 7003 7004 7005
2.分别创建配置文件并启动6个单点服务
配置文件Redis.conf参考上文配置
cd 7000 ../redis-server ./redis.conf
....
cd 7005 ../redis-server ./redis.conf
3.启动后会看到以下日志信息,提示Node.conf不存在,并且每个节点创建了一个NodeID
[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1
4.组建集群配置
源码src文件下提供了一个叫做redis-trib.rb的脚本文件,是一个Ruby脚本用于创建集群,检测及重新分片等
./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
create表示创建一个新的集群
replicas 1表示指定集群中的副本集为1
出现以下消息,表示只有一个主节点完成了HashSlot的初始化并可以提供服务
[OK] All 16384 slots covered
集群环境搭建方式二:
更简单的集群搭建方式,使用Create-Cluster脚本!
脚本位于utils/create-cluster目录西,执行以下命令
1.create-cluster start 2.create-cluster create
启动后默认第一个节点端口为30001,完成后执行以下命令
1.create-cluster stop.
验证集群是否搭建成功:
$ redis-cli -c -p 7000 redis 127.0.0.1:7000> set foo bar -> Redirected to slot [12182] located at 127.0.0.1:7002 OK redis 127.0.0.1:7002> set hello world -> Redirected to slot [866] located at 127.0.0.1:7000 OK redis 127.0.0.1:7000> get foo -> Redirected to slot [12182] located at 127.0.0.1:7002 "bar" redis 127.0.0.1:7000> get hello -> Redirected to slot [866] located at 127.0.0.1:7000 "world"
OK,环境搭建完成,今天先更新到这里,后续继续....