当前位置: 首页 > news >正文

分布式系统的经典基础理论

历史文章推荐:

可能是最漂亮的Spring事务管理详解

面试中关于Java虚拟机(jvm)的问题看这篇就够了

Java NIO 概览

关于分布式计算的一些概念

分布式系统设计理念

分布式系统架构的第一原则是不要分布!这句话看似矛盾实则揭露了分布式系统的很多特征。

分布式系统的目标与要素

分布式系统的目标是提升系统的整体性能和吞吐量另外还要尽量保证分布式系统的容错性(假如增加10台服务器才达到单机运行效果2倍左右的性能,那么这个分布式系统就根本没有存在的意义)。

即使采用了分布式系统,我们也要尽力运用并发编程、高性能网络框架等等手段提升单机上的程序性能。

分布式系统设计两大思路:中心化和去中心化

1)中心化设计:

  • 两个角色: 中心化的设计思想很简单,分布式集群中的节点机器按照角色分工,大体上分为两种角色: “领导”“干活的”
  • 角色职责: “领导”通常负责分发任务并监督“干活的”,发现谁太闲了,就想发设法地给其安排新任务,确保没有一个“干活的”能够偷懒,如果“领导”发现某个“干活的”因为劳累过度而病倒了,则是不会考虑先尝试“医治”他的,而是一脚踢出去,然后把他的任务分给其他人。其中微服务架构 Kubernetes 就恰好采用了这一设计思路。
  • 中心化设计的问题
    1. 中心化的设计存在的最大问题是“领导”的安危问题,如果“领导”出了问题,则群龙无首,整个集群就奔溃了。但我们难以同时安排两个“领导”以避免单点问题。
    2. 中心化设计还存在另外一个潜在的问题,既“领导”的能力问题:可以领导10个人高效工作并不意味着可以领导100个人高效工作,所以如果系统设计和实现得不好,问题就会卡在“领导”身上。
  • 领导安危问题的解决办法: 大多数中心化系统都采用了主备两个“领导”的设计方案,可以是热备或者冷备,也可以是自动切换或者手动切换,而且越来越多的新系统都开始具备自动选举切换“领导”的能力,以提升系统的可用性。

2)去中心化设计

  • 众生地位平等: 在去中心化的设计里,通常没有“领导”和“干活的”这两种角色的区分,大家的角色都是一样的,地位是平等的,全球互联网就是一个典型的去中心化的分布式系统,联网的任意节点设备宕机,都只会影响很小范围的功能。
  • “去中心化”不是不要中心,而是由节点来自由选择中心。 (集群的成员会自发的举行“会议”选举新的“领导”主持工作。最典型的案例就是ZooKeeper及Go语言实现的Etcd)
  • 去中心化设计的问题: 去中心化设计里最难解决的一个问题是 “脑裂”问题 ,这种情况的发声概率很低,但影响很大。脑裂问题,这种情况的发生概率很低,但影响很大。脑裂指一个集群由于网络的故障,被分为至少两个彼此无法通信的单独集群,此时如果两个集群都各自工作,则可能会产生严重的数据冲突和错误。一般的设计思路是,当集群判断发生了脑裂问题时,规模较小的集群就“自杀”或者拒绝服务。

分布式与集群的区别是什么?

  • 分布式: 一个业务分拆多个子业务,部署在不同的服务器上
  • 集群: 同一个业务,部署在多个服务器上。比如之前做电商网站搭的redis集群以及solr集群都是属于将redis服务器提供的缓存服务以及solr服务器提供的搜索服务部署在多个服务器上以提高系统性能、并发量解决海量存储问题。

CAP定理

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistence) :所有节点访问同一份最新的数据副本
  • 可用性(Availability):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据
  • 分区容错性(Partition tolerance) : 分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

CAP仅适用于原子读写的NOSQL场景中,并不适合数据库系统。现在的分布式系统具有更多特性比如扩展性、可用性等等,在进行系统设计和开发时,我们不应该仅仅局限在CAP问题上。

注意:不是所谓的3选2(不要被网上大多数文章误导了):

现实生活中,大部分人解释这一定律时,常常简单的表述为:“一致性、可用性、分区容忍性三者你只能同时达到其中两个,不可能同时达到”。实际上这是一个非常具有误导性质的说法,而且在CAP理论诞生12年之后,CAP之父也在2012年重写了之前的论文。

