1、分布式系統的目標:加強A、P,在C上進行妥協 ? ? BASE模型
CAP理論:
C:Consistency(一致性)? 任何一個讀操作總是能夠讀取之前完成的寫操作。
A:Availability(可用性) 每一次操作總是能夠在確定的時間返回。
P: Partition Tolerance ( 分區容錯性 )?? 在出現網絡分區的情況下,仍然能夠滿足一致性和可用性。
BASE模型
BA:基本可用 S:接受一段時間內不一致 ?。牛鹤罱K一致性
N節點個數 W寫的節點數 ?。易x的節點數
W + R > N? —->? 強一致性(通常N=3,W=R=2)
W=N,R=1?? —->? 最佳讀
W=1,R=N?? —->? 最佳寫
W + R <= N —->? 弱一致性
強一致性(ACID)? :?? 在單機環境中,強一致性可以由數據庫的事務來保證;在分布式環境中,強一致性很難做到,即便是做到也會因為分布式事物所帶來的性能低下,不適合在互聯網的環境中應用。
弱一致性(包括最終一致性)? :? 系統不能保證后續訪問返回最新的值,在訪問到最新值之前這段時間稱之為 不一致窗口?? 。
最終一致性? :是弱一致性的一種特例,存儲系統保證如果對象有多次更新,在渡過 不一致窗口?? 之后必將放回最后更新的值。
服務器的一致性? :? N? 代表節點的個數;? W? 代表更新的時候需要確認已經被更新的節點個數; R? 代表讀取數據需要的節點數量。
2、分布式存儲或分布式文件系統
1) 集中式:
共享存儲:NAS、SAN
2) 分布式存儲:
有專用的元數據節點:集中元數據存儲,數據節點只負責存儲數據
無專用元數據幾點:所有數據節點均完整存儲元數據,存儲了部分數據
分布式:
文件系統:有文件系統接口:一般掛載使用
存儲:無文件系統接口,通過API訪問
常見的分布式文件系統:
GFS:Google File System GFS擅長處理單個大文件?。
HDFS:Hadoop Distributed File System??根據GFS思想開發的,擅長處理單個大文件?,使用場景,數據不太多的大文件。
TFS:Taobao File System 淘寶開源的文件系統,擅長處理海量小文件,適用于大規模場景。將元數據存儲于關系型數據庫或其他高性能存儲中,從而能維護海量文件元數據。
GlusterFS:去中心化設計,無專用數據節點,擅長處理單個大文件
ceph:整合到linux內核實現的文件系統,已經被收錄在內核,是一個 Linux PB級別的分布式文件統。
MogilesFS:MogileFS是一個開源的分布式文件系統,用于組建分布式文件集群
3、MogileFS
MogileFS特性:
1) 應用層提供服務,不需要使用核心組件
2)無單點失敗,主要有三個組件組成,分為tracker(跟蹤節點)、mogstore(存儲節點)、database(數據庫節點)
3)自動復制文件,復制文件的最小單位不是文件,而是class
4)傳輸中立,無特殊協議,可以通過NFS或HTTP實現通信
5)簡單的命名空間:沒有目錄,直接存在與存儲空間上,通過域來實現
6)不用共享任何數據
MogileFS的組成:
1) server:主要包括mogilefsd和mogstored兩個應用程序。mogilefsd實現的是tracker,它通過數據庫來保存元數據信息,包括站點domain、class、 host等;mogstored是存儲節點(store node),它其實是個WebDAV服務,默認監聽在7500端口,接受客戶端的文件存儲請求。在MogileFS安裝完后,要運行mogadm工具將所有的store node注冊到mogilefsd的數據庫里,mogilefsd會對這些節點進行管理和監控。
2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
3) 客戶端API:MogileFS的客戶端API很多,例如Perl、PHP、Java、Python等,用這個模塊可以編寫客戶端程序,實現文件的備份管理功能等。
配置MogileFS
環境:
node1:192.168.1.32 ? ? ?nginx反代,支持MogileFS模塊
node2:192.168.1.33 ? ? ? traceker+mogstored+database節點
node3:192.168.1.35 ? ? ? traceker+mogstored節點
node4:192.168.1.47 ? ? ? traceker+mogstored節點
【node2&3&4】
安裝mogileFS
# yum install perl-Sys-Syslog perl-Net-Netmask perl-IO-AIO # yum install 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 perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm –y
【node2】
Database節點:安裝mariadb
# vim /etc/my.cnf innodb_file_per_table=ON skip_name_resolve=ON # systemctl start mariadb.service # mysql > GRANT ALL ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY 'queen'; > CREATE DATABASE mogilefs; > GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.1.%' IDENTIFIED BY 'mogpass'; # mogdbsetup --dbhost=192.168.1.32? --dbrootpass='queen' --dbuser='moguser' --dbpass='mogpass' # mysql MariaDB [mogilefs]> use mogilefs; Database changed MariaDB [mogilefs]> 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)
設置Tracker節點
# vim /etc/mogilefs/mogilefsd.conf daemonize = 1 pidfile = /var/run/mogilefsd/mogilefsd.pid db_dsn = DBI:mysql:mogilefs:host=192.168.1.32 db_user = moguser db_pass = mogpass listen = 0.0.0.0:7001 conf_port = 7001 query_jobs = 10 delete_jobs = 1 replicate_jobs = 5 reaper_jobs = 1 # systemctl start mogilefsd.service # ss -tnl State????? Recv-Q Send-Q Local Address:Port ??????????????Peer Address:Port????????????? LISTEN???? 0????? 128?????????? *:7001????????????????????? *:*????????????????? 【node2&3&4】 storage節點:mogstored # mkdir -pv /data/mogilefs/dev1 # chown -R mogilefs.mogilefs /data/mogilefs/ # vim /etc/mogilefs/mogstored.conf docroot = /data/mogilefs # vim /etc/rc.d/init.d/mogstored pidfile=/var/run/mogilefsa/mogstored.pid ?[ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogstored) > ${pidfile}? || failure?????? ?[ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile} || failure # systemctl daemon-reload # service mogstored restart # ss -tnl State????? Recv-Q Send-Q Local Address:Port?????????????? Peer Address:Port????????????? LISTEN???? 0????? 128?????????? *:7500????????????????????? *:*???????????????? ? LISTEN???? 0????? 128?????????? *:7501????????????????????? *:*????? 【node2】 添加存儲節點: # mogadm –trackers=192.168.1.33:7001 host add 192.168.1.33 -ip=192.168.1.33 –status=alive # mogadm –trackers=192.168.1.33:7001 host add 192.168.1.35 -ip=192.168.1.35 –status=alive # mogadm –trackers=192.168.1.33:7001 host add 192.168.1.47 -ip=192.168.1.47 –status=alive 添加存儲設備:
# mogadm –trackers=192.168.1.33:7001 device add 192.168.1.33 1 設備號唯一不可重名 # mogadm –trackers=192.168.1.33:7001 device add 192.168.1.35 2 # mogadm –trackers=192.168.1.33:7001 device add 192.168.1.47 3
添加域
# mogadm domain add files # mogadm domain add images
添加class類
# mogadm class add images png # mogadm class add?images jpeg # mogadm class add files text # mogadm class add files html 上傳文件測試:
# mogupload –trackers=192.168.1.33:7001 –domain=files –key='fstab.txt' –file=/etc/fstab –class=text
mogilefs狀態查詢:
# mogstats –db_dsn="DBI:mysql:mogilefs:host=192.168.1.33" –db_user="moguser" –db_pass="mogpass" --verbose --stats="devices.file"
列出images域下所有key
# moglistkeys –trackers=192.168.1.33:7001 –domain=images
刪除domain流程:
# mogdelete –trackers=192.168.1.33:7001 –domain=images –key=linux.jpg
# mogadm class delete images jpeg
# domain delete images
【node1】
Nginx做MogileFS的前端客戶端
(1)編譯安裝nginx和nginx的mogilefs模塊
# yum install "開發工具“ ”服務開發平臺“ -y # tar xf ?tengine-2.1.1.tar.gz # tar xf nginx_mogilefs_module-1.0.2.tar.gz # cd tengine-2.1.1 # groupadd -r nginx? # useradd -r -g nginx nginx # yum install pcre-devel openssl-devel # ./configure –prefix=/usr –sbin-path=/usr/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 –with-http_ssl_module –with-http_flv_module –with-http_stub_status_module –with-http_gzip_static_module –with-pcre --with-debug –add-module=../nginx_mogilefs_module-1.0.2 # make 注意:由于不確定因素,在centos7上編譯時,可能會出現"warning:variable 'pclcf'set but not used [-Wunused-but-set-variable]一類的錯誤,可通過修改objs/Makefile文件,刪除-Werror來忽略此錯誤 # make install
(2)提供配置腳本:
#!/bin/sh
#
# nginx – this script starts and stops the nginx daemon
#
# chkconfig:?? – 85 15
# description:? Nginx is an HTTP(S) server, HTTP(S) reverse \
#?????????????? proxy and IMAP/POP3 proxy server
# processname: nginx
# config:????? /etc/nginx/nginx.conf
# config:????? /etc/sysconfig/nginx
pidfile=/var/run/nginx/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ “$NETWORKING” = “no” ] && exit 0
nginx=”/usr/local/nginx/sbin/nginx”
prog=$(basename $nginx)
NGINX_CONF_FILE=”/etc/nginx/nginx.conf”
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep “configure arguments:” | sed ‘s/[^*]*–user=\([^ ]*\).*/\1/g’ -`
options=`$nginx -V 2>&1 | grep ‘configure arguments:’`
for opt in $options; do
if [ `echo $opt | grep ‘.*-temp-path’` ]; then
value=`echo $opt | cut -d “=” -f 2`
if [ ! -d “$value” ]; then
# echo “creating” $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $”Starting $prog: ”
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
“/etc/init.d/nginx” 126L, 2529C
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $”Reloading $prog: ”
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case “$1″ in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $”Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}”
exit 2
esac
# systemctl start nginx.service # cd /etc/nginx # cp nginx.cong{,.bak} # vim nginx.conf location /images/ { mogilefs_tracker 192.168.1.33; mogilefs_domain images; mogilefs_methods GET; mogilefs_noverify on; 不校驗 mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; 關閉緩沖 } } # nginx -t # systemctl reload nginx.service 測試: # mogupload –trackers=192.168.1.33:7001 –domain=images? –key='1.jpg'? –file='/images/1.jpg' --class=jpeg
訪問192.168.1.33/images/1.jpg
原創文章,作者:nene,如若轉載,請注明出處:http://www.www58058.com/88860