分布式系统理论基础及大型网络架构演化
大型网站架构演化及分布式系统理论基础
MogileFS理论基础
MogileFS基础应用


一、分布式系统

    特点系统的各组件分布于网络上多个计算机、各组件彼此之间仅通过消息传递来通讯并协调行动而客户端以为认为是一个计算机。


     分布式存在的意义

        单机处理能力向上扩展的性价比越来越低  

         单机扩展存在性能上升的临界点

        稳定性、可用性考虑单机会存在多方面的问题

     

      如何把应用从单机扩展至多机

         控制器的变化实现的模式

            透明代理lvs nginx haproxy

            旁路模式

            名称服务

            规则服务器

            master/slave机制

        分布式系统实现的难点

             缺乏全局时钟、面对故障时的独立性、处理单点故障、事务处理ACID


二、大型网站站点架构演进方式

    全球网站排名alexa

    LAMP\LNMP

    一个网站的基本应用用户--商品--交易

    应用从资源占用的角度分2类

        cpu bound (cpu密集型) 如lamp架构把mysql单独做服务器

        IO bound(IO密集型)    例如负载均衡

    保持session会话的三种解决方案

    session sticky {cookie based}session粘性

    session replication session负载

    session server session集中存储

    

扩展服务器集群时的会话策略问题。

        因为session是存在服务器端的多台服务器集群
        session replication 策略是复制会话即一个用户访问了一次就把session复制到所有的服务器或这一部分服务器。这样的好处是如果正访问的服务器down了用户可以自动被转到别的服务器session不丢失。缺点当然是效率低。
        session sticky策略则是不复制一个用户访问了一次后同一个session周期内所有的请求都定向到这个服务器down了session就丢了。

    

        引用mysql主从面临的问题

        1、数据复制的问题主从复制

        2、应用选择数据源的问题读写分离

    

        电商网站的读写一般写都是在主库完成同步复制到从库当用户读数据搜索商品时不可能全库mysql收索商品而是搜索引擎从从数据库把数据读过来存储在本地构建成索引这样用户搜索商品时数据库调度器会转发到搜索引擎来快速搜索。

         引入缓存(缓存命中的技术一致性hash算法)

        1、页面缓存 varnishsquid

        2、数据缓存 key-value store:mencached


        主数据库写操作压力数据库拆分

            垂直拆分把数据库中不同的业务的数据拆分到不同的数据库服务器上

            例如把用户注册、登录的数据库和商品信息、交易等数据库拆分。

            水平拆分把一个单独的表中的数据拆分到多个不停地数据库服务器上

    

        CAP:衡量分布式系统性能的理论,分布式领域CAP理论

                    Consistency(一致性), 数据一致更新所有数据变动都是同步的
                    Availability(可用性), 好的响应性能
                    Partition tolerance(分区容错性) 可靠性
 

定理任何分布式系统只可同时满足二点没法三者兼顾。
忠告架构师不要将精力浪费在如何设计能满足三者的完美分布式系统而是应该进行取舍。

关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区
        Atomicity原子性一个事务中所有操作都必须全部完成要么全部不完成。
        Consistency一致性. 在事务开始或结束时数据库应该在一致状态。
        Isolation隔离层. 事务将假定只有它自己在操作数据库彼此不知晓。
        Durability. 一旦事务完成就不能返回。
跨数据库事务2PC (two-phase commit) 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的JavaEE中的JTA事务可以支持2PC。因为2PC是反模式尽量不要使用2PC使用BASE来回避。

BASE模型反ACID模型完全不同ACID模型牺牲高一致性获得可用性或可靠性
Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库)
Soft state软状态 状态可以有一段时间不同步异步。
Eventually consistent最终一致最终数据是一致的就可以了而不是时时高一致。

BASE思想的主要实现有
1.按功能划分数据库
2.sharding碎片 

BASE思想主要强调基本的可用性如果你需要High 可用性也就是纯粹的高性能那么就要以一致性或容错性为牺牲BASE思想的方案在性能上还是有潜力可挖的。

现在NoSQL运动丰富了拓展了BASE思想可按照具体情况定制特别方案比如忽视一致性获得高可用性等等NOSQL应该有下面两个流派
1. Key-Value存储如Amaze Dynamo等可根据CAP三原则灵活选择不同倾向的数据库产品。
2. 领域模型 + 分布式缓存 + 存储 Qi4j和NoSQL运动可根据CAP三原则结合自己项目定制灵活的分布式方案难度高。

这两者共同点都是关系数据库SQL以外的可选方案逻辑随着数据分布任何模型都可以自己持久化将数据处理和数据存储分离将读和写分离存储可以是异步或同步取决于对一致性的要求程度。

不同点NOSQL之类的Key-Value存储产品是和关系数据库头碰头的产品BOX可以适合非Java如PHP RUBY等领域是一种可以拿来就用的产品而领域模型 + 分布式缓存 + 存储是一种复杂的架构解决方案不是产品但这种方式更灵活更应该是架构师必须掌握的。

三、

     Distributed FS 分布式存储:不是文件系统,不遵循POSIX规范

     常见的分布式文件系统:

         GlusterFS:适用于存储少量大文件、

         MogileFS:适用于存储海量小文件,使用mysql存储元数据

         FastDFS:仿MogileFS 开发

         MooseFS

         Ceph:内核级别,支持PB级别存储的分布式文件系统

         HDFS:GFS的山寨版,MapReduce+HDFS=Hadoop(是一个平台),HBase = haoopdatabases (Nosql)

         GFS:Google FS(MapReduce)

         TFS:适用于存储海量小文件,淘宝

         Lustre:Oracle的开源的分布式文件   


四、MogileFS 理论及基础应用   

    开源的分布式存储,由LiveJournal旗下的Danga Interactive:这公司还开发了Memcached ,MogileFS,Perlbal;大宗点评、安居客、土豆网等在用MogileFS。

    MogileFS的特性:

        1、用户空间文件系统,无须特殊的核心组件

        2、无单点失败

        3、自动文件复制

        4、比“RAID”好多了

        5、传输中立,无特殊协议

        命名空间比较简单,每个文件对于一个key

    MogileFS的组件:

        Tracker nodes:跟踪器或调度器:运行mogilefsd进程,其实现的功能包括replication,Deletion,Query,Moniter等等;基于附件

        storage nodes:运行mogstored 进程:文件实际存储的位置,其实质是一个http服务器,基于WebDAV模式工作,能完成文件创建,删除,重命名等操作;

        mysql nodes:用于为tracker存储元数据信息,mogilefs的名称空间及文件名


        用户访问数据时各组件的关系:用户访问tracker节点---tracker向后端mysql节点请求,mysql将元数据返回tracker---tracker将元数据返回用户,用户向mogilefs(多个节点)请求数据---mogilefs返回数据给用户。