一、分布式文件系统简介:
什么是分布式存储:
分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
分布式文件系统设计目标 :
• 访问透明
• 位置透明
• 并发透明
• 失效透明
• 硬件透明
• 可扩展性
• 复制透明
• 迁移透明
CAP理论:
C:Consistency(一致性) 任何一个读操作总是能够读取之前完成的写操作。
A:Availability(可用性) 每一次操作总是能够在确定的时间返回。
P: Partition Tolerance ( 分区容错性 ) 在出现网络分区的情况下,仍然能够满足一致性和可用性。
有科学家都在致力于 CAP 三元素并存的时候,Eric.Brewer教授指出 CAP 永远无法兼顾,只能根据具体应用来权衡和取舍,并且至多两个元素可以共存,后来由两位麻省理工学院的科学家证明此观点是具有前瞻性的,由此形成Brewer的 CAP定理 。
正所 谓鱼和熊掌不可兼得 ,关注一致性就需要处理因系统不可用而带来写操作失败的情况,反之关注可用性就无法保证每次都能读取到最新的写入操作。传统 关系型数据库 侧重于 CA ,而 非关系型键值数据库 则侧重于 AP 。
强一致性(ACID) : 在单机环境中,强一致性可以由数据库的事务来保证;在分布式环境中,强一致性很难做到,即便是做到也会因为分布式事物所带来的性能低下,不适合在互联网的环境中应用。
弱一致性(包括最终一致性) : 系统不能保证后续访问返回最新的值,在访问到最新值之前这段时间称之为 不一致窗口 。
最终一致性 :是弱一致性的一种特例,存储系统保证如果对象有多次更新,在渡过 不一致窗口 之后必将放回最后更新的值。
服务器的一致性 : N 代表节点的个数; W 代表更新的时候需要确认已经被更新的节点个数; R 代表读取数据需要的节点数量。
W + R > N —-> 强一致性(通常N=3,W=R=2)
W=N,R=1 —-> 最佳读
W=1,R=N —-> 最佳写
W + R <= N —-> 弱一致性
分布式存储或分布式文件系统
集中式:
共享存储:
NAS
SAN
分布式存储:
专用的元数据节点:集中元数据存储,数据节点至负责存储数据
无专用元数据几点:所有数据均完整存储元数据,存储了部分数据
分布式:
文件系统:有文件系统接口:一般挂载使用
存储:无文件系统接口,通过API访问
常见的分布式文件系统:
GFS:Google File System GFS擅长处理单个大文件 。
HDFS:Hadoop Distributed File System 根据GFS思想开发的,擅长处理单个大文件 ,使用场景,数据不太多的大文件。
TFS:Taobao File System 淘宝开源的文件系统,擅长处理海量小文件,适用于大规模场景。
将元数据存储于关系型数据库或其他高性能存储中,从而能维护海量文件元数据。
GlusterFS:去中心化设计:擅长处理单个大文件
ceph:整合到linux内核实现的文件系统,已经被收录在内核,是一个 Linux PB级别的分布式文件系统。
MogilesFS:MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群
二、MogilesFS介绍:
1.MogilesFS简介:
MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。MogileFS是一个开源的分布式文件系统。
目前使用 MogileFS 的公司非常多,比如国外的一些公司,日本前几名的公司基本都在使用这个.国内所知道的使用 MogileFS 的公司有图片托管网站 yupoo又拍,digg, 土豆, 豆瓣,1 号店, 大众点评,搜狗,安居客等等网站.基本很多网站容量,图片都超过 30T 以上。
2.MogileFS特性:
1) 应用层提供服务,不需要使用核心组件
2)无单点失败,主要有三个组件组成,分为tracker(跟踪节点)、mogstore(存储节点)、database(数据库节点)
3)自动复制文件,复制文件的最小单位不是文件,而是class
4)传输中立,无特殊协议,可以通过NFS或HTTP实现通信
5)简单的命名空间:没有目录,直接存在与存储空间上,通过域来实现
6)不用共享任何数据
3.MogileFS的核心
1)Tracker–跟踪器,调度器
MogileFS的核心,是一个调度器,mogilefsd进程就是trackers进程程序,trackers的主要职责有:删除数据、复制数据、监控、查询等等.这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到多个"query workers"中,然后让 mogilefs的子进程去处理.
mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡.trackers也可以只运行在一台机器上,使用负载均衡时可以使用搞一些简单的负载均衡解决方案,如haproxy,lvs,nginx等,
tarcker的配置文件为/etc/mogilefs/mogilefsd.conf,监听在TCP的7001端口
2)Database–数据库部分
主要用来存储mogilefs的元数据,所有的元数据都存储在数据库中,因此,这个数据相当重要,如果数据库挂掉,所有的数据都不能用于访问,因此,建议应该对数据库做高可用
3)mogstored–存储节点
数据存储的位置,通常是一个HTTP(webDAV)服务器,用来做数据的创建、删除、获取,任何 WebDAV 服务器都可以, 不过推荐使用 mogstored . mogilefsd可以配置到两个机器上使用不同端口… mogstored 来进行所有的 DAV 操作和流量,IO监测, 并且你自己选择的HTTP服务器(默认为 perlbal)用来做 GET 操作给客户端提供文件.
典型的应用是一个挂载点有一个大容量的SATA磁盘. 只要配置完配置文件后mogstored程序的启动将会使本机成为一个存储节点.当然还需要mogadm这个工具增加这台机器到Cluster中.
配置文件为/etc/mogilefs/mogstored.conf,监听在TCP的7500端口
4.基本工作流程:
应用程序请求打开一个文件 (通过RPC 通知到 tracker, 找到一个可用的机器). 做一个 “create_open” 请求.
tracker 做一些负载均衡(load balancing)处理,决定应该去哪儿,然后给应用程序一些可能用的位置。
应用程序写到其中的一个位置去 (如果写失败,他会重新尝试并写到另外一个位置去).
应用程序 (client) 通过”create_close” 告诉tracker文件写到哪里去了.
tracker 将该名称和域命的名空间关联 (通过数据库来做的)
tracker, 在后台, 开始复制文件,知道他满足该文件类别设定的复制规则
然后,应用程序通过 “get_paths” 请求 domain+key (key == “filename”) 文件, tracker基于每一位置的I/O繁忙情况回复(在内部经过 database/memcache/etc 等的一些抉择处理), 该文件可用的完整 URLs地址列表.
应用程序然后按顺序尝试这些URL地址. (tracker’持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做..)
5.MogileFS的组成:
1) server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、 host等;mogstored是存储节点(store node),它其实是个WebDAV服务,默认监听在7500端口,接受客户端的文件存储请求。在MogileFS安装完
后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
3) 客户端API:MogileFS的客户端API很多,例如Perl、PHP、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。
三、MogileFS安装配置:
1、准备环境:
node1 192.168.139.203 centos7 traceker+mogstored+database节点
node2 192.168.139.200 centos7 traceker+mogstored节点
node3 192.168.139.204 centos7 traceker+mogstored节点
安装包:需要在三个节点上安装如下安装包和安装epel源解决依赖 yum install -y epel-* yum install *.rpm
2、配置database:
1)、node3安装database并创建数据、授权这里不在讲解。
2)、导入数据库:
mogdbsetup –dbhost=192.168.139.204 –dbrootpass='123456' –dbuser='mog' –dbpass='4263.212'
3)、node3配置tracker,node1、node2配置同node3
4)、启动tracker
先在创建/var/run/mogilefsd文件 mkdir /var/run/mogilefsd chown -R mogilefs.mogilefs /var/run/mogilefsd
/etc/init.d/mogilesd start
5)、修改mogstored服务配置文件:
分别在node1、node2、node3、上创建/data/mogilefs/dev1、/data/mogilefs/dev2、/data/mogilefs/dev3:
提供mogstored服务脚本和启动服务:(默认脚本是支持centos6需要更改支持centos7)
启动mogstored服务:/etc/init.d/mogstored start
3、使用mogadm命令配置mogilefs:
1)、添加存储主机:
mogadm –trackers=192.168.139.203:7001 host add 192.168.1.203 -ip=192.168.139.203 –status=alive
mogadm –trackers=192.168.139.200:7001 host add 192.168.1.200 -ip=192.168.139.200 –status=alive
mogadm –trackers=192.168.139.204:7001 host add 192.168.1.204 -ip=192.168.139.204 –status=alive
2)、添加存储设备:
mogadm –trackers=192.168.139.203:7001 device add 192.168.139.203 1
mogadm –trackers=192.168.139.200:7001 device add 192.168.139.200 2
mogadm –trackers=192.168.139.204:7001 device add 192.168.139.204 3
3)、添加域
mogadm domain add files mogadm domain add images
4)、添加class类
mogadm class add images png mogadm class add images jpeg
mogadm class add files text mogadm class add files html
5)、上传文件测试:
mogupload –trackers=192.168.139.204:7001 –domain=files –key='test' –file=/etc/fstab –class=text
6)、mogilefs状态查询:
mogstats –db_dsn="DBI:mysql:mogilefs:host=192.168.139.204" –db_user="mog" –db_pass="123456"
7)、删除domain流程:删除文件–class-domain
moglistkeys –trackers=192.168.139.204:7001 –domain=images 列出images域下所有key
mogdelete –trackers=192.168.139.204:7001 –domain=images –key=linux.jpg
mogadm class delete images jpeg
domain delete images
4、Nginx做MogileFS的前端客户端
1)、编译安装nginx和nginx的mogilefs模块
tar xf nginx-1.6.1.tar.gz tar xf nginx_mogilefs_module-1.0.2.tar.gz
groupadd -r nginx useradd -r -g nginx 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 –with-http_ssl_module –with-http_flv_module –with-http_stub_status_module
–with-http_gzip_static_module –http-client-body-temp-path=/var/tmp/nginx/client/ –http-proxy-temp-path=/var/tmp/nginx/proxy/ –http-
fastcgi-temp-path=/var/tmp/nginx/fcgi/ –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi –http-scgi-temp-path=/var/tmp/nginx/scgi –with-
pcre –add-module=/usr/local/src/nginx_mogilefs_module-1.0.2
2)、提供配置脚本:
#!/bin/sh
#
# nginx – this script starts and stops the nginx daemon
#
# chkconfig: – 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
pidfile=/var/run/nginx/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*–user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
"/etc/init.d/nginx" 126L, 2529C
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
3)、修改nginx配置文件:
4)、mogilefs上传文件:
mogupload –trackers=192.168.139.204:7001 –domain=imgs –key=test.html –file='/etc/redhat-release'
5)、客户端浏览器测试:
实验成功!
接下来补充一下mogadm命令的额外指令。
mogadm slave //由于文件元数据信息是保存在MySQL中的,每次请求文件需要读取MySQL一旦请求量太大,MySQL必定会成为性能瓶颈,这时我们要给MySQL做主从,这个指令就是用来添加从节点的,可以实现tracker与主从架构的MySQL交互时,实现读写分离。
mogadm fsck //文件系统检测,一般不要使用,除非集群意外断电,在上线时执行。
mogadm rebalance // 重新平衡,当数据出现热区时使用,在执行之前需要定义平衡策略。
mogadm rebalance start // 启动平衡策略。
mogadm rebalance policy //定义平衡策略。
mogadm rebalance test //用于测试是否出现数据不平衡的问题。
mogadm settings //定义mogilefs工作属性。
mogadm class modify <domain> <class> –mindevcount= //定义文件最小的副本份数
再总结两个技巧.
技巧一、 MogileFS 中怎么删除主机
在机器坏了的时候 , 就会给这些标坏掉了 , 但还是不能删除 . 下面是我建议的方式 ,当你给所有的硬盘设备标成不可用后 , 你然后在 fsck , 这样会同 步文件到其它的机器同样的份数 . 接着为了确认进入 MySQL 中查一下。
select count (*) from file_on where devid=11;
看看是不是去掉的硬盘设备,真的没有文件的记录在上面了. 接着我们就可以安全的删除这个设备了.
delete from device where devid=11;
当对那个主机上的硬盘操作完时,你就可以删除你的主机了.
技巧二、 MogileFS 复制不正常 , 发现文件少于指定的份数解决方法
在安装最新的 MogileFS 时,会发现测试的时候,怎么样复制文件的过程都不正常.使用 telnet 到 7001 中使用 !watch 来查看时会不断的报下面的错(详细
使用见 MogileFS 高级排错).
!watch Added you to watcher list. . :: Child 10106 (replicate) died: 256 (UNEXPECTED) :: Job replicate has only 9, wants 10, making 1. :: Child 10091 (replicate) died: 256 (UNEXPECTED) :: Job replicate has only 9, wants 10, making 1. :: Child 10121 (replicate) died: 256 (UNEXPECTED) :: Job replicate has only 9, wants 10, making 1. :: Child 10134 (replicate) died: 256 (UNEXPECTED) :: Job replicate has only 9, wants 10, making 1. :: Child 10120 (replicate) died: 256 (UNEXPECTED) :: Job replicate has only 9, wants 10, making 1.
使用 MogileFS 的 DEBUG 模式跟这个问题,是由于 Sys::Syscall 这个模块升级成 0.25 的新版本引起的.
我们可以使用下面的命令来检查当前的版本
perl -MSys::Syscall -e 'print $Sys::Syscall::VERSION'
如果发现是显示上面的 0.25 就一定会出问题.建议退回到 0.23 就不会在出问题了.所以建议大家在安装完 MogileFS 后,先退回这个模块到 0.23.
cpan http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
感谢马哥,每天进步一点点!
原创文章,作者:n18-jude,如若转载,请注明出处:http://www.178linux.com/15506