MogileFS是一套高效的文件自动备份组件,由Six Apart开发,普遍应用在包括LiveJournal等web2.0站点上。
MogileFS由3个部分组成:
第1个部分:是server端,包括mogilefsd和mogstored两个程序。前者便是mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等。后者便是存储节点(store node),它实际上是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将全部的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
第2个部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
第3个部分:是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块能够编写客户端程序,实现文件的备份管理功能,提供MogileFS.pm。html
当下互联网飞速发展,海量并发所产生的数据量以几何方式增加,随着信息连接方式日益多样化,数据存储的结构也发生了变化,在这样的压力下咱们不得不从新审视大量数据的存储所带来了巨大的挑战:
一、数据采集:对于社交网站通常都是由用户上传的;
二、数据存储:如今是数据量大爆炸时代,天天都会产生大量的数据,因此数据存储就成了一个大问题;
三、数据搜索:若是说存储是考验数据的存储能力的话,那搜索就是考量计算机能力了,从大量的数据中搜索出来;
四、数据共享:数据存储下来以后还要进行数据的共享问题,大量的数据该怎么共享这些数据呢;
五、数据传输:而海量数据存储下来以后数据怎么用户与用户之间进行安全的传输;
六、数据分析:数据的分析是了解咱们过去的一些行为规范;
七、数据可视化:而海量数据存储下来以后怎么样能够直观的展现在人们面前呢;前端
分布式文件系统的几个难点:
一、缺少全局时钟、不过同步自己就存在时间差,很难作到步调一致,
二、面对故障的独立性,分布式是由多个节点组成的,而每一个节点都是独立工做的,一个节占故障度不会影响其它节点正常工做,
三、如何去处理单点故障, 一是:作冗余,对单点作备份;二是:下降单点故障的影响范围
四、事务类的挑战,在分布环境中怎么处理事务呢;ACID或2PI(两段式提交)、最终一致、BASE法则、CAP理论、Paxos算法;node
什么是两段式提交:
经过使用某种协议进行通讯来完成分布式事务,被称为两段式提交。从名字上看,您可能已经知道有两个阶段:
第一个阶段,即预提交:
事务协调器给每一个事务管理器发送准备操做的信号。
事务管理器将操做(一般是数据更新)步骤(或细节)写入事务日志。若是失败,事务管理器使用这些步骤重复操做。
事务管理器本地建立事务并通知资源管理器对资源(例如,数据库或消息服务器)执行操做。
资源管理器执行操做并向事务管理器报告成功(准备提交信号)或失败(准备回滚)。
资源管理器等待事务管理器进一步的指令。
事务管理器向事务协调器报告成功或失败。
第二阶段,即提交阶段:在第二阶段中,第一阶段的结果将传送给全部事务管理器。mysql
若是任何事务管理器报告失败,全部的事务参与者都必须回滚。
事务协调器让全部事务管理器提交(或回滚)。
全部事务管理器将提交或回滚信息传递给其资源管理器。
资源管理器将成功或失败提示返回给事务管理器。
事务管理器向事务协调器报告成功或失败。linux
CAP理论:一致性,可用性,分区容错性;指一个分布式系统不能够知足一致性,可用性和分区容错性这三个需求,最多只能同时知足其中的两个;
C(Consistency):一致性,任何一个读操做老是可以读取以前完成的写操做;就是一个数据写入一立马被读到;
A(Availability):可用性,每一次操做老是可以 在肯定的时间返回;不管成功或失败都能收到一个返回值的;
P(Tolerance of network Partition):分区容错性,在出现网络分区的状况下,仍然可以知足一致性和可用性;nginx
BASE法则模型反ACID模型,彻底不一样ACID模型,牺牲高一致性,得到可用性或可靠性:
BA:Basically Available,基本能够用,支持分区失败(sharding碎片划分数据库);
S:Soft state,软状态,接受一段时间内的状态不一样步,异步;
E:Eventually consistent:最终一致性,弱一致性的表现;
BASE思想主要强调基本的可用性,若是你须要High 可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上仍是有潜力可挖的。web
Paxos算法:比2PC提交更轻量级的分布式事务的协调方式;大概是指不出现故拜占庭将军的前提下,要取得数据的一致性,在通讯信道不安全的时候,咱们数据传输可能会被人劫持,这样就不能保证数据的可信了,因此必须保证通讯信道安全下Paxos算法才可行;算法
实现MogileFS的分布式过程,按照下图构建MogileFS分布式文件系统的结构,这里限于机器的缘由,一些服务都整合在一块儿;sql
第一步:安装MogileFS软件,咱们前面提到,它是由三部分组成,因此三个组件都得安装上,而且每一个节点都作MogileFS和Mogstored;数据库
在这里先说一个笔者的基本布局,node0(172.16.27.88)上安装nginx和MariaDB,node1(172.16.27.1)和node2(172.16.27.2)上分别安装了MogileFS和Mogstored,node1和node2都共同使用node0上的MariaDB数据库,nginx作为前端接收用户请求并负载均衡到后端两个节点上;
在node1上的安装和配置过程,修改好配置文件以后复制一份相同的配置文件到node2节点上,由于它们的配置参数都是同样的:
[root@node1 ~]# rpm -ivh perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm [root@node1 ~]# yum -y install MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-IO-AIO # 安装好以后修改配置文件,只须要修改如下几项就能够了 # mysql指使用的数据库是什么,MariaDB也是写mysql;mogdb指数据库名;host=172.16.27.88指定安装数据的地址 [root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf db_dsn = DBI:mysql:mogdb:host=172.16.27.1 db_pass = linux # 登陆mogdb数据所使用密码 listen = 0.0.0.0:7001 # 0.0.0.0表示监听全部地址 # 再编辑mogstored.conf这个配置文件 maxconns = 10000 [root@node1 ~]# mkdir -pv /dfs/mogdata/dev1 # 建立修改的docroot目录 [root@node1 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/dev1 # 修改属主属组 [root@node1 ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd/ [root@node1 ~]# cd /etc/mogilefs [root@node1 ~]# scp mogilefsd.conf mogstored.conf root@172.16.27.2:/etc/mogilefs/ # 复制修改好的配置文件到node2的mogilefs目录下,覆盖便可,两个节点都安装配置好以后先不要启动服务,数据库尚未安装 |
在node2上的安装和配置,这里的配置文件由node1上复制过来就能够了;
[root@node2 ~]# rpm -ivh perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm [root@node2 ~]# yum -y install MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-IO-AIO
[root@node2 ~]# mkdir -pv /dfs/mogdata/dev2 # 建立修改的docroot目录 [root@node1 ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd/ [root@node2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/dev2 # 修改属主属组 |
第二步:安装nginx和MariaDB,这里安装Nginx须要编译安装,由于他须要装载第三方模块才可使用mogilefs,MariaDB安装这里就再也不说明了;
在node0节点上的安装步骤:
# 解决依赖关系 [root@node0 ~]# yum -y groupinstall "Development Tools" "Server Platform Development" [root@node0 ~]# yum -y install openssl-devel pcre-devel [root@node0 ~]# groupadd -r nginx [root@node0 ~]# unzip nginx-mogilefs-module-master.zip [root@node0 ~]# cd nginx-1.4.2 [root@node0 nginx-1.4.2]# make && make install # 这里MariaDB安装过程再也不说明了,能够参数前面的博文,编译安装好以后就能够能够启动MariaDB和去配置Nginx的相关配置了,还要给nginx提供一个服务脚本; [root@node0 support-files]# service mysqld start [root@node0 nginx-1.4.2]# vim /etc/rc.d/init.d/nginx #!/bin/sh [root@node0 nginx-1.4.2]# chmod +x /etc/init.d/nginx [root@node0 nginx-1.4.2]# vim /etc/profile.d/nginx.sh export PATH=/usr/sbin/nginx:$PATH [root@node0 nginx-1.4.2]# . /etc/profile.d/nginx.sh [root@node0 nginx-1.4.2]# service nginx start [root@node0 nginx-1.4.2]# ss -tnl |
测试访问一下nginx的页面:
第三步:链接上数据库,给两个用户受权:
[root@node0 ~]# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 46 Server version: 10.0.10-MariaDB-log MariaDB Server Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> USE mysql; Database changed MariaDB [mysql]> GRANT ALL ON *.* TO 'root'@'172.16.%.%' IDENTIFIED BY 'linux';Query OK, 0 rows affected (0.20 sec) MariaDB [mysql]> GRANT ALL ON mogdb.* TO 'moguser'@'172.16.%.%' IDENTIFIED BY 'linux'; Query OK, 0 rows affected (0.00 sec) MariaDB [mysql]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.21 sec) MariaDB [mysql]> |
第四步:再到两个节点上,在其中一个上设置便可:
[root@node1 mogilefs]# mogdbsetup --dbhost=172.16.27.88 --dbport=3306 --dbname=mogdb --dbrootuser=root --dbrootpass=linux --dbuser=moguser --dbpass=linux --yes # 能够再回到node0上查看一下生成的数据库 MariaDB [mysql]> USE mogdb; MariaDB [mogdb]> SHOW TABLES; |
第五步:在两个节点的其中一个上添加主机:
[root@node1 ~]# mogadm --trackers=172.16.27.1:7001 host add 172.16.27.1 --ip=172.16.27.1 --status=alive [root@node1 ~]# mogadm --trackers=172.16.27.1:7001 host add 172.16.27.2 --ip=172.16.27.2 --status=alive [root@node1 mogilefs]# mogadm --trackers=172.16.27.1:7001 host list 172.16.27.1 [1]: alive IP: 172.16.27.1:7500 172.16.27.2 [2]: alive IP: 172.16.27.2:7500 # 再添加设备 [root@node1 mogilefsd]# mogadm --trackers=172.16.27.1:7001 device add 172.16.27.1 1
# [root@node1 ~]# mogadm --trackers=172.16.27.1:7001 domain add images # 添加域 domain class mindevcount replpolicy hashtype [root@node1 ~]# mogupload --trackers=172.16.27.1:7001 --domain=images --key='/images/3.png' --file='/usr/share/backgrounds/centos_wallpaper_01_1920x1200.png' [root@node1 ~]# mogupload --trackers=172.16.27.1:7001 --domain=html --key='/files/index.html' --file='/var/www/html/index.html' [root@node1 ~]# moglistkeys --trackers=172.16.27.1:7001 --domain=images |
能够复制这个地址在页面上测试一下,这里是每上传一个文件就都会在两个节点是都存一份,若是节点多的话它会根据定义的devcount本身选择节点存储几份,这样在一个节点掉了也能够在别的节点在有相同的资源可用;
第五步:以上的都配置好了就能够在前端的Nginx上配置访问控制了,修改配置文件:
[root@node0 nginx]# vim nginx.conf upstream mogcluster { # 定义多个上游服务器 # 修改好配置文件后保存退出重启服务 [root@node0 nginx]# service nginx restart |
而后在页面上测试访问刚才上传的文件以及图片:
总结:
最后还能够测试一下把一个节点掉了,试着访问一下看另外正常工做的节点可不能够正常提供服务,这里还能够添加不少功能的,后续还会更新相关的基础网站服务器架构搭建的文章,在此,若是发如今什么不妥或作得不到的还望你们多提点建议。
本文出自 “温水煮青蛙” 博客,请务必保留此出处http://tanxw.blog.51cto.com/4309543/1409362