Redis_Cluster集群

2021年4月17日10:12:16 发表评论
摘要

【心语】不要因害怕冒险而踟蹰不前,而要为创造伟大提供可能。

集群模式:redis官方的 redis-cluster

一、Redis特点介绍

数据分布到各个哈希槽

  1. 所有的redis节点彼此互联,内部使用二进制协议优化传输速度和带宽
  2. 节点的fail 是通过集群中超过半数的节点检测失效时才生效
  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  4. redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value
  5. Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
  6. Redis –cluster 主节点master 挂掉之后,对应的slave 自动接管 变成Master,当主节点恢复之后 自动成为slave ,两者身份互换!!
二、准备安装环境

系统环境准备centos 7.4
安装wget和gcc
[root@localhost ~]# yum install wget gcc gcc-c++ -y
下载redis安装包(官网)
wget -c -P /data/software/ http://download.redis.io/releases/redis-3.2.11.tar.gz
解压和创建存放目录
[root@localhost software]# tar xf redis-3.2.11.tar.gz
[root@localhost software]# cd redis-3.2.11
[root@localhost redis-3.2.11]# make
[root@localhost redis-3.2.11]# mkdir -p /usr/local/redis-cluster
拷贝redis目录
[root@localhost software]# cp -a redis-3.2.11 /usr/local/redis-cluster/redis_7000
[root@localhost software]# cp -a redis-3.2.11 /usr/local/redis-cluster/redis_7001
[root@localhost software]# cp -a redis-3.2.11 /usr/local/redis-cluster/redis_7002
[root@localhost software]# cp -a redis-3.2.11 /usr/local/redis-cluster/redis_7003
[root@localhost software]# cp -a redis-3.2.11 /usr/local/redis-cluster/redis_7004
[root@localhost software]# cp -a redis-3.2.11 /usr/local/redis-cluster/redis_7005
将6个节点的redis.con配置文件进行修改 (这里采用脚本)
#!/bin/bash
for i in `seq 7000 7005`
do
cd /usr/local/redis-cluster/redis_$i
sed -i "/port/s/6379/$i/" /usr/local/redis-cluster/redis_$i/redis.conf
sed -i '/appendonly/s/no/yes/' /usr/local/redis-cluster/redis_$i/redis.conf
sed -i '/daemonize/s/no/yes/' /usr/local/redis-cluster/redis_$i/redis.conf
cat >>/usr/local/redis-cluster/redis_$i/redis.conf <<EOF
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF
done

备注:端口号如果是同一台主机的话,必须不同。不同主机可以相同
备注:我这里是使用一台主机,所以我将六个节点的端口修改为7000-7005
编写启动脚本:
#!/bin/bash
for i in `seq 7000 7005`
do
cd /usr/local/redis-cluster/redis_$i/src
./redis-server ../redis.conf
Done
编写停止脚本
[root@localhost ~]# vim auto_redis_shutdown.sh
#!/bin/bash
for i in `seq 7000 7005`
do
cd /usr/local/redis-cluster/redis_$i/src
./redis-cli -p $i shutdown
done

