Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型。所以得到很多开发者的青睐。加之其支持主从、持久化等功能,3.0版本开始正式提供分片技术、让其在大型互联网应用中大显身手
 
分片(parttitioning)就是将你的数据拆分到多个redis实例的过程,这样每个实例只包含所有键的子集,
 
分片的目的:
1、允许使用很多电脑内存综合来支持更大的数据库,没有分片你就被局限于单机能支持的内存容量
2、允许伸缩计算到多核和多服务器,伸缩网络带宽到多服务器或者多网络适配器
 
拓展
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。
Redis快的主要原因是:
  1. 完全基于内存
  2. 数据结构简单,对数据操作也简单
  3. 使用多路 I/O 复用模型
单进程单线程好处
  1. 代码更清晰,处理逻辑更简单
  2. 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  3. 不存在多进程或者多线程导致的切换而消耗CPU
单进程单线程弊端
  1. 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;
 
分片的基础
1、范围分片
2、哈希分片
 
分片的不同实现
1、客户端分片:客户端直接选择正确的节点来写入和读取指定键,许多Redis客户端实现了客户端的分析
2、代理协助分片:客户端发送一个请求到一个可以理解Redis协议的代理上,而不是直接发送请求到
Redis实例上,代理会根据配置好的分片模式,来保证转发我们的请求到正确的Redis实例,并返回给客户端,Redis和Memcached的代理Twemproxy实现了代理协助分片
3、查询路由分片:你可以发送你的查询到一个随机实例,这个实例会保证转发你的查询到正确的节点,Redis集群在客户端的帮助下,实现了查询路由的一种混合形式(请求不是直接从Redis实例转发到另一个,而是客户端收到重定向到正确的节点)。
4、在服务端进行分片即Redis官方集群分片方案 Redis Cluster
 

理论讲完,就来点干活

最近公司打算做redis集群分片,研究了下redis 自带的clutesr 功能真的很强大,唯一的不足之处就是当其中一个分片服务器挂掉的话整个集群就会宕机,处于系统不可用状态

官网分片方案,很不错但是要保证数据备份,做redis 灾备方案,会比较麻烦,而且需要很多台服务器,redis搭建cluster分片服务起需要针对每台分片搭建主从配置方案,实现自动切换从而解决相关问题,相关主从的配置还有需要搭建redis sentinel哨兵服务,导致整个集群变得越来越复杂维护成本越来越高,所以为了解决这个问题,就打算通过客户端分片的方式实现该功能,减少运维压力

一致性哈希算法实现redis的数据分片横向扩展

翻阅资料发现java 有现成的jredis客户端分片方案,C#比较悲哀只能自己实现,其实jedis实现实现分片方式是通过一致性哈希算法实现的集群分片,装模做样照搬实现方式,备份通过两次哈希键值达到备份的目的

那么什么是一致性哈希算法呢?网上有很多资料,我讲讲自己的简单理解

redis 是键值对数据存储的一种数据库,我们在存出数据的时候要将数据均匀的分布在多个服务器上面,并且在增加减少cache server后,cache的迁移做到最少。

那么一致性hash算法就是为了实现这个功能设计的

具体算法代码参见
https://git.oschina.net/hl.wei/RedisCluster.git
一致性哈希算法可以实现数据散列到均衡的服务器,能够最大限度的达到增减服务器的时候数据散列问题影响至最小。

实际应用中减少服务器添加,删除,造成的数据丢失问题,可以使用如下方案:
假如我们有 A,B,C 三台服务器,我们在三台服务器上面每天搭建三个redis 实例,等于创建了 有9台redis 实例,当我们添加新机器的时候就可以直接映射一台服务器到 其中一个实例,对该服务器数据进行迁移达到数据零误差完美迁移的目的。

 

