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.www58058.com/81786