1、请描述本地文件系统和分布式文件系统的特点;
本地文件系统:
本地文件系统主要是指Ext2,Ext3,Btrfs,XFS这类(很难概括,只好举例子),它们通常提供以下功能:
1.扩展性:随着系统容量的增加保持性能,不随容量变化而导致性能震荡。比如一个目录下的海量文件,在EXT2/3中由于目录设计问题会导致较大的性能问题。再比如EXT2/3中的Metadata的占用和inode的划分可能会导致空间的浪费。
2.数据一致性
1)Checksum: Checksum与对应的数据块分开放置,避免silent corruption
2)CoW事务: 写时复制
3)Log: Log被一些文件系统用作WAL模式来加快写操作,并且保证写操作的原子性
3.多设备管理:传统上Linux往往使用LVM进行多设备的管理,现代文件系统往往增加对多设备的支持。如ZFS和Btrfs会有存储池模型对应LVM的逻辑卷组,文件系统会对底层的多设备进行并行的访问。
1)快照和克隆:采用COW事务模型的文件系统通常具有这个特性
2)软件RAID支持:现代文件系统通过对多设备的管理可以很好的支持软件RAID,如Btrfs对Metadata进行RAID1的默认保护
4.针对SSD的优化: 除了SSD对于随机读这一特性的优化外,还有对SSD擦除操作的优化。另外,SSD在使用容量接近100%时会导致极差的写入性能,文件系统也可以对SSD的分配策略和重平衡进行一定的优化。
5.压缩和加密: 现在的IO速度远远跟不上CPU的发展,因此对磁盘文件进行压缩读写是个很好的选择,现代文件系统往往支持多种压缩格式,而且可以支持整个文件系统的加密或者某个文件和目录的加密
6.去重: 文件系统系统去重是个大话题,主要是计算块的checksum方法或者客户端计算文件的hash来决定是否是一个新文件。具体参考Deduplication。
本地文件系统架构图:
分布式文件系统:
分布式文件系统的架构和实现有非常大的差异,如NFS这种传统的基于存储服务器的网络文件系统,基于SAN的GPFS,然后现在的集群式架构,比如HDFS这种有中心的分布式,如GlusterFS这种无中心分布式,再如Ceph这种部分在内核态部分在用户态等等。
由于架构上的差异和本身文件系统的设计目标,通常分布式文件系统可以根据接口类型分成块存储、对象存储和文件存储。如Ceph具备块存储(Experiment)、文件存储和对象存储的能力,GlusterFS支持对象存储和文件存储的能力。而MogileFS只能作为对象存储并且通过key来访问。
1.扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点。分布式文件系统中元数据管理一般是扩展的重要问题,GFS采用元数据中心化管理,然后通过Client暂存数据分布来减小元数据的访问压力。GlusterFS采用无中心化管理,在客户端采用一定的算法来对数据进行定位和获取。
2.高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性。整个文件系统的可用性是分布式系统的设计问题,类似于NOSQL集群的设计,比如有中心分布式系统的Master服务器,网络分区等等。数据完整性则通过文件的镜像和文件自动修复等手段来解决,另外,部分文件系统如GlusterFS可以依赖底层的本地文件系统提供一定支持。
3.协议和接口: 分布式文件系统提供给应用的接口多种多样,Http RestFul接口、NFS接口、Ftp等等POSIX标准协议,另外通常会有自己的专用接口。
4.弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。弹性存储的最大挑战是减小或增加资源时的数据震荡问题。
5.压缩、加密、去重、缓存和存储配额: 这些功能的提供往往考验一个分布式文件系统是否具有可扩展性,一个分布式文件系统如果能方便的进行功能的添加而不影响总体的性能,那么这个文件系统就是良好的设计。这点GlusterFS就做的非常好,它利用类似GNU/Hurd的堆栈式设计,可以让额外的此类功能模块非常方便的增加。
MogileFS/FastDFS架构图:
2、总结常用的分布式文件系统的应用场景及常规的维护方式;
名称 | 适用场景 |
MogileFS | 适用于处理海量小文件 |
Ceph | PB级的分布式文件系统 |
MooseFS | 适用于处理海量小文件 |
Taobao Filesystem | 适用于处理海量小文件 |
GlusterFS | 适于用处理单个大文件 |
Google Filesystem | 适用于处理单个大文件 |
Hadoop Distributed Filesystem | 适用于处理单个大文件 |
3、从理论原理到实战案例来阐述MogileFS体系;
Tacker’s Database(数据库)
数据库保存了Mogilefs的所有元数据,你可以单独拿数据库服务器来做,也可以跟其他程序跑在一起,数据库 部分非常重要,类似邮件系统的认证中心那么重要,如果这儿挂了,那么整个Mogilefs将处于不可用状态。因此最好是HA结构。
Storage nodes(存储节点)
mogstored 程序的启动将使本机成为一个存储节点。启动时默认去读/etc/mogilefs/mogstored.conf 。mogstored启动后,便可以通过mogadm增加这台机器到cluster中。一台机器可以只运行一个mogstored作为存储节点即可,也可以同时运行其他程序。
Trackers(跟踪器)
mogilefsd即 trackers程序,类似mogilefs的wiki上介绍的,trackers做了很多工作,Replication ,Deletion,Query,Reaper,Monitor等等。mogadm,mogtool的所有操作都要跟trackers打交 道,Client的一些操作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡。trackers也可以只运行在一台机器 上,也可以跟其他程序运行在一起,只要你配置好他的配置文件即可,默认在/etc/mogilefs/mogilefsd.conf。
工具
主要就是mogadm,mogtool这两个工具了,用来在命令行下控制整个mogilefs系统以及查看状态等等。
Client
Client实际上是一个Perl的pm,可以写程序调用该pm来使用mogilefs系统,对整个系统进行读写操作。
原理:
每次文件的上传和读取,都经过前端Trackers服务器,trackers服务器收到client端的请求,查询数据库,返回一个上传或者是读取的可用的后端StorageNode的地址,然后由client端直接操作后端StorageNode服务器。upload操作返回就是成功或者失败的结果,read操作就是返回对应的查询数据。
环境:
Tracker + Tracker database:192.168.0.21
Mogstored node1:192.168.0.22
Mogstored node2:192.168.0.23
### 安装包 ~]# ls mogilefs MogileFS-Server-2.46-2.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm Perlbal-1.78-1.el6.noarch.rpm ### 在tracker和mogstored节点上安装需要的包 ~]# cd mogilefs ~]# yum install * -y ### 在tracker节点上安装mysql ~]# yum install mysql-server -y ~]# vim /etc/my.cnf [mysqld] ... innodb_file_per_table=ON skip_name_resolve ~]# /etc/init.d/mysql start mysql> CREATE DATABASE mogdb charset utf8; mysql> grant all on mogdb.* to 'moguser'@'192.168.0.%' identified by 'mogpass'; mysql> flush privileges; ### 初始化mogdb库 ~]# mogdbsetup --dbname=mogdb --dbuser=moguser --dbpass=mogpass This will attempt to setup or upgrade your MogileFS database. It won't destroy existing data. Run with --help for more information. Run with --yes to shut up these prompts. Continue? [N/y]: y Create/Upgrade database name 'mogdb'? [Y/n]: y Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogdb'? [Y/n]: y ### 修改配置文件 ~]# vim /etc/mogilefs/mogilefsd.conf db_dsn = DBI:mysql:mogdb:host=192.168.0.61 db_user = moguser db_pass = mogpass listen = 0.0.0.0:7001 ### 启动tracker### ~]# /etc/init.d/mogilefsd start ### 在mogstored节点1创建数据挂载点 mkdir -p /data/mogstored/DEV{1,2} chown -R mogilefs.mogilefs /data/mogstored/ ### 在mogstored节点2创建数据挂载点 mkdir -p /data/mogstored/DEV{3,4} chown -R mogilefs.mogilefs /data/mogstored/ ### 修改mogstored配置文件 vim /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /data/mogstored #修改数据文件目录为实际路径 ### 启动mogstored服务 /etc/init.d/mogstored start ### 在tracker上创建host ~]# mogadm host add 192.168.0.62 --ip=192.168.0.62 --port=7500 --status=alive ~]# mogadm host add 192.168.0.63 --ip=192.168.0.63 --port=7500 --status=alive ### 创建device ~]# mogadm device add 192.168.0.62 1 #最后的数字代表设备号,如:dev1 ~]# mogadm device add 192.168.0.62 2 ~]# mogadm device add 192.168.0.63 3 ~]# mogadm device add 192.168.0.63 4 ### 查看device状态 ~]# mogadm device list 192.168.0.62 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 1.643 108.021 109.664 100 dev2: alive 1.643 108.021 109.664 100 192.168.0.63 [2]: alive used(G) free(G) total(G) weight(%) dev3: alive 1.643 108.021 109.664 100 dev4: alive 1.643 108.021 109.664 100 ### 创建一个名为files的域用来存储文件 ~]# mogadm domain add files ### 将本地的/etc/fstab文件上传至files域,并命名为fstab.txt ~]# mogupload --trackers=192.168.0.61 --domain=files --key='/fstab.txt' --file='/etc/fstab' ### 查看files域中的文件 ~]# moglistkeys --trackers=192.168.0.61 --domain=files /fstab.txt ### 查看已上传的fstab.txt文件的属性信息 ~]# mogfileinfo --trackers=192.168.0.61 --domain=files --key='/fstab.txt' - file: /fstab.txt class: default devcount: 2 domain: files fid: 3 key: /fstab.txt length: 805 - http://192.168.0.62:7500/dev1/0/000/000/0000000003.fid - http://192.168.0.63:7500/dev3/0/000/000/0000000003.fid ### 下载fstab.txt文件到本地,并另存为fstab_dfs.txt ~]# mogfetch --trackers=192.168.0.61 --domain=files --key='/fstab.txt' --file='/tmp/fstab_dfs.txt'
4、自动化运维工具ansible的应用示例
1.安装ansible
~]# yum install ansible -y
2.修改配置文件,添加客户端信息
~]# vim /etc/ansible/hosts
[websrvs] #组名称可以自定义
192.168.0.121
192.168.0.131
192.168.0.141
3.与客户端建立ssh公钥认证(免密登录)
~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.121
~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.131
~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.141
4.使用ping模块进行ping测试
~]# ansible websrvs -m ping
5.使用command模块远程执行命令(此模块不支持管道符)
#在目标主机上创建user1用户
~]# ansible websrvs -m command -a “useradd user1”
6.使用shell模块远程执行命令(此模块支持管道符)
#在目标主机上修改user1用户的密码
~]# ansible websrvs -m shell -a “echo “mageedu”|passwd –stdin user1”
7.使用copy模块将本地文件远程复制到目标主机
#将本地的/tmp/hello.txt文件copy到目标主机的/tmp目录下
~]# ansible websrvs -m copy -a “src=/tmp/hello.txt dest=/tmp”
#将content中的字符串copy到目标主机的/tmp/hello.txt文件下,如果该文件已存在,将会覆盖原文件内容
~]# ansible websrvs -m copy -a “content=’my name is mageedu\n’ dest=/tmp/hello.txt”
8.使用cron模块远程设置计划任务
#在目标主机上创建一个名为Synctime的计划任务,用来做时间同步
~]# ansible websrvs -m cron -a “minute=*/5 job=’/usr/sbin/ntpdate cn.pool.ntp.org &>/dev/null’ name=Synctime”
#删除上面创建的Synctime计划任务
~]# ansible websrvs -m cron -a “state=absent name=Synctime”
9.使用file模块远程修改文件权限
#修改目标主机上的/tmp/hello.txt文件的权限
~]# ansible websrvs -m file -a “path=/tmp/hello.txt owner=root group=root mode=777”
10.使用yum模块远程安装软件包
#在目标主机上yum安装apache
~]# ansible websrvs -m yum -a “name=httpd state=latest”
11.使用service模块远程启停服务
#在目标主机上启动httpd服务
~]# ansible websrvs -m service -a “name=httpd state=started”
12.使用user模块远程管理用户
#在目标主机上创建系统帐号user2,uid为306
~]# ansible websrvs -m user -a “name=user2 system=yes state=present uid=306”
#删除上面创建的用户
~]# ansible websrvs -m user -a “name=user2 system=yes state=absent”
原创文章,作者:N26-西安-方老喵,如若转载,请注明出处:http://www.178linux.com/81786