摘要:我发现,凡是涉及到大数据存储,好像都得有个横向扩容方案,不管是在应用层实现,还是在数据存储本身实现。Redis作为一个高效的数据缓存,也周到的提供了数据sharding特性,本文就先讲下最基础的东西:什么是redis的sharding以及如何搭建redis cluster,欢迎大家关注我的微信公众号虾米兵法(sammytalk)和我一起讨论。

简单介绍数据分片模型

所谓数据分片,就是将所存储的数据按照一定的规则存储在不同的存储服务/介质上,通过降低单服务/介质的数据量级来提升数据处理效能,从而达到拥有数据处理横向扩容的能力的目的。

这样说貌似有点抽象,我们通过一个例子简单看下。有一个数据主存储器拥来存储每天的订单,随着时间的推移,数据量级不断扩大,因为机器硬件能力有限,必然造成数据存储性能的衰减,如果应用层的容错机制设计不合理,很容易造成整个服务的性能下降。

要解决这个问题,除了加强硬件配置以外,还可以通过增加节点,将数据全集拆分成一个个的小数据集合进行存储的方式来解决。那么拆分以后,数据该如何存储?如何读取?如何迁移数据呢?这里就需要一个数据分布规则方案来支撑。通过这种方式,每个数据节点都可以将数据集保持在一定大小范围,从而保持一定都数据处理效率,而应对数据增长采用增加节点都方式来进行,当然数据分布规则和(数据-节点)的获取方式成为影响效率的关键,如果处理不好,非常可能将耗时集中在节点查找及数据合并处理上。

redis如何实现数据分片

Redis至少存在三个数据分片,每个分片称为master,分片之前的关系为完全图,假设整个cluster有N个节点,那么每个节点都和其他N-1个节点保持连接和心跳,节点之间采用Gossip协议进行通信。通信主要确认节点是否存活、节点的数据版本、投票选择新的master等内容。

Redis的数据如何分布在分片上呢?Redis内部被固定划分为16384个槽(slot),每个数据都会被存储在指定都槽内,当用户put一个key时,redis会调用crc16函数然后与0x3FFF进行&运算确定数据存储的槽位,当数据正确存储后,通过Gossip协议向其他节点广播该数据当位置,所以redis没有中心路由的概念,所有节点都知道数据-节点都路由信息。

既然没有中心路由,客户端在一开获取/更新数据的时候是随机对master节点进行访问,如果数据经过计算是在该节点上,那么存取没有问题,否则会返回一个MOVED异常(slot没有正在移动过程中),客户端需要重新指向正确的节点对数据进行处理,当然客户端最好能缓存数据与节点的对应关系,提升数据访问或者更新速度。

Redis分片对通讯机制东西很多,这里初步介绍一下,详细对在后面的文章中具体介绍。

开始动手搭建redis cluster

在此实战小结里,我将一步步的搭建一个分片集群(如下图),包括3个master节点和3个slave节点(每个master节点有1个slave节点)。

首先准备6台Linux服务器(我安装的是Centos7.2)。

在每台服务器上安装redis服务,具体如下:

#下载redis4.0.8
wget http://download.redis.io/releases/redis-4.0.8.tar.gz #解压安装包
tar xzvf redis-4.0.8.tar.gz #安装GCC
yum -y install gcc#进入redis目录
cd redis-4.0.8#编译redis源码
make MALLOC=libc#安装redis
make install

所有的服务安装好之后,开始修改src文件夹下的配置文件redis.conf,修改如下几项(最小配置):

#端口分别设置为10000~10005
port 10000
#开启cluster
cluster-enabled yes
#clusetr的配置文件名,保存节点相关的信息
#自动创建,内容无需手工修改
cluster-config-file nodes.conf
#节点fail的超时时间
cluster-node-timeout 3000
#开始aof文件持久化
appendonly yes
#绑定监听的ip地址,写物理ip地址
bind xx.xx.xx.xx

选择一台机器安装ruby运行环境,因为redis的集群管理工具redis-trib.rb需要ruby运行环境。

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBcurl -sSL https://get.rvm.io | bash -s stable

以上步骤是安装rvm管理器,安装成功后会有如下提示:

  • To start using RVM you need to run source /etc/profile.d/rvm.sh
    in all your open shell windows, in rare cases you need to reopen all shell windows.

执行提示语句,并安装ruby2.4.2:

source /etc/profile.d/rvm.shrvm install 2.4.2gem install redis --version 3.0.0 

启动redis服务

redis-server redis.confg &

创建redis分片集群

随便选择一台服务器,进入redis安装目录的src目录,执行如下命令:

./redis-trib.rb create --replicas 1 ip1:port1 ip2:port2

其中ip和port就是redis的ip和端口,–replicas 1表示为每个master生成一个slave节点。

执行后,redis会生成集群创建计划,输入yes,回车,直到看到如下信息,redis集群就创建完毕了。

