分佈式系統:node
一、系統的各組件分佈於網絡上多個計算機;mysql
二、各組件彼此之間僅僅經過消息傳遞來通訊並協調行動;nginx
分佈式系統存在乎義:c++
一、向上擴展的性價比愈來愈低;git
二、單機擴展存在性能上升臨界點;github
三、出於穩定性及可用性考慮,單機會存在多方面的問題;sql
計算機組成:CPU、內存、IOmongodb
多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主從面臨的問題:
一、數據複製的問題
二、應用選擇數據源的問題
引入緩存:
一、頁面緩存
varnish, squid
二、數據緩存
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的特性:
一、應用層:運行於用戶空間;
二、無單點失敗:
mogstored:存儲多個數據副本;
tracker:多節點;
database:mysql等等
三、自動文件複製
四、不須要RAID;
五、傳輸中立,無特殊協議(HTTP或NFS)
六、簡單的名稱空間:
domain,class,fid(key);
七、不用共享任何數據:
元數據: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:
一、安裝相關的包:
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
二、受權數據庫用戶,並初始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
三、修改配置文件mogilefsd.conf
db_dsn = DBI:mysql:DBNAME:host=172.16.100.7
四、啓動mogilefsd進程
# service mogilefsd start
安裝mogstored:
一、安裝相關的包
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
二、準備存儲設備
掛載至某路徑下,確認此路徑下存在文件devN
此路徑的屬主和屬組爲mogilefs.mogilefs
三、修改配置文件/etc/mogilefs/mogstored.conf
docRoot=
前面的掛載路徑;
四、啓動mogstored進程
# service mogtored start
配置mogielfs:mogadm --help查看幫助信息
一、向tracker添加各mogstored主機
mogadm --trackers=TRACKER_NODE host add
二、向tracker添加各設備
mogadm --trackers=TRACKER_NODE device add
三、爲tracker定義名稱空間domain
mogadm --trackers=TRACKER_NODE domain add
四、爲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;
}
}
測試驗證手動驗證:
一、經過mogupload --trackers=172.20.120.22 --domain=imgs --key='dune.jpg' --file=/usr/share/backgrounds/nature/Dune.jpg
二、手動查看mogfileinfo --trackers=172.20.120.22 --domain=imgs --key='dune.jpg'
三、經過瀏覽器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
# less INSTALL
# ./make.sh
# ./make.sh install
# git clone https://github.com/happyfish100/fastdfs.git
# less INSTALL
# ./make.sh
# ./make.sh install
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
run_by_group=fastdfs
run_by_user=fastdfs
# service fdfs_storaged restart
# cp client.conf.sample client.conf
# vim client.conf
base_path=/data/fdfs/client
tracker_server=192.168.71.41:22122
# 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
store_path0=/data/fdfs/storage
tracker_server=192.168.71.41:22122
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,測試驗證