原理:

  • Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储。
  • 集群使用公式(CRC16 key)& 16384计算键key数据那个槽。
  • 16384个slot均匀分布在各个节点上。
  • 集群中每个主节点将承担一部分槽点的维护,而槽点中存储着数据,每个主节点都有至少一个从节点用于高可用。

节点通信方式:

  • 开启一个端口 设置的端口号+10000,用于集群之间节点通信交换信息。
  • 每个节点默认每秒10次选择随机5个节点发送ping消息,将自身信息和知道的集群信息传递,收到ping消息后返回pong消息做回复,最后通过这种随机的消息交换,最终每个节点将获得所有信息。
  • 当某个主节点挂掉,所有节点将会发现主节点挂掉了,作为主节点的从节点,就会接替主节点的工作,然后告诉所有其它节点,他成为了主。这样其它存活节点,就将它们维护的信息表更新从节点将接任做主,如果都挂掉集群将报错。当从一个节点操作,根据一致性哈希计算后将存储在其中一个主节点中,从节点将同步主的数据。
  • redis cluster是去中心化的,集群中的每个节点都是平等的关系,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃。
  • 搭建集群时,会为每一个分片的主节点,对应一个从节点。实现slaveof功能,同时当主节点down,实现sentinel哨兵的自动failover切换功能

Redis分布式集群(部署):

端口号:7000-7005

本次分布式分片集群在一台LInux系统即可,只需要安装多个实例作为集群配置。

安装ruby环境支持:

yum -y install ruby rubygems

yum安装2.0.0版本,但是gem需要2.2.2版本以上,所以选择编译

下载并安装ruby环境:

wget https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.gz
tar xf ruby-2.6.1.tar.gz && cd ruby-2.6.1/
./configure --prefix=/usr/local/ruby
make && make install && echo $?
echo 'export PATH=$PATH:/usr/local/ruby/bin' >> /etc/profile
source /etc/profile

修改gem工具国内源:

# 查看gem工具源地址
gem sources -l
# 添加一个阿里云的gem工具源
gem sources -a http://mirrors.aliyun.com/rubygems/
# 删除gem工具默认国外源
gem sources --remove https://rubygems.org/
# 下载当前最新版本集群插件
gem install redis -v 4.1.0

集群节点准备:

mkdir /data/700{0..5}

配置7000端口实例:

vim /data/7000/redis.conf
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

拷贝其他端口实例:

# 拷贝配置文件cp /data/7000/redis.conf /data/7001/
cp /data/7000/redis.conf /data/7002/
cp /data/7000/redis.conf /data/7003/
cp /data/7000/redis.conf /data/7004/
cp /data/7000/redis.conf /data/7005/
# 修改配置文件内容
sed -i 's#7000#7001#g' /data/7001/redis.conf
sed -i 's#7000#7002#g' /data/7002/redis.conf
sed -i 's#7000#7003#g' /data/7003/redis.conf
sed -i 's#7000#7004#g' /data/7004/redis.conf
sed -i 's#7000#7005#g' /data/7005/redis.conf

启动所有实例:

redis-server /data/7000/redis.conf
redis-server /data/7001/redis.conf
redis-server /data/7002/redis.conf
redis-server /data/7003/redis.conf
redis-server /data/7004/redis.conf
redis-server /data/7005/redis.conf

创建命令软链接:

(这个命令过期了,现在使用redis-cli命令)(可选执行命令)

ln -s /usr/local/redis-5.0.2/src/redis-trib.rb /usr/sbin/

查看进程:

ps -ef |grep redis-server

加入所有实例节点到集群管理:

# --replicas 1",1是代表每一个主有一个从,后面的是所有节点的地址与端口信息
redis-cli --cluster create --cluster-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

分布式主从规则为,前三个实例节点是主,对应的后面三个实例节点为从节点,如果replicas 2,那就多加3个实例节点

查看主节点状态:

redis-cli -p 7000 cluster nodes|grep master

查看从节点状态:

redis-cli -p 7000 cluster nodes|grep slave

Redis-分布式集群(管理)

集群节点增加准备:

mkdir /data/700{6..7}拷贝其他端口实例:
# 拷贝配置文件cp /data/7000/redis.conf /data/7006/
cp /data/7000/redis.conf /data/7007/# 修改配置文件内容
sed -i 's#7000#7006#g' /data/7006/redis.conf
sed -i 's#7000#7007#g' /data/7007/redis.conf

启动新节点实例:

redis-server /data/7006/redis.conf
redis-server /data/7007/redis.conf

查看进程:

ps -ef |grep redis-server

