分布式引入
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