Redis Cluster集群部署文档

1. 必读概述

1.1 部署条件

版本说明
Centos7.0以上64位、Redis 3.2.12以上,cluster的gem版本redis-3.3.5.gem

yum -y install epel-release gcc gcc-c++ wget git

1.2 节点架构

节点概述
本文档的cluster集群部署方案,以三主三从为例说明,共6个Redis实例、3台服务器,主从混合部署。涉及集群搭建、服务器异常和扩容,以供参考。

架构说明
将集群划分为A、B、C三个名称的主库,其从库分别名为A1、B1和C1。
三组主从混合部署,其IP和端口为:

第1台服务器,A组主库和B组从库:
192.168.25.130:6379 主库A
192.168.25.130:6380 从库A1,所属主库为C库

第2台服务器,B组主库和C组从库:
192.168.25.131:6379 主库B
192.168.25.131:6380 从库B1,所属主库为A库

第3台服务器,C组主库和A组从库:
192.168.25.132:6379 主库C
192.168.25.132:6380 从库C1,所属主库为B库

1.3 步骤简述

(1)在三台服务器都安装Redis 3.2.12;
(2)在每台服务器增加两个端口号命名的配置文件,比如redis_6379.conf;
(3)在每台服务器的redis数据存放目录增加两个以端口号命名的数据目录用于存放redis实例数据,比如redis_6379;
(4)在每台服务器的redis日志目录增加两个以端口号命名的日志文件,比如redis_6379.log;
(5)设置redis配置,主要修改以下配置:
bind 绑定IP,局域网可以设为0.0.0.0
port 端口号
logfile 日志文件路径
dir 所在目录路径
cluster-enabled 是否开启cluster集群,值为yes或no
cluster-config-file nodes-6379.conf 集群配置文件的名称,这个文件并不需要手动配置,这个配置文件有Redis生成并更新,一般为nodes-端口号.conf
cluster-node-timeout 5000 集群节点超时毫秒数
masterauth 主库密码,从库同步时要用这个密码,一般配置成requirepass一样
requirepass 客记端请求的密码,客户端请求执行命令时的密码
daemonize 是否后台守护进程启动,值为yes或no,我们这里设置为yes
pidfile 如果daemonize为yes,启动时会生成/var/run/redis.pid的文件,可以端口结尾,如redis_6379.pid
protected-mode 是否安全模式,值为yes或no,这里我们设为no
appendonly yes (默认no,关闭)表示是否开启AOF持久化

2. 具体部署

2.1 安装Redis和cluster

安装tcl

yum -y install tcl

使用redis-3.2.12.tar.gz安装redis.3.2.12

cd /usr/local/
wget https://download.redis.io/releases/redis-3.2.12.tar.gz
tar -zxvf redis-3.2.12.tar.gz
cd /usr/local/redis-3.2.12/
make && make test
make install

进入utils目录并执行安装脚本install_server.sh

cd /usr/local/redis-3.2.12/utils
sh install_server.sh

具体安装路径如下:

Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli

在这里插入图片描述

安装Cluster
Cluster是用Ruby语言编写的,需要安装ruby和rubygems。

yum install -y ruby
yum install -y rubygems

安装完成后,需要安装redis.3.3.0.gem以上版本
下载地址:https://rubygems.org/gems/redis/version
我们选择3.3.5版本 http://rubygems.org/downloads/redis-3.3.5.gem

cd /usr/local/
wget http://rubygems.org/downloads/redis-3.3.5.gem
gem install -l ./redis-3.3.5.gem

或者,在线安装:

gem install redis

2.2 redis和cluster配置

2.2.1 cluster密码设置

使用密码时,要设置cluster本身的密码,要和redis配置的密码一致。
如果不设置它的密码,操作集群时会报错:[ERR] Sorry, can’t connect to node 192.168.25.130:6379。
需要找到gems安装目录,本文档安装时是在/usr/local/share/gems目录。
然后修改它下面的client.rb文件:

sudo vi /usr/local/share/gems/gems/redis-3.3.5/lib/redis/client.rb

在这里插入图片描述

2.2.2 主库配置

在3台服务器确认并修改/etc/redis/6379.conf。
首先,备份原配置文件:

sudo cp -ar /etc/redis/6379.conf /etc/redis/6379.conf_bak

然后,修改配置:

sudo vi /etc/redis/6379.conf

开启或修改配置如下:

bind 0.0.0.0
# 端口号
port 6379
logfile /var/log/redis/6379
dir /var/lib/redis/6379
cluster-enabled yes
cluster-config-file nodes-6379.conf 
cluster-node-timeout 5000
# 主从同步密码
masterauth abc123456
# 客户端请求密码
requirepass abc123456
daemonize yes
pidfile /var/run/redis_6379.pid
protected-mode no
appendonly yes

