第四周作业
关系型数据库:虽然最近NoSql很火,但是其一直替代不了关系型数据库的位置。其原因就是因为关系型数据库强大的关系支持与早已很稳定的数据库事务。代表作:Mysql、Oracle,并且一个应用系统建立之初肯定最先考虑关系数据库的支持,在现在的工作场景中,开发、运维甚至测试和产品对标准sql 的掌握基本已成为必备工作技能。
非关系型数据库和缓存数据库:缓存数据库算是一类特殊的非关系数据库,例如Redis,memcached以其强大的内存性能常用来作为系统提升的首选。Redis之于memcached算是后起之秀,redis具有更丰富的内容类型,并且每种类型都有自己的独有的计算方法,以计算偏向于数据的方式可以减轻客户端的压力,存储依然不够了怎么办,还有Redis-cluster。另一类Nosql数据库MongoDb我们常会用到类似于文档存储的场景。
分布式数据库:在单机mysql达到极限的时候,这时候我们会考虑分库分表以支持数据的扩张,这也是一种分布式的数据存储方案。市面上针对不同的场景也有很多分布式数据库产品会用到,例如HDFS、FastDFS等,有时为了处理HDFS与sql之间的差异转换问题,可能会用到hive等产品。
聚合数据库:当分库分表方案用尽了的时候,我们还能用什么?ES应该算是一种特殊的数据库,虽然他的出生主要是以聚合分析为主,通过倒排索引提高数据检索的速度,但是终究离不开数据的存储,所以也可以勉强把其归为数据库的一种。
消息中间件
分布式系统中解决不同系统之间通讯少不了的就是消息中间件。可以分为无代理消息架构与有代理消息架构。目前我们基本常用到的是有代理消息架构,类似产品RocketMq、Kafka、ActiveMq等。
分布式事务
分布式中最难解决的可能就是分布式事务,最终可能通过一系列柔性事务去解决最终一致性问题,牺牲性能以获得数据的准确性。目前比较或的一些框架有阿里的seata、gts等,或是通过业务上的一些手段例如XA、TCC、多阶段提交来解决。
分布式锁
分布式锁的实现方式主要有几种,1、基于mysql实现 2、基于zk实现 3、基于Redis实现 4、基于etcd实现
分布式ID
作用不多说,常用到的例如snowflake,美团的leaf也是基于此基础来的。
任务调度中心
一个分布式系统中我们需要由对定时任务进行批量管理,手动停止、启动、详情等的管理调度中心。例如xxl-job
配置中心
都分布式集群了,零散的配置肯定不能项目自己管理了。配置中心这时候就可以很好的维护起配置文件的作用。常用的apollo,spring cloud config
注册中心
在微服务架构里注册中心主要起到了协调者的一个作用;例如zookeeper、eureka
网关
作为流量的入口,统一的处理和业务相关的请求,让请求更加安全、快速和准确的得到处理。例如kong,spring zuul
服务监控
微服务系统一旦请求出现异常,我们必须得知道是在哪个服务环节出了故障,这样我们就需要对每一个服务,以及各个指标都进行全面的监控。我们常用到的会有 Prometheus,在这之前我们还用过zabbix、openfalcon等。
全链路跟踪
在微服务架构中,一个服务链路调用起来特别长,可能会涉及到多个服务,这时候查找问题需要全链路跟踪的出现了,我们叫他 APM系统。有Twitter开源的ZipKin,国内skywalking等都是优秀的组件。
熔断、降级、限流
熔断、降级、限流三个似乎总是一起出现,但是他们三个又都各司其职。熔断参考的生活中短路保护器的原理,当下游发生故障时,及时算开链路防止造成更大的影响,当它监控到调用下游的服务异常会根据策略进行适当的保护下游,采用防护下游系统的方式来间接保护自己被hang住太多超时的请求,他的策略有三种状态,全开、全断、半开状态。降级可以在熔断之后为服务自动触发降级以保护系统,同时我们也可以采用手动降级的方式,防止在服务熔断时再采取措施,这个方法很好用,大家记住。限流指的是限制达到系统的并发数量,限流的算法你至少应该知道 :窗口、漏斗、令牌桶等等。
负载均衡
将流量转发到多个服务器来提高系统的可用性。可以分为三类,1、地域上的负载 DNS;2、硬件的负载 例如F5,做的是集群与集群间的负载;3、软件层面的负载,常用到的有nginx 和 lvs 分别工作在应用层 和 传输层 .
评论