[OK] All 16384 slots covered.

运行如下命令检查集群状态

./redis-trib.rb check ip:port

ip和port为任意一个redis的ip和端口,可以看到输出的集群信息,包括节点的id、地址、负责的槽区范围、主/从节点角色信息。如果是从节点,还会显示主节点的id。

后续

Redis分片集群还有很多东西可以分享,本文初步介绍了下基本概念和基本的安装过程,不过我认为:虽然redis支持分片,但是redis并不保证的数据的完全一致性,所以,在使用redis分片的过程中,请把它当成一个锦上添花的工具,不要过分依赖,设计好强大的应用层的数据保障机制才是王道。本文就到这里,如有错误,欢迎指正。

欢迎关注我的微信公众号

和你聊聊如何搭建redis分片集群相关推荐

  1. Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)

    文章目录 一.要求: 二.知识总结 缓存雪崩 解决方案 docker中redis分片集群搭建 配置好配置文件 redis-6380.conf redis-6381.conf redis-6382.co ...

  2. Docker下搭建Redis分片集群

    分片集群结构 同一台虚拟机中开启6个redis实例,模拟分片集群 IP  PORT 角色 192.168.19.128 7001 master 192.168.19.128 7002 master 1 ...

  3. Redis 分片集群搭建

    Redis 分片集群模式 主从和哨兵可以解决高可用.高并发读的问题.但是依然有两个问题没有解决: 海量数据存储问题,单台服务的磁盘存储终究是有瓶颈: master 负责写操作,高并发写情况下,单台 m ...

  4. centos7 docker-compose安装_Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

  5. 搭建MongoDB分片集群

    在部门服务器搭建MongoDB分片集群,记录整个操作过程,朋友们也可以参考. 计划如下: 用5台机器搭建,IP分别为:192.168.58.5.192.168.58.6.192.168.58.8.19 ...

  6. DOCKER-COMPOSE搭建MONGODB分片集群(单机版)

    docker-compose搭建mongodb分片集群(单机版) - 丰哥坑到 - 博客园

  7. linux系统搭建redis cluster集群 切片集群 教程 centOS系统redis6

    目录 一.说明 二.环境信息 三.介绍 四.部署流程 五.测试 一.说明 该教程为redis集群-cluster切片集群部署方式,不包含redis的安装过程,如需redis安装教程请移步以下链接: & ...

  8. Redis分片集群启动过程分析

    Redis分片集群启动分析 分片集群为6个节点,备份方式AOF和RDB都已经开启 节点启动log分析 1:C 08 May 2023 05:34:52.156 # oO0OoO0OoO0Oo Redi ...

  9. (四)分布式缓存——Redis分片集群

    分布式缓存--Redis分片集群: 一.分片集群: 1.分片集群特征: 二.散列插槽: 1.散列插槽: 2.总结: 2.1 Redis如何判断某个key应该在哪个实例? 2.2 如何将同一类数据固定的 ...

最新文章

  1. 配置高可用的Hadoop平台
  2. C++ STL set(集合)
  3. 浙江义乌发现桥头遗址,将5000年中华文明,再前推4000年?
  4. 雷神开机logo更改_九代酷睿i9加持的性能怪兽 雷神911黑武士Ⅱ评测
  5. 程序员网上晒出新同事与老同事一起吃饭的照片,太搞笑
  6. [译] 关于CSS中的float和position (父容器div内的子元素div为float时,父元素无法撑开(或高度自适应)的解决方式)
  7. ctfshow-萌新-web5( 利用位运算符控制SQL获取网站敏感信息)
  8. ThinkPHP5 助手函数
  9. 字符串压缩-连续字符压缩并输出次数
  10. ArcGIS10.2的详细安装过程和下载方法
  11. 全球超高精度 IP 实时定位系统--捕风者
  12. 读取QQ ClientKey失败分析
  13. STL两种格式:文本格式与二进制格式
  14. 真人qq秀代码_关于QQ我的记忆
  15. Spring整合Mybatis遇到的错误一
  16. Mac/MacBookPro解决系统升级后运行卡顿问题(非配置问题)
  17. MATLAB演奏音乐
  18. 一文搞定子网划分!子网掩码!超详细例题解析!
  19. 如何生成git的公钥和私钥
  20. 我们是科幻迷(刘慈欣)

热门文章

  1. 荣盛生物冲刺科创板:拟募资12.5亿 年营收2.6亿
  2. 2023 404 收音机动画HTML源码
  3. 【中国善网】爱心供应商——瀚宏音响“应运而生”
  4. 【华为HDZ深圳站】授旗成立并成功举办首场区块链专题技术交流会
  5. wsus服务器不显示客户端,教你如何配置WSUS服务器客户端.pptx
  6. 便携小风扇PD取电芯片
  7. CC攻击常见类型集合
  8. 互联网“红包大战”套路深
  9. kubernetes组件再认知
  10. js 获取当前日期(年月日时分秒周)