当前项目使用redis是单节点,不具备高可用,为了消除风险,花了一天半时间申请了三台服务器新搭建了一个redis集群,现在做下记录,以备后续查阅。
物料:三台linux服务器,centos7.9,root账号,无外网访问权限
目标:三主三从redis集群,每台服务器一主一从两个节点
以下正式开始:
(1)选择安装包方式安装redis主要是因为linux服务器无外网权限,不能通过yum来安装
(2)选择版本4主要是因为linux服务器上的gcc版本较低,不支持高版本的redis(踩过坑),而且没外网不能通过yum来升级gcc,所以在此选择低版本redis主要是无奈之举
(1)在/usr/local/路径下创建redis文件夹(可通过ftp创建)
(2)上传到路径下:/usr/local/redis
cd /usr/local/redis
tar -zxvf redis-4.0.8.tar.gz
# 进入解压后的路径
cd redis-4.0.8
# 编译
make
# 安装到特定路径下
make PREFIX=/usr/local/redis install
安装完成后就会在/usr/local/redis/路径下看到一个bin文件夹
cd /usr/local/redis/bin
前台启动
./redis-server
后台启动
# 进入解压redis文件夹
cd /usr/local/redis/redis4.0.8
# 复制redis.conf文件到/usr/local/redis/bin路径
cp redis.conf /usr/local/redis/bin
# 修改redis.conf文件中的daemonize 为 yes
vim redis.conf
daemonize yes
# 完成修改后,可后端启动
./redis-server redis.conf
# 关闭redis
./redis-cli shutdown
以上完成了redis单机安装,以下开始集群操作
# 进入/usr/local路径
cd /usr/local
# 创建redis-cluster文件夹,存放redis节点,每台服务器创建两个节点
mkdir redis-cluster
# 创建两个redis节点文件夹redis01和redis02
cd redis-cluster
mkdir redis01
mkdir redis02
# 复制文件到redis01和redis02
cp /usr/local/redis/redis-4.0.8/bin/ /usr/local/redis-cluster/redis01
cp /usr/local/redis/redis-4.0.8/bin/ /usr/local/redis-cluster/redis02
# 如果事先没有创建redis01和redis02文件夹,可使用以下命令复制文件的同时自动创建文件夹
cp -r /usr/local/redis/redis-4.0.8/bin/ /usr/local/redis-cluster/redis01
cp -r /usr/local/redis/redis-4.0.8/bin/ /usr/local/redis-cluster/redis02
# 进入redis01 路径
cd redis01
# 查看并修改redis.conf文件
vim redis.conf
# 注释掉 bind 127.0.0.1
# bind 127.0.0.1
# 修改protected-mode为no
protected-mode no
# 修改端口为7001
port 7001
# 设置后台启动
daemonize yes
# 设置cluster模式开启
cluster-enabled yes
# 设置集群节点文件,该文件为redis自己维护,无需也不要手工修改里面内容,只要设置好名称,启动redis服务时会自动创建该文件,如果不小心变更了该文件的内容导致redis无法启动,删除该文件重新启动redis即可
cluster-config-file nodes-7001.conf
# 设置节点超时时间
cluster-node-timeout 10000
# 完成后别忘记保存退出
# 进入redis02
cd /usr/local/redis-cluster/redis02
# 查看并修改redis.conf文件
vim redis.conf
# redis02节点的redis.conf文件修改和redis01基本一致,只有两个地方不一样,以下只放出不一样的地方,其他一样的就不再重复了
# 第一处不一样的地方
port 7002
# 第二处不一样的地方
cluster-config-file nodes-7002.conf
# 进入/usr/local/redis-cluster路径
cd /usr/local/redis-cluster
# 编写批量启动脚本
vim start-all-redis.sh
# 进入编辑界面,编辑以下文字,完成后保存并退出
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
# 给启动脚本赋权
chmod 7 start-all-redis.sh
# 进入redis-cluster路径
cd /usr/local/redis-cluster
# 执行批量启动命令
./start-all-redis.sh
# 查看redis进程状态
ps -ef | grep redis
到此为止,一台服务器上的两个redis节点已经搭建完成
以上操作在另外两台服务器上再执行一遍,完成三台服务器六个节点的redis搭建
接下来开始搭建集群操作
redis 5.0之前的版本创建集群需要redis-trib.rb工具脚本,但是该工具脚本是一个ruby脚本文件,所以redis 5.0之前的版本想要创建集群,都需要安装ruby,ruby安装非常耗时,这是一个很坑的地方。
由于没有外网权限,所以还是不能通过yum命令安装,只能下载gz文件解压安装
下载ruby安装包到本地,当前最新版本为3.0.3,我选择的也是3.0.3版本ruby-3.0.3.tar.gz
将下载的ruby-3.0.3.tar.gz安装包上传到三台linux服务器
(1)在/usr/local/路径下创建ruby文件夹(可通过ftp创建)
(2)上传到路径下:/usr/local/ruby
#进入/usr/local/ruby路径
cd /usr/local/ruby
# 解压ruby压缩文件
tar -zxvf ruby-3.0.3.tar.gz
# 进入解压路径
cd ruby-3.0.3
# 在当前解压的目录下,编辑配置并编译源代码进行安装
# -prefix是将ruby安装到指定目录,也可以自定义
./configure –-prefix=/usr/local/ruby
# 编译并安装,这个过程十分漫长,一般一个小时以上
make && make install
# 建立软连接,要不然ruby命令无法识别
ln -s /usr/local/ruby/bin/ruby /usr/local/bin/ruby
ln -s /usr/local/ruby/bin/ruby /usr/bin/ruby
# 安装完成后,检查ruby版本
ruby -v
以上同样操作,三台服务器全部安装
这里我用的gem版本跟我的redis版本的大版本是一样的,都是4.0
下载redis-4.1.0.gem安装包,并通过ftp将安装包上传到三台服务器/usr/local路径下
#进入/usr/local路径,安装gem
gem install redis-4.1.0.gem
这一步一般不会有坑,直接安装即可
redis-trib.rb工具脚本具体位置在/usr/local/redis/src路径下
# 进入/usr/local/redis/src路径,并复制redis-trib.rb工具脚本
cd /usr/local/redis/src
cp redis-trip.rb /usr/local/redis-cluster/
同样三台服务器全部执行该操作
到了这一步创建redis集群的准备工作基本上都已经做好了,但是还是有几个坑,要格外注意一下,自己在这几个坑里浪费了好几个小时
# 将IP替换为自己服务器的IP
telnet XXX.XXX.XXX.XXX 7001
对于新服务器来说会报错(telnet: connect to address IP地址: No route to host)
主要原因是没开放端口,可通过以下操作来开放端口
# 开放防火墙端口,其中7001和7002是redis端口,443为https端口,22为ssh端口
firewall-cmd --permanent --zone=public --add-port=7001/tcp
firewall-cmd --permanent --zone=public --add-port=7002/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=22/tcp
# 以上为常规端口开放,以下两个端口是踩了大坑才知道要开放的
# 17001和17002端口也要开放
firewall-cmd --permanent --zone=public --add-port=17001/tcp
firewall-cmd --permanent --zone=public --add-port=17002/tcp
Redis服务在集群中还有一个叫集群总线端口,其端口为客户端连接端口加上10000,即 7001 + 10000 = 17001,所以开放每个集群节点的客户端端口和集群总线端口才能成功创建集群!
这里是个大坑,如果不开放redis集群端口,在执行创建集群命令时会一直在等待,晚上白白等了三个小时才意识到这样是有问题的...
端口放开之后需要将防火墙重启一下,具体操作如下
# 查看防火墙状态
firewall-cmd --state
# 重启防火墙
firewall-cmd --reload
以上操作三台服务器都要执行,执行完成后不会再有端口不通的问题
执行该步骤主要也是踩过坑才知道
因为在执行创建集群命令遇到问题,解决问题后会在redis节点留有一些数据和配置,在最终执行创建redis集群命令时,需要先清理这些旧数据和配置信息,具体操作如下:
# 连接redis节点
redis01/redis-cli -p 7001 -c
# 清除数据
flushall
# 清除配置
cluster reset
以上操作在3台服务器6个redis节点都要操作
执行该步骤也是因为踩过坑,当时是所有准备工作都做好了,执行创建集群命令,但是一直有如下报错
查阅了很多技术文档做了很多操作都不行,最后重启了全部六个节点,奇迹的不再报这个错误了
./redis-trib.rb create --replicas 1 10.100.100.99:7001 10.100.100.100:7001 10.100.100.101:7001 10.100.100.100:7002 10.100.100.101:7002 10.100.100.99:7002
# 进入路径
cd /usr/local/redis-cluster
# 连接redis节点
redis01/redis-cli -p 7001 -c
# 存缓存
set str1 testStr1
#取缓存(可连接任意一个节点获取)
get str1
#连接任意一个redis节点后
# 查看cluster节点
cluster nodes
# 查看集群信息
cluster info