构建Mogilefs分布式文件系统:
当下互联网飞速发展,海量并发所产生的数据量以几何方式增长,随着信息链接方式日益多样化,数据存储的结构也发生了变化,在这样的压力下我们不得不重新审视大量数据的存储所带来了巨大的挑战:
1、数据采集 :对于社交网站一般都是由用户上传的;
2、数据存储 :现在是数据量大爆炸时代,每天都会产生大量的数据,所以数据存储就成了一个大问题;
3、数据搜索 :如果说存储是考验数据的存储能力的话,那搜索就是考量计算机能力了,从大量的数据中搜索出来;
4、数据共享 :数据存储下来之后还要进行数据的共享问题,大量的数据该怎么共享这些数据呢;
5、数据传输 :而海量数据存储下来之后数据怎么用户与用户之间进行安全的传输;
6、数据分析 :数据的分析是了解我们过去的一些行为规范;
7、数据可视化 :而海量数据存储下来之后怎么样可以直观的展示在人们面前呢;
1、数据采集 :对于社交网站一般都是由用户上传的;
2、数据存储 :现在是数据量大爆炸时代,每天都会产生大量的数据,所以数据存储就成了一个大问题;
3、数据搜索 :如果说存储是考验数据的存储能力的话,那搜索就是考量计算机能力了,从大量的数据中搜索出来;
4、数据共享 :数据存储下来之后还要进行数据的共享问题,大量的数据该怎么共享这些数据呢;
5、数据传输 :而海量数据存储下来之后数据怎么用户与用户之间进行安全的传输;
6、数据分析 :数据的分析是了解我们过去的一些行为规范;
7、数据可视化 :而海量数据存储下来之后怎么样可以直观的展示在人们面前呢;
分布式文件系统的几个难点:
1、缺乏全局时钟、不过同步本身就存在时间差,很难做到步调一致,
2、面对故障的独立性,分布式是由多个节点组成的,而每个节点都是独立工作的,一个节占故障度不会影响其它节点正常工作,
3、如何去处理单点故障, 一是:做冗余,对单点做备份;二是:降低单点故障的影响范围
4、事务类的挑战,在分布环境中怎么处理事务呢;ACID或2PI(两段式提交)、最终一致、BASE法则、CAP理论、Paxos算法;
什么是两段式提交:
通过使用某种协议进行通信来完成分布式事务,被称为两段式提交。从名字上看,您可能已经知道有两个阶段:
第一个阶段,即预提交:
事务协调器给每个事务管理器发送准备操作的信号。
事务管理器将操作(通常是数据更新)步骤(或细节)写入事务日志。如果失败,事务管理器使用这些步骤重复操作。
事务管理器本地创建事务并通知资源管理器对资源(例如,数据库或消息服务器)执行操作。
资源管理器执行操作并向事务管理器报告成功(准备提交信号)或失败(准备回滚)。
资源管理器等待事务管理器进一步的指令。
事务管理器向事务协调器报告成功或失败。
第二阶段,即提交阶段:在第二阶段中,第一阶段的结果将传送给所有事务管理器。
如果任何事务管理器报告失败,所有的事务参与者都必须回滚。
事务协调器让所有事务管理器提交(或回滚)。
所有事务管理器将提交或回滚信息传递给其资源管理器。
资源管理器将成功或失败提示返回给事务管理器。
事务管理器向事务协调器报告成功或失败。
1、缺乏全局时钟、不过同步本身就存在时间差,很难做到步调一致,
2、面对故障的独立性,分布式是由多个节点组成的,而每个节点都是独立工作的,一个节占故障度不会影响其它节点正常工作,
3、如何去处理单点故障, 一是:做冗余,对单点做备份;二是:降低单点故障的影响范围
4、事务类的挑战,在分布环境中怎么处理事务呢;ACID或2PI(两段式提交)、最终一致、BASE法则、CAP理论、Paxos算法;
什么是两段式提交:
通过使用某种协议进行通信来完成分布式事务,被称为两段式提交。从名字上看,您可能已经知道有两个阶段:
第一个阶段,即预提交:
事务协调器给每个事务管理器发送准备操作的信号。
事务管理器将操作(通常是数据更新)步骤(或细节)写入事务日志。如果失败,事务管理器使用这些步骤重复操作。
事务管理器本地创建事务并通知资源管理器对资源(例如,数据库或消息服务器)执行操作。
资源管理器执行操作并向事务管理器报告成功(准备提交信号)或失败(准备回滚)。
资源管理器等待事务管理器进一步的指令。
事务管理器向事务协调器报告成功或失败。
第二阶段,即提交阶段:在第二阶段中,第一阶段的结果将传送给所有事务管理器。
如果任何事务管理器报告失败,所有的事务参与者都必须回滚。
事务协调器让所有事务管理器提交(或回滚)。
所有事务管理器将提交或回滚信息传递给其资源管理器。
资源管理器将成功或失败提示返回给事务管理器。
事务管理器向事务协调器报告成功或失败。
CAP理论 :一致性,可用性,分区容错性;指一个分布式系统不可以满足一致性,可用性和分区容错性这三个需求,最多只能同时满足其中的两个;
C(Consistency):一致性 ,任何一个读操作总是能够读取之前完成的写操作;就是一个数据写入一立马被读到;
A(Availability):可用性 ,每一次操作总是能够 在确定的时间返回;无论成功或失败都能收到一个返回值的;
P(Tolerance of network Partition):分区容错性 ,在出现网络分区的情况下,仍然能够满足一致性和可用性;
BASE法则 模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性:
BA :BasicallyAvailable,基本可以用,支持分区失败(sharding碎片划分数据库);
S :Soft state,软状态,接受一段时间内的状态不同步,异步;
E :Eventuallyconsistent:最终一致性,弱一致性的表现;
BASE思想主要强调基本的可用性,如果你需要High 可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。
C(Consistency):一致性 ,任何一个读操作总是能够读取之前完成的写操作;就是一个数据写入一立马被读到;
A(Availability):可用性 ,每一次操作总是能够 在确定的时间返回;无论成功或失败都能收到一个返回值的;
P(Tolerance of network Partition):分区容错性 ,在出现网络分区的情况下,仍然能够满足一致性和可用性;
BASE法则 模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性:
BA :BasicallyAvailable,基本可以用,支持分区失败(sharding碎片划分数据库);
S :Soft state,软状态,接受一段时间内的状态不同步,异步;
E :Eventuallyconsistent:最终一致性,弱一致性的表现;
BASE思想主要强调基本的可用性,如果你需要High 可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。
Paxos算法 :
比2PC提交更轻量级的分布式事务的协调方式;大概是指不出现故拜占庭将军的前提下,要取得数据的一致性,在通信信道不安全的时候,我们数据传输可能会被人劫持,这样就不能保证数据的可信了,所以必须保证通信信道安全下Paxos算法才可行;
比2PC提交更轻量级的分布式事务的协调方式;大概是指不出现故拜占庭将军的前提下,要取得数据的一致性,在通信信道不安全的时候,我们数据传输可能会被人劫持,这样就不能保证数据的可信了,所以必须保证通信信道安全下Paxos算法才可行;
各种分布式存储文件系统介绍
#Google Filesystem :GFS+MapReduce擅长处理单个大文件
#Hadoop Distibuted Filesystem :GFS山寨版+MapReduce 擅长处理单个大文件
#GlusterFS :擅长处理单个大文件
#Taobao Filesystem :擅长处理海量小文件
#MogileFS:擅长处理海量小文件
#Ceph :PB级别的分布式文件系统
#MooseFS :通用简单
#Lustre :一种平行分布式文件系统
#Google Filesystem :GFS+MapReduce擅长处理单个大文件
#Hadoop Distibuted Filesystem :GFS山寨版+MapReduce 擅长处理单个大文件
#GlusterFS :擅长处理单个大文件
#Taobao Filesystem :擅长处理海量小文件
#MogileFS:擅长处理海量小文件
#Ceph :PB级别的分布式文件系统
#MooseFS :通用简单
#Lustre :一种平行分布式文件系统
一,介绍
MofileFS是一个开源的分布式文件系统,用于组件分布式文件集群。其主要特性包括:应用层组件、无单点故障、自动文件复制(复制单位不是文件而是class类)、传输中使用http协议,基于域的简单命名方式、具有比RAID更好的可靠性
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。
MofileFS是一个开源的分布式文件系统,用于组件分布式文件集群。其主要特性包括:应用层组件、无单点故障、自动文件复制(复制单位不是文件而是class类)、传输中使用http协议,基于域的简单命名方式、具有比RAID更好的可靠性
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。
环境:
trackers节点:192.168.125.200
storage节点1:192.168.125.200 dev1
DB节点:192.168.125.200
storage节点2:192.168.125.201 dev3
storage节点1:192.168.125.202 dev2
trackers节点:192.168.125.200
storage节点1:192.168.125.200 dev1
DB节点:192.168.125.200
storage节点2:192.168.125.201 dev3
storage节点1:192.168.125.202 dev2
二,安装
yum -y install ntpdate && ntpdate ntp1.aliyun.com #时间必须要同步,不然使用cpanm安装Mogilefs会fail
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo #安装epel源
setenforce 0 && service iptables stop #因这是测试环境,需要关闭防火墙和selinux
yum -y install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO #安装mogilefs关联安装包
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
wget http://xrl.us/cpanm -O /usr/bin/cpanm && chmod +x /usr/bin/cpanm #下载cpanm
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
wget http://xrl.us/cpanm -O /usr/bin/cpanm && chmod +x /usr/bin/cpanm #下载cpanm
cpanm MogileFS::Server #安装mogilefs server
cpanm MogileFS::Utils #安装管理工具
cpanm MogileFS::Client
cpanm IO::AIO
cpanm MogileFS::Utils #安装管理工具
cpanm MogileFS::Client
cpanm IO::AIO
三,安装mysql,负责存储trackers元数据。
授权root用户:
MariaDB [(none)]> grant all on *.* to 'root'@'192.168.125.%' identified by '123123';
创建mogiles数据库:
MariaDB [(none)]> create database mogilefs;
授权访问mogiles数据用户:
MariaDB [(none)]> grant all on mogilefs.* to 'moguser'@'192.168.125.%' indentified by '123123';
刷新数据库系统权限相关表:
MariaDB [(none)]> flush privileges;
授权root用户:
MariaDB [(none)]> grant all on *.* to 'root'@'192.168.125.%' identified by '123123';
创建mogiles数据库:
MariaDB [(none)]> create database mogilefs;
授权访问mogiles数据用户:
MariaDB [(none)]> grant all on mogilefs.* to 'moguser'@'192.168.125.%' indentified by '123123';
刷新数据库系统权限相关表:
MariaDB [(none)]> flush privileges;
四,添加启动脚本并添加用户
mogilefsd不会以root运行,需要创建non-root用户:
useradd mogilefs
mogilefsd不会以root运行,需要创建non-root用户:
useradd mogilefs
添加mogilefsd启动脚本,赋予755权限:
#!/bin/sh
#
# mogilefsd Startup script for the MogileFS tracker
#
# chkconfig: - 85 15
# description: MogileFS tracker
# processname: mogilefsd
# config: /etc/mogilefs/mogilefs.conf
# pidfile: /var/run/mogilefsd.pid
# Source function library.
. /etc/init.d/functions
# Check that networking is up.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
mogilefsd="/usr/local/bin/mogilefsd"
MOGILEFS_CONF_FILE="/etc/mogilefs/mogilefs.conf"
SUDO_USER=mogile
lockfile=/var/lock/subsys/mogilefsd
start() {
echo -n $"Starting mogilefsd: "
# sudo -u $SUDO_USER $mogilefsd -c $MOGILEFS_CONF_FILE --daemon --no_schema_check
daemon --user $SUDO_USER $mogilefsd -c $MOGILEFS_CONF_FILE --daemon
retval=$?
echo
[ $retval = 0 ] && touch ${lockfile}
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc mogilefsd
retval=$?
echo
[ $retval = 0 ] && rm -f ${lockfile}
return $retval
}
reload() {
echo -n $"Reloading mogilefsd: "
killproc mogilefsd -HUP
retval=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status mogilefsd
retval=$?
;;
restart)
stop
start
;;
reload)
reload
;;
*)
echo $"Usage: mogilefsd {start|stop|restart|reload|status}"
exit 1
esac
exit $retval
#!/bin/sh
#
# mogilefsd Startup script for the MogileFS tracker
#
# chkconfig: - 85 15
# description: MogileFS tracker
# processname: mogilefsd
# config: /etc/mogilefs/mogilefs.conf
# pidfile: /var/run/mogilefsd.pid
# Source function library.
. /etc/init.d/functions
# Check that networking is up.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
mogilefsd="/usr/local/bin/mogilefsd"
MOGILEFS_CONF_FILE="/etc/mogilefs/mogilefs.conf"
SUDO_USER=mogile
lockfile=/var/lock/subsys/mogilefsd
start() {
echo -n $"Starting mogilefsd: "
# sudo -u $SUDO_USER $mogilefsd -c $MOGILEFS_CONF_FILE --daemon --no_schema_check
daemon --user $SUDO_USER $mogilefsd -c $MOGILEFS_CONF_FILE --daemon
retval=$?
echo
[ $retval = 0 ] && touch ${lockfile}
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc mogilefsd
retval=$?
echo
[ $retval = 0 ] && rm -f ${lockfile}
return $retval
}
reload() {
echo -n $"Reloading mogilefsd: "
killproc mogilefsd -HUP
retval=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status mogilefsd
retval=$?
;;
restart)
stop
start
;;
reload)
reload
;;
*)
echo $"Usage: mogilefsd {start|stop|restart|reload|status}"
exit 1
esac
exit $retval
五,配置trackers节点:
1,添加running目录:
[root@localhost ~]# mkdir -pv /var/run/mogilefsd
[root@localhost ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd
1,添加running目录:
[root@localhost ~]# mkdir -pv /var/run/mogilefsd
[root@localhost ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd
2,使用mogdbsetup初始化数据库:(此处会删除所有数据库,此处操作需谨慎)
[root@localhost ~]# mogdbsetup --dbhost=192.168.125.200 --dbrootpass='123123' --dbuser='moguser' --dbpass='123123'
[root@localhost ~]# mogdbsetup --dbhost=192.168.125.200 --dbrootpass='123123' --dbuser='moguser' --dbpass='123123'
3,配置mogilefs.conf文件:
[root@localhost ~]# cat /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog
daemonize = 1
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.125.200
db_user = moguser
db_pass = 123123
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001
# Optional, if you don't define the port above.
conf_port = 7001
# Number of query workers to start by default.
query_jobs = 10
# Number of delete workers to start by default.
delete_jobs = 1
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs = 1
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs = 1
# Minimum amount of space to reserve in megabytes
# default: 100
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space = 200
# Number of seconds to wait for a storage node to respond.
# default: 2
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout = 2
# Number of seconds to wait to connect to a storage node.
# default: 2
# Keep this low so overloaded nodes get skipped.
#conn_timeout = 2
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port = 1
[root@localhost ~]# cat /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog
daemonize = 1
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.125.200
db_user = moguser
db_pass = 123123
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001
# Optional, if you don't define the port above.
conf_port = 7001
# Number of query workers to start by default.
query_jobs = 10
# Number of delete workers to start by default.
delete_jobs = 1
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs = 1
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs = 1
# Minimum amount of space to reserve in megabytes
# default: 100
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space = 200
# Number of seconds to wait for a storage node to respond.
# default: 2
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout = 2
# Number of seconds to wait to connect to a storage node.
# default: 2
# Keep this low so overloaded nodes get skipped.
#conn_timeout = 2
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port = 1
启动成功:
[root@localhost ~]# service mogilefsd start
Starting mogilefsd [ OK ]
[root@localhost ~]# service mogilefsd start
Starting mogilefsd [ OK ]
六,配置mogstore node节点:
1,在每个mogstored节点创建dev设备,此处设备号需要唯一:
[root@localhost ~]#mkdir /var/mogdata/dev1
[root@localhost ~]#chmod -R mogilef.mogilefs /var/mogdata/dev1
2,设置mogstore.conf:
[root@localhost ~]# cat /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogdata
3,添加启动脚本;
#!/bin/bash
# mogstored - Startup script for the MogileFS storage
#
# chkconfig: - 86 14
# description: MogileFS storage
# processname: mogstored
# config: /etc/mogilefs/mogstored.conf
# pidfile: /var/run/mogilefsd/mogstored.pid
1,在每个mogstored节点创建dev设备,此处设备号需要唯一:
[root@localhost ~]#mkdir /var/mogdata/dev1
[root@localhost ~]#chmod -R mogilef.mogilefs /var/mogdata/dev1
2,设置mogstore.conf:
[root@localhost ~]# cat /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogdata
3,添加启动脚本;
#!/bin/bash
# mogstored - Startup script for the MogileFS storage
#
# chkconfig: - 86 14
# description: MogileFS storage
# processname: mogstored
# config: /etc/mogilefs/mogstored.conf
# pidfile: /var/run/mogilefsd/mogstored.pid
# Source function library.
. /etc/rc.d/init.d/functions
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogstored}
RETVAL=0
lockfile=${LOCKFILE-/var/lock/subsys/mogstored}
RETVAL=0
configfile='/etc/mogilefs/mogstored.conf'
pidfile=/var/run/mogstored/mogstored.pid
prog=$(which mogstored)
pidfile=/var/run/mogstored/mogstored.pid
prog=$(which mogstored)
start() {
ulimit -n 65535
echo -n $"Starting mogstored"
su - mogilefs -c "$prog -c $configfile --daemon" &> /dev/null
RETVAL=$?
[ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogstored) > ${pidfile} || failure
echo
return $RETVAL
}
ulimit -n 65535
echo -n $"Starting mogstored"
su - mogilefs -c "$prog -c $configfile --daemon" &> /dev/null
RETVAL=$?
[ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogstored) > ${pidfile} || failure
echo
return $RETVAL
}
stop() {
echo -n $"Stopping mogstored"
netstat -nlp|grep "mogstored"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
RETVAL=$?
[ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile} || failure
echo
}
echo -n $"Stopping mogstored"
netstat -nlp|grep "mogstored"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
RETVAL=$?
[ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile} || failure
echo
}
reload() {
echo -n $"Reloading mogstored: "
killall mogstored -HUP
RETVAL=$?
[ $RETVAL = 0 ] && success || failure
echo
}
echo -n $"Reloading mogstored: "
killall mogstored -HUP
RETVAL=$?
[ $RETVAL = 0 ] && success || failure
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status mogstored
RETVAL=$?
;;
restart)
stop
sleep 1
start
;;
reload)
reload
;;
*)
echo $"Usage: mogstored {start|stop|restart|reload|status}"
exit 1
esac
exit $RETVAL
start)
start
;;
stop)
stop
;;
status)
status mogstored
RETVAL=$?
;;
restart)
stop
sleep 1
start
;;
reload)
reload
;;
*)
echo $"Usage: mogstored {start|stop|restart|reload|status}"
exit 1
esac
exit $RETVAL
4,启动:
[root@localhost ~]# service mogstored start
Starting mogstored [ OK ]
[root@localhost ~]# service mogstored start
Starting mogstored [ OK ]