海量小文件存储利器Mogilefs

#######################################################################前端

  • 数据存储的趋势和大数据带来的挑战mysql

  • 分布式存储与CAP定理nginx

  • 分布式存储文件系统程序员

  • Mogilefs基本原理sql

  • Mogilefs实现数据库

  • Nginx反向代理Tracker节点vim

#######################################################################后端


数据存储的趋势和大数据带来的挑战
bash

       当下咱们处在一个互联网飞速发展的信息社会,在海量并发链接的驱动下天天所产生的数据量必然以几何方式增加,随着信息链接方式日益多样化,数据存储的结构也随着发生了变化。在这样的压力下使得人们不得不从新审视大量数据的存储所带来的挑战,例如:数据采集、数据存储、数据搜索、数据共享、数据传输、数据分析、数据可视化等一系列问题。
服务器

传统存储在面对海量数据存储表现出的力不从心已是不争的事实,例如:纵向扩展受阵列空间限制、横向扩展受交换设备限制、节点受文件系统限制。

       然而分布式存储的出如今必定程度上有效的缓解了这一问题,之因此称之为缓解是由于分布式存储在面对海量数据存储时也并不是十全十美毫无压力,依然存在的难点与挑战例如:节点间通讯、数据存储、数据空间平衡、容错、文件系统支持等一系列问题仍处在不断摸索和完善中。


分布式存储与CAP定理

       首先要说明的是一个完美分布式系统有三个最重要的元素,他们分别是:

       一致性(Consistency):任何一个读操做老是能读取以前完成的写操做。

       可用性(Availability):每次操做老是可以在预约时间返回。

       分区容错性(Partition Tolerance):在出现网络分区(分布式)的状况下,仍然可以知足一致性和可用性。

032623364.png

       2007年,正当全部科学家都在致力于CAP三元素并存的时候,Eric.Brewer教授站了出来并指出CAP永远没法兼顾,只能根据具体应用来权衡和取舍,而且至多两个元素能够共存,后来由两位麻省理工学院的科学家证实此观点是具备前瞻性的,由此造成Brewer的CAP定理

       正所谓鱼和熊掌不可兼得,关注一致性就须要处理因系统不可用而带来写操做失败的状况,反之关注可用性就没法保证每次都能读取到最新的写入操做。传统关系型数据库侧重于CA,而非关系型键值数据库则侧重于AP

       对于大型站点,可用性(Availability)分区容错性(Partition Tolerance)的优先级会高于一致性(Consistency),这里并非指彻底舍弃一致性,而是经过其余手段实现数据的弱一致性,例如:用户微博的浏览数和评论能够容忍相对长时间的不一致,几乎不会影响用户体验,而股票价格的数据则异常敏感,即使是10秒钟的数据不一致也没法容忍,为了能更形象的了解所谓“各类一致性”须要进行一下内容的回顾。

       强一致性(ACID)在单机环境中,强一致性能够由数据库的事务来保证;在分布式环境中,强一致性很难作到,即使是作到也会由于分布式事物所带来的性能低下,不适合在互联网的环境中应用。

       弱一致性(包括最终一致性)系统不能保证后续访问返回最新的值,在访问到最新值以前这段时间称之为不一致窗口

       最终一致性:是弱一致性的一种特例,存储系统保证若是对象有屡次更新,在渡过不一致窗口以后必将放回最后更新的值。

       服务器的一致性N表明节点的个数;W表明更新的时候须要确认已经被更新的节点个数;R表明读取数据须要的节点数量。

               W + R > N  ---->  强一致性(一般N=3,W=R=2)

               W=N,R=1   ---->  最佳读

               W=1,R=N   ---->  最佳写

               W + R <= N ---->  弱一致性


分布式存储文件系统

Google Filesystem GFS+MapReduce擅长处理单个大文件
Hadoop Distributed Filesystem GFS的山寨版+MapReduce,擅长处理单个大文件
ClusterFS 擅长处理单个大文件
Taobao Filesystem 擅长处理海量小文件
MogileFS 擅长处理海量小文件
Ceph 是一个 Linux PB级别的分布式文件系统
MooseFS 通用简便,适用于研发能力不强的公司
Lustre 一种平行分布式文件系统


Mogilefs基本原理

       MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。MogileFS是一个开源的分布式文件系统。主要特性包括:应用层的组件、无单点故障、自动文件复制、具备比RAID更好的可靠性、无需RAID支持等……核心角色以下:

       tracker节点:借助数据库保存各节点文件的元数据信息保存每一个域中全部键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。

       database节点为tracker节点提供数据存取服务。

       storage节点:将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点因为使用http进行数据传输,所以依赖于perlbal,storage节点前端可使用nginx进行反向代理,但须要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)

       Domain一个域中的键值是唯一的,一个MogileFS能够有多个域,域能够用来存储不一样应用类型的数据的容器。

       Host每个存储节点称为一个主机,一个主机上能够有多个存储设备(单独的硬盘),每一个设备都有ID号,Domain+Fid用来定位文件。

       Class:复制最小单位,文件属性管理,定义文件存储在不一样设备上份数。

       流程图以下:

