您好,登錄后才能下訂單哦!
大綱
前言:
什么是分布式?
分布式存在的意義?
分布式的難點及CAP、BASE、2PC、X/Open XA介紹
分布式存儲和分布式文件系統:
MogileFS實現原理:
MogileFS編譯安裝和配置
總結
不知不覺中我們就進入大數據時代, 什么是大數據? 什么是分布式? 什么是云計算? 我們在后面都將介紹, 本篇文章, 我們主要討論分布式系統;
分布式這個詞聽起來很高大上, 實際上在我們以前(作者博客)經常構建分布式系統, 從最初的分離LAMP中的MySQL 到引入Varnish緩存頁面, 再到使用LVS負載均衡Nginx|Apache, Nginx負載均衡Tomcat等等, 廣義上都算是分布式系統.
簡單來說分布式就是將一個系統的各個組件(MySQL、PHP、Apache …)分布在網絡上的各臺主機, 并且各組件之間僅通過消息傳遞來通信并協調工作
其實我們在之前負載均衡相關的博文中已經回答過了, 主要有以下問題:
垂直擴展的性價比不高
單機擴展存在性能上升的臨界點
處于穩定性及可用性考慮, 單機會存在多方面的問題
分布式系統存在以下難點
缺乏全局時鐘
面對故障時的獨立性
很難處理單點故障
很難實現事務
事務要具有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中的術語:
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的高可用架構:
本我來是打算進行編譯安裝的, 但是由于各種原因, 我這次就使用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 p_w_picpaths
[root@node6~] mogadm domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
p_w_picpaths default 2 MultipleHosts() NONE
創建類
[root@node6~] mogadm class list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
p_w_picpaths 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
p_w_picpaths 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的, 但是分布式理論比配置更為重要, 大家一定要牢記在心!
作者水平很低, 如果有錯誤及時指出, 如果你覺得本文寫的好請點一波贊~(≧▽≦)/~
作者: AnyISaIln QQ: 1449472454
感謝: MageEdu
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。