分布式定理

分布式引入

cap定理:一致性,可用性,分区容错性

  • 一致性:数据时刻保持一致
  • 可用性:主节点宕机没关系,从节点补上
  • 分区容错性:数据不一致没关系,最终一致就可以

redis单机版的可靠性是由本地磁盘保证的,如果当前机器会宕机,那么本地可靠性也没有了

akf:x、y、z轴

x轴:全量镜像,大家都一样

y轴:根据功能业务区分数据,比如订单、用户信息、页面热点数据,

z轴:在业务数据量极大,需要拆分业务数据到不同的redis里,再根据业务拆分

redis单机不行,可能会宕机,那么就x轴增强,加入多台redis,做redis实例副本,主备,客户端只访问第一台redis,第一台挂了下面的顶上.

开了这么多机器,单单当备用机很浪费,增删改往第一台机器写,读往后面的机器读但是数据都是一样的

redis在y轴就可以业务区分数据,订单,热点,用户,mysql则是分库分表

x轴问题

一变多,数据一致性问题

1号主机 2、3号备机

redis在x轴上就是1主2备,备不参与运算,主机时刻同步数据到备机,

数据一致性方式:client发送数据到1号,1号发送数据到2、3号,完毕后1号返回client,ok,这是数据强一致性,但是如果2号宕机了,那么这个过程就永远不会有返回,强一致性会破坏可用性,单redis变为多redis就是为了可用性.

修改一下,client数据发给1号机,1号机写成功了就直接返回,1号机异步的发送数据给2、3号机完成数据一致性.但是会发生数据丢失一部分

再优化一下,在1号机后面增加一个可靠的数据存储软件(kafka),同步将数据发到这,然后2、3号机从kafka里取数据同步到自己这,(最终一致性)

但是最终一致性的黑盒集群,client可能会取到不一致的数据.主从

无论是主从还是主备,都有一个主,主又是一个单点,主挂了就没了.

对主机做高可用,最终是要把备机变成主机

  • 人为或者监控程序把备机设置主机,但是监控程序也可能出问题,所以需要很多监控程序共同监控.一部分给出ok(主节点运行正常),一部分是几个,如果有3个监控程序,1个程序决策状况会有2种情况,正常或者不正常,如果2个程序认为正常,那么才是真的正常.半数以上投票,推荐使用奇数台
    • 3台与4台都可以容忍1台挂掉,成本不同,4台比3台更容易出现1台挂掉
  • 网络分区、脑裂,client取数据可以取到不一样的数据,不一定是坏事,看是否可以容忍

redis使用的方式

主从复制,配置文件中配置,主机数据复制到从节点

从节点在复制过程中是否可以被查询原先的数据(分区容错性)

redis可以先磁盘io将数据落盘,在将数据发给从节点,或者直接通过网络将数据发给从节点

增量复制,rdb被从节点读取后,从节点下线再上线后,需要重新同步数据,全量同步效率低,于是可以配置一个大小的队列,队列中存储着增量的数据,然后将增量数据发给从节点

哨兵模式

redis-server --sentienl

  • 检查主服务器和从服务器是否运行正常
  • 主服务器运行故障后,哨兵程序会将一个从节点升级为主节点

由于主节点知道自己的从节点,所以哨兵只需要监控主节点就可以,

通过发布订阅模型,订阅哨兵的主题,发现其他哨兵

主从复制完成了x轴,没有解决y轴和z轴的问题,以下为y轴解决方案,解决容量限制

一个client通过编写业务代码将数据存放到多个redis节点中,有好几种模型

1.单个redis进行业务分区.client编写逻辑代码区分redis,取模sharding分片,缺点是扩容困难,模数固定

2.客户端随机给某个redis节点,能往里扔但是找不到,但是其他的客户端,链接这两个redis节点取数据就可以了,(消息队列,里面的key就是topic,每个redis节点是partition)

3.一致性hash算法,映射算法,hash环,扩容时不会造成全局洗牌,缺点是可能造成一小部分数据无法命中

上面的方式采用客户端与redis直连,如果客户端链接反向代理服务器,再由反向代理服务器连接redis,对客户端代码简单许多,不会有上面三种y轴处理的方法.三种实现都被迁移到了代理层

代理层有了逻辑实现:modula,random,kemata

技术:twemproxy

有很多方式比如hash将数据分布到节点上.

数据映射方式(无主模型)

1节点,2节点,存放着模数值范围为1,2,3,4,5 6,7,8,9,0

如果此时新增加了一个节点,那么就需要从1,2号节点取出一些模数值迁移到3号节点,同时将模数值下的key也传输给3号节点

client连接redis时,随机访问一个redis节点,每个redis节点有算法,得到算出的值,比如取模的值,与自己节点有的模数值进行匹配,没匹配上则查看其他节点的模数值(每个redis节点都有其他节点的模数值,有点像eureka),每个redis节点都可以做路由

##数据分治问题:聚合操作,事物,取交集等

使用相同的key hash时会落到同一个节点上

predixy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值