spring.io PROJECTS SPRING DATA 自学不用买书,看官方文档。 Spring dATA Redis learn reference Doc 所有Spring 对Rrdis做的事。

一,容量问题怎么解决?

X轴,HA,主从复制,没有解决容量问题 从客户端

1 业务拆分

mvc redis集群_redis

2 hash+取模

弊端:取值的数必须固定

%3 %4

影响分布式下的扩展性

mvc redis集群_数据_02

3 random

消息队列:一个往redis里扔lpush,一个从redis取rpop,消费的模式。

mvc redis集群_cluster_03

4 一致性哈希算法(更适合作为缓存使用)

mvc redis集群_mvc redis集群_04

映射算法:hash,crc16,crc32,fnv,md5 没有取模,使用的是哈希环

0开始到2的32次方,有无数个虚拟的点。 准备一个算法,按照物理机的节点数分片。 新增一个节点,不影响节点以后的数据。

优点:加节点,可以分担其他节点的压力,不会造成全局洗牌。缺点:新增节点会造成一小部分数据不能命中。 1,问题:会出现击穿,压力到了数据库 2,方案:没的话,去取离我最近的2个物理节点

数据倾斜 可以通过设备地址拼接10个数字,使两个节点平均分配再20个节点中

2,3,4的弊端

redis的连接成本问题(3握手4分手),对server压力很大

mvc redis集群_数据_05

怎么解决?nginx反向代理服务,自己不参与,把连接分散。

LVS:对于客户端透明,客户端的代码成本量,VIP不管后面有多少,对外只有一个路径,无需发现中心,去查看后面有几个服务

keepalived

1,监控节点的状态,转发到存活的机器上

2,主备切换

3,换主

无状态:只有无状态才能一变多 代理的三种: tw predixy cluster

codis (修改了redis的源代码)豌豆荚的团队

mvc redis集群_redis_06

github twitter twemproxy

以上,一致性哈希最好,但也只能做缓存,不能做数据库使用。

预分区

迁移成本降低

取模是10,范围是0 … 9,

添加mapping,设置每个阶段的槽位数据,假设一开始是两台redis,各领5个槽位。未来新加一个阶段,只需要让之前的两个阶段让出一部分槽位。不需要全部伪哈希一遍(所有的key全部取出来,全算一遍哈希,然后按照哈希分区,删除和新增),直接移动完部分槽位的数据(减少计算和删除的操作)。

只要槽位够大,可以无限添加节点。(redis集群有16384个槽位,使用CRC16算法校验决定放到那个槽位)。使用redis命令迁移数据。

mvc redis集群_mvc redis集群_07

迁移过程中,数据能不能修改?

做主从的时候,Master-slave, 先给时点数据,在给缓冲的数据,数据追平。RDB和增量日志的概念。

无主模型 Cluster 模式

算法和别人有什么槽位。 hash%10,算出槽位,和mapping对比,返回给客户端,重定向的位置。

mvc redis集群_cluster_08

数据分治-聚合/事务操作很难实现

计算向数据移动,最大的本质是快,影响性能的功能都去掉了,为了保证高性能。 但是给了处理方案: 数据一旦被分开就很难被整合使用。 hash tag {00}k1 {00}k2 用{00}取模,通过key让数据落到同一台redis上,可以进行聚合和事务操作。

twemproxy

twemproxy安装和小结

Predixy

Predixy安装和小结

redis 自身的集群

对比

twemproxy

Predixy

Redis Cluster

高可用

一致性哈希

Redis Sentinel或Redis Cluster

Redis Sentinel或Redis Cluster

事务

不支持

Redis Sentinel模式单Redis组下支持

支持

多机房支持

不支持

支持,可定义丰富规则调度流量

支持