分布式存储
当下互联网飞速发展,海量并发所产生的数据量以几何方式增长,随着信息链接方式日益多样化,数据存储的结构也发生了变化,在这样的压力下我们不得不重新审视大量数据的存储所带来的挑战,比如:数据采集、数据存储、数据搜索、数据共享、数据传输、数据分析、数据可视化等一些列问题
传统存储在面对海量数据存储时已经力不从心,比如纵向扩展受阵列空间限制、横向扩展受交换设备限制、节点受文件系统限制
分布式存储的出现在在一定程度上缓解了这一问题
分布式存储基础介绍
(一)多线程与进程的执行模式 #互不通信的多线程模式; #基于共享容器协同的多线程模式; #通过事件协同的多线程模式; (二)基于输入设备变化、运算器的变化、存储器的变化分类 1)控制器的变化 # 透明模式 # 旁路模式 # 名称模式 # 规则服务器 2)存储器的变化 # 代理模式 # 名称服务 # 规则服务器 # master模型:前段节点存放元数据(name node),后端节点存放数据(data node) (三)分布式系统的难点 # 缺乏全局时钟 # 面对故障的独立性 # 处理单点故障:①做冗余②降低单点故障的影响范围 #事务的挑战(ACID):①2pc两端式提交、②最终一致③BASE方法④CAP理论⑤Paxos (四)分布式文件系统的设计目标 # 访问透明 # 位置透明 # 并发透明 # 失效透明 # 硬件透明 # 可拓展性 # 复制透明 # 迁移透明 (五)分布式文件系统的注重的特性 # Scalable 伸缩性 # Reliable 可靠性 # Cheap 性价比
(六)分布式事务的模型及规范 X/open: XA-----XA规范是开放群组关于分布式事务处理 (DTP)的规范 #DTP:Distributed Transaction Processing Reference Model 分布式事务处理 XA规范 定义了三个组件 #AP :Appliacation Program 应用程序 #RM :Resource Manager 资源管理器 #TM :Transaction Manager 事务管理器 简单来讲:AP通过RM来实现资源操作,如果AP当中执行一个完整的事务,则通过TM控制事务都执行或者不执行,如果事务执行失败则回滚; 其中TM管理哪些资源的事务需要事先向RM资源管理器注册申请
(七)面对事务挑战(ACID)的协调方式 #2PC(两段式提交):事务管理中双方都完成,或者都不完成 #CAP理论:C代表一致性,A代表可用性,P代表分区容错性 CAP理论一般满足以上两者,无法保证三者都满足;其中关系型数据库属于AC,其他环境一般为AP #BASE :BA(Basically)表示基本可用,S(Soft state)表示接受一段时间内的状态不同步,E(Eventually consistent)最终一致性 #Paxos : 比2PC提交更轻量级的分布式事务的协调方式
分布式事务处理的一致性问题
强一致性 #ACID #在单机环境中,强一致性可以由数据库的事务来保证 #在多级环境中,强一致性很难做到 #分布式事务:性能太差,在化联网的应用中不适合 弱一致性(包括最终一致性) #通过提交处理的半同步、半异步或全异步,取得最终一致性效果 #最终一致性使得数据的提交具有延时性,而在一定范围时的延时性范围内(比如一秒),应用的可用性时正常的 集群内一致性算法实施过程案例 #基于合法票数(Quorum)和向量时钟(Vector Clock) Quorum算法 #N :数据复制的节点量 #R :成功读取所依赖的最少节点数 #W :成功写操作所依赖的最少节点数 #W+R>N 表示强一致性 ;W+R<=N 属于弱一致性(保证最终一致性)
分布式存储文件系统类别
各种分布式存储文件系统介绍 #Google Filesystem :GFS+MapReduce擅长处理单个大文件 #Hadoop Distibuted Filesystem :GFS山寨版+MapReduce 擅长处理单个大文件 #GlusterFS :擅长处理单个大文件 #Taobao Filesystem :擅长处理海量小文件 #MogileFS:擅长处理海量小文件 #Ceph :PB级别的分布式文件系统 #MooseFS :通用简单 #Lustre :一种平行分布式文件系统
MofileFS原理
MofileFS是一个开源的分布式文件系统,用于组件分布式文件集群。其主要特性包括:应用层组件、无单点故障、自动文件复制(复制单位不是文件而是class类)、传输中使用http协议,基于域的简单命名方式、具有比RAID更好的可靠性
核心角色 (1)tracker节点:借助于数据库保存各节点文件的元数据信息,保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时并监控各个节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名mogilefsd/端口7001 (2)database节点:为tracker节点提供数据存取 (3)storage节点:将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值对应关系,storage节点由于使用http进行数据传输,因此依赖于perlball,storage节点前段可以使用nginx进行反向代理,但需要安装nginx的第三方模块nginx-mogilefs-module-master,进程mogstored/7500端口,perlbal/7500端口 (4)Domain:一个域中的键值是唯一的,一个MogileFS可以有多个域,域可以存储不同应用类型的数据的容器 (5)Class:复制最小单位,文件属性管理,定义文件存储在不同设备上的分数
客户端、tracker、Database、mogstore的关系图
流程图
Nginx + MogileFS集群的实现
架构图
1 应用层发起GET请求到Ningx
2 Nginx根据负载均衡机制随机代理到后台的tracker服务器(其中之一)
3 tracker服务器将查询结果返回给Nginx
4 Nginx将查询结构根据模块转换为合理的url发送给后端的mogstore存储服务器
5 mogstore存储服务器将文件内容通过http协议返回给Nginx
6 Nginx将结果返回给应用层客户端
实现步骤
1、MySQL服务器配置
mysql的编译安装请参照我的博客 mysql配置 1)授权root用户 #MariaDB [(none)]> grant all on *.* to root@'172.16.%.%' identified by '123456'; 2)授权moguser用户 #MariaDB [(none)]> grant all on mogdb.* to 'moguser'@'172.16.%.%' identified by 'mogpass'; 3)冲刷授权表 #MariaDB [mogdb]> flush privileges;
2、172.16.13.2服务器安装tracker和mystore
1)下载程序包: MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm 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 同时将所有rpm包 放到另外两个服务器上一份 #scp *.rpm 172.16.13.3:/root #scp *.rpm 172.16.13.4:/root
2)安装 #yum -y install *.rpm perl-IO-AIO 3)配置tracker # chown -R mogilefs.mogilefs /var/run/mogilefsd/ 指定为mogilefs用户和组 # mogdbsetup --dbhost=172.16.249.39 --dbport=3306 --dbname=mogdb --dbrootuser=root --dbrootpass=123456 --dbuser=moguser --dbpass=mogpass --yes 数据库初始化 MySQL服务器查看生成的数据库 #MariaDB [(none)]> show databases;
编辑tracker的配置文件 #cd /etc/mogilefs #vim mogilefsd.conf 修改一下内容 db_dsn = DBI:mysql:mogdb:host=172.16.249.39 db_user = moguser db_pass = mogpass listen = 0.0.0.0:7001 #chmod -R mogilefs.mogilefs mogilefsd.conf #service mogilefsd start 启动mogilefsd服务 #ss -ntl | grep 7001
4)配置mogstore # mkdir /dfs/mogdata/dev1 # chown -R mogilefs.mogilefs /dfs/mogdata/dev1 # cd /etc/mogilefs # vim mogstored.conf 修改如下内容 docroot = /dfs/mogdata # chown -R mogilefs.mogilefs mogstored.conf # service mogstored start 启动服务 # ss -tnlp
在trakers 中添加 mogstore存储主机 #mogadm --trackers=172.16.13.2:7001 host add 172.16.13.2 --ip=172.16.13.2 --status=alive # mogadm --trackers=172.16.13.2:7001 host list
此时已经实现172.16.13.2服务器即是tracker,也是mogstore存储
将配置文件mogilefsd.conf mogstored.conf 复制到 172.16.13.3 与172.16.13.4 上 #cd /etc/mogilefs #scp * 172.16.13.3:/etc/mogilefs #scp * 172.16.13.4:/etc/mogilefs
3、172.16.13.3服务器配置
1) 安装 # cd /root (该目录已经有从 172.16.13.2传送的所有rpm包) # yum -y install *.rpm perl-IO-AIO 2) 配置cheker # service mogilefsd start # ss -ntl | grep 7001 3)配置mogstore # mkdir -pv /dfs/mogdata/dev2 # chown -R mogilefs.mogilefs /dfs/mogdata/dev2 # service mogstored start # ss -ntlp 查看 7500 7501端口侦听 4)tracker中添加mogstore存储主机 # mogadm --trackers=172.16.13.3:7001 host add 172.16.13.3 --ip=172.16.13.3 --status=alive # mogadm --trackers=172.16.13.3:7001 host list
4、172.16.13.4服务器配置
1)安装 #cd /root #yum -y install *.rpm perl-IO-AIO 2)配置tracker #service mogilefsd start #ss -ntl | grep 7001 配置文件无需更改 3)配置mogstore #mkdir -pv /dfs/mogdata/dev3 #chown -R mogilefs.mogilefs /dfs/mogdata/dev3 创建mogstore数据目录 #service mogstored start # ss -ntlp 查看7500 7501端口 4)添加mystore存储主机 # mogadm --trackers=172.16.13.4:7001 host add 172.16.13.4 --ip=172.16.13.4 --status=alive # mogadm --trackers=172.16.13.4:7001 host list
以上三个节点全部配置完 trackers 与 mystore ,接下来我们添加三个节点上的设备、添加域、添加类文件
5)添加存储设备 在172.16.13.4 tracker服务器配置即可 # mogadm --trackers=172.16.13.4:7001 device add 172.16.13.2 1 # mogadm --trackers=172.16.13.4:7001 device add 172.16.13.3 2 # mogadm --trackers=172.16.13.4:7001 device add 172.16.13.4 3 # mogadm --trackers=172.16.13.4:7001 device list
6)分布式系统添加domain 域 # mogadm --trackers=172.16.13.4:7001 domain add files # mogadm --trackers=172.16.13.4:7001 domain add p_w_picpaths # mogadm --trackers=172.16.13.4:7001 domain list
7)在域(domain)中添加类(class)文件 ### class 是在mystore中最小存储与复制单元 为p_w_picpaths域创建几个class文件 # mogadm --trackers=172.16.13.4:7001 class add p_w_picpaths class0 --mindevcount=2 至少2个副本 # mogadm --trackers=172.16.13.4:7001 class add p_w_picpaths class1 --mindevcount=2 # mogadm --trackers=172.16.13.4:7001 class add p_w_picpaths class2 --mindevcount=2 # mogadm --trackers=172.16.13.4:7001 class add p_w_picpaths class3 --mindevcount=2 # mogadm --trackers=172.16.13.4:7001 class list 查看创建的类文件
现在为止,终于将mogilefs 集群搭建完毕,接下来我们配置nginx反向代理服务器
5、Nginx服务器配置
基于第三方模块ningx-mogilefs-mudule=master 实现http反向代理
1)下载源码包nginx-1.4.7.tar.bz (自行官网下载即可) 下载nginx支持mogfile的第三方模块 nginx-mogilefs-module-master.zip 2)编译安装 # tar -xf nginx-1.4.7.tar.bz # unzip nginx-mogilefs-module-master.zip 创建nginx用户与组 # gourpadd -r nginx # useradd -r -g nginx nginx 开始编译安装 #cd nginx-1.4.7 #./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 --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --with-debug --add-module=../nginx-mogilefs-module-master # make && make install 3) 为nginx 提供服务脚本 # vim /etc/rc.d/init.d/nginx #!/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.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/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() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? 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 为此脚本赋予执行权限: # chmod +x /etc/rc.d/init.d/nginx 添加至服务管理列表,并让其开机自动启动: # chkconfig --add nginx # chkconfig nginx on 启动服务并测试: # service nginx start # ss -ntl | grep 80
4 )在分布式集群系统上上传几个图片和文件 172.16.13.2服务器上操作即可因为它是三个trackers之一 # mogupload --trackers=172.16.13.2:7001 --domain=p_w_picpaths --key='/p_w_picpaths/1.png' --file='/usr/share/backgrounds/default_1920x1200.png' # mogupload --trackers=172.16.13.2:7001 --domain=p_w_picpaths --key='/p_w_picpaths/2.png' --file='/usr/share/backgrounds/default_1920x1440.png' # mogupload --trackers=172.16.13.2:7001 --domain=files --key='/file/fstab.html --file='/etc/fstab' # moglistkeys --trackers=172.16.13.2:7001 --domain=p_w_picpaths
# mogfileinfo --trackers=172.16.13.3:7001 --domain=p_w_picpaths --key='/p_w_picpaths/1.png' 查看图片信息
5) 编辑nginx配置文件 在server段添加两个location,一个负责图片文件的访问,一个负责文本文件的访问控制 location ~* ^(/p_w_picpaths/.*)$ { mogilefs_tracker 172.16.13.3:7001; mogilefs_domain p_w_picpaths; mogilefs_pass $1 { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } location ~* ^(/file/.*)$ { mogilefs_tracker 172.16.13.2:7001; mogilefs_domain files; mogilefs_pass $1 { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } # service nginx restart 重读配置文件
客户端测试:文本文件
客户端测试:图片文件
nginx的反向代理实现
6)nginx 实现负载均衡调度 http段添加一个upstream,server中调用即可 #vim /etc/nginx/nginx.conf 重新编辑配置文件增加如下内容 upstream mogcluster { server 172.16.13.2:7001; server 172.16.13.3:7001; server 172.16.13.4:7001; } 其中一个location调用定义好的upstream location ~* ^(/p_w_picpaths/.*)$ { mogilefs_tracker mogcluster; mogilefs_domain p_w_picpaths; mogilefs_pass $1 { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } #service nginx restart
客户端测试
nginx负载均衡调度实现
PS:已实现nginx对后端mogileFS分布式集群的反向代理与负载均衡调度,水平有限,项目并不复杂,还需完善(mysql可以实现主从复制和读写分离,nginx服务器存在单点故障)如有错误之处请指出!