添加主节点:(7000实例是管理节点)

#'把7006实例添加到7000实例这个主节点所在集群内(此时已经有了4个主节点)
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

查看主节点状态:

redis-cli -p 7000 cluster nodes|grep master

转移slot(重新分片):

#'操作集群管理节点从新分配,并在交互界面指定分片大小、选择接收分片的节点ID
redis-cli --cluster reshard 127.0.0.1:7000How many slots do you want to move (from 1 to 16384)? 4096
#通过人工手动计算数据分片总大小除以主节点后的数字What is the receiving node ID? 2129d28f0a86fc89571e49a59a0739812cff7953
#选择接收数据分片的节点ID,(这是新增节点7006实例的ID号)Source node #1: all
#选择从哪些源主节点重新分片给新主节点)(all是所有节点
)Do you want to proceed with the proposed reshard plan (yes/no)? yes
#确认修改以上的操作

重新查看主节点状态:(可以看到集群数据的重新分片)

redis-cli -p 7000 cluster nodes|grep master

添加从节点:

#'把7007实例节点添加到7006实例主节点内,并指定对应7006实例主节点坐在集群的管理节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 2129d28f0a86fc89571e49a59a0739812cff7953

查看从节点状态:

redis-cli -p 7000 cluster nodes|grep slave

集群节点删除准备:

移动要删除节点的数据分片:

#'操作集群管理节点从新分配,并在交互界面指定分片大小、选择接收分片的节点ID
redis-cli --cluster reshard 127.0.0.1:7000#方法是根据要删除master节点的分片位置,然后一个组分一个节点 , 也可以直接移动所有数据片到一个节点
How many slots do you want to move (from 1 to 16384)? 1365                    #通过人工手动查看数据分片总大小
What is the receiving node ID? e64f9074a3733fff7baa9a4848190e56831d5447#选择接收数据分片的节点ID,(这是新增节点7006实例的ID号)
Source node #1: 2129d28f0a86fc89571e49a59a0739812cff7953#选择从哪些源主节点重新分片给新主节点(这是要删除的主节点的ID号)Source node #2: done
#这是结束命令Do you want to proceed with the proposed reshard plan (yes/no)? yes
#确认修改以上的操作

重新查看主节点状态:(可以看到集群数据的重新分片)

redis-cli -p 7000 cluster nodes|grep master

继续移动数据片:

#'操作集群管理节点从新分配,并在交互界面指定分片大小、选择接收分片的节点ID
redis-cli --cluster reshard 127.0.0.1:7000# 方法是根据要删除master节点的分片位置,然后一个组分一个节点 , 也可以直接移动所有数据片到一个节点
How many slots do you want to move (from 1 to 16384)? 1366                    #通过人工手动查看数据分片总大小
What is the receiving node ID? f6c1aaea3a8c56e0c7dee8ad7ae17e26dd04244c#选择接收数据分片的节点ID,(这是新增节点7006实例的ID号)
Source node #1: 2129d28f0a86fc89571e49a59a0739812cff7953#选择从哪些源主节点重新分片给新主节点(这是要删除的主节点的ID号)Source node #2: done
#这是结束命令Do you want to proceed with the proposed reshard plan (yes/no)? yes
#确认修改以上的操作

重新查看主节点状态:(可以看到集群数据的重新分片)

redis-cli -p 7000 cluster nodes|grep master

最后一次移动数据片:

#'操作集群管理节点从新分配,并在交互界面指定分片大小、选择接收分片的节点ID
redis-cli --cluster reshard 127.0.0.1:7000#方法是根据要删除master节点的分片位置,然后一个组分一个节点 , 也可以直接移动所有数据片到一个节点
How many slots do you want to move (from 1 to 16384)? 1365                    

重新查看主节点状态:(可以看到集群数据的重新分片)

redis-cli -p 7000 cluster nodes|grep master

删除清空数据片的主节点:

#'删除已经清空数据的7006实例
redis-cli --cluster del-node 127.0.0.1:7006 2129d28f0a86fc89571e49a59a0739812cff7953
#删除没有主库的7007实例
redis-cli --cluster del-node 127.0.0.1:7007 821bcf78c5e4c0b08aa7a5d514214b657ebec4ab

其他配置管理:

#内存信息查看
redis-cli -p 6382 -a redhat info memory#设置最大只能使用100MB的内存
redis-cli -p 6382 -a redhat config set maxmemory 102400000


  • 升职加薪必备!运维工程师打怪升级进阶成神之路
  • 我没有开挂的人生!自律和坚持,是我走IT之路的唯一捷径
  • 全网最新、最全Linux面试题(2020版)!
  • 史上最全、最新的Redis面试题(2020最新版)!
  • 赞!7000 字学习笔记,MySQL 从入门到放弃

