redis分片配置

redis分片配置,第1张

三台机器为例

所有节点,除了端口号,配置是一样的配置:

检查状态

输出如下内容则为成功:

之所以要多添加一个从节点,是因为:当集群中某一个master宕机了,其从升级为主后,会出现这个新主没有从的情况,此时,这个C2会自动分配为这个新主的Slave.

安装配置和前面的实例是一样的,只需修改配置文件的端口。添加步骤:登录集群执行 cluster nodes 获取C的节点ID-登录C2将其设置为C的Slave(也可以是A或者B的)。例如:

这是官方集群的基本配置,客户端需要支持ask/move访问节点,便可以访问其中一个主节点来使用集群。当集群中不可用节点超过半数,整个集群将不可用,当集群中Master宕机,其对应的Slave会提升为Master,原本的Master再次加入启动连接到集群中时,会成为Slave。

内容部分摘自于《Redis的设计与实现》(17章节)

Redis 集群的重新分片 *** 作是由 Redis 的集群管理软件 redis-trib 负责执行的, Redis 提供了进行重新分片所需的所有命令,而 redis-trib 则通过向源节点和目标节点发送命令来进行重新分片 *** 作。

redis-trib 对集群的单个槽slot进行重新分片的步骤如下:

如果重新分片涉及多个槽,那么redis-trib将对每个给定的槽分别执行上面给出的步骤。

假设我们有三台redis集群(不考虑从机器),node0(127.0.0.1:7000)、node1(127.0.0.1:7001)、node2(127.0.0.1:7002),现在我们需要新加一台node3(127.0.0.1:7003)机器,这时候会发现重新分片。

假设槽8000(存在多个key,key0、key1、key2)、8001需要从node2迁移到node3上,对应上面过程中,node2 就为源节点, node3 为目标节点。

如果在这个重新分片的过程,刚好请求的key在发生转移的过程,因为源节点记录了要迁移的目标节点,即使请求到源节点上,这个key并不存在与源节点,此时会返回一个ASK错误,并将请求转发给key存在目标节点。

twitter的 twemproxy 是一个Redis的代理服务程序,能够实现key的分片。分片能使key均匀地分布到集群的机器上去,能保证数据的一致性,有着众多的优点。

但从Redis单实例切换到twemproxy集群时,还是有些需要注意的地方:

不支持的方法:

KEYS,MIGRATE,SCAN等

支持但需特殊处理的方法:

MSET,SINTERSTORE,SUNIONSTORE,ZINTERSTORE,ZUNIONSTORE等

全部请查看 Redis命令列表 .

对于不支持的方法,在使用时需要寻找替代方案。本文主要解决一下需特殊处理的方法。

单实例上的MSET是一个原子性(atomic) *** 作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。

而集群上虽然也支持同时设置多个key,但不再是原子性 *** 作。会存在某些给定 key 被更新而另外一些给定 key 没有改变的情况。其原因是需要设置的多个key可能分配到不同的机器上。

这四个命令属于同一类型。它们的共同之处是都需要对一组key进行运算或 *** 作,但要求这些key都被分配到相同机器上。

这就是分片技术的矛盾之处:

即要求key尽可能地分散到不同机器,又要求某些相关联的key分配到相同机器。

解铃还需系铃人。解决方法还是从分片技术的原理上找。

分片,就是一个hash的过程:对key做md5,sha1等hash算法,根据hash值分配到不同的机器上。

为了实现将key分到相同机器,就需要相同的hash值,即相同的key(改变hash算法也行,但不简单)。

但key相同是不现实的,因为key都有不同的用途。例如user:user1:ids保存用户的tweets ID,user:user1:tweets保存tweet的具体内容,两个key不可能同名。

仔细观察user:user1:ids和user:user1:tweets,两个key其实有相同的地方,即user1。能不能拿这一部分去计算hash呢?

这就是 Hash Tag 。允许用key的部分字符串来计算hash。

当一个key包含 {} 的时候,就不对整个key做hash,而仅对 {} 包括的字符串做hash。

假设hash算法为sha1。对user:{user1}:ids和user:{user1}:tweets,其hash值都等同于sha1(user1)。

Hash Tag是用于hash的部分字符串开始和结束的标记,例如"{}"、"$$"等。

配置时,只需更改hash_tag字段即可

博客链接: http://spetacular.github.io/2015/09/20/redis-hash-tag.html


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11619211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存