redis学习笔记之九:Redis的集群

n 复制的问题


由于复制中,每个数据库都是拥有完整的数据,因此复制的总数据存储量,受限于
内存最小的数据库节点,如果数据量过大,复制就无能为力了。


n 分片
分片(Partitioning)就是将你的数据拆分到多个Redis实例的过程,这样每个
Redis实例将只包含完整数据的一部分。常见的分片方式:
1:按照范围分片
2:哈希分片,比如一致性哈希


n 常见的分片实现:
1:在客户端进行分片
2:通过代理来进行分片,比如:Twemproxy
3:查询路由:就是发送查询到一个随机实例,这个实例会保证转发你的查询到正确的节点,
Redis集群在客户端的帮助下,实现了查询路由的一种混合形式,请求不是直接从Redis实
例转发到另一个,而是客户端收到重定向到正确的节点
4:在服务器端进行分片, Redis采用哈希槽(hash slot)的方式在服务器端进行分片:
Redis集群有16384个哈希槽,使用键的CRC16编码对16384取模来计算一个键所属的哈希槽


n Redis分片的缺点
1:不支持涉及多键的操作,如mget,如果所操作的键都在同一个节点,就正常执行,否则会提示错误
2:分片的粒度是键,因此每个键对应的值不要太大
3:数据备份会比较麻烦,备份数据时你需要聚合多个实例和主机的持久化文件
4:扩容的处理比较麻烦
5:故障恢复的处理会比较麻烦,可能需要重新梳理Master和Slave的关系,并调整每个复制集里面的数据


n 集群
由于数据量过大,单个复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展,每个
复制集只负责存储整个数据集的一部分,这就是Redis的集群。
1:在以前版本中,Redis的集群是依靠客户端分片来完成,但是这会有很多缺点,比如维护成本高,需要客
户端编码解决;增加、移出节点都比较繁琐等
2:Redis3.0新增的一大特性就是支持集群,在不降低性能的情况下,还提供了网络分区后的可访问性和支
持对主数据库故障的恢复。
3:使用集群后,都只能使用默认的0号数据库
4:每个Redis集群节点需要两个TCP连接打开,正常的TCP端口用来服务客户端,例如6379,加10000的端口
用作数据端口,必须保证防火墙打开这两个端口
5:Redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请
求命令。
 

n 集群架构


1:所有的Redis节点彼此互联,内部使用二进制协议优化传输速度和带宽
2:节点的fail是通过集群中超过半数的节点检测失效时才生效
3:客户端与Redis节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,连接集
群中任何一个可用节点即可
4:集群把所有的物理节点映射到[0-16383]插槽上,集群负责维护:节点-插槽-值 的关系


n 集群操作基本命令
1:CLUSTER INFO:获取集群的信息
2:CLUSTER NODES:获取集群当前已知的所有节点,以及这些节点的相关信息
3:CLUSTER MEET <ip> <port>:将ip和port所指定的节点添加到集群当中
4:CLUSTER FORGET <node_id>:从集群中移除 node_id 指定的节点
5:CLUSTER REPLICATE <node_id>:将当前节点设置为 node_id 指定的节点的从节点
6:CLUSTER SAVECONFIG:将节点的配置文件保存到硬盘里面
7:CLUSTER ADDSLOTS <slot> [slot ...]:将一个或多个槽分配给当前节点
8:CLUSTER DELSLOTS <slot> [slot ...]:从当前节点移除一个或多个槽
9:CLUSTER FLUSHSLOTS:移除分配给当前节点的所有槽
10:CLUSTER SETSLOT <slot> NODE <node_id>:将槽分配给 node_id 指定的节点,如果槽已经分配给另一
个节点,那么先让另一个节点删除该槽>,然后再进行分配
11:CLUSTER SETSLOT <slot> MIGRATING <node_id>:将本节点的槽迁移到指定的节点中
12:CLUSTER SETSLOT <slot> IMPORTING <node_id>:从指定节点导入槽到本节点
13:CLUSTER SETSLOT <slot> STABLE:取消对槽的导入(import)或迁移(migrate)
14:CLUSTER KEYSLOT <key>:计算键 key 应该被放置在哪个槽
15:CLUSTER COUNTKEYSINSLOT <slot>:返回槽目前包含的键值对数量
16:CLUSTER GETKEYSINSLOT <slot> <count>:返回 count 个槽中的键
17:migrate 目的节点ip 目的节点port 键名 数据库号码 超时时间 [copy] [replace]:迁移某个键值对

n 手工创建集群
1:首先进行集群配置
只需要将每个数据库的cluster-enabled配置选项打开,然后再修改如下内
容:pidfile、port、logfile、dbfilename、cluster-config-file
2:分别启动这些Redis数据库,可以用info cluster查看信息
3:连接节点,使用cluster meet,把所有的数据库都放到一个集群中来
4:可以通过cluster info ,或者cluster nodes 查看信息
5:设置部分数据库为slave,使用cluster replicate
6:然后就该来分配插槽了,使用cluster addSlots,这个命令目前只能一个一个
加,如果要加区间的话,就得客户端编写代码来循环添加。
有个实用的技巧:把所有的Redis停下来,然后直接修改node的配置文件,
只需要配置master的数据库就可以,然后再重启数据库。
分配完插槽,可以使用cluster slots查看信息。
7:通过cluster info查看集群信息,如果显示ok,那就可以使用了
 

猜你喜欢

转载自blog.csdn.net/u010800970/article/details/81369342