首頁 > 軟體

分散式系統介紹及MogileFS安裝、基本設定

2020-06-16 17:42:39

前言:

不知不覺中我們就進入巨量資料時代, 什麼是巨量資料? 什麼是分散式? 什麼是雲端計算? 我們在後面都將介紹, 本篇文章, 我們主要討論分散式系統;

什麼是分散式?

分散式這個詞聽起來很高大上, 實際上在我們以前經常構建分散式系統, 從最初的分離LAMP中的MySQL 到引入Varnish快取頁面, 再到使用LVS負載均衡Nginx|Apache, Nginx負載均衡Tomcat等等, 廣義上都算是分散式系統.

簡單來說分散式就是將一個系統的各個元件(MySQL、PHP、Apache …)分布在網路上的各台主機, 並且各元件之間僅通過訊息傳遞來通訊並協調工作

分散式存在的意義?

其實我們在之前負載均衡相關的博文中已經回答過了, 主要有以下問題:

  1. 垂直擴充套件的價效比不高

  2. 單機擴充套件存在效能上升的臨界點

  3. 處於穩定性及可用性考慮, 單機會存在多方面的問題

分散式的難點及CAP、BASE、2PC、X/Open XA介紹

分散式系統存在以下難點

  • 缺乏全域性時鐘

  • 面對故障時的獨立性

  • 很難處理單點故障

  • 很難實現事務

事務要具有ACID. 但是這在分散式系統中很難實現

  • A: Atomicity 原子性

  • C: Consistency 一致性

  • I: Isolation 隔離性

  • D: Durability 永續性

很多資料庫都能實現單機事務, 但是一旦構建為分散式系統, 單機的ACID就不能實現了, 有兩種選擇, 1、放棄事務 2、引入分散式事務;

分散式事務的實現:

一次事務中的主要角色:

  • 事務的參與者

  • 支援事務的伺服器

  • 資源伺服器

  • 事務管理器

分散式事務的模型和規範: Distributed Transaction Processing: The XA Specification 
X/Open DTP: Distribution Transaction Process

  • AP: 應用程式

  • RM: Resource Manager, 資源管理器, 一般是DBMS

  • TM: Transaction Manager, 負責協調和管理事務 
    提供給AP程式設計介面, 並管理資源管理器

2PC: 
Two Phase Commitment Protocol 兩段式提交

如圖: 一次事務首先要準備資源, 所有節點的資源都準備好後, 同時進行Commit, 如果中途中斷則會一起ROLLBACK, 從而實現資料一致性

 

 

 

CAP: CAP的更多資訊

2000年7月 由 Eric Brewer提出, 並經過他人證明, 分散式系統不能同時滿足CAP

  • C: Consistency 一致性 所有主機的資料都是同步的

  • A: Avaiability 可用性 能夠保證系統的可用性(有主機宕機不影響使用者)

  • P: Partition tolerance 分割區容錯性: 即使網路出現故障從而分割區, 不影響系統執行

一般情況下的分散式系統都是在C(Consistency)進行妥協

BASE: 可替代ACID;

  • BA: Basically Availibale 基本可用性

  • S: Soft state 接受一段時間的狀態不能同步

  • E: Eventually Consistent 最終一致性

相比於ACID而言, BASE並沒有那麼苛刻, BASE允許部分的失敗但是不會引起系統的故障 
DNS就是最著名的Eventually Consistent的實現

分散式儲存和分散式檔案系統:

儲存一般分為兩種型別:

  • 集中式: 
    NAS: Network Attached Storage; 檔案系統級別, 例如NFS, FTP, SAMBA… 
    SAN: Storage Aera Network; 塊級別, 例如IP SAN, FC SAN…

  • 分散式 
    中心節點儲存: 每個叢集中有節點專門用來儲存後設資料, 其他節點則儲存部分資料 
    無中心節點儲存: 每個叢集各節點都儲存後設資料和部分資料

分散式儲存和分散式檔案系統:

  • 檔案系統: 有檔案系統介面

  • 儲存: 無檔案系統介面, 通過API存取

常見的實現: 
GFS: Google File System 
分散式系統的開山鼻祖, 由於Google內部需要遂開發, 後來發布論文公布其技術細節, 但是沒有開源 
HDFS: Hadoop Distribution File System 
通過Google發布的論文, 從而實現HDFS

GFS和HDFS都將後設資料儲存於記憶體中, 定期儲存在持久儲存中 、只適合儲存百萬、千萬級別的 大檔案

GlusterFS: 
去中心化設計, 沒有後設資料節點 
Ceph: 
Linux核心級實現的檔案系統, 已經收錄Linux核心 
MogileFS: 
適用於儲存海量小檔案, 使用perl語言編寫, 國內有人使用C語言重寫並開源為FastDFS 
TFS: 
TaoBao FileSystem, 基於HDFS開發 適用於儲存海量小檔案

