redis 3.0引入cluster,试试水,玩一玩
1.准备3个目录
cd /usr/local
mkdir redis_cluster
cd redis_cluster
mkdir 7000 7001 7002
2.分别创建3个redis.conf
cd 7000 && vim redis.conf
port 7000
bind 127.0.0.1
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly no
daemonize yes
pidfile /usr/local/redis_cluster/7000/redis.pid
7001和7002同上,仅数字做替换
3.启停脚本
vim /usr/local/bin/redis_cluster
#!/bin/bash
case "$1" in
start)
cd /usr/local/redis_cluster/7000/ && /usr/local/redis3.0/bin/redis-server redis.conf
cd /usr/local/redis_cluster/7001/ && /usr/local/redis3.0/bin/redis-server redis.conf
cd /usr/local/redis_cluster/7002/ && /usr/local/redis3.0/bin/redis-server redis.conf
echo "redis cluster started"
;;
stop)
kill $(cat /usr/local/redis_cluster/7000/redis.pid)
kill $(cat /usr/local/redis_cluster/7001/redis.pid)
kill $(cat /usr/local/redis_cluster/7002/redis.pid)
echo "redis cluster stopped"
;;
*)
echo "Usage: redis_cluster {start|stop}"
exit 64 # EX_USAGE
;;
esac
exit 0
4.启动
redis_cluster start
此命令启动3个redis server,但彼此不通信,不构成集群
首次启动后:
redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
使用redis src目录下的redis-trib工具,将三个单点串成集群,按提示输入yes后,会分别在7000,7001,7002目录下生成nodes.conf。--replicas 0表示无slave,三个节点全为master
下次启动redis_cluster start即可,不需要再次使用redis-trib工具。redis-trib工具作用就是首次生成nodes.conf
more /usr/local/redis_cluster/7000/nodes.conf
a734131671bb4f7280c35aa9727e570b7adcdcf3 127.0.0.1:7002 master - 0 1471252241282 3 connected 10923-16383
dc520376e372da298a79fc785a04f8e702690128 127.0.0.1:7001 master - 0 1471252240977 2 connected 5461-10922
2899304d0f26fcb8feb46fd5c2d04ea8a116c525 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
vars currentEpoch 3 lastVoteEpoch 0
redis cluster没有采用一致性hash,而是引入一个新名词hash slot(哈希槽),首先规定一共有16384个哈希槽(可以认为就是大的数据块),然后将key进行CRC16运算,再对16384取模,落到哪个槽数据就存在哪。
上面more命令输出表明,一共3个master节点,所以把16384分成3段,每人负责一段。当某个key CRC16运算对16384取模后就可以知道7000,7001,7002谁负责该数据了
5.停止
redis_cluster stop
6.redis-trib
redis-trib没有的话可以官网下载,redis-trib.rb 不带参数可以查看更多集群管理命令。本机闹着玩,这样就够了,生产环境,每个节点必带slave
连接集群redis-cli -c -p 7000
get set使用上同单点redis,此时连接的是7000,当key落在7001或者7002时,会有个提示信息如下:
127.0.0.1:7000> set aaa 123
-> Redirected to slot [10439] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get aaa
"123"
127.0.0.1:7001>
-> Redirected to slot [10439] located at 127.0.0.1:7001
注意此行,可以看到aaa落在哈希槽10439,该7001负责
python client包:pip install redis-py-cluster
使用上与非cluster无明显变化,不予赘述