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://blog.nbqykj.cn/?p=2931.html
http://blog.nbqykj.cn/?p=2936.html
http://www.cnblogs.com/mafly/p/redis_cluster.html
