1、分布式系统的目标:加强A、P,在C上进行妥协 BASE模型
CAP理论:
C:Consistency(一致性) 任何一个读操作总是能够读取之前完成的写操作。
A:Availability(可用性) 每一次操作总是能够在确定的时间返回。
P: Partition Tolerance ( 分区容错性 ) 在出现网络分区的情况下,仍然能够满足一致性和可用性。
BASE模型
BA:基本可用 S:接受一段时间内不一致 E:最终一致性
N节点个数 W写的节点数 R读的节点数
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.178linux.com/88860