分布式系統:
1、系統的各元件分布于網絡上多個計算機;
2、各元件彼此之間僅僅通過消息傳遞來通信并協調行動;
分布式系統存在意義:
1、向上擴充的成本效益越來越低;
2、單機擴充存在性能上升臨界點;
3、出于穩定性及可用性考慮,單機會存在多方面的問題;
計算機組成:CPU、記憶體、IO
多CPU:
多線程程式設計,(線程間共享程序的資源)
互不通信的線程模型
基于共享容器協同工作的模型
通過事件協調的多線程模型
多程序模型
網絡IO:
多程序:每個程序響應一個請求;
多線程、多程序:每程序生成多個線程,每線程響應一個使用者請求
多線程:每線程直接響應多個請求
基于socket實作網絡通信開發,其實作方式:
BIO:Blocking IO:一個程序或一個線程處理一個請求;
NIO:Nonblocking IO:基于事件驅動(epoll)思想,采用Reactor模式
AIO:基于事件驅動思想,采用Proactor模式
如何把應用從單機擴充至多機?
輸入裝置的變化?
輸出裝置的變化?
控制器的變化?
實作的模式:
透明代理
lvs的nat
haproxy, nginx
旁路代理
lvs的dr、tun
名稱服務
規則服務
Master/slave機制
運算器的變化:
存儲器的變化?
分布式系統實作的難點:
缺乏全局時鐘?
面對故障時的獨立性
處理單點故障
事務處理
ACID
2PC、BASE、CAP、Paxos
大型網站站點的架構演進方式:
LAMT, LNMT
應用從資源占用的角度分兩類:
CPU Bound
IO Bound: IO密集型
session sticky
ip based
cookie based
session replication
session server
引用MySQL主從面臨的問題:
1、資料複制的問題
2、應用選擇資料源的問題
引入緩存:
1、頁面緩存
varnish, squid
2、資料緩存
key-value store: memcached
主庫寫操作壓力:資料庫拆分
垂直拆分:把資料庫中不同的業務的資料拆分到不同的資料庫伺服器中
水準拆分:把一個單獨的表中的資料拆分到多個不同的資料庫伺服器上
NoSQL: 非關系資料
文檔資料庫
列式資料庫
... ...
應用拆分:
根據業務特性拆分
根據使用者拆分:
使用者注冊
使用者登入
使用者資訊維護
根據對底層應用的調用進行拆分
異步:解耦
消息中間件:在分布式系統中,完成消息發送和接收的基礎性軟體;
MOM:Message-oriented middleware
RabbitMQ, ActiveMQ, ZMQ
分布式存儲:
資料類型:
結構化資料:SQL,TPS,MYSQL(主從複制、分庫分表);
半結構化資料:json,xml(document store,mongodb、elasticsearch)
非結構化資料:k-v
CAP:一緻性、可用性、網絡分區容錯性;
通用分布式存儲:分布式存儲,不可直接挂載,需通過api:mogilefs,fastdfs 等等
專用分布式存儲:分布式檔案系統,可直接挂載:moosefs,ceph等等
常見的分布式檔案系統:
GlusterFS:适用于存儲少量大檔案
MogileFS:适用存儲海量小檔案
使用MySQL存儲中繼資料
FastDFS
MooseFS:
Ceph:核心級别,支援PB級别存儲的分布式檔案系統;
HDFS:Lucene, MapReduce + HDFS = Hadoop (平台), HBase(NoSQL)
GFS:Google FS
MapReduce
Bigtable
TFS: 适用于存儲海量小檔案
Lustre: Oracle的開源的分布式檔案
MogileFS:
開源的分布式存儲,由LiveJournal旗下的Danga Interactive;
memcached, MogileFS, Perlbal
MogileFS的特性:
1、應用層:運作于使用者空間;
2、無單點失敗:
mogstored:存儲多個資料副本;
tracker:多節點;
database:mysql等等
3、自動檔案複制
4、不需要RAID;
5、傳輸中立,無特殊協定(HTTP或NFS)
6、簡單的名稱空間:
domain,class,fid(key);
7、不用共享任何資料:
中繼資料:db;
資料:mogstored,副本;
MogileFS的角色:
Tracker:Mogilefsd程序;其實作的功能包括Replication,Deletion, Query, Monitor等等;
Storage Nodes: mogstored程序;檔案實際存儲的位置,其實質上是一個http伺服器,基于WebDAV模式工作,能完成檔案建立、删除、重命名等操作;
MySQL節點:用于為tracker存儲中繼資料資訊;mogilefs的名稱空間及檔案名;
服務程序有兩個:
tracker: mogilefsd
storage nodes: mogstored
perl子產品的安裝方式:
線上安裝:自動解決依賴關系
cpan> install module_name::name
離線安裝:
編譯:
# perl Makefile.PL
# make
# make install
rpm包:
# yum install
安裝tracker:
1、安裝相關的包:
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
2、授權資料庫使用者,并初始mysql資料庫
mysql> CREATE DATABASE mogdb CHARSET ‘utf8';
mysql> GRANT ALL ON mogdb.* TO 'moguser'@'127.0.0.1' IDENTIFIED BY 'mogpass';
mysql> GRANT ALL ON mogdb.* TO 'moguser'@'localhost' IDENTIFIED BY 'mogpass';
mysql> flush privileges;
# mogdbsetup --dbname=mogdb --dbuser=moguser --dbpass=mogpass
3、修改配置檔案mogilefsd.conf
db_dsn = DBI:mysql:DBNAME:host=172.16.100.7
4、啟動mogilefsd程序
# service mogilefsd start
安裝mogstored:
1、安裝相關的包
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm perl-IO-AIO
2、準備儲存設備
挂載至某路徑下,确認此路徑下存在檔案devN
此路徑的屬主和屬組為mogilefs.mogilefs
3、修改配置檔案/etc/mogilefs/mogstored.conf
docRoot=
前面的挂載路徑;
4、啟動mogstored程序
# service mogtored start
配置mogielfs:mogadm --help檢視幫助資訊
1、向tracker添加各mogstored主機
mogadm --trackers=TRACKER_NODE host add
2、向tracker添加各裝置
mogadm --trackers=TRACKER_NODE device add
3、為tracker定義名稱空間domain
mogadm --trackers=TRACKER_NODE domain add
4、為domain添加一個或多個class
mogadm --trackers=TRACKER_NODE class add
可同時副本的最少個數;
上傳檔案:mogupload
下載下傳檔案:mogfeatch
檢視檔案資訊:mogfileinfo
mogilefs與nginx結合:nginx_mogilefs_module
編譯安裝nginx時加上--add-module=子產品的的解壓路徑即可
配置檔案nginx.conf示例:
将trackers定義為upstream示例:
upstream mogtrackers {
server 172.20.120.22:7001;
server 172.20.120.23:7001;
}
并且在server段内添加
location /images {
mogilefs_tracker mogtrackers;
mogilefs_domain imgs;
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-type;
proxy_buffering off;
}
}
測試驗證手動驗證:
1、通過mogupload --trackers=172.20.120.22 --domain=imgs --key='dune.jpg' --file=/usr/share/backgrounds/nature/Dune.jpg
2、手動檢視mogfileinfo --trackers=172.20.120.22 --domain=imgs --key='dune.jpg'
3、通過浏覽器url驗證 http://nginx-ip/images/dune.jpg
開啟status示例:
location /status {
stub_status on;
access_log off;
allow 172.20.120.0/24;
deny all;
FastDFS:開源的輕量級分布式檔案系統,c++
三個角色:tracker、storage、client
tacker server:跟蹤伺服器,排程;在記憶體中記錄所有儲存組和儲存伺服器的狀态資訊;
storage server:存儲伺服器,檔案(data)和檔案屬性(metadata);
client:用戶端,業務請求發起方,通過專用接口基于tcp協定與tracker以及storage server進行互動;
擴充示例:如何根據源碼制作rpm包
# git clone https://github.com/happyfish100/libfastcommon.git
# less INSTALL
# less libfastcommon-1.0.40/libfastcommon.spec 檢視該軟體版本号
# mv libfastcommon libfastcommon-1.0.40
# tar zcf libfastcommon-1.0.40.tar.gz libfastcommon-1.0.40/* 打包
# mkdir -pv rpmbuild/{SOURCES,SPECS}
# cp libfastcommon-1.0.40.tar.gz rpmbuild/SOURCES/
# cp libfastcommon-1.0.40/libfastcommon.spec rpmbuild/SPECS/
# cd rpmbuild/SPECS/
# rpmbuild -ba libfastcommon.spec
fastdfs托管在github:https://github.com/happyfish100/fastdfs
# yum groupinstall "Development Tools" "Server Platform Development" -y
# yum install git -y
# git clone https://github.com/happyfish100/libfastcommon.git
# ./make.sh
# ./make.sh install
# git clone https://github.com/happyfish100/fastdfs.git
# less INSTALL
# ./make.sh
fastdfs配置檔案和測試
# group -r fastdfs
# groupadd -r fastdfs
# useradd -g fastdfs -r -s /sbin/nologin fastdfs
# mkdir -pv /data/fdfs/{tracker,storage,client}
# cd /etc/fdfs/
# cp tracker.conf.sample tracker.conf
# vim tracker.conf
base_path=/data/fdfs/tracker
run_by_group=fastdfs
run_by_user=fastdfs
# service fdfs_trackerd restart
# cp storage.conf.sample storage.conf
# vim /etc/fdfs/storage.conf
base_path=/data/fdfs/storage
store_path0=/data/fdfs/storage
tracker_server=192.168.71.41:22122
# service fdfs_storaged restart
# cp client.conf.sample client.conf
# vim client.conf
base_path=/data/fdfs/client
# fdfs_test client.conf upload /usr/share/backgrounds/night.jpg 測試
fastdfs與nginx結合:借用fastdfs-nginx-module子產品,前提需手動編譯安裝nginx
# wget http://nginx.org/download/nginx-1.16.0.tar.gz
# yum install pcre-devel openssl-devel -y
# git clone https://github.com/happyfish100/fastdfs-nginx-module.git
# tar xvf nginx-1.16.0.tar.gz
# cd nginx-1.16.0
# groupadd -r nginx
# useradd -g nginx -r -s /sbin/nologin nginx
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx/nginx.pid --lock
-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-pcre --add-module=/root/fastdfs-nginx-module/src
# ln -sv /data/fdfs/storage/data/ /data/fdfs/storage/data/M00
# cp /etc/nginx/nginx.conf{,.bak}
# vim /etc/nginx/nginx.conf
location /M00 {
root /data/fdfs/storage/data;
ngx_fastdfs_module;
}
# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
# vim /etc/fdfs/mod_fastdfs.conf
base_path=/data/fdfs/storage
url_have_group_name = true
# mkdir -pv /var/run/nginx
# cp fastdfs/conf/{http.conf,mime.types} /etc/fdfs/
# /usr/local/nginx/sbin/nginx -t
# vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
# source /etc/profile.d/nginx.sh
# nginx
通路URL,測試驗證