Redis Cluster集群搭建


参考文章: 用外网搭建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安装包
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 的集群端口来进行数据同步的,因此需要开放外网服务端口和集群端口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值