GFSgoogle分布式存储的基石,其他存储系统,比如Google的bigtable、megastore、percolator均直接或者间接的构建在GFS上。


  • 系统架构

    • GFS Master
      维护了系统的元数据,包括文件及chunk命名空间、文件到chunk的映射关系、chunk的位置信息;复制整个系统的全局控制,master定期会与CS通过心跳的方式交换信息

    • GFS ChunkServer(CS,数据块服务器)
      64MB的chunk块,由master在创建时分配一个64位全局唯一的chunk句柄,CS以普通的linux文件的形式将chunk存储在磁盘中

    • GFS客户端
      客户端是GFS提供给应用程序的访问接口,是一组专用接口,以库文件形式提供 ,GFS客户端不缓存文件数据,只缓存主控服务器中获取的元数据

关键问题

  • 租约机制
    GFS数据追加以记录为单位,GFS系统中通过租约(lease)机制将chunk写操作授权给chunkmaster,拥有租约的chunserver为主chunkserver,其他副本所在的chunkservcer为备chunkserver

  • 一致性模型 -- 追加一致性

  • 追加流程 -- GFS中最为复杂的部分
    GFS追加流程有两个特色:流水线及分离数据流和控制流

  • 容错机制
    master保存三种元数据:命名空间(name space)、文件到chunk的映射、chunk副本的位置信息 (1)master容错:操作日志 + checkpoint、shadow master (2)chunkserver容错:


Master设计

  • 新副本所在的chunkserver的磁盘利用率远远低于平均水平

  • 限制每个chunkserver“最近”创建的数量

  • 每个chunkserver的所有副本不能在同一个机架

  • Master内存占用

  • 负载均衡
    串讲chunk的三种情况:chunk创建、chunk复制(re-replicantion)、负载均衡(rebalancing)

  • 垃圾回收
    GFS采用延迟删除的机制

  • 快照(snapshot)

ChunkServer设计

ChunkServer是一个磁盘和网络IO密集型的应用


总结

  • GFS是一个具有良好扩展性并且在软件层面可以自动处理各种异常情况的系统

  • 单Master的设计是可行的



Linux GFS和Google GFS的区别

Linux GFS中的GFS是Global FileSystem,指的是全局文件系统,要解决的是共享存储的读写。如下图:

Linux GFS类似于一个并发锁的处理器:获得独占锁的节点才可以进行写操作。

所以,Linux GFS面对的存储设备有两种:iSCSI和FC


Google GFS中的GFS是Google FileSystem,指的是分布式文件系统,要解决的问题是文件系统的分布。

除了管理节点外,其它的都是数据节点;数据节点存放具体的数据。


总结:

Linux GFS是把让昂贵的存储共享起来给大家用;

Google GFS是把便宜的各个本地存储集中起来共享给大家用。


http://www.90rhca.com/?p=126



linux下一些常用软件的编译安装命令

PHP编译参数 Apache:
  ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-curl --with-mcrypt --enable-mbstring --with-iconv --with-gd --with-jpeg-dir=/usr/local/lib --enable-pdo --with-pdo-mysql=/usr/local/mysql5.5.25/ --with-mysqli=/usr/local/mysql5.5.25/bin/mysql_config --with-mysql=/usr/local/mysql5.5.25/
 
PHP编译参数 NGINX:
 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/lib --enable-pdo --with-pdo-mysql=/usr/local/mysql5.6.19/ --with-mysqli=/usr/local/mysql5.6.19/bin/mysql_config --with-mysql=/usr/local/mysql5.6.19/ --with-libxml-dir --enable-ftp --enable-sockets --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-zlib-dir --enable-gd-native-ttf --enable-magic-quotes --with-iconv --enable-mbstring=all --disable-cgi --with-openssl --with-mcrypt --enable-bcmath --enable-calendar --enable-exif --enable-libxml --with-bz2 --with-curl --with-xmlrpc --with-gettext --disable-cli  --disable-debug  --enable-zend-multibyte --with-mhash --enable-pcntl --enable-sysvsem --enable-inline-optimization --enable-soap --disable-ipv6 --enable-fpm
 
MYSQL:
 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.6.19 -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_TCP_PORT=3306 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_DEBUG=0 
 
nginx:
./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/tmp/nginx/nginx.pid  --lock-path=/tmp/nginx/nginx.lock --user=nginx --group=nginx --with-pcre --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --http-fastcgi-temp-path=/tmp/nginx/fcgi/ 

apache:
./configure --with-included-apr --prefix=/usr/local/apache --with-pcre=/usr/local/pcre/

keepalived:
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-279.el6.x86_64