优势:
· 自动分割数据到不同的节点上。
· 整个集群的部分节点失败或者不可达的情况下能够继续处理命令
Redis 集群没有使用一致性hash,而是引入了 哈希槽的概念.Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
- 节点 A 包含 0 到 5500号哈希槽.
- 节点 B 包含5501 到 11000 号哈希槽.
- 节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D,我需要从节点 A, B, C中得部分槽到D上. 如果我像移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.
i. 下面是一个最少选项的集群的配置文件:
port 7000 #每个redis不一样,需要修改
cluster-enabled yes #开启实例的集群模式
cluster-config-file nodes.conf #保存节点配置文件的路径,同一台服务器上的名称不能一样,最好改成例如nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
ii. 首先, 让我们进入一个新目录, 并创建六个以端口号为名字的子目录, 稍后我们在将每个目录中运行一个 Redis实例:
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
cd 7000
./redis-server redis.conf
iii. 现在我们已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。需要安装ruby与rubygems
apt-get install ruby
gem install redis
iv. 搭建集群:
./redis-trib.rb create --replicas 1127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004127.0.0.1:7005
这个命令在这里用于创建一个新的集群, 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave redis-trib 会打印出一份预想中的配置给你看,如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:
[OK] All 16384 slotscovered
这表示集群中的 16384 个槽都有至少一个主节点在处理,集群运作正常.
v. 测试 Redis 集群
$ redis-cli-c -p 7000
redis127.0.0.1:7000> set foo bar
->Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis127.0.0.1:7002> set hello world
->Redirected to slot [866] located at 127.0.0.1:7000
OK
redis127.0.0.1:7000> get foo
->Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis127.0.0.1:7000> get hello
->Redirected to slot [866] located at 127.0.0.1:7000
"world"
vi. 集群重新分片
.
/redis-trib.rb reshard 127.0.0.1:7000
./redis-trib.rb check 127.0.0.1:7000 #检查集群状态
cluster nodes