2.2.3 从库配置

在3台服务器的/etc/redis复制6379.conf为6380.conf。
首先,复制配置文件:

sudo cp -ar /etc/redis/6379.conf /etc/redis/6380.conf

然后,替换配置中端口号:

sudo sed -i "s/6379/6380/g" /etc/redis/6380.conf

最后,确认一下配置:
sudo vi /etc/redis/6380.conf
最终配置如下:

bind 0.0.0.0
# 端口号
port 6380
logfile /var/log/redis/6380
dir /var/lib/redis/6380
cluster-enabled yes
cluster-config-file nodes-6380.conf 
cluster-node-timeout 5000
# 主从同步密码
masterauth abc123456
# 客户端请求密码
requirepass abc123456
daemonize yes
pidfile /var/run/redis_6380.pid
protected-mode no
appendonly yes

2.3 cluster目录和日志

在3台服务器如何下相同操作:

在/var/lib/redis下面分别创建6379(已存在)和6380两个目录,并确认为空。

sudo mkdir -p /var/lib/redis/6380

在/var/log/redis下面分别创建6379.log(已存在)和6380.log两个日志文件。

sudo mkdir -p /var/log/redis
sudo touch /var/log/redis/6379.log
sudo touch /var/log/redis/6380.log

2.4 cluster启动

2.4.1 开启服务和系统自启

系统自动启动
在/etc/init.d/下面从redis_6379复制一个redis_6380,并替换其中的端口号:

sudo cp -ar /etc/init.d/redis_6379 /etc/init.d/redis_6380
sudo sed -i "s/6379/6380/g" /etc/init.d/redis_6380

然后确认是否修改端口成功:
vi /etc/init.d/redis_6380

开启自动启动

sudo /sbin/chkconfig redis_6379 on
sudo /sbin/chkconfig redis_6380 on

2.4.2 启动redis实例

启动三台服务器的主从redis实例
手动启动:

sudo /usr/local/bin/redis-server /etc/redis/6379.conf
sudo /usr/local/bin/redis-server /etc/redis/6380.conf

服务启动:

sudo systemctl start redis_6379.service
sudo systemctl start redis_6380.service

检查是否启动:

ps -ef|grep redis

显示6379和6480的redis进程,则表示启动成功

2.4.3 端口开放

如果开启了防火墙,需要开放6379和6380端口。
同时还要开放集群总线端口,它们是节点端口加上10000,即16397和16380。

检查端口是否开放:
firewall-cmd --list-port

开放端口:
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --zone=public --add-port=16379/tcp --permanent
firewall-cmd --zone=public --add-port=6380/tcp --permanent
firewall-cmd --zone=public --add-port=16380/tcp --permanent
firewall-cmd --reload

再次查看是否开放成功:
firewall-cmd --list-port

2.4.4 创建集群

使用redis3.2.12的源码中的/usr/local/redis-3.2.12/src/redis-trib.rb可以创建集群和添加节点。

(1) 创建集群

输入命令:

cd /usr/local/redis-3.2.12/src
sudo ./redis-trib.rb create --replicas 1 192.168.52.61:6379 192.168.52.62:6379 192.168.52.63:6379 192.168.52.61:6380 192.168.52.62:6380 192.168.52.63:6380

注意:后半部分的实例IP和端口,按照三主再三从的顺序。
当出现以下提示时输入yes,即可进入创建过程:
Can I set the above configuration? (type ‘yes’ to accept):

进入创建过程:

>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 192.168.52.61:6379)
M: 1a0e69f83c78abf16c94eca6e03698b9a3375e42 192.168.52.61:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 01d2859e1ddd1e5a3555f4b56557bfa6a138a580 192.168.52.62:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: f309f4e161578b1d92a9d48c09fef7a3fe9abf32 192.168.52.62:6380
   slots: (0 slots) slave
   replicates 1a0e69f83c78abf16c94eca6e03698b9a3375e42
M: 1c2eb7f24e1750ef98e636eef457cb0a6b16c0ef 192.168.52.63:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 81917f31382bbbba176d6e45fb6edba829e8137c 192.168.52.63:6380
   slots: (0 slots) slave
   replicates 1c2eb7f24e1750ef98e636eef457cb0a6b16c0ef
S: 22a37a48784cef669ccdd2c5478d2fca9c131db4 192.168.52.61:6380
   slots: (0 slots) slave
   replicates 01d2859e1ddd1e5a3555f4b56557bfa6a138a580
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

在这里插入图片描述

注意:
如果出Waiting for the cluster to join… 一直等待,需检查16379和16380的总线端品是否开放成功。
如果出现[ERR] Sorry, can’t connect to node 192.168.25.130:6379,请检查后句说的ip和端口是否可以redis-cli访问,并且密码是否配置正确和相同,以及cluster集群密码是否设置一致,上文有描述。

(2) 调整主从对应关系

如果主从对应关系不对,可以在用redis-cli连接从库修改所属主库。
注意:想改哪个从库的主库必须连接这个从库修改。
在这里插入图片描述
上图看到132服务器的从库6380所属的主库是本服务器132的6379,不符合上述第1.1点混搭需求,需要改成131的6379,它的id从图片可以看到是b2728830699fe0b86c07afc97438588154a50825。
连接132的6380从库:

sudo /usr/local/bin/redis-cli -h 192.168.25.132 -p 6380 -c
> auth abc123456
> cluster replicate b2728830699fe0b86c07afc97438588154a50825
> cluster nodes

然后按上面第1.1点调整其他的从属关系,最终效果图为:
在这里插入图片描述

2.4.5 检测集群是否可用

在某台服务器中使用redis-cli连接集群:

sudo /usr/local/bin/redis-cli -h 192.168.52.62 -p 6379 -c

此时,进入集群管理命令行:
cluster info 显示cluster_state:ok表示集群健康可用, 如果显示fail则为不可用。
cluster nodes 可显示所有节点信息,第三列显示主从类型和状态,如果显示为fail表示该启动失败。

3. 集群扩容

3.1 添加redis实例

按上述集群部署方案增加节点服务器,并设置好配置、目录等。
注意:建议保证主从实例依然是混合部署。

3.2 添加集群节点

3.2.1添加主从节点

使用源码包的redis-trib.tb add-node命令添加节点
这里我们添加192.168.25.133节点6379是主库,6380是从库。
部署完毕,将132和133服务器的从库调换。
进入redis源码目录
cd /usr/local/redis-3.2.12/src

添加主节点:
sudo ./redis-trib.rb add-node 192.168.25.133:6379 192.168.25.130:6379
在这里插入图片描述
注意:
目前扩容后cluster nodes应该看到有7个node了
如果丢失了一个老库,可能是配置错乱了,需要每个库都cluster reset并且flushall。
然后删除/var/lib/redis每个端口目录中的nodes.conf文件,重新创建集群再扩容。

添加从节点:
(1)进入集群,找到希望绑定的主库id:

sudo /usr/local/bin/redis-cli -h 192.168.25.130 -p 6379 -a abc123456 -c cluster nodes

在这里插入图片描述
可以看到132主库6379的id为15c83da47f97d0276bd24ed597500b74c34ff648。

(2)添加从节点:
sudo ./redis-trib.rb add-node --slave --master-id 15c83da47f97d0276bd24ed597500b74c34ff648 192.168.25.133:6380 192.168.25.130:6379
注意:
最后的IP和端口可以是任意集群内可用的IP和端口
在这里插入图片描述
在这里插入图片描述

3.2.2 修改主从关系

为了混合部署,要用cluster nodes检测主从关系,不对时连接从库使用cluster replicate命令进行修改。
上述添加的从节点从属于132的6379主库:

现在要将132原来的从库130的6380从库换到133的6379扩容主库。

sudo /usr/local/bin/redis-cli -h 192.168.25.132 -p 6380 -a abc123456 -c 
> auth abc123456
> cluster nodes
> cluster replicate c950571ecb5bd53f5b0df4d8e0f780314712fe7a

最终效果图为:
在这里插入图片描述

3.3 重新分配集群槽位

上述添加了主库和从库节点后,需要重新分配槽位才能使用。
当前所述有4组服务器,每组主从节点需要分配槽位数约等于16384/4,即4096。
输入命令:

cd /usr/local/redis-3.2.12/src
sudo ./redis-trib.rb reshard 192.168.25.130:6379

在这里插入图片描述
命令说明:
输出槽位数为4096;
节点id输入133的6479主库的id;
重新分配的节点范围可输入all,表示全部重新分配。

注意:
如果出现[ERR] Calling MIGRATE: ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)错误,
请检测集群:

sudo ./redis-trib.rb check 192.168.25.130:6379

一般会出现如下类似错误:

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 192.168.25.132:6379 has slots in importing state (7061).
[WARNING] Node 192.168.25.133:6379 has slots in migrating state (7061).
[WARNING] The following slots are open: 7061
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** Please fix your cluster problems before resharding

意思是7061这个槽位状态异常,卡住了。
解决方法是:
登录两个服务器的6379主库
执行cluster setslot 7061 stable
再check继续,直到完成。最后可以redis-cli进到任意实例,看看slots分配情况:
cluster slots
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值