#######################################################################前端
數據存儲的趨勢和大數據帶來的挑戰mysql
分佈式存儲與CAP定理nginx
分佈式存儲文件系統程序員
Mogilefs基本原理sql
Mogilefs實現數據庫
Nginx反向代理Tracker節點vim
#######################################################################後端
數據存儲的趨勢和大數據帶來的挑戰
bash
當下咱們處在一個互聯網飛速發展的信息社會,在海量併發鏈接的驅動下天天所產生的數據量必然以幾何方式增加,隨着信息鏈接方式日益多樣化,數據存儲的結構也隨着發生了變化。在這樣的壓力下使得人們不得不從新審視大量數據的存儲所帶來的挑戰,例如:數據採集、數據存儲、數據搜索、數據共享、數據傳輸、數據分析、數據可視化等一系列問題。
服務器
傳統存儲在面對海量數據存儲表現出的力不從心已是不爭的事實,例如:縱向擴展受陣列空間限制、橫向擴展受交換設備限制、節點受文件系統限制。
然而分佈式存儲的出如今必定程度上有效的緩解了這一問題,之因此稱之爲緩解是由於分佈式存儲在面對海量數據存儲時也並不是十全十美毫無壓力,依然存在的難點與挑戰例如:節點間通訊、數據存儲、數據空間平衡、容錯、文件系統支持等一系列問題仍處在不斷摸索和完善中。
分佈式存儲與CAP定理
首先要說明的是一個完美分佈式系統有三個最重要的元素,他們分別是:
一致性(Consistency):任何一個讀操做老是能讀取以前完成的寫操做。
可用性(Availability):每次操做老是可以在預約時間返回。
分區容錯性(Partition Tolerance):在出現網絡分區(分佈式)的狀況下,仍然可以知足一致性和可用性。
2007年,正當全部科學家都在致力於CAP三元素並存的時候,Eric.Brewer教授站了出來並指出CAP永遠沒法兼顧,只能根據具體應用來權衡和取捨,而且至多兩個元素能夠共存,後來由兩位麻省理工學院的科學家證實此觀點是具備前瞻性的,由此造成Brewer的CAP定理。
正所謂魚和熊掌不可兼得,關注一致性就須要處理因系統不可用而帶來寫操做失敗的狀況,反之關注可用性就沒法保證每次都能讀取到最新的寫入操做。傳統關係型數據庫側重於CA,而非關係型鍵值數據庫則側重於AP。
對於大型站點,可用性(Availability)與分區容錯性(Partition Tolerance)的優先級會高於一致性(Consistency),這裏並非指徹底捨棄一致性,而是經過其餘手段實現數據的弱一致性,例如:用戶微博的瀏覽數和評論能夠容忍相對長時間的不一致,幾乎不會影響用戶體驗,而股票價格的數據則異常敏感,即使是10秒鐘的數據不一致也沒法容忍,爲了能更形象的瞭解所謂「各類一致性」須要進行一下內容的回顧。
強一致性(ACID):在單機環境中,強一致性能夠由數據庫的事務來保證;在分佈式環境中,強一致性很難作到,即使是作到也會由於分佈式事物所帶來的性能低下,不適合在互聯網的環境中應用。
弱一致性(包括最終一致性):系統不能保證後續訪問返回最新的值,在訪問到最新值以前這段時間稱之爲不一致窗口。
最終一致性:是弱一致性的一種特例,存儲系統保證若是對象有屢次更新,在渡過不一致窗口以後必將放回最後更新的值。
服務器的一致性:N表明節點的個數;W表明更新的時候須要確認已經被更新的節點個數;R表明讀取數據須要的節點數量。
W + R > N ----> 強一致性(一般N=3,W=R=2)
W=N,R=1 ----> 最佳讀
W=1,R=N ----> 最佳寫
W + R <= N ----> 弱一致性
分佈式存儲文件系統
Google Filesystem | GFS+MapReduce擅長處理單個大文件 |
Hadoop Distributed Filesystem | GFS的山寨版+MapReduce,擅長處理單個大文件 |
ClusterFS | 擅長處理單個大文件 |
Taobao Filesystem | 擅長處理海量小文件 |
MogileFS | 擅長處理海量小文件 |
Ceph | 是一個 Linux PB級別的分佈式文件系統 |
MooseFS | 通用簡便,適用於研發能力不強的公司 |
Lustre | 一種平行分佈式文件系統 |
Mogilefs基本原理
MogileFS是一個開源的分佈式文件系統,用於組建分佈式文件集羣,由LiveJournal旗下DangaInteractive公司開發,Danga團隊開發了包括 Memcached、MogileFS、Perlbal等不錯的開源項目:(注:Perlbal是一個強大的Perl寫的反向代理服務器)。MogileFS是一個開源的分佈式文件系統。主要特性包括:應用層的組件、無單點故障、自動文件複製、具備比RAID更好的可靠性、無需RAID支持等……核心角色以下:
tracker節點:藉助數據庫保存各節點文件的元數據信息保存每一個域中全部鍵的存儲位置分佈,方便檢索定位數據位置的同時監控各節點,告訴客戶端存儲區位置並指揮storage節點複製數據副本,進程名爲mogilefsd(7001)。
database節點:爲tracker節點提供數據存取服務。
storage節點:將指定域中的鍵轉換爲其特有的文件名存儲在指定的設備文件中,轉換後的文件名爲值,storage節點自動維護鍵值的對應關係,storage節點因爲使用http進行數據傳輸,所以依賴於perlbal,storage節點前端可使用nginx進行反向代理,但須要安裝nginx-mogilefs-module-master模塊進行名稱轉換,進程名mogstored(7501),perbal(7500)。
Domain:一個域中的鍵值是唯一的,一個MogileFS能夠有多個域,域能夠用來存儲不一樣應用類型的數據的容器。
Host:每個存儲節點稱爲一個主機,一個主機上能夠有多個存儲設備(單獨的硬盤),每一個設備都有ID號,Domain+Fid用來定位文件。
Class:複製最小單位,文件屬性管理,定義文件存儲在不一樣設備上份數。
流程圖以下:
一、應用層發起GET請求到Nginx。
二、Nginx根據負載均衡機制隨機代理到後臺Node one。
三、Node one向從服務器發起查詢請求。
四、從服務器返回查詢結果。
五、Node one將查詢結果返回給Nginx。
六、Nginx將查詢結果根據模塊轉換爲合理的url方位Node three。
七、Node Three將文件內容經過http協議返回給Nginx。
八、Nginx將結果返回給應用層的請求。
Mogilefs實現
因爲各角色和服務之間都是基於套接字通訊,就服務自己來講沒有耦合性,因此可使用少許機器運行多種服務角色,功能圖以下:
一、經過Nginx+Keepalived實現高可用的負載均衡,經過upstream模塊能夠有選擇性的轉發應用層的請求至後端tracker節點。
二、DRBD+Corosync+Pacemaker的機制保證了Mysql的高可用,詳細配置請參閱博文:DAS之mysql高可用解決方案。
三、爲了進一步提高Mysql的性能引入從節點爲其分攤讀操做,從節點的數據能夠根據具體業務規模來設定,若是使用數據庫代理進行讀寫分離,代理會成爲單點故障,則須要爲代理作高可用,另外Tracker節點支持手動爲其指定從節點,所以能夠根據本身的喜愛,Mysql代理和複製相關實現請參閱博文:Mysql複製及代理。
##### Database節點 安裝mariadb 受權 GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'mypass'; CREATE DATABASE mogilefs; GRANT ALL ON mogilefs.* TO 'moguser'@'%' IDENTIFIED BY 'mogpass'; FLUSH PRIVILEGES; ##### Tracker節點(能夠是全部節點) 安裝 mogilefs 修改配置文件以下 vim /etc/mogilefs/mogilefsd.conf daemonize = 1 pidfile = /var/run/mogilefsd/mogilefsd.pid db_dsn = DBI:mysql:mogilefs:host=192.168.1.241 db_user = moguser db_pass = mogpass listen = 0.0.0.0:7001 conf_port = 7001 query_jobs = 100 delete_jobs = 1 replicate_jobs = 5 reaper_jobs = 1 service mogilefsd start #啓動服務 ss -tanlp (LISTEN 0 128 192.168.1.241:7001 ) ##### storage節點(能夠是全部節點) 安裝 mogilefs mkdir /mogdata/dev1 -pv #建立設備目錄 chown -R mogilefs.mogilefs /mogdata/dev2/ #權限 vim /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogdata #目錄級別 service mogstored start ss -tanlp (*:7500) ##### tracker節點添加storage節點和經常使用命令 mogadm check #檢測節點 mogadm host list #每一個存儲節點稱爲一個host mogadm host add 192.168.1.213 --ip=192.168.1.213 --ip=192.168.1.213 --status=alive #添加第一個存儲節點 mogadm host add 192.168.1.242 --ip=192.168.1.242 --ip=192.168.1.242 --status=alive #添加第一個存儲節點 mogadm host add 192.168.1.241 --ip=192.168.1.241 --ip=192.168.1.241 --status=alive #添加第一個存儲節點 mogadm device add 192.168.1.213 1 #添加第一個設備,設備號惟一不能重名 mogadm device add 192.168.1.242 2 #添加第二個設備 mogadm device add 192.168.1.241 3 #添加第三個設備 mogadm check #能夠查看狀態 mogadm domain add files #建立文件存儲域 mogadm domain add p_w_picpaths #建立圖片存儲域 mogadm domain list #查看全部域 mogupload --trackers=192.168.1.241 --domain=files --key='/fstab' --file='/etc/fstab' #上傳fstab文件,key爲'/fstab' mogfileinfo --trackers=192.168.1.241 --domain=files --key='/fstab' #根據key查看文件存放信息
註釋:mogupload工具是爲了測試,實際環境中上傳是由程序員在代碼中使用mogilefs的API進行交互。
Nginx反向代理Tracker節點
##### 配置Nginx 安裝tng yum install pcre-devel -y yum groupinstall "Development Tools" "Server Platform Development" yum install libxslt-devel gd-devel lua-devel geoip-devel tengine-1.5.1.tar.gz nginx-mogilefs-module-master.zip #mogilefs模塊須要打補丁 mkdir -pv /var/tmp/nginx/client #模塊須要 unzip nginx-mogilefs-module-master.zip useradd -r nginx ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --enable-mods-shared=all \ --add-module=/nginx-mogilefs-module-master make && make install vim /etc/profile.d/nginx.sh export PATH=/usr/local/nginx/sbin:$PATH . !$ 提供腳本..... 配置nginx vim /etc/nginx/nginx.cfg upstream trackers { server 192.168.1.242:7001 weight=1; server 192.168.1.213:7001 weight=1; server 192.168.1.241:7001 backup; check interval=3000 rise=2 fall=5 timeout=1000; check_http_send "GET / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; } location /jpg/ { mogilefs_tracker trackers; mogilefs_domain p_w_picpaths; mogilefs_methods GET; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } ##### 配置keepalived 安裝keepalived vim /etc/keepalived/keepalived.conf # backup priority 99 global_defs { notification_email { root@localhost } notification_email_from admin@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LTT } vrrp_script chk_nginx { script "killall -0 nginx" interval 1 weight -2 fall 2 rise 1 } vrrp_instance IN_1 { state MASTER interface eth0 virtual_router_id 22 priority 100 advert_int 1 authentication { auth_type PASS auth_pass aaaa } virtual_ipaddress { 192.168.1.222 } track_script { chk_nginx } }
查看負載節點:
模擬GET方法測試Nginx_mogilefs模塊: