珠三角技术沙龙 2010Q4

珠三角技术沙龙 2010Q4

Topic 1 分布式系统:一种工程方法 陈硕

之现场笔记整理

2010,10,17

单机开销

  • 上下文切换
  • 系统调用
  • TCP本机吞吐量

分布式系统 - 技术浪潮的前期

尚未形成方法论

解决方案的基础

目前成熟的: Linux 编程、 TCP/IP 网络编程

先决条件:网络编程

本质困难

Partial failure 部分故障

如何在出现问题的时候发出消息通知其他部分

分布式设计: design for failure

可靠性指标 MTBF

如果不是 IBM System z 神器的话,如何计算和根据计算出来的指标调整分布式系统方案

单机硬件配件

电源、 CPU 、内存、硬盘和网卡的冗余方案

程序开发

程序可靠性只需略高于硬件可靠性

资源耗尽时的错误处理

尽量简化

可重启

  • 自动恢复
  • 手动恢复

本机进程间通信(IPC)

最好只使用 TCP 协议(断开时候有通知)

优雅重启(服务器端)

步骤:

1) 先停止心跳

  • 对于短连接:关 listen port
  • 对于长连接:让客户端主动 failure 到备用地址

2) 等待直到无新连接

3) kill 并重启

多进程依次重启

监控

目的:预警

可以类似 Linux 内核 /proc 方式暴露整个系统状态(即使用 procfs )

消息机制与通信协议

通信模型

  • end to end
  • 广播

收发风格

  • 一问一答: request/response
  • 一问多答: stream oriented

编程风格

  • Reactor
  • RPC

避免阻塞

使用超时处理机制

注意网络 IO :绝对不能阻塞

心跳协议

需求

若 C 依赖于 S ,则 S 应定期向 C 发送心跳

消息内容

  • 时间
  • 负载(系统状态)

检查

注意网络延时和机器时差的容忍性

关键

  • 在工作进程中发送,不单独发起
  • 在业务连接中发送,不单独发起

系统演变(升级)

消息格式

避免协议的版本号

常见错误:发送 C struct 或 bit fields

使用比较通用的格式

  • Google Protocol Buffers
  • Apache Thrift

考虑:性能和可扩展性

灵活性

开发语言

经过实践证明了的架构

单 master + 多 slaves

自实现的 name service

最后忠告

使用最土的技术

  • 进程间通信只使用可靠的 TCP 协议
  • 进程之内,使用 mutex 和 cond var

========
updated 0 2010,10,19

活动地址: 珠三角技术沙龙 2010Q4

陈硕老师的演讲稿在其博客上: 分布式系统的工程化开发方法