1.分布式存储
大数据带来的挑战
数据采集,数据存储,数据搜索,数据共享,数据传输,数据分析,数据可视化
分布式存储
节点间通信,数据存储,数据空间平衡,容错,文件系统支持
多线程与进程的执行模式
互不通信的多线模式,基于共享容器协同的多线程模式,通过事件协同的多线程模型
输入设备的变化
控制器的变化:
透明代理,旁路模式,名称服务,规则服务器,运算器的变化
存储器的变化
代理模型,旁挂模型,规则服务器 Master(主控机):元数据在控制节点,数据在后端存储节点上
分布式系统的难点
缺乏全局时钟
面对故障的独立性
处理单点故障
冗余
降低单点故障的影响
事务类的挑战
ACID
2pc(两段式提交)、最终一致、BASE、CAP、Paxos
分布式文件系统设计目标
访问透明,位置透明,并发透明,失效透明,硬件透明,可扩展性,复制透明,迁移透明
满足以下特性
伸缩能力
可靠性
性价比
1.1分布式事务的模型及规范
X/Open(开源组织):XA
DTP:Distributed Transcationn Processing Reference Model(分布式事务处理参考模型X/Open定义)
定义了三个组件
AP:Application Program 应用程序
RM:Resourse Manager 资源管理器
TM:Transaction Manager 事务管理器
AP通过资源管理器管理资源,通过事务管理器管理事务,事务管理器通过资源管理器管理的资源进行控制,TM通过RM的XA管理RM
两段式提交:
事务管理器提交不止一个数据,第一阶段准备,第二阶段提交,如果出现错误,第二阶段回滚
CAP理论-分布式系统无法同时满足三种情况
C:一致性,任何一个读操作总是能够读取之前完成的写操作
A:可用性,(指的是快速获取数据)每一次操作总是能够在确定的时间返回
P:容错性,在网络出现分区的情况下(脑裂)仍然能够满足一致性和可用性
BASE:
BA:Basically Available,基本可用
S:soft state 软状态,接受一段时间内的状态不同步
E:Evetually consistent:最终一致性
一致性:强一致性,满足ACID,在单机环境中强一致性有数据库的事务来保证,在多机环境下强一致性很难做到,分布式事务,在互联网应用中不合适,性能差
软一致性,(包括最终一致)
Paxos
比2PC更轻量级的分布式事务的协调方式
集群内数据一致性算法实施过程案例:
Quorum(合法票数),Vector clock(向量时钟)
Quorum:
N:数据复制的节点数
R:成功完成读操作所依赖的最少节点数
W:成功完成写操作所依赖的最少节点数
W+R>N:强一致性 W+R<N: 弱一致性,可以保证最终一致性
2.分布式应用
分布式计算 MapReduce:分布式运算框架 MapReduce 分布式存储 GFS,Google File System HDFS 只能存储k-v数据 bigtable:列式数据库 HBase
NoSQL:列式数据库是其中的一种,大多数存储都是key-value的形式
hadoop:MapReduce+HDFS(两者结合起来)
3.分布式存储
不能mount,基于API进行存储
分布式文件系统(把存储空间抽象成文件的格式存储的格式)
mount基于VFS接口直接往里面写数据
解决方案:
适合存储少量大文件
GFS:存储少量大数据,2T
HDFS:hadoop的分布式文件系统,适合存储少量大文件
TFS:淘宝FS,在名称节点上将元数据存储于关系型数据中,文件数量不在受限于名称节点的内存空间,可以存储海量小文件
TFS:腾讯FS
Lustre:Oracle,企业级应用,重量级
GlusterFS:分布式的文件系统,适合存储p/b级的企业级数据,允许数千个节点同时访问,在海量文件存储尤其是在I/O需求量非常大的情况下,GlusterFS较好的解决方案
MooseFS:基于FUSE的格式,可以挂载
Mogilefs:存储海量小数据,使用perl开发
FastDFS,mogileefs的山寨版
3.1分布式文件系统MogileFS
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。
3.2MogileFS的特性
1.应用层提供服务,不需要使用核心组件
2.无单点(tracker(跟踪点)mogstore(存储节点)database(MySQL))
3.自动文件复制:复制的最小单位不是文件,而是class(类),将多个文件组织成一个单位进行复制
4.传输中立:无特殊协议,可以通过NFS或HTTP实现通信
5.简单的命名空间:没有目录,直接存在存储空间上,通过域来实现
6.不共享任何数据:
3.3MogileFS的工作模型
说明:用户通过自主编程的API访问数据,通过Tracker后Tracker访问database获取源数据,把源数据返回给用户告诉在那个存储节点上,然后API就调一个去访问,因为它是通过NFS和http协议的,所有每一个数据都能通过uri获取;橙色表示源数据,绿色表示API访问关系,灰色表示复制关系
MogileFS由3个部分组成:
(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 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器.
设备(device)
一个存储节点,以就是上面的主机,可以有多个 device, 就是用来存放文件的目录(例如挂载的目录),每个设备都有一个设备id,需要在 mogstored 的配置文件中的 docroot 配置的项目 指定的目录下面创建相应的设备的目录,目录名为 $docroot/dev$id,设备是不能删除的.只能将其设备的状态的值置为dead,当一个设备 dead 之后,就真的 dead了,里面的数据也无法恢复了,且这个dead了的设备的 id 也不能再用.
3.4Tracker安装配置
##MogileFS是使用perl语言开发的,所以它们的各功能都是perl模块,要安装这些功能只需连接到cpan上;rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/libdb-5.3.21-24.el7.x86_64.rpmyum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRescpan> instll mould::name
1.安装MySQL数据库
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install -y mysql-server systemctl start mysql
2.安装cpanm
##依赖模块 yum -y install make gcc unzip perl-IO-AIO perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes ##安装方式一 wget https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm -O /usr/bin/cpanm chmod +x /usr/bin/cpanm ##安装方式二 yum安装 yum install perl-App-cpanminus.noarch 注意:安装完成后,root及非root用户都可以使用cpanm安装模块,root用户直接用cpanm modulename安装即可,非root用户安装命令也 是一样的,但是会由于权限问题(permission denied)导致错误,因为使用yum安装的cpanm会默认安装到/root/perl5目录下,所以对于普 通用户来说,要想把模块安装到自己目录,需要在环境变量中加入如下参数: vim ~/.bashrc 编辑环境变量 #cpanm lib export PERL_CPANM_OPT="--prompt --reinstall -l ~/perl5 --mirror http://cpan.cpantesters.org" #指定cpanm模块安装路径为~/perl5,及mirror网址 export PERL5LIB=/home/usrname/perl5/lib/perl5:$PERL5LIB #添加lib环境变量 使环境变量生效 source ~/.bashrc
3.安装各个模块
~]# cpanm DBD::mysql
~]# cpanm MogileFS::Server
~]# cpanm MogileFS::Utils
~]# cpanm MogileFS::Client
~]# cpanm Danga::Socket
~]# cpanm App::cpanminus
若出现如下问题解决办法
Configuring ExtUtils-MakeMaker-7.36 ... OK Can't locate ExtUtils/Manifest.pm in @INC (@INC contains: FatPacked::9927560=HASH(0x977b88) /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/cpanm line 132. ##解决办法 ~]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker ##补充安装DBD::mysql yum install "perl(DBD::mysql)"
4.推荐安装方式
下载各个rpm包进行上传yum安装 [root@linux-node3 ~]# ll 总用量 624 -rw-r--r-- 1 root root 1984 7月 16 2017 MogileFS-Server-2.46-2.el7.centos.noarch.rpm -rw-r--r-- 1 root root 177468 7月 16 2017 MogileFS-Server-mogilefsd-2.46-2.el7.centos.noarch.rpm -rw-r--r-- 1 root root 26980 7月 16 2017 MogileFS-Server-mogstored-2.46-2.el7.centos.noarch.rpm -rw-r--r-- 1 root root 77000 7月 16 2017 MogileFS-Utils-2.19-1.el7.centos.noarch.rpm -rw-r--r-- 1 root root 11208 7月 18 2017 nginx_mogilefs_module-1.0.4.tar.gz -rw-r--r-- 1 root root 28111 11月 9 2015 perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm -rw-r--r-- 1 root root 30348 7月 16 2017 perl-MogileFS-Client-1.14-1.el7.centos.noarch.rpm -rw-r--r-- 1 root root 268620 7月 16 2017 perl-Perlbal-1.78-1.el6.noarch.rpm #安装依赖环境 yum install perl-Net-Netmask perl-IO-stringy perl-Sys-Syslog perl-IO-AIO -y #安装rpm包 yum install *.rpm -y 链接:https://pan.baidu.com/s/1mIWJaReMiHPF4jCaitxPlg 提取码:qkwy
5.数据库初始化
[root@linux-node1 ~]# mogdbsetup --dbhost=localhost --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbuser=moguser --dbpass=mogpass
[root@linux-node1 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.6.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mogilefs |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
mysql> use mogilefs
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------+
| Tables_in_mogilefs |
+----------------------+
| checksum |
| class |
| device |
| domain |
| file |
| file_on |
| file_on_corrupt |
| file_to_delete |
| file_to_delete2 |
| file_to_delete_later |
| file_to_queue |
| file_to_replicate |
| fsck_log |
| host |
| server_settings |
| tempfile |
| unreachable_fids |
+----------------------+
17 rows in set (0.00 sec)
##若执行不成功,进行授权
mysql> grant all on mogilefs.* to 'moguser'@'118.190.%.%' identified by 'mogpass';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
6.配置数据库及其他配置文件
进入目录 cd /usr/local 创建文件夹 mkdir mogilefs 进入目录 cd mogilefs 创建mogilefsd.conf文件 vim mogilefsd.conf mogilefsd.conf内容 [root@linux-node1 local]# grep -v "^$" mogilefsd.conf [root@linux-node1 mogilefs]# cat 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=localhost db_user = moguser db_pass = mogpass # 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
7.创建用户启动
##需要以普通用户启动 adduser mogilefs ##创建启动路径 mkdir -p /var/run/mogilefsd chown -R mogilefs.mogilefs /var/run/mogilefsd su - mogile cd /usr/local/bin ./mogilefsd -c /usr/local/mogilefs/mogilefsd.conf --daemon [root@linux-node1 ~]# netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1100/sshd tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 27784/mogilefsd tcp6 0 0 :::3306 :::* LISTEN 2677/mysqld
3.5部署存储节点
##node2,node3,node4节点部署如下操作都需执行 [root@linux-node2 ~]# mkdir /usr/local/mogilefs [root@linux-node2 ~]# cd /usr/local/mogilefs [root@linux-node2 ~]# vim mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 ##管理接口 docroot = /dfs/mogdata ##创建存储目录 [root@linux-node2 ~]# mkdir /dfs/mogdata -p ##专门挂载的存储设备每个挂载目录里只放一个存储目录 [root@linux-node2 ~]# adduser mogilefs [root@linux-node2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/ [root@linux-node2 ~]# mkdir -p /dfs/mogdata/dev1 ##创建存储目录[root@linux-node2 ~]# mkdir -p /dfs/mogdata/dev3##可不用执行 [root@linux-node2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/dev1/[root@linux-node2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/dev3/##node3节点创建存储目录 [root@linux-node3 mogilefs]# mkdir -p /dfs/mogdata/dev2 [root@linux-node3 mogilefs]# chown -R mogilefs.mogilefs /dfs/mogdata/dev2/ ##启动服务 [root@linux-node2 ~]# mogstored -c /usr/local/mogilefs/mogstored.conf --daemon [root@linux-node2 ~]# netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:7500 0.0.0.0:* LISTEN 20917/mogstored tcp 0 0 0.0.0.0:7501 0.0.0.0:* LISTEN 20917/mogstored
4.添加mogstored节点进行测试
4.1Tracker节点进行操作
##监测Tracker状态 [root@linux-node1 mogilefs]# mogadm --trackers=118.190.201.11:7001 check Checking trackers... 118.190.201.11:7001 ... OK Checking hosts... No devices found on tracker(s). ##进行添加mogstored节点 [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host add 118.190.201.12 --ip=118.190.201.12 --status=alive [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host list 118.190.201.12 [1]: alive IP: 118.190.201.12:7500 ##添加设备 [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device list ##列出当前设备 118.190.201.12 [1]: alive used(G) free(G) total(G) weight(%) [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device add 118.190.201.12 001 ##添加[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device add 118.190.201.12 003[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device list 118.190.201.12 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 1.321 44.246 45.567 100 dev3: alive 1.487 45.954 47.441 100 ##创建domain,任何一个所有存储空间里面是以domain来区分名称空间 [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 domain add files ##名称随意 [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 domain list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 MultipleHosts() NONE ##添加node3节点 [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host add 118.190.201.13 --ip=118.190.201.13 --status=alive [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host list 118.190.201.12 [1]: alive IP: 118.190.201.12:7500 118.190.201.13 [2]: alive IP: 118.190.201.13:7500 [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device add 118.190.201.13 002 [root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device list 118.190.201.12 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 1.487 45.954 47.441 100 dev3: alive 1.487 45.954 47.441 100 118.190.201.13 [2]: alive used(G) free(G) total(G) weight(%) dev2: alive 1.321 44.246 45.567 100
4.2上传文件
[root@linux-node1 ~]# mogupload --trackers=118.190.201.11:7001 --domain=files --key='fstab.html' --file='/etc/fstab'
1.列出所有key
[root@linux-node1 ~]# moglistkeys --trackers=118.190.201.11:7001 --domain=files fstab.html
2.获取file信息及访问路径
[root@linux-node1 ~]# mogfileinfo --tracker=118.190.201.11:7001 --domain=files --key='fstab.html'
- file: fstab.html
class: default
devcount: 1
domain: files
fid: 5
key: fstab.html
length: 465
- http://118.190.201.13:7500/dev2/0/000/000/0000000005.fid ###可复制浏览器访问
4.3创建专门存储图片的domain
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 domain add images [root@linux-node1 ~]# mogupload --trackers=118.190.201.11:7001 --domain=images --key='/logo.png' --file='/usr/share/backgrounds/default.png' [root@linux-node1 ~]# mogfileinfo --tracker=118.190.201.11:7001 --domain=images --key='/logo.png' - file: /logo.png class: default devcount: 1 domain: images fid: 6 key: /logo.png length: 2724666 - http://118.190.201.13:7500/dev2/0/000/000/0000000006.fid
命令小结
mogadm --trackers=118.190.201.11:7001 device mark 118.190.201.13 dev2 down ##关闭存储节点
mogfetch --trackers=118.190.201.11 --domain=files --key='fstab.html' --file='./output.txt' ##下载文件到本地
- 转载请注明来源:分布式文件存储之MogileFS
- 本文永久链接地址:https://www.xionghaier.cn/archives/1018.html