一般采用的方法是在负载均衡机器上直接配置业务处理机器的ip地址算法
随机选择数据库
hash选择缓存
round-robin选择:根据地址列表顺序选择服务器
权重选择
配置高的机器分配更高的权重,权重相同的多台机器一般按随机或者顺序的方式选择网络
按负载选择并发
按链接选择负载均衡
为了保证访问时跳出问题的机器:一般采用的方法是负载均衡机器定时和实际的业务处理机器进行心跳(ping、端口检测或者url侦测),发现心跳失败的机器即将其从可用地址列表中拿掉,在心跳成功后再从新加入到可用地址列表,响应返回方式:异步
响应经过负载均衡机器返回jvm
响应直接返回至请求发起方分布式
热备的状况下正在对外服务的机器只有一台,其余机器处于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来解决