架构入门文章记录

全文搜索解决方案:Elasticsearch

代码层扩展
架构层扩展

设计具备良好可扩展性的系统,有两个思考角度:

  • 从业务深入理解,对可预计的业务变化进行预测。
  • 从技术维度,利用扩展性好的技术,实现对变化的封装。

复杂度第二个来源:高可用

稍微看一下高可用的定义

系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。
系统的高可用方案本质上通过“冗余”来实现高可用。

组成双机热备的方案主要的三种方式分别为:基于共享存储(磁盘阵列)的方式,全冗余方式和复制方式。

计算高可用:指的是无论在哪台机器上进行计算,同样的算法和输入数据,产出的结果都是一样的。(单机变双机)
存储高可用:将数据从一台机器搬到另一台机器,需要经过线路传输。(银行账户存钱余额中不同机房传输存在延迟,可能会导致用户体验下降)

存储高可用不可能同时满足“一致性、可用性、分区容错性”。

高可用常见的决策方式:
1、独裁式
存在一个独立的决策主体,负责收集信息然后进行决策。
所有冗余的个体,为上报者,将状态信息发送给决策者。
2、协商式
两个独立的个体通过交流信息,根据规则进行决策。
3、民主式
多个独立的个体通过投票的方式来进行状态决策。(如ZooKeeper集群在选举leader Paxos)

架构预测变化的复杂性在于:

  • 不能每个设计点都考虑可扩展性。
  • 不能完全不考虑可扩展性。
  • 所有的预测都存在出错的可能性。

架构设计三原则:

  • 合适原则:“合适优于业界领先”。
  • 简单原则:“简单优于复杂”。
  • 演化原则:“演化优于一步到位”。

架构设计步骤

  • 第一步:识别复杂度(按优先级排序解决高性能、高可用、可扩展等几个方面)

  • 第二步:设计备选方案(成熟的软件技术:高可用的主备方案、集群方案,高性能负载均衡,多路复用,可扩展的分层,插件化等技术)
    现有的成熟技术:
    1、NoSQL:键值存储.
    2、Hadoop大文件存储方案(集群方案+数据复制方案).
    3、Docker虚拟化,基础是LXC.
    4、LevelDB文件存储结构是Skip List.

  • 第三步:评估和选择备选方案

  • 第四步:详细方案设计

Nginx负载均衡策略:

  • 轮询(默认)
    每个请求按时间顺序逐一分配到不同后端服务器,后端服务器分配的请求数基本一致。
  • 加权轮询
    根据权重来进行轮询,权重高的服务器分配的请求更高。(如新老服务器混用)
  • ip_hash
    每个请求按访问IP的hash结果分配,用于解决session问题。如购物车应用
  • fair
    按后端服务器的响应时间来分配请求,响应时间短的优先分配,最大化平衡各后端服务器压力
  • url_hash
    按访问url的hash结果来分配请求,每个url定向到同一个后端服务器,适用于后端服务器能够将ulr的响应结果缓存的情况。

读写分离原理

读写分离基本实现

  • 数据库服务器搭建主从集群,一主一从,一主多从都可以。
  • 数据库主机负责读写操作,从机只负责读数据。
  • 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据。
  • 业务服务器将写操作发给数据库主机,将读操作发给数据库从机。
    读写分离两个细节点:主从复制延迟和分配机制
    如刚注册完立即登陆提示还没有注册
    解决主从复制延迟的常见方法:
    1、写操作后的读操作指定发给数据库主服务器。
    2、读从机失败后在读一次主机。
    3、关键业务读写操作指向主机,非关键业务采用读写分离。

分配机制

分配机制两种方式:程序代码封装中间件封装
程序封装特点:

  • 实现简单,可以根据业务做较多定制化功能。
  • 每个编程语言要自己实现一次,无法通用。
  • 故障情况下如果主从发生切换,则可能需要所有系统都修改配置并重启。
    中间件封装指的是独立一套系统出来,实现读写操作分离和数据库服务器连接的管理。
    数据库中间件特点:
  • 能够支持多种编程语言。
  • 数据库中间件支持完整SQL语法和数据库服务器的协议。
  • 数据库中间件自己不执行真正的读写操作,但所有数据库操作请求都要经过中间件,对性能要求高。
  • 数据库主从切换对业务服务器无感知,数据库中间件可以探测数据库服务器的主从状态。

高性能数据库集群:分库分表
读写分离只分散了数据库读写操作的压力,但没有分散存储压力。

你可能感兴趣的:(架构入门文章记录)