操作系统:centos6.4 x86_64
redis:4.0.2
在一台虚拟机上验证集群配置,通过不同的端口,启动不同的redis实例
1、使用源码安装redis
cd /home
tar -xfv redis-4.0.2.tar.gz
cd redis-4.0.2
make
#指定安装的位置
make PREFIX=/usr/local/redis install
2、集群需要至少6个节点,拷贝出6份配置文件
#建立配置文件路径
mkdir -p /etc/redis/cluster/conf.d
#将通用配置放到配置文件目录
cd /etc/redis/cluster
cp /home/redis-4.0.2/redis.conf common.conf
3、建立个性化配置
cd /etc/redis/cluster/conf.d
vi 7000.conf
#配置文件要差异化,跟端口有关的都要分开配置,以7000端口为例,将以下内容写入7000.conf
#包含通用配置
include /etc/redis/cluster/common.conf
#指定端口
port 7000
#指定集群配置文件名称,该文件记录集群运行时信息
#注意:可以用绝对路径,但必须保证路径已经存在,否则启动失败;如果只有文件名称的话,文件生成在工作路径下
cluster-config-file /etc/redis/cluster/run/nodes-7000.conf
#指定进程pid文件
pidfile /var/run/redis_7000.pid
#指定日志文件
logfile /var/log/redis_7000.log
#指定数据库文件存放路径
dir /var/lib/redis/7000
#appendonly日志文件
appendfilename appendonly-7000.aof
4、按同样的方式建立7001.conf~7005.conf
5、修改common.conf
1)关于个性化的配置前加#屏蔽掉
2)增加统一的密码配置,将requirepass配置打开,使用默认密码foobared
3)appendonly改为yes
6、建立数据库文件路径
mkdir -p /var/lib/redis/7000
mkdir -p /var/lib/redis/7001
mkdir -p /var/lib/redis/7002
mkdir -p /var/lib/redis/7003
mkdir -p /var/lib/redis/7004
mkdir -p /var/lib/redis/7005
7、编写启动脚本/etc/init.d/redis_cluster
#!/bin/sh
PROG=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
CONF_DIR=/etc/redis/cluster/conf.d
COMMON_CONF=/etc/redis/cluster/common.conf
NODES=6
BASEPORT=7000
PWD=`grep ^requirepass $COMMON_CONF | awk '{print $2}'`
if test "$PWD"
then
AUTH="auth $PWD"
fi
PIDFILE=`grep ^pidfile $COMMON_CONF | awk '{print $2}'`
if test -z "$PIDFILE"
then
PIDFILE=/var/run/redis_$REDISPORT.pid
fi
startRedis()
{
REDISPORT=$1
[ -z $REDISPORT ] && exit 1
CONF_FILE=$CONF_DIR/$REDISPORT.conf
PIDFILE=`grep ^pidfile $CONF_FILE | awk '{print $2}'`
if test -z "$PIDFILE"
then
PIDFILE=/var/run/redis_$REDISPORT.pid
fi
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
elif [ ! -f $CONF_FILE ]
then
echo "$CONF_FILE does not exist"
else
nohup $PROG $CONF_FILE >/dev/null 2>&1 &
fi
}
stopRedis()
{
REDISPORT=$1
[ -z $REDISPORT ] && exit 1
CONF_FILE=$CONF_DIR/$REDISPORT.conf
PIDFILE=`grep ^pidfile $CONF_FILE | awk '{print $2}'`
if test -z "$PIDFILE"
then
PIDFILE=/var/run/redis_$REDISPORT.pid
fi
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping $REDISPORT ..."
$CLIEXEC -p $REDISPORT << EOF
$AUTH
shutdown
EOF
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis $REDISPORT to shutdown ..."
sleep 1
done
echo "Redis $REDISPORT stopped"
fi
}
statusRedis()
{
REDISPORT=$1
[ -z $REDISPORT ] && exit 1
PIDFILE=/var/run/redis_$REDISPORT.pid
PID=$(cat $PIDFILE)
if [ ! -x /proc/${PID} ]
then
echo 'Redis $REDISPORT is not running'
else
echo "Redis $REDISPORT is running ($PID)"
fi
}
case "$1" in
start)
if test "$2"
then
startRedis $2
else
for ((i=0; i<$NODES; i++))
do
startRedis $((BASEPORT+i))
done
fi
;;
stop)
if test "$2"
then
stopRedis $2
else
for ((i=0; i<$NODES; i++))
do
stopRedis $((BASEPORT+i))
done
fi
;;
status)
if test "$2"
then
statusRedis $2
else
for ((i=0; i<$NODES; i++))
do
statusRedis $((BASEPORT+i))
done
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Please use start, stop, restart or status as first argument"
;;
esac
9、启动集群实例,/etc/init.d/redis_cluster start
10、配置集群
cd /home/redis-4.0.2/src
HOSTS="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"
./redis-trib.rb create --replicas 1 $HOSTS
执行之后,报错“/usr/bin/env: ruby: No such file or directory”,需要安装ruby
yum install ruby
继续执行上个命令,又报错“./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24”,需要安装rubygems
yum install rubygems
继续执行上个命令,又报错“/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25”,需要通过gem安装redis
gem install redis
执行之后报错“ERROR: Error installing redis:
redis requires Ruby version >= 2.2.2.”,需要升级ruby
11、升级ruby
1)确认rvm有没有安装
rvm -v
如果已经安装,就跳过第2步
2)安装rvm
curl -L get.rvm.io | bash -s stable
如果没有curl命令,就执行yum intall curl进行安装
执行结果如下
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 24090 100 24090 0 0 21983 0 0:00:01 0:00:01 --:--:-- 21983
Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc
gpg: Signature made Mon 11 Sep 2017 04:59:21 AM CST using RSA key ID BF04FF17
gpg: Can't check signature: No public key
Warning, RVM 1.26.0 introduces signed releases and automated check of signatures when GPG software found. Assuming you trust Michal Papis import the mpapis public key (downloading the signatures).
GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.3.tgz' - 'https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc'! Try to install GPG v2 and then fetch the public key:
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
or if it fails:
command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
the key can be compared with:
https://rvm.io/mpapis.asc
https://keybase.io/mpapis
NOTE: GPG version 2.1.17 have a bug which cause failures during fetching keys from remote server. Please downgrade or upgrade to newer version (if available) or use the second method described above.
按照提示,获取一下public key
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
再次执行安装curl -L get.rvm.io | bash -s stable,就可以了。
3)source /usr/local/rvm/scripts/rvm
4)查看可以安装的ruby版本
rvm list known
显示如下
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.7]
[ruby-]2.3[.4]
[ruby-]2.4[.1]
5)安装2.4.1版本
rvm install 2.4.1
6)确认ruby版本
ruby -v
12、再次安装redis
gem install redis
13、再次执行集群配置
./redis-trib.rb create --replicas 1 $HOSTS
报错“[ERR] Sorry, can't connect to node 127.0.0.1:7000”
原来,用redis-trib.rb命令创建集群前,不能设置密码。
先将集群实例停止,/etc/init.d/redis_cluster stop
将common.conf中密码requirepass屏蔽掉,再启动集群实例
/etc/init.d/redis_cluster start
然后再执行集群配置
./redis-trib.rb create --replicas 1 $HOSTS
14、设置集群的密码
先将集群实例停止,/etc/init.d/redis_cluster stop
修改common.conf,将requirepass打开,并设置密码,同时将masterauth打开,密码设置与requirepass一样
15、重新启动集群,至此,集群配置完毕
16、验证集群
./redis-cli -p 7000
127.0.0.1:7000> cluster nodes
此时,7000、7001、7002是master,其他三个是slave
在另外一个会话窗口停掉7002
/etc/init.d/redis_cluster stop 7002
再次查看cluster状态
/etc/init.d/redis_cluster restart
此时,7002变成failed?,7005变为master
17、验证数据存取
./redis-cli -p 7000
127.0.0.1:7000> set key5 7005
(error) MOVED 9057 127.0.0.1:7001
登录的时候,必须加上-c参数,才会自动重定向到另外一个实例
./redis-cli -c -p 7000
再次执行,又出现(error) NOAUTH Authentication required.
登录的时候,必须加上密码参数-a,这样就不用要求输入密码了