基于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
若执行 gem install redis 时报错(不报错的童鞋直接忽略)
?
我用的是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 #执行安装
三:创建redis集群
启动所有redis节点
?
创建集群命令 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
?
--replicas 1 :表示主从复制比例为 1:1,即一个主节点对应一个从节点,redis有16383的slot(插槽),slot默认将slot平均分配给三个主节点。
查看集群状态和节点信息
cluster info
?
cluster nodes
?
四:测试
?
什么情况??(error) MOVED 7638 192.168.1.212:6380
因为当key为abc的时候,redis通过算法得出该key对应的插槽信息是在6380上,现在使用redis-cli连接的6379,无法完成set操作,需要客户端跟踪重定向。
使用 -c参数连接redis,进行操作
?
五:插槽(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 #修改配置文件
?
启动6385
6385/redis-server 6385/redis.conf
使用 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
add-node是加入集群节点,192.168.1.212:6385 为要加入的节点,192.168.1.212:6379 表示加入的集群的一个节点,用来辨识是哪个集群,理论上那个集群的节点都可以。
?
已经添加成功!查看集群信息:
?
发现没有插槽数。
使用 redis-trib.rb 命令从 其他三个节点中转移1000个插槽到 6385
1:输入下列命令,进行相关操作
redis/src/redis-trib.rb reshard 192.168.1.212:6379 #连接集群中任意一个节点
2:需要移动多少个插槽,输入1000
?
3:填写需要接收插槽的ID,输入 6385 的节点ID
?
4:all:从所有的master节点平均取, done:从某一个master节点中取插槽,最后用done结束,输入all
?
5:确认分配插槽,输入yes
?
插槽分配完成,查看节点信息:
?
>> 新增slave节点
cp -r redis 6386 #复制一个节点
vim 6385/redis.conf #修改配置文件
?
6386/redis-server 6386/redis.conf #启动 6386 实例
#将 6386 添加为 6385的从节点
redis/src/redis-trib.rb add-node --slave 192.168.1.212:6386 192.168.1.212:6385
查看集群节点信息
?
七:删除节点
>> 删除slave节点
在从节点中,我们没有分配哈希槽,所以删除很简单,直接执行命令即可
./redis-trib.rb del-node ip:port 节点ID
#删除6386节点
redis/src/redis-trib.rb del-node 192.168.1.212:6383 221d76f96c95cc0af7be30f08e0490013c79023b
?
>> 删除master节点
因为在主节点中存放着数据,所以我们在删除之前,要把这些数据迁移走,并且把该节点上的哈希槽分配到其他主节点上
redis/src/redis-trib.rb reshard 192.168.1.212:6385
2:需要移动多少个插槽,输入1000
?
3:填写需要接收插槽的ID,输入 6379 的节点ID
?
4:输入要删除的节点ID
?
5:确认转移插槽
?
查看集群节点信息
?
6:删除6385节点
redis/src/redis-trib.rb del-node 192.168.1.212:6385 0d4d77571bb0dc7dc551b798891f0b4dc78d4682
?
上一篇:redis4.x 主从复制