spring.io PROJECTS SPRING DATA 自学不用买书,看官方文档。 Spring dATA Redis learn reference Doc 所有Spring 对Rrdis做的事。
一,容量问题怎么解决?
X轴,HA,主从复制,没有解决容量问题 从客户端
1 业务拆分
2 hash+取模
弊端:取值的数必须固定
%3 %4
影响分布式下的扩展性
3 random
消息队列:一个往redis里扔lpush,一个从redis取rpop,消费的模式。
4 一致性哈希算法(更适合作为缓存使用)
映射算法:hash,crc16,crc32,fnv,md5 没有取模,使用的是哈希环
0开始到2的32次方,有无数个虚拟的点。 准备一个算法,按照物理机的节点数分片。 新增一个节点,不影响节点以后的数据。
优点:加节点,可以分担其他节点的压力,不会造成全局洗牌。缺点:新增节点会造成一小部分数据不能命中。 1,问题:会出现击穿,压力到了数据库 2,方案:没的话,去取离我最近的2个物理节点
数据倾斜 可以通过设备地址拼接10个数字,使两个节点平均分配再20个节点中
2,3,4的弊端
redis的连接成本问题(3握手4分手),对server压力很大
怎么解决?nginx反向代理服务,自己不参与,把连接分散。
LVS:对于客户端透明,客户端的代码成本量,VIP不管后面有多少,对外只有一个路径,无需发现中心,去查看后面有几个服务
keepalived
1,监控节点的状态,转发到存活的机器上
2,主备切换
3,换主
无状态:只有无状态才能一变多 代理的三种: tw predixy cluster
codis (修改了redis的源代码)豌豆荚的团队
github twitter twemproxy
以上,一致性哈希最好,但也只能做缓存,不能做数据库使用。
预分区
迁移成本降低
取模是10,范围是0 … 9,
添加mapping,设置每个阶段的槽位数据,假设一开始是两台redis,各领5个槽位。未来新加一个阶段,只需要让之前的两个阶段让出一部分槽位。不需要全部伪哈希一遍(所有的key全部取出来,全算一遍哈希,然后按照哈希分区,删除和新增),直接移动完部分槽位的数据(减少计算和删除的操作)。
只要槽位够大,可以无限添加节点。(redis集群有16384个槽位,使用CRC16算法校验决定放到那个槽位)。使用redis命令迁移数据。
迁移过程中,数据能不能修改?
做主从的时候,Master-slave, 先给时点数据,在给缓冲的数据,数据追平。RDB和增量日志的概念。
无主模型 Cluster 模式
算法和别人有什么槽位。 hash%10,算出槽位,和mapping对比,返回给客户端,重定向的位置。
数据分治-聚合/事务操作很难实现
计算向数据移动,最大的本质是快,影响性能的功能都去掉了,为了保证高性能。 但是给了处理方案: 数据一旦被分开就很难被整合使用。 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组下支持 | 支持 |
多机房支持 | 不支持 | 支持,可定义丰富规则调度流量 | 支持 |