MogileFS實現原理:

MogileFS中的術語:

tracker: 借助資料庫儲存各個節點檔案的後設資料資訊, 便於檢索定位資料位置並監控各個節點, 告知用戶端儲存區的位置並指揮storage節點複製資料副本, 進程為mogilefsd

database: 為tracker節點儲存節點檔案的後設資料資訊

storage: 將指定域中的鍵轉換為特有的檔名儲存於在特定的裝置檔案中, 轉換後檔名為值, storage自動維護鍵值之間的對應關係, storage節點使用http進行資料傳輸, 依賴於perbal, 進程為mogstored, perbal

Domain: 一個域中的鍵值是唯一的, 一個MogileFS可以有多個域來儲存不同型別的檔案

Class: 複製的最小單位, 管理檔案屬性, 定義檔案儲存在不同裝置上的份數

device: 一個儲存節點, 可以有多個device, 就是用來存放檔案的目錄, 每個裝置都有一個裝置ID, 需要在mogstored組態檔中docroot設定, 裝置不能刪除, 只能將裝置的狀態置為dead, 置為dead之後資料就無法恢復了, 並且裝置ID也無法再使用

MogileFS Architecture:

MogileFS的特性:

  • 工作的應用層, 不需要特殊的元件

  • 無單點故障

  • 自動複製檔案

  • 簡單的名稱空間

  • 不需要RAID

  • 不能追加, 隨機寫

  • 資料通過HTTP/WebDAV服務上傳到Storage Node(mogstored)

  • MySQL儲存MogileFS後設資料(名稱空間、位置)

MogileFS的高可用架構:

MogileFS編譯安裝和設定

本我來是打算進行編譯安裝的, 但是由於各種原因, 我這次就使用rpm包安裝了, 本次rpm包是馬哥提供的.

對於實驗中的所有操作過程, 由於時間原因, 這裡都不在敘述 詳情看: 官方WIKI

實驗環境

  • node6 172.16.1.7 tracker, database

  • node7 172.16.1.8 storage

  • node8 172.16.1.9 storage

安裝: 需要epel源. 每一台主機都要安裝

[root@node6~] yum install perl-Net-Netmask perl-IO-AIO  #每一台主機都必須安裝, 否則可能導致mogstored不能正常監聽埠
[root@node6~] yum localinstall MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm  Perlbal-1.78-1.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
[root@node6~] yum install mysql-server
[root@node6~] scp *.rpm 172.16.1.8:/root/                                                                                                                
[root@node6~] scp *.rpm 172.16.1.9:/root/

[root@node7~] yum install perl-Net-Netmask perl-IO-AIO  #每一台主機都必須安裝, 否則可能導致mogstored不能正常監聽埠
[root@node7~] yum localinstall MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm  Perlbal-1.78-1.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm

[root@node8~] yum install perl-Net-Netmask perl-IO-AIO  #每一台主機都必須安裝, 否則可能導致mogstored不能正常監聽埠
[root@node8~] yum localinstall MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm  Perlbal-1.78-1.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm

設定資料庫:

[root@node6~] service mysqld start

mysql> GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'passwd' ;  #設定一個可以遠端連線的root使用者
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON mogilefs.* TO  mogileuser@'%' IDENTIFIED BY 'passwd';  #設定一個可管理mogilefs資料庫的使用者
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE DATABASE mogilefs;   #建立mogilefs資料庫
Query OK, 1 row affected (0.00 sec)

[root@node6~] mogdbsetup --dbhost=172.16.1.7 --dbuser=mogileuser --dbpass=passwd  --dbname=mogilefs --dbrootpass=passwd  #生成資料表

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)

設定mogilefsd

[root@node6~] vim /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogilefs:host=172.16.1.7
db_user = mogileuser
db_pass = passwd
listen = 0.0.0.0:7001
conf_port = 7001

[root@node6~] service mogilefsd start
Starting mogilefsd                                         [  OK  ]



[root@node6~] mogadm host add node1 --ip=172.16.1.7 alive
[root@node6~] mogadm host add node2 --ip=172.16.1.8 alive
[root@node6~] mogadm host add node3 --ip=172.16.1.9 alive
[root@node6~] mogadm host list
node1 [1]: down
   IP:       172.16.1.7:7500

node2 [2]: down
   IP:       172.16.1.8:7500

node3 [3]: down
    IP:       172.16.1.9:7500

設定mogstored

