1

构建高可用系统

避免系统单点

负载均衡

通常采用的方法是在负载均衡机器上直接配置业务处理机器的ip地址

  • 随机选择

  • hash选择

  • round-robin选择:根据地址列表顺序选择

  • 权重选择
    配置高的机器分配更高的权重,权重相同的多台机器通常按随机或者顺序的方式选择

  • 按负载选择

  • 按连接选择

为了保证访问时跳出问题的机器:通常采用的方法是负载均衡机器定时和实际的业务处理机器进行心跳(ping、端口检测或者url侦测),发现心跳失败的机器即将其从可用地址列表中拿掉,在心跳成功后再重新加入到可用地址列表,响应返回方式:

  • 响应通过负载均衡机器返回

  • 响应直接返回至请求发起方

热备

热备的情况下正在对外服务的机器只有一台,其他机器处于standby状态。standby机器通过心跳机制检查对外服务机器的健康状况。当出现问题时,其中一台standby机器即进行接管,机器间的状态同步至其他standby机器或者写入一个集中存储设备(LVS+Keepalived)

提高应用自身的可用性

尽可能地避免故障

  • Fail Fast原则
    当主流程的任何一步出现问题时,都应快速地结束整个流程,而不是等到后续才来处理

  • 接口保证和对象设计严谨

  • 设计具备自我保护能里的系统

  • 限制使用资源

    • 限制内存的使用

    • 集合容量过大

    • 未释放已经不用的对象引用

  • 限制文件的使用

    • 控制单个日志文件的大小

    • 控制写日志的频率

  • 限制网络的使用

  • 限制线程的使用

    • 使用线程池

  • 从其他角度避免故障

    • 设计、代码编写、代码review、风险推测、测试、部署

及时发现故障

  • 单机报警:cpu使用率过高、某功能点失败率过高、依赖的第三方系统连续出问题

  • 集群报警:集群访问的状况、响应状况等指标和同期或基线指标对比出现过大偏差

  • 报警系统

  • 日志记录和分析系统

    • Facebook的Scribe:将需要分析的数据以特殊的格式写入日志文件,然后通过SNMP采集方式或者同机器上agent推送方式汇报到数据搜集服务器上,并对数据进行分析生成报表(即时报表、日报表、同期对比报表)

    • eBay:将要记录和分析的数据通过消息中间件异步发送出去,然后由相应的数
      据分析程序订阅此类消息进行分析

及时处理故障

  • 自我修复

    • 执行风险点应对措施

    • 全局资源调整

    • 功能降级

    • 降低对资源的使用量

访问量及数据量不断上涨的应对策略

  • 访问量上涨:拆分系统及水平伸缩,通常拆分按照功能进行,例如eBay将系统拆分为交易、商品、评价等

  • 数据量上涨:通常采取的方法是拆分数据库、拆分表及读写分离

    • 拆分数据库:将数据库拆分为用户、交易、商品、评价

      • 缺点:跨库操作比较麻烦

    • 拆分表:按时间、hash算法、取模等

      • 缺点:跨表操作比较麻烦

    • 读写分离:提供一个写库、多个读库

      • 挑战:如何快速地完成数据从写库复制到其他读库

  • 水平伸缩则是用增加机器的方法来支撑更高的访问量

构建可伸缩系统

垂直伸缩

通过升级或增加单台机器硬件来支撑访问量及数据增长的方式,很容易达到瓶颈

支撑高访问量

通常平静或出现在cpu或者内存上,网络io或磁盘io出现的瓶颈记录较低

  • 增加cpu
    但以下情况不能解决:

    • 锁竞争激烈

    • 用于支撑并发请求的线程数是固定的

    • 单线程任务

  • 增加内存 但以下情况不能解决:

    • cache的集合大小是固定的

    • jvm堆内存是固定的

支撑大数据量

分表

提升计算能力

增加cpu

水平伸缩

通过增加机器来支撑访问量及数据增长的方式,最佳的情况是应用是无状态的

支撑高访问量

缓存状态的水平伸缩方法
  • 广播同步

  • 分布式缓存
    -用户登录时访问的是NodeA机器,NodeA机器在验证通过了用户的信息后,将用户的信息放入分布式缓存集群中的某一台机器上,当用户登录后访问其他功能进入NodeB机器时,NodeB即可从分布式缓存集群的某台机器上寻找用户的登录信息

    • 最简单的方法是对用户ID进行hash,并用此hash值与缓存集群中的可用机器的总数进行取模

    • 一致性hash是解决这种问题的常用方法

文件的水平伸缩方法
  • 直连式存储

  • 网络存储

  • 分布式文件存储
    GFS中,解决方法是增加一个称为主服务器的单点机器,当NodeA要上传文件时,NodeA上的GFS Client会将文件按固定大小划分,并向主服务器提交文件名和索引信息,从而得到要存储的目标机器及位置,之后NodeA将数据存储到目标及其的相应位置上。主服务器负责记录文件和块的命名空间、文件到块的映射及每个块副本的位置。

应用的水平伸缩方法

通常采用拆分应用的方式来解决,拆分应用通常按照业务领域来划分(商品、用户、评价、交易等),水平伸缩后带来的数据库问题:数据库连接池的增加,解决方案:

  • 缓存

    • 页面静态化:变得不大,且无需根据访问用户来展示的页面

    • 页面片段缓存:页面中部分变化不大,且无需根据访问用户来展示的片段

    • 数据缓存:用户信息

  • 分库

    • 通常按照业务领域拆分

  • 异步数据库访问

    • 采用非阻塞异步IO方式访问

  • DAL(中间件)

    • 目前DAL开源的有Amoeba,DAL方式的另一个好处是可透明化分库、分表对于业务服务器带来的影响

支撑大数据量

  • 读写分离:用于写入的库称为master库,用于读取的库称为slave库

    • 对称复制:从master库复制数据库到所有salve库,slave库的数据和master库的数据保持一致

    • 非对称复制:从master复制部分数据到salve,各salve库的数据可能不同

  • 多master

    • 数据一致性的问题通常采用复制、两阶段提交、三阶段提交或者google paxos来解决

提升计算能力


pysasuke
199 声望4 粉丝

青铜分段掌控雷电