Redis-集群 - 分片的更多相关文章

  1. 【Redis学习之九】Redis集群:Twemproxy和HA

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-3.0.4 主从模式对写压力没有分担,解决思路就 ...

  2. Redis 集群缓存测试要点--关于 线上 token 失效 BUG 的总结

    在测试账户系统过程中遇到了线上大面积用户登录态失效的严重问题,事后对于其原因及测试盲点做了一些总结记录以便以后查阅,总结分为以下7点,其中原理性的解释有些摘自网络. 1.账户系统token失效问题复盘 ...

  3. redis集群与分片(2)-Redis Cluster集群的搭建与实践

    Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...

  4. redis集群与分片(1)-redis服务器集群、客户端分片

    下面是来自知乎大神的一段说明,个人觉得非常清晰,就收藏了. 为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型 ...

  5. redis(6)--redis集群之分片机制(redis-cluster)

    Redis-Cluster 即使是使用哨兵,此时的Redis集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于可用存储内存最小的节点,形成了木桶效应.而因为Redis是基于内存 ...

  6. 在 Istio 中实现 Redis 集群的数据分片、读写分离和流量镜像

    Redis 是一个高性能的 key-value 存储系统,被广泛用于微服务架构中.如果我们想要使用 Redis 集群模式提供的高级特性,则需要对客户端代码进行改动,这带来了应用升级和维护的一些困难.利 ...

  7. Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义

    回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...

  8. [个人翻译]Redis 集群教程(中)

    上一篇:http://www.cnblogs.com/li-peng/p/6143709.html 官方原文地址:https://redis.io/topics/cluster-tutorial  水 ...

  9. [个人翻译]Redis 集群教程(上)

    官方原文地址:https://redis.io/topics/cluster-tutorial  水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢.        这是 ...

  10. Redis集群(九):Redis Sharding集群Redis节点主从切换后客户端自动重新连接

    上文介绍了Redis Sharding集群的使用,点击阅读 本文介绍当某个Redis节点的Master节点发生问题,发生主从切换时,Jedis怎样自动重连新的Master节点 ​一.步骤如下: 1.配 ...

随机推荐

  1. iPhone4 8.3 系统下字体下方去除下划线

        NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:@"先去看看 ...

  2. 简明的sql优化

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  3. MSP430 G2553 计时/计数器 Timer_A

    MSP430G2553包含了两个16-bit Timer_A计时/计数器.本文简单介绍了Timer_A的功能和寄存器使用,本文及后续的随笔部分参考了"Scientific Instrumen ...

  4. Android源码设计模式分析开源项目

    简述 该项目通过分析Android系统中的设计模式来提升大家对设计模式的理解,从源码的角度来剖析既增加了对Android系统本身的了解,也从优秀 的设计中领悟模式的实际运用以及它适用的场景,避免在实际 ...

  5. 更改JupyterNotebook默认文件路径 行之有效!

    在安装了Anaconda以后浏览器默认打开的是C盘用户目录,平时不想把一些文件.代码放在C盘尤其是用户目录下,所以考虑将默认路径改掉,尝试了网上的几种方法,终于找到了一种可行有效的. 1.找到jupy ...

  6. C#集合总结

    1.为什么引入集合? 因为数组长度是固定的,为了建立一个动态的"数组",所以引入了集合. 2.为什么引入ArrayList 非泛型集合? ArrayList可以填补数组的不足,进行 ...

  7. SQL Server数据库的基础脚本编程

    数据库脚本的基础编程 Go批量处理语句 用于同时处理多条语句 use指定数据库或表 use master --创建数据库 go use Student --创建表(Student)表示数据库 go 创 ...

  8. net项目总结一(1)

    中小型新闻发布系统 代码结构:分为实体层,数据层与接口,数据工厂层,业务逻辑层,公共层,UI层(由于图片上传实在麻烦,所以只上传少量而已),项目中用到了工厂模式,解耦BLL层和DLL层 1.登录功能, ...

  9. 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

    数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...

  10. Django 项目拆分配置文件settings.py

    使用Django命令生成一个项目的基本结构时, 配置信息默认保存在和项目目录同名的目录下的settings.py文件里, 对于一个项目而言, 这样往往是不合适的, 在实际的开发中,需要将配置文件拆分为 ...