8、安装ruby 的环境,这里推荐使用yum 安装
[root@localhost software]# yum -y install ruby rubygems
拷贝源码包的redis-trib.rb 文件
[root@localhost ~]# cp redis-3.0.7/src/redis-trib.rb ~
启动redis 集群
[root@localhost software]# sh auto_redis.sh
[root@localhost software]# netstat –lntp
备注:端口 7000-7005 全部已启动
执行redis的创建集群的命令创建集群
[root@localhost ~]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
Redis_Cluster集群 在执行命令:
[root@localhost ~]# gem install redis
Redis_Cluster集群
备注如出现以上错误,原因为ruby 版本比较低导致
升级ruby 版本
[root@localhost ~]# curl -L get.rvm.io | bash -s stable
Redis_Cluster集群
由于没有密钥导致
[root@localhost ~]# gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB Redis_Cluster集群[root@localhost ~]# curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
Redis_Cluster集群[root@localhost ~]# curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -Redis_Cluster集群
在执行一次
[root@localhost ~]# curl -L get.rvm.io | bash -s stable
Redis_Cluster集群
成功!!!在 执行source /etc/profile.d/rvm.sh即可
安装ruby
查看ruby可用版本
Redis_Cluster集群
可用版本 2.7
安装最新的版本
[root@localhost ~]# rvm install 2.7.0
Redis_Cluster集群升级ruby成功
#查看ruby 版本
Ruby –v
Redis_Cluster集群
#安装gem install redis 接口
Redis_Cluster集群
#创建redis集群命令创建集群
[root@localhost ~]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
Redis_Cluster集群
可以看到16384个slot都已经创建完成,并且建立了3个master和对应的replica
验证集群的状态
[root@localhost ~]# /usr/local/redis-cluster/redis_7000/src/redis-cli -c -p 7000
查看集群状态:
127.0.0.1:7000> cluster info
cluster_state:ok #表示集群正常 fail 状态表示至少有一个哈希槽没有被绑定
cluster_slots_assigned:16384 #16384个哈希槽全部被分配到集群节点,是集群正常运行的必要条件
cluster_slots_ok:16384 #  哈希槽状态不是FAIL 和 PFAIL 的数量
cluster_slots_pfail:0
cluster_slots_fail:0 #哈希槽状态是FAIL的数量。如果值不是0,那么集群节点将无法提供查询服务
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:37013
cluster_stats_messages_received:37013
127.0.0.1:7000> cluster nodes
Redis_Cluster集群测试 Redis 集群比较简单的办法就是使用 redis-rb-cluster 或者 redis-cli , 接下来我们将使用 redis-cli 为例来进行演示:
127.0.0.1:7000> set hello word
[root@localhost ~]# redis-cli -c -p 7003
Redis_Cluster集群
添加主节点
集群创建成功后可以向集群中添加节点,下面是添加一个master主节点。
首先,准备一个干净的redis节点。按上面集群版修改redis配置文件。开启该redis节点
Redis_Cluster集群[root@localhost ~]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7001Redis_Cluster集群 查看redis 节点是否添加成功Redis_Cluster集群Redis_Cluster集群
添加成功!
添加从节点
集群创建成功后可以向集群中添加节点,下面是添加一个slave从节点。
添加7007从结点,将7007作为7006的从结点。
首先,准备一个干净的redis节点。按上面集群版修改redis配置文件。开启该redis节点。
查看redis进程;
Redis_Cluster集群
新节点一起来
添加slave 从节点的命令
[root@localhost ~]# ./redis-trib.rb add-node --slave --master-id 0493abc0dd3762e52124c99a1fe9a257256de594 127.0.0.1:7007 127.0.0.1:7006Redis_Cluster集群添加slave 节点成功!!
#查看集群节点Redis_Cluster集群#如上图我们能看到 master 7006 ID 对应的7007 slave上的ID 一致表示添加 7007slave 对应7006 mastet 成功 !
#命令格式详解如下:
备注:1、主节点ID 0493abc0dd3762e52124c99a1fe9a257256de594
2. Slave 节点的IP:127.0.0.1:7007
3、集群中已存在旧master节点:127.0.0.1:7000
命令格式如下:
./redis-trib.rb add-node --slave --master-id 主节点id 添加节点的ip和端口 集群中已存在节点ip和端口
5、对主节点重新分配slot 哈希槽
由于新增加的主节点,是没有slots的,主节点如果没有slots的话,存取数据就都不会被选中
#为主机点分配slots哈希槽
[root@localhost ~]# ./redis-trib.rb reshard 127.0.0.1:7006

Redis_Cluster集群#分配槽点说明
How many slots do you want to move (from 1 to 16384)? #输入你要分配的槽点
What is the receiving node ID? ba075bec7f4ed2df648d57a1a6f9cbb95a349ebd 这个ID 是你要分配给谁就写谁的ID
Source node #1:all #输入all 是代表从所有节点里面分配 凑数100个slots 给 目标节点,如果是输入某个节点ID 那就是从某个节点ID 直接分配出来
#从某个节点直接分配
Redis_Cluster集群完成!
#检查solt 槽是否正确
./redis-trib.rb check 127.0.0.1:7000
#修复集群
./redis-trib.rb fix 127.0.0.1:7001
#查询slot槽分配情况
cluster slots
Redis_Cluster集群
#redis测试数据存取值
根据redis-cluster的key值分配,name应该配分到节点 7001上,如图自动显示从7000节点 跳转到7001节点
Set name andy
Redis_Cluster集群
#我们验证其它节点查询节点,我们能看到从7007节点跳转到7001节点,这也是redis cluster的特点,它是去中心化。每个节点都是对等的,连接那个节点都可以获取和设置数据
Get name
Redis_Cluster集群
#集群删除某一个节点
[root@localhost ~]# ./redis-trib.rb del-node 127.0.0.1:7000 b77c02af83248764d486ff1594792b69d0c58dab
Redis_Cluster集群提示的警告信息解决办法Redis_Cluster集群分别在两台警告的节点上执行清除操作
Redis_Cluster集群
#重新分片slost槽报错
出错的原因分析:这是由于 ruby gem 安装的redis 库,版本不能使用最新的4.0,否则redis-trib.rb reshard 127.0.0.1:7006重新分片时会报错!
如图1
Redis_Cluster集群解决方案
卸载最新redis库 gem uninstall redis
[root@localhost ~]# gem uninstall redisRedis_Cluster集群[root@localhost ~]# gem install redis -v 3.3.5Redis_Cluster集群
安装3.x版本 gem install redis –v 3.3.5 测试3.2.1到3.3.5都可以,4.x以上的分片报错
Redis更改集群中master对应的slave的关系
#使用命令 cluster replicate + master 的ID 即可
Redis_Cluster集群

  • 微信公众号
  • 这是我的微信公众号扫一扫
  • weinxin
  • 我的QQ技术群
  • 我的QQ技术群扫一扫
  • weinxin
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: