本文共 8924 字,大约阅读时间需要 29 分钟。
17年就不维护的程序包,可能在centos7有很多料想不到的不兼容的地方 前面演示到了可以使用mogadm将三个mogstored节点添加到集群中 每个节点贡献一个设备,每个设备就都能识别了
**对分布式存储来说,如果存储的都是较少量的单个巨大文件,避免一个文件在一个节点上存储时,占据空间过多而导致,空间占用失衡等问题,通常是将答文件切割成多个小片,每一块大概有一个固定大小(128M,64M之类的),每一个片当作一个独立的文件来管理,而且每一片按照我们所定义的最少副本数量进行冗余, 但是文件过小的话,应该将多个小文件,打包柔和成一个文件,比如放在一个64M的容器中,把这个容器当作副本冗余时的管控,以面把每一个文件当作单位使得监控的对象过多,管理起来,在实现所谓的迁移时,也过度凌乱和麻烦。 ** mogilefs比较适合存储海量小文件,之所以是因为mogilefs架构当中,它实现了将其元数据存放在mysql中,因此mysql存放了10000条,就表明存放了10000个文件的元数据,存1000w条就意味着有1000W文件的元数据,所以设计是用来存储海量小文件的 有些分布式存储的元数据不是放在mysql这样的存储中,而是放在内存中的,HDFS,就是如此,基于内存来存放元数据,且不说是否容易丢失,内存空间是有限的,一个文件占据几十K,一百万个就很大了,所以这种基于内存来实现文件系统管理的就不怎么适用存储数量太多的情形 HDFS存储百万级内的单个文件还是比较理想的,太多就不理想了 而mogilefs没有这样的限制,所有的元数据是在mysql数据库当中,能存多少文件,取决于数据库限制 对mogilefs来讲首先要解决的是,如何可以存大量的小文件,在多个节点上,为了方便完成副本的管理,尽可能不用单个文件为单位进行,而应该以容器为单位,这个容器在mogilefs上,不称为容器,叫做类,class,一个class可以放很多文件,其大小其实没有限制,每一个class其实是最小复制单位,意味着 第一个节点上class放了文件以后,在其他节点上,也应该有一个同类class,任何文件在第一个class存放了以后,如果第二个class是第一个class的副本,把同样文件再存都class副本一份 万一第二个节点宕机了,整个类就没有了,需要将类再第三个节点上启动起来,然后再冗余起来才可以 **再同一个目录中 ,不同文件不可以同名,因为是文件标识,所以一个目录可以理解为名称空间,namespace;名称空间代表命名的范围,对于linux主机或者windows主机来讲,每一个目录都会引入一个新的名称空间 比如再A目录下有test。txt文件,就不能再有同名的文件了,再B目录下则可以,所以每一个目录都是一个名称空间,可以再同一个名称空间下,名称是不能同名的,但是再不同的名称空间下,文件可以同名 对于linux来讲创建一个子目录太容易了 但是对于mogilefs并不是这样,它只是一个简单的存储,没有所谓的目录路径,所有文件都在一个平面上,因此像mogilefs内部存文件时,存第一个文件叫这个文件以后,其他的文件绝不能同名,因为没有子目录这一说,所有文件都不能同名,这样一来灵活性大大降低 **所谓为了避免这种现状,mogilefs引入了一个新的组件叫域,domain,一个domain就相当于一个文件名称空间, 对整个分布式文件系统来讲,是一个大的名称空间,这个大名称空间所有文件都不能同名,太不灵活了,于是我们创建一个又一个的域domain,只要域的名字不相同即可,不同域的内部。,文件名是可以相同的, 每个域依然是平面结构,里面是没有层级结构的, 至少这样子,在分布式存储上,多个文件叫同一个名字也已经可行了
那么域和class将如何区分,域包含class,域是一个更大的范畴,而class才是用来存放文件的,class作为最小复制单元而存在的 一个mogilefs可以有多个domain可以存放不同文件(可以基于大小,类型来分) 在同一个domain内,文件名必须唯一,文件名在mogilefs中,称为key,可以理解为每个文件都是kv存储的空间,因此每一个文件都需要一个唯一标识 不同的域内可以相同 class 是最小复制单元 只要用于文件属性管理 定义文件存储在不同设备上的份数 在mogilefs,文件定位方式是,文件所在域+文件的key来完成 ,每个文件key称为文件的FID存文件的时候为了可以让key重用,于是引入一个逻辑组件domain,来完成名称空间的隔离,隔离完成后,每一个名称空间内,其文件ID,所谓的key必须唯一,同时文件为了实现冗余,基于class来完成复制,文件都应该放在class内部,class复制所在何处,一个class对应的文件都在这个节点之上,定义class的份数,就相当于定义了文件副本的个数 所以下面的有些命令其实也可以理解了 mogadm domain class
当我们创建完设备以后,domain,class都有默认值 add添加domain 每个domain内部都有默认的class,叫default,定义每一个类至少存在 mindevcount=2就是两个设备上, 意味着,每一个存进来的文件,只要存在这个类里面,就应该有两份 做实验的时候推荐用centos6如果要实现类mogadm class 创建add 选项类型,包含哈希类型(是否进行哈希计算还是原来的明文格式),mindevcount每个类至少有几个副本, replpolicy是复制策略
replpolicy,multiplehosts()每个复制策略是要在不同主机上的,这样主机损坏时,不至于数据丢失 下面几条对存储空间逻辑是没什么关系 slave创建从服务器,因为一个节点故障以后,不管怎么讲都是副本减少了,设置从服务器,一个节点坏了,能立即让从服务器顶上来,类似冗余的方式提供备用 fsck 如果文件存储半道崩溃,存储了一个不完成的文件,fsck能做文件检测和修复的 rebalance 系统运行很久会发现,三个mogilestored的节点的,有的存了百分之50的数据,另外两个加起来才存了百分之50的数据,不均衡了,可以使用rebalance,重新均衡一下 新加一个节点进来也需要rebalance settings 设定集群的工作特性,哪些可以使用settings list 接口设定 协议模式是http协议,如果要交互,通过它的API交互。要想存文件,有专门的命令 上传文件 mogupload 获取文件 mogfetch 删除文件 mogdelete 看文件信息 mogfileinfo 列出文件的id moglistfids 列出文件的key moglistkeys 现在就可以使用upload来上传文件 这个key其实是url访问时候 的key路径,第一张图片定义为1.jpg –file 文件是哪个文件 把本地文件路径上传,而且指定url路径是什么 指定tracker 和domain就可以查看文件 信息了 devcount默认放在default当中,默认只上传一个,default count 应该是两个 http:xxxxxxid这个就是我们的fid 因此要访问这个文件,通过url可以直接访问的,因为是http协议的 可以查看帮助,可以指定class,指明key 再上传一个图片 key也不必要一定带斜线,这个key是将来做映射时使用的,真正访问的时候和期望访问的(期望访问的比如www.baidu.com/1.jpg) 以后要带映射的话,有没有斜线就很关键了 按道理如果定义2个这个fid就会显示两个存储。centos6是没有问题的,有可能是centos7的环境问题 文件在存储时确实会换位置,因为有三个存储节点 要想下载图片到本地,可以用,mogfetch 现在可以用nginx来进行反代,nginx反代以后直接使用url请求,nginx会拆分需要的内容,发送给tracker,再发送给mostored来获取,看到的是一个固定的url 需要有一个特定的模块,还需要编译nginx才能实现,因为这是一个第三方模块,得自己从头编译nginx,把这个模块补丁打进去才可以 每一个url可以映射到cluster 先安装开发环境 接下来把node2,3也成为tracker,先把配置文件复制过去 启动服务 node1上检测i两个tracker是否ok 还可以三个一块给,找不到67,就找68,68找不到,找69pcre处理正则表达式,openssl能够支持https
创建nginx用户 这个nginx包应该下载nginx。1.10。3的版本,在后面有解决安装的方案 ./configure \ –prefix=/usr \ 安装路径 –sbin-path=/usr/sbin/nginx \ 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 \ 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= 添加第三方模块 make && make install 应该是新版nginx不兼容的问题 老版本试试 还报错换成1.4试试 configure只是编译时出错了 另外一个窗口重新编译1.10,configure生成makefile文件 安装好了 make 的时候忽略一个警报信息 如果遇到错误,可使用如下编译命令: make CFLAGS="-pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g"安装好后对nginx需要做一个简单配置然后启动
3、为nginx提供SysV init脚本:新建文件/etc/rc.d/init.d/nginx,内容如下:
#!/bin/sh. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ “$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() {
user=nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -
$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 N G I N X C O N F F I L E r e t v a l = NGINX_CONF_FILE retval= NGINXCONFFILEretval=? echo [ $retval -eq 0 ] && touch $lockfile return $retval }stop() {
echo -n $"Stopping $prog: " killproc p r o g − Q U I T r e t v a l = prog -QUIT retval= prog−QUITretval=? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval }restart() {
configtest || return $? stop sleep 1 start }reload() {
configtest || return $? echo -n $"Reloading $prog: " killproc n g i n x − H U P R E T V A L = nginx -HUP RETVAL= nginx−HUPRETVAL=? 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 基于nginx来反代用户请求到分布式文件系统 mogilefs_pass 如何把内容传递到后端去 首先反代到主机上 反代时隐藏某个首部 、反代是要不要关闭缓冲池 反代时只反代哪些种方法 mogilefs反代到哪个类哪个域 mogilefs反代的tracker地址是什么 upstream还可以负载均衡 连接发生,读取的超时时间 配置实例, error_log logs/error.log notice;working_directory /usr/local/nginx;
http {
include mime.types; default_type application/octet-stream;server { listen 80; # # This location could be used to retrieve files from MogileFS. # It is publicly available. # location /download/ { 上传文件可能要用download映射了 # # Query tracker at 192.168.2.2 for a file with the key # equal to remaining part of request URI # mogilefs_tracker 192.168.2.2; mogilefs_domain example_domain; mogilefs_pass { 隐藏一些首部 proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } # # This location could be used to store or delete files in MogileFS. # It may be configured to be accessable only from local network. # location /upload/ { allow 192.168.2.0/24; deny all; mogilefs_tracker 192.168.2.2; mogilefs_domain example_domain; mogilefs_methods PUT DELETE; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } }}
}
主要是server端修改的多 像后端怎么传递,mogile_pass,可以定义class png reload以后尝试访问一下,可能跟我们之前上传的url路径有关 查看日志 没说什么错,那就可能上传文件路径的key必须要重新指定一下 现在就可以了,nginx直接访问,能自动找到后端文件这个配置只调用来了一个tracker,如果这个tracker坏了就调不上去了,因此可以把node2,3tracker加进来
多tracker定义成集群即可 首先在,http段定义一个upstream 再去访问 再去上传一个图片 现在无论各个图片上传了只有一个副本,这个个centos7上的perl环境有关系 nginx主机可以反代到后端主机集群,程序能调用API就能允许用户管理上传用户的,nginx主机假如只有一个,也可能进行故障,, 刚才的nginx,装两次,配置一模一样,前面的vrnish做健康状态监测向后端调度,keepalived slave这一项,并没有什么作用 fsck有可能会使用,文件系统一致性监测的,命令有可能运行半天,还会影响IO,在访问量较小的时候进行, status报告状态 如果晚上监测到白天还没结束,用户开始访问了可以使用stop print log 可以看到过去监测结果 文件有4个, fid8个 unixtime 每个时间戳 rebalance需要做重新均衡的 test 没有定义均衡策略(基于大小,cpu占用率等,文件数,文件空间) settings 来显示rebalance setting 可以去官方文档看看policy有哪些字符串 如果policy不让用了。可以用reset重置一下 用的时候最多偶尔用到fsck,加减节点,然后rebalance一下 其他就没什么转载地址:http://pdkgn.baihongyu.com/