当发生网络分区的时候,如果我们要继续服务,那么强一致性和可用性只能2选1。也就是说当网络分区之后P是前提,决定了P之后才有C和A的选择。也就是说分区容错性(Partition tolerance)我们是必须要实现的。

我在网上找了很多文章想看一下有没有文章提到这个不是所谓的3选2,用百度半天没找到了一篇,用谷歌搜索找到一篇比较不错的,如果想深入学习一下CAP就看这篇文章把,我这里就不多BB了:《分布式系统之CAP理论》 : www.cnblogs.com/hxsyl/p/438…

BASE理论

BASE理论由eBay架构师Dan Pritchett提出,在2008年上被分表为论文,并且eBay给出了他们在实践中总结的基于BASE理论的一套新的分布式事务解决方案。

BASEBasically Available(基本可用)Soft-state(软状态)Eventually Consistent(最终一致性) 三个短语的缩写。BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,它大大降低了我们对系统的要求。

BASE理论的核心思想

即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。也就是牺牲数据的一致性来满足系统的高可用性,系统中一部分数据不可用或者不一致时,仍需要保持系统整体“主要可用”。

针对数据库领域,BASE思想的主要实现是对业务数据进行拆分,让不同的数据分布在不同的机器上,以提升系统的可用性,当前主要有以下两种做法:

  • 按功能划分数据库
  • 分片(如开源的Mycat、Amoeba等)。

由于拆分后会涉及分布式事务问题,所以eBay在该BASE论文中提到了如何用最终一致性的思路来实现高性能的分布式事务。

BASE理论三要素

1. 基本可用

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性。但是,这绝不等价于系统不可用。

比如:

  • 响应时间上的损失:正常情况下,一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询结果,但由于出现故障,查询结果的响应时间增加了1~2秒
  • 系统功能上的损失:正常情况下,在一个电子商务网站上进行购物的时候,消费者几乎能够顺利完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面

2. 软状态

软状态指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时

3. 最终一致性

最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

总结

本文主要是简单的介绍了三个常见的概念: 分布式系统设计理念CAP定理BASE理论 ,关于分布式系统的还有很多很多东西。

我是Snailclimb,一个以架构师为5年之内目标的小小白。 欢迎关注我的微信公众号:"Java面试通关手册"(一个有温度的微信公众号,期待与你共同进步~~~坚持原创,分享美文,分享各种Java学习资源)

最后,就是使用阿里云服务器一段时间后,感觉阿里云真的很不错,就申请做了阿里云大使,然后这是我的优惠券地址.

相关文章:

  • 如何在工作中学习
  • 实现自动SSH连接
  • 以太坊教程:搭建环境、编写编译一个智能合约
  • 微信小程序第三方开发需要注意的点
  • SSH配置免秘钥登录
  • 【VS】使用vs2017自带的诊断工具(Diagnostic Tools)诊断程序的内存问题
  • 浅谈Golang中select的用法
  • Ubantu 更新时间方法
  • [xdoj] 13011302 数字计数 数字计数的复仇
  • php面试题12(多态web服务器共享session的方法:将session存到数据库)($val=$data[$key];)...
  • nohup和后台运行,进程查看及终止
  • bash命令行初探
  • 转: 关于linux用户时间与系统时间的说明
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • day01.1 vmware虚拟机
  • 网络传输文件的问题
  • 【译】JS基础算法脚本:字符串结尾
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2019.2.20 c++ 知识梳理
  • Android 架构优化~MVP 架构改造
  • Android系统模拟器绘制实现概述
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java取消线程实例
  • PHP面试之三:MySQL数据库
  • Puppeteer:浏览器控制器
  • Python 反序列化安全问题(二)
  • Python连接Oracle
  • spring boot下thymeleaf全局静态变量配置
  • 缓存与缓冲
  • 那些被忽略的 JavaScript 数组方法细节
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 排序(1):冒泡排序
  • 前端技术周刊 2019-02-11 Serverless
  • 事件委托的小应用
  • 微信小程序开发问题汇总
  • 系统认识JavaScript正则表达式
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • #1015 : KMP算法
  • (10)ATF MMU转换表
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (python)数据结构---字典
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)UDP基本编程步骤
  • (一)为什么要选择C++
  • .gitignore文件—git忽略文件
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 命令行参数包含应用程序路径吗?
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2