如有错误或其它问题,欢迎小伙伴留言评论、指正。如有帮助,欢迎点赞+转发分享。

更多相关开源技术文章,请持续关注民工哥知乎技术专栏。

我是民工哥,一个爱折腾的IT技术老司机,欢迎关注我,我们一起学习,共同成长!!

redis分片_5000+字硬核干货!Redis 分布式集群部署实战相关推荐

  1. redis 槽点重新分配 集群_5000+字硬核干货!Redis 分布式集群部署实战

    原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储. 集群使用公式(CRC16 key)& 16384计算键key ...

  2. 硬核干货!Redis 分布式集群部署实战

    原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储. 集群使用公式(CRC16 key)& 16384计算键key ...

  3. down redis集群_硬核干货!Redis 分布式集群部署实战

    原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储. 集群使用公式(CRC16 key)& 16384计算键key ...

  4. 技术干货实战(4)- 分布式集群部署模式下Nginx如何实现用户登录Session共享(含详细配置与代码实战)

    原文链接:技术干货实战(4)- 分布式集群部署模式下Nginx如何实现用户登录Session共享(含详细配置与代码实战) 最近有小伙伴催更,让debug多写点技术干货,以便多学习.巩固一些技能:没办法 ...

  5. redis详解(四)-- 高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...

  6. Linux服务集群部署实战--MySQL、Redis、ES、RocketMQ、Zookeeper

    部署架构 部署计划 MySQL服务部署 架构 规划 部署pxc集群 部署MySQL主从架构 部署mycat集群 创建表以及测试 部署HAProxy redis集群部署 redis集群采用3主3从的架构 ...

  7. redis 分布式集群部署

    redis 分布式集群 参考视频 redis下载 最好下载一份新的redis.conf 我redis7.0.0 报错,后重新下载了一份 redis.conf ,解决 *** FATAL CONFIG ...

  8. Redis分布式集群部署安装及细节(多主机搭建集群开启多个服务)

    注意: redis的安装步骤与同机器下一致,这里只讲解个别不同配置的修改 每台主机都有固定的IP 10.25.84.105SZD-L0073672   此台机器部署了多个服务 10.25.84.106 ...

  9. Redis(3.2.3)集群部署实战

    一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis官网地址:http://red ...

最新文章

  1. linux系统管理及vim
  2. E1载波的数据速率是(16)Mb/s,E3载波的数据速率是(17)Mb/s。答案】B D
  3. Python基础教程:对象及数字对象与数学运算
  4. BZOJ1693: [Usaco2007 Demo]Asteroids
  5. 数据库面试题【二、MYSQL的两种存储引擎区别(事务、锁级别等等)】
  6. 【Fabric】Python自动化部署工具-Fabric入门教程
  7. 【CodeForces - 673D】Bear and Two Paths(构造,tricks)
  8. 博客已经迁移到 http://imbotao.top 也会同步到这儿
  9. 物联网linux_Linux的未来,Google的物联网标准等
  10. as2的Key.isDown方法在as3的代替
  11. 判断一个变量是否是Array类型
  12. matlab虚拟现实之V-Realm Builder2中viewpoint节点的使用
  13. c语言自学教程——字符函数和字符串函数
  14. 晶体管电路设计.铃木雅臣
  15. 基础篇:6)形位公差标注(GDT标准)-总章
  16. mybatis官方文档中文版
  17. 通达信程序化交易接口使用步骤
  18. 微博html5版网址打不开,网页微博打不开怎么办
  19. Python中while循环练习——打印星星总结
  20. 非标产品和标准产品的区别(关于3C)

热门文章

  1. SAP Spartacus 用户登录成功后,Access Token 持久化到浏览器 local storage 的执行原理
  2. ABAP Netweaver和SAP Hybris的内存管理
  3. 为什么SAP GUI里的传统事务码能通过Fiori Launchpad启动
  4. Hybris Commerce Product字段名列表
  5. SAP Hybris Commerce product读取的调试截图
  6. SAP CRM pricing read的实现逻辑
  7. read configuration - shared object - read_comp_configuration_raw
  8. SAP UI5 walkthrough第一第二部分解析:data-sap-ui-libs=“sap.ui.commons,sap.ui.table“
  9. ABAP Netweaver体内的那些寄生式编程语言
  10. CRM WebUI的错误消息是如何从后台服务器取出并绘制到前台的