当前位置: 代码迷 >> 综合 >> redis6.x 集群
  详细解决方案

redis6.x 集群

热度:86   发布时间:2023-11-30 19:45:09.0

基于Redis版本: redis-6.0.5

官网地址:https://redis.io/

上一篇博客介绍了redis主从,实际项目中,即使redis有了主从复制,但是每个redis数据库都要保存整个集群中的所有数据,这样容易形成木桶效应。而redis集群架构可以有效的解决木桶效应。

 

一:准备Redis节点

// 解压、命名、编译安装

wget http://download.redis.io/releases/redis-6.0.5.tar.gz   #下载
tar -zxvf redis-6.0.5.tar.gz    #解压
mv redis-6.0.5 redis            #命名
cd redis && make                 #编译安装

make命令可能出现失败:

错误一:cc:命令未找到

解决方案:yum install gcc

错误二:致命错误:jemalloc/jemalloc.h:没有那个文件或目录

解决方案:使用 make MALLOC=libc 命令代替 make

错误三:突然一大推错误和警告,报错信息如下

解决方案:升级gcc版本到9.1,在执行编译

# gcc -v                             # 查看gcc版本
# yum -y install centos-release-scl  # 升级到9.1版本
# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# scl enable devtoolset-9 bash

 

// 把安装好的 Redis 的 src 路径下的运行脚本拷贝到根目录 

cp src/redis-server ./    
cp src/redis-cli ./

// 修改redis的配置文件

vim redis/redis.conf,修改以下8处

# bind 120.0.0.1                          # 注释bind,支持其他ip访问
port 6379                                 # 配置端口
daemonize yes                             # 支持后台启动
pidfile /var/run/redis_6379.pid           # 指定pid文件
cluster-enabled yes                       # 支持redis-cluster
cluster-config-file nodes-6379.conf       # 指定集群配置文件
cluster-node-timeout 1500                 # 连接超时时间
appendonly yes                            # 开启AOF持久化机制

 

 

// 由于集群需要6个节点(3主3从模式),复制六份redis实例

cp -r redis 6379
cp -r redis 6380
cp -r redis 6381
cp -r redis 6382
cp -r redis 6383
cp -r redis 6384

 

//将6380、6381、6382、6383、6384的配置文件中的所有端口替换一致

例如将所有的6379改成6381: %s/6379/6381

点击Enter键执行

 

 

二:安装ruby环境

由于 Redis 集群需要使用 ruby 命令,所以我们需要安装 ruby

yum -y install zlib ruby rubygems   
gem install redis                
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

若执行 gem install redis 时报错(不报错的童鞋直接忽略)

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

我用的是Centos7,Centos默认支持ruby到2.0.0,因此需要升级ruby版本

依次执行下面命令

sudo yum install curl   #安装curlcurl -sSL https://rvm.io/mpapis.asc | gpg2 --import  #安装RVM
curl -L get.rvm.io | bash -s stable    source /usr/local/rvm/scripts/rvm   #编译rvm list known   #查看rvm库中已知的ruby版本rvm install 2.5.1   #安装一个高于2.0.0的 ruby版本rvm use 2.5.1   #使用2.5.1版本的rubyruby --version   #查看ruby版本号gem install redis  #执行安装
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

三:创建redis集群

启动所有redis节点

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

创建集群命令 redis-trib.rb

注意这里不能使用127.0.0.1,否则在Jedis客户端使用时无法连接到!

redis/src/redis-trib.rb create --replicas 1 192.168.1.212:6379 192.168.1.212:6380 192.168.1.212:6381 192.168.1.212:6382 192.168.1.212:6383 192.168.1.212:6384
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 

--replicas 1 :表示主从复制比例为 1:1,即一个主节点对应一个从节点,redis有16383的slot(插槽),slot默认将slot平均分配给三个主节点。

 

查看集群状态和节点信息

cluster info

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

cluster nodes

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 

四:测试

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

什么情况??(error) MOVED 7638 192.168.1.212:6380  

因为当key为abc的时候,redis通过算法得出该key对应的插槽信息是在6380上,现在使用redis-cli连接的6379,无法完成set操作,需要客户端跟踪重定向。

使用 -c参数连接redis,进行操作

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 

五:插槽(slot)

插槽的分配

整个Redis提供了16384个插槽,也就是说集群中的每个节点分得的插槽数总和为16384。

./redis-trib.rb 脚本实现了是将16384个插槽平均分配给了N个节点。

 

当我们执行set abc 123命令时,redis是如何将数据保存到集群中的呢?执行步骤:

1:接收命令set abc 123

2:通过key(abc)计算出插槽值,然后根据插槽值找到对应的节点。(abc的插槽值为:7638)

3:重定向到拥有7638插槽的节点执行命令

 

插槽和key的关系:

通过key的有效部分使用CRC16算法计算出哈希值,再将哈希值对16384取余,得到插槽值
 

六:向集群中新增节点

tip:确保新增的redis实例没有存储过数据

>> 新增master节点

cp -r redis 6385            #复制一个节点
vim 6385/redis.conf         #修改配置文件
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

启动6385

6385/redis-server 6385/redis.conf 
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 使用 redis-trib.rb,添加节点

语法  ./redis-trib.rb  add-node  new_host:new_port existing_host:existing_port

redis/src/redis-trib.rb add-node 192.168.1.212:6385 192.168.1.212:6379
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

add-node是加入集群节点,192.168.1.212:6385 为要加入的节点,192.168.1.212:6379  表示加入的集群的一个节点,用来辨识是哪个集群,理论上那个集群的节点都可以。 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

已经添加成功!查看集群信息:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

发现没有插槽数。

使用  redis-trib.rb 命令从 其他三个节点中转移1000个插槽到 6385

1:输入下列命令,进行相关操作

redis/src/redis-trib.rb reshard 192.168.1.212:6379  #连接集群中任意一个节点
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2:需要移动多少个插槽,输入1000

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

3:填写需要接收插槽的ID,输入 6385 的节点ID

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

4:all:从所有的master节点平均取, done:从某一个master节点中取插槽,最后用done结束,输入all

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

5:确认分配插槽,输入yes

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

插槽分配完成,查看节点信息: 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 

>> 新增slave节点

cp -r redis 6386            #复制一个节点
vim 6385/redis.conf         #修改配置文件
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

6386/redis-server 6386/redis.conf   #启动 6386 实例
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
#将 6386 添加为 6385的从节点
redis/src/redis-trib.rb  add-node --slave 192.168.1.212:6386 192.168.1.212:6385
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

查看集群节点信息

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 

七:删除节点

>> 删除slave节点

在从节点中,我们没有分配哈希槽,所以删除很简单,直接执行命令即可

./redis-trib.rb del-node  ip:port  节点ID

#删除6386节点
redis/src/redis-trib.rb  del-node 192.168.1.212:6383 221d76f96c95cc0af7be30f08e0490013c79023b
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 

>> 删除master节点

因为在主节点中存放着数据,所以我们在删除之前,要把这些数据迁移走,并且把该节点上的哈希槽分配到其他主节点上

redis/src/redis-trib.rb reshard 192.168.1.212:6385
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2:需要移动多少个插槽,输入1000

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

3:填写需要接收插槽的ID,输入 6379 的节点ID

 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

4:输入要删除的节点ID

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

5:确认转移插槽 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

查看集群节点信息

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 6:删除6385节点

redis/src/redis-trib.rb del-node 192.168.1.212:6385 0d4d77571bb0dc7dc551b798891f0b4dc78d4682
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

 

上一篇:redis4.x 主从复制