032539679.png

       一、应用层发起GET请求到Nginx。

       二、Nginx根据负载均衡机制随机代理到后台Node one。

       三、Node one向从服务器发起查询请求。

       四、从服务器返回查询结果。

       五、Node one将查询结果返回给Nginx。

       六、Nginx将查询结果根据模块转换为合理的url方位Node three。

       七、Node Three将文件内容经过http协议返回给Nginx。

       八、Nginx将结果返回给应用层的请求。


Mogilefs实现

      因为各角色和服务之间都是基于套接字通讯,就服务自己来讲没有耦合性,因此可使用少许机器运行多种服务角色,功能图以下:

034037457.png

       一、经过Nginx+Keepalived实现高可用的负载均衡,经过upstream模块能够有选择性的转发应用层的请求至后端tracker节点。

       二、DRBD+Corosync+Pacemaker的机制保证了Mysql的高可用,详细配置请参阅博文:DAS之mysql高可用解决方案

       三、为了进一步提高Mysql的性能引入从节点为其分摊读操做,从节点的数据能够根据具体业务规模来设定,若是使用数据库代理进行读写分离,代理会成为单点故障,则须要为代理作高可用,另外Tracker节点支持手动为其指定从节点,所以能够根据本身的喜爱,Mysql代理和复制相关实现请参阅博文:Mysql复制及代理

##### Database节点
安装mariadb
受权
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'mypass';
CREATE DATABASE mogilefs;
GRANT ALL ON mogilefs.* TO 'moguser'@'%' IDENTIFIED BY 'mogpass';
FLUSH PRIVILEGES;
##### Tracker节点(能够是全部节点)
安装 mogilefs
修改配置文件以下
vim /etc/mogilefs/mogilefsd.conf        
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.1.241
db_user = moguser
db_pass = mogpass
listen = 0.0.0.0:7001
conf_port = 7001
query_jobs = 100
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
service mogilefsd start     #启动服务
ss -tanlp (LISTEN      0      128       192.168.1.241:7001  )
##### storage节点(能够是全部节点)
安装 mogilefs
mkdir /mogdata/dev1 -pv     #建立设备目录
chown -R mogilefs.mogilefs /mogdata/dev2/   #权限
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata          #目录级别
service mogstored start
ss -tanlp (*:7500)
##### tracker节点添加storage节点和经常使用命令
mogadm check        #检测节点
mogadm host list    #每一个存储节点称为一个host
mogadm host add 192.168.1.213 --ip=192.168.1.213 --ip=192.168.1.213 --status=alive      #添加第一个存储节点
mogadm host add 192.168.1.242 --ip=192.168.1.242 --ip=192.168.1.242 --status=alive       #添加第一个存储节点
mogadm host add 192.168.1.241 --ip=192.168.1.241 --ip=192.168.1.241 --status=alive      #添加第一个存储节点
mogadm device add 192.168.1.213 1    #添加第一个设备,设备号惟一不能重名
mogadm device add 192.168.1.242 2   #添加第二个设备
mogadm device add 192.168.1.241 3   #添加第三个设备
mogadm check    #能够查看状态
mogadm domain add files     #建立文件存储域
mogadm domain add p_w_picpaths    #建立图片存储域
mogadm domain list  #查看全部域
mogupload --trackers=192.168.1.241 --domain=files --key='/fstab' --file='/etc/fstab'     #上传fstab文件,key为'/fstab'
mogfileinfo --trackers=192.168.1.241 --domain=files --key='/fstab'    #根据key查看文件存放信息

注释:mogupload工具是为了测试,实际环境中上传是由程序员在代码中使用mogilefs的API进行交互。

042651555.png


Nginx反向代理Tracker节点

##### 配置Nginx
安装tng
yum install pcre-devel -y
yum groupinstall "Development Tools" "Server Platform Development"
yum install libxslt-devel gd-devel lua-devel geoip-devel
tengine-1.5.1.tar.gz
nginx-mogilefs-module-master.zip    #mogilefs模块须要打补丁
mkdir -pv /var/tmp/nginx/client     #模块须要
unzip nginx-mogilefs-module-master.zip
useradd -r nginx
./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/local/nginx/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --enable-mods-shared=all \
  --add-module=/nginx-mogilefs-module-master
make && make install
vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
. !$
提供脚本.....
配置nginx
vim /etc/nginx/nginx.cfg
upstream trackers {
        server 192.168.1.242:7001 weight=1;
        server 192.168.1.213:7001 weight=1;
        server 192.168.1.241:7001 backup;
        check interval=3000 rise=2 fall=5 timeout=1000;
        check_http_send "GET / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
   }
location /jpg/ {
        mogilefs_tracker trackers;
        mogilefs_domain p_w_picpaths;
        mogilefs_methods GET;
        mogilefs_pass {
            proxy_pass $mogilefs_path;
            proxy_hide_header Content-Type;
            proxy_buffering off;
                }
       }
##### 配置keepalived
安装keepalived
vim /etc/keepalived/keepalived.conf  # backup  priority 99
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LTT
}
vrrp_script chk_nginx {
   script "killall -0 nginx"
   interval 1
   weight -2
   fall 2
   rise 1
}
vrrp_instance IN_1 {
    state MASTER
    interface eth0
    virtual_router_id 22
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aaaa
    }
    virtual_ipaddress {
        192.168.1.222
    }
   track_script {
    chk_nginx
}
}


查看负载节点:

045554770.png


模拟GET方法测试Nginx_mogilefs模块:

045933806.png

相关文章
相关标签/搜索