redis3.0以上支持集群模式,集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。
3.0之后的功能,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了Redis高可用、可扩展等问题。
集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作。
1、下载文件
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzvf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make all & cd src & make installprefix=/home/liubowei/redis-cluster
2、复制redis.conf 7001、7002、7003、7004
$ cd /home/liubowei/redis-cluster
$ mkdir config
$ cp /home/liubowei/redis-3.0.3/redis.conf /home/liubowei/redis-cluster/config
$ cd config
$ mv redis.conf redis7001.conf
$ cp redis7001.conf redis7002.conf
$ cp redis7001.conf redis7003.conf
$ cp redis7001.conf redis7004.conf
3、修改配置文件redis7001.conf、redis7002.conf、redis7003.conf、redis7004.conf
port 7001 #7001、7002、7003、7004
daemonize yes
cluster-enabled yes
cluster-config-file nodes-7001.conf #7001、7002、7003、7004
cluster-node-timeout 15000
4、启动redis
$ redis-server ../config/redis7001.conf
$ redis-server ../config/redis7002.conf
$ redis-server ../config/redis7003.conf
$ redis-server ../config/redis7004.conf
5、将redis示例加入到集群中
$ redis-cli -p 7001
> cluster meet 127.0.0.1 7002
> cluster meet 127.0.0.1 7003
> cluster meet 127.0.0.1 7004
> cluster nodes #查看集群情况
可以通过cluster forget清除集群中的某个实例
6、分配卡槽(slots),redis-cluster总共有16384个槽位(0-16383)
$ vi nodes-7001.conf #分配slots:0-4095(注意127.0.0.1:7000对应的行尾)
65d2857f061c431d80dd347ba908a1d896c9706c 127.0.0.1:7003 master - 0 1498481148811 2 connected
24826566d6c7b91924a5a31d27bf8521e7ae2098 127.0.0.1:7004 master - 0 1498481149811 3 connected
00b37ff7a84d854519cfe54918d52ea82662eeef 127.0.0.1:7002 master - 0 1498481147809 1 connected
c89ecc22e3bb5a728d356ef5c0d8a485f842b8b5 127.0.0.1:7001 myself,master - 0 0 0 connected 0-4095
vars currentEpoch 3 lastVoteEpoch 0
$ vi nodes-7002.conf #分配slots:4096-8191(注意127.0.0.1:7002对应的行尾)
00b37ff7a84d854519cfe54918d52ea82662eeef 127.0.0.1:7002 myself,master - 0 0 1 connected 4096-8191
65d2857f061c431d80dd347ba908a1d896c9706c 127.0.0.1:7003 master - 0 1498481149011 2 connected
24826566d6c7b91924a5a31d27bf8521e7ae2098 127.0.0.1:7004 master - 0 1498481149013 3 connected
c89ecc22e3bb5a728d356ef5c0d8a485f842b8b5 127.0.0.1:7001 master - 0 1498481148009 0 connected
vars currentEpoch 3 lastVoteEpoch 0
$ vi nodes-7003.conf #分配slots:8192-12287(注意127.0.0.1:7003对应的行尾)
c89ecc22e3bb5a728d356ef5c0d8a485f842b8b5 127.0.0.1:7001 master - 0 1498481149512 0 connected
65d2857f061c431d80dd347ba908a1d896c9706c 127.0.0.1:7003 myself,master - 0 0 2 connected 8192-12287
00b37ff7a84d854519cfe54918d52ea82662eeef 127.0.0.1:7002 master - 0 1498481148510 1 connected
24826566d6c7b91924a5a31d27bf8521e7ae2098 127.0.0.1:7004 master - 0 1498481149612 3 connected
vars currentEpoch 3 lastVoteEpoch 0
$ vi nodes-7004.conf #分配slots:12288-16383(注意127.0.0.1:7004对应的行尾)
c89ecc22e3bb5a728d356ef5c0d8a485f842b8b5 127.0.0.1:7001 master - 0 1498481150912 0 connected
24826566d6c7b91924a5a31d27bf8521e7ae2098 127.0.0.1:7004 myself,master - 0 0 3 connected 12288-16383
65d2857f061c431d80dd347ba908a1d896c9706c 127.0.0.1:7003 master - 0 1498481151914 2 connected
00b37ff7a84d854519cfe54918d52ea82662eeef 127.0.0.1:7002 master - 0 1498481149912 1 connected
vars currentEpoch 3 lastVoteEpoch 0
7、给每个master节点配一个slave节点
$ cp redis7001.conf redis8001.conf
$ cp redis7001.conf redis8002.conf
$ cp redis7001.conf redis8003.conf
$ cp redis7001.conf redis8004.conf
8、修改配置文件redis8001.conf、redis8002.conf、redis8003.conf、redis8004.conf
port 8001 #8001、8002、8003、8004
daemonize yes
cluster-enabled yes
cluster-config-file nodes-8001.conf #8001、8002、8003、8004
luster-node-timeout 15000
9、将8001、8002、8003、8004加入集群
$ redis-cli -p 7001
> cluster meet 127.0.0.1 8002
> cluster meet 127.0.0.1 8002
> cluster meet 127.0.0.1 8003
> cluster meet 127.0.0.1 8004
10、将从节点分别挂到7001、7002、7003、7004上,语法格式:cluster replicate {主节点的hash值}
$ ./redis-cli -p 8001
> clusterreplicatec89ecc22e3bb5a728d356ef5c0d8a485f842b8b5
$ ./redis-cli -p 8002
> cluster replicate 00b37ff7a84d854519cfe54918d52ea82662eeef
$ ./redis-cli -p 8003
> cluster replicate 65d2857f061c431d80dd347ba908a1d896c9706c
$ ./redis-cli -p 8004
> cluster replicate 24826566d6c7b91924a5a31d27bf8521e7ae2098
11、连接使用集群模式
$ ./redis-cli -c -p 7001
附录:常用的Redis-cluster命令
#### 集群(cluster)
cluster info 打印集群的信息
cluster nodes 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
#### 节点(node)
cluster meet 将 ip 和 PORT 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget 从集群中移除 node_id 指定的节点。
cluster replicate 将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig 将节点的配置文件保存到硬盘里面。
#### 槽(slot)
cluster addslots [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
cluster delslots [slot ...] 移除一个或多个槽对当前节点的指派。
cluster flushslots 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot migrating 将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing 从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable 取消对槽 slot 的导入(import)或者迁移(migrate)。
#### 键(key)
cluster keyslot 计算键 KEY 应该被放置在哪个槽上。
cluster countkeysinslot 返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot 返回 COUNT 个 slot 槽中的键。
网友评论