文章目录
参考文章: 用外网搭建redis集群总结
修改配置文件
本文中Redis集群采用3主3从模式,其中redis采用yum方式安装,配置文件redis.conf在etc目录下。
创建redis-cluster目录,并在该目录下创建redis7001、redis7002、redis7003、redis7004、redis7005、redis7006目录。修改配置文件redis7001.conf后,将修改后的配置文件复制到redis7001目录下,并重新命名为redis7001.conf。
bind 172.16.0.9
protected-mode no
port 7001
daemonize yes
pidfile "/var/run/redis_7001.pid"
loglevel notice
logfile "/etc/redis7001/redis7001.log"
databases 16
dbfilename "dump.rdb"
dir "/etc/redis7001"
#集群主要相关配置
#是否加入cluster集群
cluster-enabled yes
#cluster配置文件名,该文件自动生成
cluster-config-file nodes-7001.conf
#节点服务响应超时时间,用于判定该节点是否下线
cluster-node-timeout 10000
# master连接的slave最小数量
cluster-migration-barrier 1
# 进入/etc目录,将redis.conf配置文件去掉注释和空白后复制到指定目录下,并重命名
cat redis.conf|grep '#'|grep '^$'> /etc/redis7001/redis7001.conf
通过如下命令将7001目录配置文件复制到对应目录下,并将7001端口分别替换为相应的端口号
# 将redis7001.conf配置文件中的关键字7001替换为7006后,将数据保存到配置文件redis7006.conf
sed 's/7001/7006/g' redis.conf > /etc/redis7006/redis7006.conf
编写批量启动脚本搭建,此文中脚本文件名为:start_all.sh
redis-server ./redis7001/redis7001.conf &
redis-server ./redis7002/redis7002.conf &
redis-server ./redis7003/redis7003.conf &
redis-server ./redis7004/redis7004.conf &
redis-server ./redis7005/redis7005.conf &
redis-server ./redis7006/redis7006.conf &
批量关闭redis集群所有实例:pkill redis-server
执行命令:ps -ef | grep redis,查询各redis节点的启动情况
Redis各节点准备好以后,各个节点是相互没有通信的,需要将各个节点串联起来组成集群,常用的工具是redis官方推荐的redis-trib.rb脚本,此外还有其他脚本工具
Redis集群的脚本工具redis-trib.rb
redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成的工具,是redis作者用ruby完成的。
- redis-trib.rb依赖Ruby和RubyGems
- 如果是yum方式安装redis,无法找到redis-trib.rb脚本,需要到官网下载,下载后放到任意目录下均可,本文放到了/etc/redis-cluster目录下:
https://github.com/beebol/redis-trib.rb
- Redis cluster要求Ruby版本不能低于2.2.2
安装Ruby
- 安装Ruby之前需要先安装openssl
yum install gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel sqlite-devel
- 安装Ruby
官网下载Ruby:http://www.ruby-lang.org/zh_cn/downloads/
# 解压Ruby安装包
tar -xvzf ruby-2.7.1.tgz
# 进入解压后源码目录
cd /etc/redis-cluster/ruby-2.7.1
# 执行configure,在源码目录下生成Makefile文件,其中prefix参数指定了ruby安装目录,当执行make install命令时,会将软件安装在此路径中
./configure --prefix=/usr/local/ruby/
# 执行make,从Makefile文件中读取指令,将源码编译成二进制文件,并存放在当前目录下
make clean; make
#执行make install,将ruby安装至指定目录
make install
- 配置Ruby环境变量
vim /etc/profile
设置环境变量
RUBY_HOME=/usr/local/ruby-2.7.1
export PATH=$PATH:$RUBY_HOME/bin
使配置文件生效:
source /etc/profile
- 查看ruby是否安装成功
ruby -v
安装Gem
官网下载:https://rubygems.org/pages/download
- 官网下载后放到/usr/local/目录下并解压
tar -zxvf rubygems-3.1.4.tgz
- 进入gem安装目录后如下命令安装
ruby setup.rb
- 配置Ruby环境变量
GEM_HOME=/usr/local/rubygems-3.1.4
export PATH=$PATH:$RUBY_HOME/bin:$GEM_HOME/bin
- 查看gem是否安装成功,查看gem版本号
gem -v
- 进入gem安装目录,安装gem的redis模块
gem install redis
通过redis-trib.rb脚本串联各节点
安装好ruby以后,通过redis-trib.rb脚本串联各个节点:【前提:各节点必须已经启动,可通过前面编写的脚本脚本启动】
/etc/redis-cluster/redis-trib.rb create --replicas 1 \
172.16.0.9:7001 \
172.16.0.9:7002 \
172.16.0.9:7003 \
172.16.0.9:7004 \
172.16.0.9:7005 \
172.16.0.9:7006
其中replicas n表示:每个master节点后需要跟n个slave节点,本文中每个master节点后跟1个slave节点
集群成功正常情况:
验证集群状态
集群搭建成功后,连接到某个具体的redis上执行set命令存储值时,可能为报错,因为该set命令key通过计算后槽位编号不一定在当前redis实例上,而在其他redis实例上,因此会提示你到指定的redis实例执行该set命令。
- 登录集群客户端,-c标识以集群方式登录
redis-cli -c -h 172.16.0.9 -p 7001
- 查看集群状态:cluster info
- 查看集群节点状态:cluster nodes
设置redis-cluster开机自启
- 打开文件redis-cluster
vim /etc/init.d/redis-cluster
- 在redis-cluster文件中编写脚本
#!/bin/sh
REDISPORT1=7001
REDISPORT2=7002
REDISPORT3=7003
REDISPORT4=7004
REDISPORT5=7005
REDISPORT6=7006
EXEC=/usr/bin/redis-server
CLIEXEC=/usr/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT1}.pid
CONF1="/etc/redis-cluster/${REDISPORT1}.conf"
CONF2="/etc/redis-cluster/${REDISPORT2}.conf"
CONF3="/etc/redis-cluster/${REDISPORT3}.conf"
CONF4="/etc/redis-cluster/${REDISPORT4}.conf"
CONF5="/etc/redis-cluster/${REDISPORT5}.conf"
CONF6="/etc/redis-cluster/${REDISPORT6}.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 $CONF1 &
$EXEC $CONF2 &
$EXEC $CONF3 &
$EXEC $CONF4 &
$EXEC $CONF5 &
$EXEC $CONF6 &
echo "启动成功..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT1 shutdown
$CLIEXEC -p $REDISPORT2 shutdown
$CLIEXEC -p $REDISPORT3 shutdown
$CLIEXEC -p $REDISPORT4 shutdown
$CLIEXEC -p $REDISPORT5 shutdown
$CLIEXEC -p $REDISPORT6 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
注册系统服务
chkconfig --add redisc
启动和关闭服务
启动:service redisc start
关闭:service redisc stop
搭建可外网连接的redis-cluster注意事项
外网连接时,redis-cluster除了配置客户端连接需要的服务端口,还需要配置节点之间通信端口,节点之间通过gossip协议通信,通信端口是在服务端口的基础行+10000、
(1)例如:需要开放服务端口号7001、7002、7003、7004、7005、7006,集群节点的通信端口号则是:17001、17002、17003、17004、17005、17006
(2)redis-trib.rb脚本串联各节点时,使用外网ip
/etc/redis-cluster/redis-trib.rb create --replicas 1 外网ip
Redis集群常见问题
参考文章:https://www.cnblogs.com/gered/p/11793451.html
问题1:无法连接节点
问题2:redis数据库集群之前已经存在数据
问题3:集群成功前,每个节点自动生成的集群配置文件、dir指定目录下rdb和aof等文件必须删除
问题4:使用外网IP集群时,redis-trib.rb脚本串联各节点一直处于:wating for the cluster to join
解析:产生这种情况的原因是未开启外网集群端口, redis 实际上是通过服务端口 + 10000 的集群端口来进行数据同步的,因此需要开放外网服务端口和集群端口