redis 3.0引入cluster,试试水,玩一玩
1.准备3个目录
cd /usr/local mkdir redis_cluster cd redis_cluster mkdir 7000 7001 70022.分别创建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.pid7001和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 04.启动
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 0redis 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无明显变化,不予赘述
