当线上的并发量很高,单台服务器已经无法满足需求了,这个时候我们就需要使用到多台服务器(微服务架构,数据库集群等)
1.CAP理论-多台服务器
CAP是Consistency(一致性)、Availability(可用性)和Partition tolerance(分区容忍性) 可靠性
1.1Consistency(一致性):性能比较低
一致性是指写操作后的读操作可以读取到最新的数据状态,当数据分布在多个节点上,从任意结点读取到的数据都是最新的状态。
- 如何实现一致性:
- 写入主节点后要将数据同步到从节点。
- 写入主节点,要将从节点同步期间要将从节点锁定,待同步完成后再释放锁,以免在新数据写入功后,向从从节点查询到旧的数据。
- 分布式系统一致性的特点:
- 由于存在节点同步的过程,写操作的响应会有一定的延迟。
- 为了保证数据一致性会对资源暂时锁定 ,待数据同步完成释放锁定资源。
- 如果请求数据同步失败的结点则会返回错误信息, -定不会返回旧数据。
1.2Availability(可用性)
可用性是指任何操作都可以得到响应结果,且不会出现响应超时或响应错误。
- 如何实现可用性
- 写入主节点后要将数据同步到从节点。
- 由于要保证从节点的可用性,不可将从节点中的资源进行锁定。
- 即时数据还没有同步过来,从节点也要返回要查询的数据,哪怕是旧数据,如果连旧数据也没有则可以约定返回一个默认信息,但不能返回错误或响应超时。
- 分布式系统可用性的特点
- 所有请求都有响应,且不会出现响应超时或响应错误。
1.3Partition tolerance(分区容忍性)可靠性
通常分布式系统的各结点部署在不同的子网,这就是网络分区,不可避免的会出现由于网络问题而导致结点之间通信失败,此时仍可对外提供服务,这叫分区容忍性。
- 如何实现分区容忍性
- 尽量使用异步取代同步操作,例如使用异步方式将数据从主节点同步到从数据,这样结点之间能有效的实现松耦合。
- 添加从节点结点,其中一个从结点挂掉其它从结点提供服务。分布式分区容忍性的特点:分区容忍性分是布式系统具备的基本能力。
1.4常见组合
定理:任何分布式系统只可同时满足二点,没法三者兼顾。
组合:
- 满足CA舍弃P,也就是满足一致性和可用性,舍弃容错性。但是这也就意味着你的系统不是分布式的了,因为涉及分布式的想法就是把功能分开,部署到不同的机器上。(单个mysql服务器)
- 满足CP舍弃A,也就是满足一致性和容错性,舍弃可用性。如果你的系统允许有段时间的访问失效等问题,这个是可以满足的。就好比多个人并发买票,后台网络出现故障,你买的时候系统就崩溃了。 redis.set(key,value) 当我在进行操作的时候其他的要进行等待或者超时异常(Redis zk consol nacos(cp,ap))
- 满足AP舍弃C,也就是满足可用性和容错性,舍弃一致性。这也就是意味着你的系统在并发访问的时候可能会出现数据不一致的情况。 (Mysql主从同步 eureaka)
总结: 一般来说,现在的分布式系统都要支持p,只能选择c或者a中的一个,如果数据要求立即生效,选择c,否则运行一定的延迟a。
1.5系统补充理论-BASE理论-ap
- 理解强一致性和最终一致性
- 强一致性:对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。比如小明更新V0到V1,那么小华读取的时候也应该是V1。
- 弱一致性:如果能容忍后续的部分或者全部访问不到,则是弱一致性。比如小明更新VO到V1,可以容忍那么小华读取的时候是V0。
- 最终一致性:如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。比如小明更新VO到V1,可以使得小华在一段时间之后读取的时候是V1。
为了保证分布式系统的可用性,牺牲强一致性,采用最终一致性
-
Base理论
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent (最终一致性)三个短语的缩写。BASE理论是对CAP中AP的一个扩展,通过牺牲强一致性来获得可用性,当出现故障允许部分不可用但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终达到一致状态。满足BASE理论的事务,我们称之为"柔性事务"。- 基本可用:分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。如,电商网站交易付款出现问题了,商品依然可以正常浏览。
- 软状态:由于不要求强一致性,所以BASE允许系统中存在中间状态(也叫软状态) ,这个状态不影响系统可用性,如订单的"支付中"、“数据同步中”等状态,待数据最终一致后状态改为“成功”状态。
- 最终一致:最终一致是指经过一段时间后,所有节点数据都将会达到一致。如订单的"支付中"状态,最终会变为“支付成功”或者"支付失败" ,使订单状态与实际交易结果达成-致,但需要一定时间的延迟等待。
-
小结
操作我时其他可用,但是有中间状态,但是要最终一致性
p一定要满足,c和a二选1,ap用得最多,但是我们还要使用base理论来完成最终一致性
2.Mysql做集群
分布式:不同的服务分散到不同节点
集群:同一个服务通过多台服务器来处理. 集群是一种特殊的分布式
使用集群的原因:
- 解决高并发需求
- 提高可用性,单点故障
主从同步:当我们要准备多个服务器时,每台服务器上的mysql数据不一致,我们要保证数据一致,就需要主写的数据库修改好数据后要把数据给从读的数据库,保证数据一致性
读写分离:当主数据库既要读也要负责写,性能很低,所以我们主数据库只处理写请求,其他的从数据库负责处理读的请求
如何实现分发读写请求:需要用第三方组件mysqlproxy,mycat,sharding-jdbc
如何实现主从同步:mysql自己可以实现