您好,登录后才能下订单哦!
这篇文章将为大家详细讲解有关Redis内存数据库分片的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
· 允许用多台机器的内存存放更大的数据集。如果没有分片,那么你只能存放单台机器内存的最大值的数据集。
· 允许用多核和多台机器提高计算能力和网络带宽。
1、按照范围分片
2、哈希分片,例如一致性哈希
常见的分片的实现:
①客户端分片
②在代理中做分片,比如:twemproxy
③查询路由:就是发送查询到一个随机实例,这个实例会保证转发你的查询到正确的节点,redis集群在客户端的帮助下,实现了查询路由的一种混合形式,请求不是直接从redis实例转发到另一个实例,而是客户端收到重定向到正确的节点
④在服务端进行分片,Redis采用哈希槽(hash slot)的方式在服务器端进行分片:
Redis集群有16384个哈希槽,使用健CrC16对16384取模来计算一个键所属的哈希槽
Redis 的一些特性与分片在一起时玩转的不是很好:
1、涉及多个键的操作通常不支持。例如,你不能对映射在两个不同 Redis 实例上的键执行交集(事实上有办法做到,但不是直接这么干)。
2、涉及多个键的事务不能使用。
3、分片的粒度(granularity)是键,所以不能使用一个很大的键来分片数据集,例如一个很大的有序集合。
4、当使用了分片,数据处理变得更复杂,例如,你需要处理多个 RDB/AOF 文件,备份数据时你需要聚合多个实例和主机的持久化文件。
5、添加和删除容量也很复杂。例如,Redis 集群具有运行时动态添加和删除节点的能力来支持透明地再均衡数据,但是其他方式,像客户端分片和代理都不支持这个特性。但是,有一种称为预分片(Presharding)的技术在这一点上能帮上忙。
Redis分片的缺点
1、不支持涉及多建的操作,如mget,如果所操作的健都在同一个节点,就正常执行,否则会提示报错
2、分片的粒度是健,因此每个键对应的值不要太大
3、数据备份会比较麻烦,备份数据时你需要聚合多个实例和主机的持久化文件
4、扩容的处理比较麻烦
5、故障的恢复的处理会比较麻烦,可能需要重新梳理Master和Slave的关系,并调整每个复制集里面的数据
Redis的预分片技术可以按照以下步骤进行实例迁移操作:
(1)在新机子上启动新的redis实例;
(2)将新redis实例作为slave将原redis实例作为master,将数据从原redis实例迁移到新redis实例上;
(3)停止客户端(分片操作在客户端上时)或代理服务器(分片操作在代理上)
(4)更新客户端或者代理服务器中的配置信息,去掉被迁移的原redis实例的ip和端口等信息,加上新启动redis实例的IP地址和端口;
(5)向新启动的redis发送SLAVEOF NOONE命令,终止新redis实例对原redis实例的从属关系;
(6)重启客户端程序或者代理程序,此时它们将会使用新的redis实例;
(7)关掉被迁移走数据的原redis实例;
我们已经知道分片存在的一个问题,除非我们使用 Redis 作为缓存,增加和删除节点是一件很棘手的事情,使用固定的键和实例映射要简单得多。
然而,数据存储的需求可能一直在变化。今天我可以接受 10 个 Redis 节点(实例),但是明天我可能就需要 50 个节点。
因为 Redis 只有相当少的内存占用(footprint)而且轻量级(一个空闲的实例只是用 1MB 内存),一个简单的解决办法是一开始就开启很多的实例。即使你一开始只有一台服务器,你也可以在第一天就决定生活在分布式的世界里,使用分片来运行多个 Redis 实例在一台服务器上。
你一开始就可以选择很多数量的实例。例如,32 或者 64 个实例能满足大多数的用户,并且为未来的增长提供足够的空间。
这样,当你的数据存储需要增长,你需要更多的 Redis 服务器,你要做的就是简单地将实例从一台服务器移动到另外一台。当你新添加了第一台服务器,你就需要把一半的 Redis 实例从第一台服务器搬到第二台,如此等等。
使用 Redis 复制,你就可以在很小或者根本不需要停机时间内完成移动数据:
· 在你的新服务器上启动一个空实例。
· 移动数据,配置新实例为源实例的从服务。
· 停止你的客户端。
· 更新被移动实例的服务器 IP 地址配置。
· 向新服务器上的从节点发送 SLAVEOF NO ONE 命令。
· 以新的更新配置启动你的客户端。
· 最后关闭掉旧服务器上不再使用的实例。
由于数据量过大,单个复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展,每个复制集只负责存储数据集的一部分,这就是Redis的集群
1、在以前版本中,Redis的集群是依靠客户端分片来完成,但是这样会有很多缺点,比如维护成本高,需要客户端编码解决;增加、移除节点都比较繁琐等
2、Redis3.0新增的一大特性就是支持集群,在不降低性能的情况下,还提供了网络分区的可访问性和支持对主数据库故障的恢复。
3、使用集群后,都只能使用默认的0号数据库
4、每个redis集群节点需要两个TCP连接打开,正常的TCP端口用来服务客户端,例如6379,家10000的端口用作数据端口,必须保证防火墙打开这两个端口
5、Redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令(Master传播命令返回OK后挂掉,slave还没有收到广播)
集群的架构
1、所有的Redis节点彼此互联,内部使用二进制协议优化传输速度和宽带
2、节点的fail是通过集群中超过半数的节点检测失效时才生效
3、客户端与redis节点直连,不需要中间的proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
4、集群把所有的物理节点映射到【0-16383】插槽上,集群负责维护:节点—插槽—值 的关系
集群操作的基本命令
CLUSTER INFO
CLUSTER NODES
CLUSTER MEET
CLUSTER FORGET
CLUSTER REPLICATE
CLUSTER SAVECONFIG
CLUSTER ADDSLOTS
CLUSTER DELSLOTS
CLUSTER FLUSHSLOTS
CLUSTER SETSLOT NODE
CLUSTER SETSLOT MIGRATING
CLUSTER SETSLOT IMPORTING
CLUSTER SETSLOT STABLE
CLUSTER KEYSLOT
CLUSTER COUNTKEYSINSLOT
CLUSTER GETKEYSINSLOT
MIGRATE 目的节点目的节点键名 数据库号码 超时时间 [copy] [replace]
关于Redis内存数据库分片的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。