目录:
1.什么是分布式系统:
2.水平分表:
3.垂直分表:
4.水平分库:
5.垂直分库:
6.分库分表时常见问题:
7.主从复制原理:
8.读写分离:
9.本地事务:
10.分布式事务:
11.zookeeper:
12.zookeeper特点:
13.zookeeper应用场景:
14.zookeeper选举机制:
15.zookeeper和eureka区别:
16.dubbo和springcloud的区别:
17.谈谈对微服务的理解:
18.微服务的优点和缺点:
1.什么是分布式系统:
将一个应用拆分成多个可独立运行的服务。也就是多个独立的服务的集合。
2.水平分表:
可以按时间,按id,按区域等条件,将一张表拆分成多张相同的表。
3.垂直分表:
将一张表拆分成多张不同的表,主表保留关键信息。
4.水平分库:
将同一张表的内容,按照一定条件拆分到不同的库中。
5.垂直分库:
不同的业务的表,分到不同的库中。
6.分库分表时常见问题:
1.事务一致性:分布式事务,常见的操作就是分阶段提交。之后详细说。
2.跨库join查询:通常应该避免跨库join,但可以通过字段冗余,将每个库都存上需要的数据,还可以通过数据同步的操作,每个库都建立一个类似数据字典的表,改动时同步改动。
3.主键一致性:常用的就是雪花算法。
4.公共表:有一些公共表可以在每一个库中都保留一份,操作时同时操作。
7.主从复制原理:
主库主要负责写操作,从库主要负责读操作。主表的写操作会记录在binlog日志中,从库读取该日志文件,写入到relaylog日志中,再进行写操作。达到主从复制的目的。
8.读写分离:
主要为了提升数据库读取数据的性能。通常需要几个库,主库负责写操作,从库负责读操作。需要注意的点就是主从复制的数据一致性问题。
9.本地事务:
事务就是用户定义的一组操作序列,这些操作要么全部执行,要么全部不执行。
事务的4个隔离级别:
读未提交:读取到其他事务未提交的数据,造成脏读。
读提交:事务必须等另一个事务提交数据后,才能开始读数据。事务a先读取到了数据,而事务b修改了数据,并提交,事务a再读取数据时,造成前后两次读取数据不一致,造成不可重复读。
重复读:事务读取时,不允许其他事务进行修改操作。但无法保证新增操作,当事务a读取数据后,事务b新增了数据,事务a再次读取数据,同样造成两次读取数据不一致,造成幻读。
序列化:a事务必须全部执行完,b事务才能开始执行。
事务的4大特性:
原子性:一组操作序列,看作一个整体。
一致性:要么全部执行,要么全部不执行。
隔离性:事务和事务之间是隔离的,互不影响。
持久性:事务一旦提交对于数据的修改,是永久性的。
10.分布式事务:
在分布式系统中,可能存在跨服务和跨数据源的操作,此时无法利用数据库的事务来保证事务的一致性,需要用到分布式事务。
解决方案包括:XA、TCC、可靠性消息一致性、AT
1.XA:
分阶段提交,最重要的是需要一个中间件,起到最终提交的作用。
多个事务先进行本地操作,但都停留在最后的提交阶段。当多个事务都执行完毕后,没有出错,则中间件通知所有事务进行提交。但有事务执行失败的话,中间件提醒所有的事务回滚。
优点:保证了数据的强一致性,技术成熟。
缺点:容易出现单点故障,和数据锁定。
2.TCC:
try --- confirm ---- cancel
同样也是分阶段提交。但和XA不同,所有的本地事务都会执行完毕,并多了一个补偿操作。例如余额100元,扣款30元,先进行事务的提交,但将这30元先冻结。其他事务没有问题,则将冻结的30元清空,其他事务出现异常,将冻结的30元再重新加到余额中。
优点:并不会出现单点故障和数据锁定。
缺点:多了补偿操作 ,所以需要自己手动实现补偿的代码,开发成本高。4
3.可靠性消息最终一致:
利用了mq消息队列。
服务a先执行本地事务,再通过mq消息队列通知服务b执行本地事务。当服务b失败后,mq消息队列会一直提醒服务b执行本地事务,知道最终成功为止。
缺点:必须保证服务b最终是可以执行成功的。
4.AT:
使用seata框架,兼具了前面的优势,同样也是分段提交,阶段一全部执行本地事务,阶段二根据阶段一的操作,进行提交或回滚操作。但不需要中间件,也不需要写额外的补偿操作。全部由seata框架来实现。
再需要执行的操作上加上@GlobalTransactional注解即可。
11.zookeeper:
基于观察者模式设计的分布式系统,提供协调服务的服务框架。
12.zookeeper特点:
1.需要至少半数以上的集群存活,也就是最少需要3台服务。
2.每一个服务都保存一份数据,无论客户端连接哪个服务,都能获取数据的一致性。
3.一次更新要么全部成功,要么全部失败。
4.实时性:客户端能读取到最新的数据。
13.zookeeper应用场景:
1.对服务统一命名。
2.统一配置,配置修改后,能同步到其他节点。
3.统一集群管理,实时掌握每一个节点的状态。
4.软负载均衡:每一个服务器分摊访问。
5.分布式锁。
14.zookeeper选举机制:
zookeeper工作时,会选举一个节点为leader节点,其他的节点为follower节点。
每一个节点最开始都会先选举自己成为leader节点,但当自己没有获得票数过半时,会推选下一个节点为leader节点。当一个节点超过半数时,leader节点选举成功。所以一般选择奇数台服务器,由中间的服务器成为leader节点。
15.zookeeper和eureka区别:
相同点:都可以作为服务注册中心。
不同点:
前提:CAP定理,C一致性:数据的一致更新,A可用性:服务随时可用,P分区容错:服务一部分挂掉,不会影响其他服务的正常运行。
1.zookeeper保证了CP,eureka保证了AP。
2.zookeeper有leader节点,并会产生选举机制,选举期间,不对外提供服务。
eureka没有leader节点,一个服务挂掉,不会停止服务。
16.dubbo和springcloud的区别:
1.注册中心:
dubbo没有自己的注册中心,需要引入第三方注册中心:zookeeper
springcloud有自己的注册中心,eureka。
2.通讯协议:
dubbo采用rpc通讯协议。
springcloud采用http方式的通讯协议,通常使用feign来跨服务调用。
3.springcloud有一套完整的微服务架构方案。而dubbo则需要引入其他第三方,或自己开发。例如网关等服务。
17.谈谈对微服务的理解:
之前的项目都单体项目,使用同一个数据库,但这样当单体应用过大时,可能会出现改动困难,性能瓶颈等问题。所以慢慢使用微服务,将一个单体应用根据需求拆分成多个服务,每个服务对应自的数据库,达到一个解耦和提高性能的作用。
18.微服务的优点和缺点:
优点:
1.将服务拆分,到达一种解耦的目的,每个部门或者每个人管理自己的服务即可,不会出现以前单体项目,代码集中在一起,出现矛盾。
2.每个服务对应自己的数据库,提高服务的性能。
缺点:
1.因为单体拆分成微服务了,会提高人力成本。
2.微服务通常每一个服务对应一个数据库,导致跨库等关联操作,出现问题。
3.会出现分布式事务等等复杂问题。