Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。集群中的每个节点都是平等的关系,Redis 客户端可以在任意一个 Redis 实例发出请求。如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。
Redis 集群至少需要6个节点(3主3从模式),本次实验直接在一台服务器上进行,分别指定不同的端口。主master节点挂掉后备slave节点会选举成为master。
开始配置集群先需要在本地已经安装有redis,redis安装不清楚的可以参考这篇文章:《CentOS系统Redis安装》。
第一步:创建目录
计划把cluster的配置放置在/usr/local/redis/cluster目录,存放配置文件和数据文件。
mkdir /usr/local/redis/cluster cd /usr/local/redis/cluster mkdir conf var mkdir var/17701 var/17702 var/17703 var/17704 var/17705 var/17706
第二步:修改配置
在/usr/local/redis/cluster/conf目录,分别创建redis-17701.conf,redis-17702.conf ,redis-17703conf ,redis-17704.conf ,redis-17705.conf ,redis-17706.conf 配置文件。
内容类似如下:
bind 0.0.0.0 protected-mode yes port 17701 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised systemd pidfile "/usr/local/redis/cluster/var/17701/redis.pid" loglevel notice logfile "/usr/local/redis/cluster/var/17701/redis.log" databases 16 always-show-logo yes save "" stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/usr/local/redis/cluster/var/17701" slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no slave-lazy-flush no appendonly no appendfilename "appendonly.aof" appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble no lua-time-limit 5000 cluster-enabled yes cluster-config-file nodes-17701.conf cluster-node-timeout 15000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
集群配置文件基本都一样,只需要修改如下几个参数为指定的路径或端口即可。
第三步:集群启动和停止脚本
启动脚本
#!/bin/bash function green(){ echo -e " 33[32m[ $1 ] 33[0m" } for i in `seq 17701 17706`;do green "start redis cluster, node $i ..." /usr/local/redis/src/redis-server /usr/local/redis/cluster/conf/redis-${i}.conf sleep 3 ps -ef|grep "/usr/local/redis/src/redis-server .*:${i} [cluster]" done
停止脚本
#!/bin/bash function green(){ echo -e " 33[32m[ $1 ] 33[0m" } function bred(){ echo -e " 33[31m 33[01m 33[05m[ $1 ] 33[0m" } function blue(){ echo -e " 33[34m[ $1 ] 33[0m" } for i in `seq 17701 17706`;do blue "stop redis cluster, node $i ..." pid=`cat /usr/local/redis/cluster/var/${i}/redis.pid 2>/dev/null` if [ $? -eq 0 ];then /bin/kill -SIGTERM $pid #/bin/kill -9 $pid fi sleep 3 left=`ps -ef|grep -c "/usr/local/redis/src/redis-server .*:${i} [cluster]"` if [ $left -eq 0 ];then green "redis cluster node $i stop successfully." else bred "redis cluster node $i stop failed." ps -ef|grep "/usr/local/redis/src/redis-server .*:${i} [cluster]" fi done
然后就可以运行脚本启动和关闭集群了。
第四步:添加集群
到这里集群其实已经启动好了,但是还不能直接使用,直接使用会报这种错误。
[redis@mail cluster]$ redis-cli -c -p 17701
127.0.0.1:17701> set name "nbhao.org"
(error) CLUSTERDOWN Hash slot not served
127.0.0.1:17701>
这是因为虽然我们配置并启动了 Redis 集群服务,但是他们暂时还并不在一个集群中,互相直接发现不了,而且还没有可存储的位置,就是所谓的slot(槽)。
添加集群使用redis-trib.rb脚本,他是用ruby写的,所以在运行之前还需要安装ruby 。
yum install ruby yum install rubygems gem install redis
如果gem install redis出错,参考这篇文章:CentOS7安装Redis集群提示requires Ruby version >= 2.2.2的问题
/usr/local/redis/bin/redis-trib.rb create --replicas 1 127.0.0.1:17701 127.0.0.1:17702 127.0.0.1:17703 127.0.0.1:17704 127.0.0.1:17705 127.0.0.1:17706
使用这个命令添加集群,出现这个说明添加成功。
第五步:集群测试
一切正常!
参考地址:
http://www.cnblogs.com/mafly/p/redis_cluster.html