[root@node6~] mkdir /data/mogilefs/dev1 -pv
   mkdir: created directory `/data'
   mkdir: created directory `/data/mogilefs'
   mkdir: created directory `/data/mogilefs/dev1'
[root@node6~] vim /etc/mogilefs/mogstored.conf
   maxconns = 10000
   httplisten = 0.0.0.0:7500
   mgmtlisten = 0.0.0.0:7501
   docroot = /data/mogilefs/

[root@node6 ~]# chown mogilefs.mogilefs /data/mogilefs/ -R
[root@node6~] service mogstored start
Starting mogstored                                         [  OK  ]

[root@node7~] mkdir /data/mogilefs/dev2 -pv
   mkdir: created directory `/data'
   mkdir: created directory `/data/mogilefs'
   mkdir: created directory `/data/mogilefs/dev2'
[root@node7~] vim /etc/mogilefs/mogstored.conf
   maxconns = 10000
   httplisten = 0.0.0.0:7500
   mgmtlisten = 0.0.0.0:7501
   docroot = /data/mogilefs/

[root@node7 ~]# chown mogilefs.mogilefs /data/mogilefs/ -R
[root@node7~] service mogstored start
Starting mogstored                                         [  OK  ]


[root@node8~] mkdir /data/mogilefs/dev3 -pv
mkdir: created directory `/data'
mkdir: created directory `/data/mogilefs'
mkdir: created directory `/data/mogilefs/dev3'
[root@node8~] vim /etc/mogilefs/mogstored.conf

maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogilefs/

[root@node8 ~]# chown mogilefs.mogilefs /data/mogilefs/ -R
[root@node8~] service mogstored start
Starting mogstored                                         [  OK  ]



[root@node6~] mogadm device add node1 1  alive
[root@node6~] mogadm device add node2 2  alive
[root@node6~] mogadm device add node3 3  alive

[root@node6~] mogadm check
   Checking trackers...
   127.0.0.1:7001 ... OK

Checking hosts...
         [ 1] node1 ... OK
         [ 2] node2 ... OK
         [ 3] node3 ... OK

Checking devices...
         host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
         ---- ------------ ---------- ---------- ---------- ------ ---------- -----
         [ 1] dev1            74.435      2.069     72.366   2.78%  writeable  28.9
         [ 2] dev2            74.435      1.958     72.477   2.63%  writeable   0.0
         [ 3] dev3            74.435      1.954     72.481   2.63%  writeable   0.5
         ---- ------------ ---------- ---------- ---------- ------
                    total:   223.306      5.982    217.324   2.68%

建立域

[root@node6~] mogupload --trackers=172.16.1.7 --doma^C
[root@node6~] mogadm domain list
   domain               class                mindevcount   replpolicy   hashtype
   -------------------- -------------------- ------------- ------------ -------
[root@node6~] mogadm domain add files
[root@node6~] mogadm domain add images
[root@node6~] mogadm domain list
   domain               class                mindevcount   replpolicy   hashtype
   -------------------- -------------------- ------------- ------------ -------
   files                default                   2        MultipleHosts() NONE  
   images               default                   2        MultipleHosts() NONE


建立類

[root@node6~] mogadm class list   
   domain               class                mindevcount   replpolicy   hashtype
   -------------------- -------------------- ------------- ------------ -------
   files                default                   2        MultipleHosts() NONE  
   images               default                   2        MultipleHosts() NONE  

[root@node6~] mogadm class add files fulltext --mindevcount=1

[root@node6~] mogadm class list
        domain               class                mindevcount   replpolicy   hashtype
       -------------------- -------------------- ------------- ------------ -------
        files                default                   2        MultipleHosts() NONE  
        files                fulltext                  1        MultipleHosts() NONE  
         images               default                   2        MultipleHosts() NONE      

上傳並檢視檔案

[root@node6~] mogupload --trackers=172.16.1.7 --domain=files --key='/fstab.txt' --file=/etc/fstab 
[root@node6~] mogfileinfo --trackers=172.16.1.7 --domain=files --key='/fstab.txt'
       - file: /fstab.txt
            class:              default
         devcount:                    2
           domain:                files
              fid:                    2
              key:           /fstab.txt
           length:                  711
        - http://172.16.1.8:7500/dev2/0/000/000/0000000002.fid
        - http://172.16.1.9:7500/dev3/0/000/000/0000000002.fid

驗證

總結

MogileFS設定還是很Easy的, 但是分散式理論比設定更為重要, 大家一定要牢記在心! 
作者水平很低, 如果有錯誤及時指出, 如果你覺得本文寫的好請點一波讚~(≧▽≦)/~

 

MogileFS 設定 Memcached http://www.linuxidc.com/Linux/2012-03/56905.htm

在 MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56904.htm

在開源分散式檔案系統MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56573.htm

分散式檔案系統MogileFS的使用 http://www.linuxidc.com/Linux/2015-09/122947.htm

自定義Nagios監控MogileFS儲存節點指令碼 http://www.linuxidc.com/Linux/2011-12/49394.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-05/131022.htm


IT145.com E-mail:sddin#qq.com