设为首页 收藏本站
查看: 1209|回复: 0

[经验分享] 海量图片存储

[复制链接]

尚未签到

发表于 2019-2-1 07:31:05 | 显示全部楼层 |阅读模式
  分布式存储
  

  当下互联网飞速发展,海量并发所产生的数据量以几何方式增长,随着信息链接方式日益多样化,数据存储的结构也发生了变化,在这样的压力下我们不得不重新审视大量数据的存储所带来的挑战,比如:数据采集、数据存储、数据搜索、数据共享、数据传输、数据分析、数据可视化等一些列问题
  传统存储在面对海量数据存储时已经力不从心,比如纵向扩展受阵列空间限制、横向扩展受交换设备限制、节点受文件系统限制
  

  分布式存储的出现在在一定程度上缓解了这一问题
  

  

  分布式存储基础介绍
  

(一)多线程与进程的执行模式
#互不通信的多线程模式;
#基于共享容器协同的多线程模式;
#通过事件协同的多线程模式;
(二)基于输入设备变化、运算器的变化、存储器的变化分类
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 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 images
# mogadm --trackers=172.16.13.4:7001 domain list

  

  

7)在域(domain)中添加类(class)文件
### class 是在mystore中最小存储与复制单元
为images域创建几个class文件
# mogadm --trackers=172.16.13.4:7001 class add images class0 --mindevcount=2  至少2个副本
# mogadm --trackers=172.16.13.4:7001 class add images class1 --mindevcount=2
# mogadm --trackers=172.16.13.4:7001 class add images class2 --mindevcount=2
# mogadm --trackers=172.16.13.4:7001 class add images 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=images --key='/images/1.png' --file='/usr/share/backgrounds/default_1920x1200.png'
# mogupload --trackers=172.16.13.2:7001 --domain=images --key='/images/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=images

  

# mogfileinfo --trackers=172.16.13.3:7001 --domain=images --key='/images/1.png'  查看图片信息

  

  

5) 编辑nginx配置文件
在server段添加两个location,一个负责图片文件的访问,一个负责文本文件的访问控制
location ~* ^(/images/.*)$  {
mogilefs_tracker 172.16.13.3:7001;
mogilefs_domain images;
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 ~* ^(/images/.*)$  {
mogilefs_tracker mogcluster;
mogilefs_domain images;
mogilefs_pass $1 {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
#service nginx  restart  

  客户端测试

  

  nginx负载均衡调度实现
  

  PS:已实现nginx对后端mogileFS分布式集群的反向代理与负载均衡调度,水平有限,项目并不复杂,还需完善(mysql可以实现主从复制和读写分离,nginx服务器存在单点故障)如有错误之处请指出!
  

  

  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670207-1-1.html 上篇帖子: mogilefs实现企业级分布式存储 下篇帖子: 基于mogileFS搭建分布式文件系统
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表