1. 操作系统
CentOS 6.7
2. 集群部署准备工作
2.1. 先安装Redis
详细安装过程,请参考上篇博客Redis单点安装,注册为系统服务,开机启动
由于虚拟机数量有限,我就在一台虚拟机上部署了Redis集群,只需要安装一个Redis,复制出6份配置文件(三主三从),分别启动,就可拥有6个Redis实例。下面进行详细描述。
2.2. 目录构建
2.2.1. Redis安装目录
/usr/local/redis/bin
注:
Redis自动安装在/usr/local/bin目录下,这里手动将文件移动到了/usr/local/redis/bin目录下。
2.2.2. 创建cluster目录,完成集群目录构建
$ cd /usr/local/redis
$ mkdir cluster
在cluster目录中放置集群,采用三主三从的模式,使用7000,7001,7002,7003,7004,7005端口,分别创建以端口号命名的目录。
$ cd cluster
$ mkdir 7000 7001 7002 7003 7004 7005
在每个目录下,创建data文件夹,用以存放数据,操作如下,以7000为例,其他类似。
$ cd 7000
$ mkdir data
至此,目录结构搭建完毕。
2.3. 配置文件
2.3.1. 配置文件修改
配置文件特别重要,在redis源码自带的redis.conf上修改
$ cp /usr/local/src/redis-4.0.1/redis.conf /usr/local/redis/cluster/7000/7000.conf
以7000需要的配置文件为例:
$ cd /usr/local/redis/cluster/7000
$ vim 7000.conf
有几处需要更改或取消注释:
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
dir /usr/local/redis/cluster/7000/data
appendonly yes
cluster-enabled yes
cluster-config-file /usr/local/redis/cluster/7000/nodes.conf
cluster-node-timeout 15000
注:
nodes.conf不用手动创建,在redis集群启动的过程中会自动生成。
2.3.2. 配置文件复制与内容替换
将此配置文件分别复制到7001-7005的文件夹下:
$ cp 7000.conf ../7001/7001.conf
$ cp 7000.conf ../7002/7002.conf
$ cp 7000.conf ../7003/7003.conf
$ cp 7000.conf ../7004/7004.conf
$ cp 7000.conf ../7005/7005.conf
下面进行文本替换,以7001为例:
$ cd ../7001
$ vim 7001.conf
:%s/7000/7001
7002-7005也是这样操作,至此,准备工作已基本完毕。
3. 启动
3.1. 依次启动
$ cd /usr/local/redis
$ bin/redis-server cluster/7000/7000.conf
$ bin/redis-server cluster/7001/7001.conf
$ bin/redis-server cluster/7002/7002.conf
$ bin/redis-server cluster/7003/7003.conf
$ bin/redis-server cluster/7004/7004.conf
$ bin/redis-server cluster/7005/7005.conf
启动过程中,会有如下输出:
3.2. 端口占用
查看端口占用情况:
$ netstat -nltp
集群中,每个redis会占用两个端口,一个是本身设置的端口,如7000(用来服务客户端),还有一个是在设置的端口上加10000,也就成了17000(用作集群间nodes通信:用来处理节点的失效检测,配置更新,灾备授权等事情,称为集群总线)。
3.3. 完成集群创建
3.3.1. 随便连接一个node
会提示Hash slot还没有分配。
3.3.2. 使用redis-trib.rb完成集群创建
redis-trib位于Redis源码的src文件夹,它是一个Ruby程序,这个程序通过向实例发送特殊命令来完成创建新集群,检查集群,或者对集群进行重新分片(reshared)等工作。
先安装所需的Ruby环境:
$ yum install ruby
$ yum install rubygems
$ gem install redis
使用redis-trib.rb创建:
$ cd /usr/local/src/redis-4.0.1/src
$ ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
注:
--replicas 1 表示为集群中的每个主节点创建一个从节点
在创建的过程中,需要手动写入一次yes表明同意上述配置。
至此集群搭建完毕。
3.4. 最终目录结构
再次说明,nodes.conf不必手动创建,集群在启动过程中会自动创建。
4. 注册为系统服务,开机启动
4.1. 改写启动脚本
此时,启动与关闭集群,需要对6个实例逐一操作,十分麻烦,需要改写启动脚本。启动脚本在源码自带的脚本上进行修改。可以先参考上篇博客Redis单点安装,注册为系统服务,开机启动对脚本的说明。
$ cp /usr/local/src/redis-4.0.1/utils/redis_init_script /etc/init.d/redisc
重命名为redisc表示是reidis cluster。
修改后的脚本为:
#!/bin/sh
# chkconfig: 2345 80 90
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
REDISPORT0=7000
REDISPORT1=7001
REDISPORT2=7002
REDISPORT3=7003
REDISPORT4=7004
REDISPORT5=7005
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT0}.pid
CONF0="/usr/local/redis/cluster/${REDISPORT0}/${REDISPORT0}.conf"
CONF1="/usr/local/redis/cluster/${REDISPORT1}/${REDISPORT1}.conf"
CONF2="/usr/local/redis/cluster/${REDISPORT2}/${REDISPORT2}.conf"
CONF3="/usr/local/redis/cluster/${REDISPORT3}/${REDISPORT3}.conf"
CONF4="/usr/local/redis/cluster/${REDISPORT4}/${REDISPORT4}.conf"
CONF5="/usr/local/redis/cluster/${REDISPORT5}/${REDISPORT5}.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis cluster server..."
$EXEC $CONF0 &
$EXEC $CONF1 &
$EXEC $CONF2 &
$EXEC $CONF3 &
$EXEC $CONF4 &
$EXEC $CONF5 &
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT0 shutdown
$CLIEXEC -p $REDISPORT1 shutdown
$CLIEXEC -p $REDISPORT2 shutdown
$CLIEXEC -p $REDISPORT3 shutdown
$CLIEXEC -p $REDISPORT4 shutdown
$CLIEXEC -p $REDISPORT5 shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis cluster to shutdown ..."
sleep 1
done
echo "Redis cluster stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
注:
这块在网上没有找到参考资料(可能是我没有仔细找),之前也没有写过shell脚本,就按照自带的脚本写法做了一些修改。肯定是不完善的,首先判断条件就只看了7000,这点就不够充足。如果有更好的脚本,请告知我。不过一般也不会把所有的Redis装在一台机器上,所以这个脚本的实用性也不强,怪不得没有找到^_^
4.2. 注册为系统服务
$ chkconfig --add redisc
启动:service redisc start
关闭:service redisc stop
感觉清爽多了。
注:
只要在第一次使用redis-trib.rb,之后再启动和关闭集群就不必再使用了,因为Hash slot在初次就分配完成啦。
4.3. 开机启动
$ chkconfig redisc on
4.4. 其他说明
连接的时候随便挑一个node即可,需要添加-c:
$ ./redis-cli -c -p 7000
使用:cluster info,cluster nodes可以查看集群状态
4.5. 参考资料
http://www.redis.cn/topics/cluster-tutorial.html
http://www.cnblogs.com/mafly/p/redis_cluster.html