mogilefs
http://soulboy.blog.51cto.com/4007306/1338192
#######################################################################
-
数据存储的趋势和大数据带来的挑战
-
分布式存储与CAP定理
-
分布式存储文件系统
-
Mogilefs基本原理
-
Mogilefs实现
-
Nginx反向代理Tracker节点
#######################################################################
数据存储的趋势和大数据带来的挑战
当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化。在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集、数据存储、数据搜索、数据共享、数据传输、数据分析、数据可视化等一系列问题。
传统存储在面对海量数据存储表现出的力不从心已经是不争的事实,例如:纵向扩展受阵列空间限制、横向扩展受交换设备限制、节点受文件系统限制。
然而分布式存储的出现在一定程度上有效的缓解了这一问题,之所以称之为缓解是因为分布式存储在面对海量数据存储时也并非十全十美毫无压力,依然存在的难点与挑战例如:节点间通信、数据存储、数据空间平衡、容错、文件系统支持等一系列问题仍处在不断摸索和完善中。
分布式存储与CAP定理
首先要说明的是一个完美分布式系统有三个最重要的元素,他们分别是:
一致性(Consistency):任何一个读操作总是能读取之前完成的写操作。
可用性(Availability):每次操作总是能够在预定时间返回。
分区容错性(Partition Tolerance):在出现网络分区(分布式)的情况下,仍然能够满足一致性和可用性。
2007年,正当所有科学家都在致力于CAP三元素并存的时候,Eric.Brewer教授站了出来并指出CAP永远无法兼顾,只能根据具体应用来权衡和取舍,并且至多两个元素可以共存,后来由两位麻省理工学院的科学家证明此观点是具有前瞻性的,由此形成Brewer的CAP定理。
正所谓鱼和熊掌不可兼得,关注一致性就需要处理因系统不可用而带来写操作失败的情况,反之关注可用性就无法保证每次都能读取到最新的写入操作。传统关系型数据库侧重于CA,而非关系型键值数据库则侧重于AP。
对于大型站点,可用性(Availability)与分区容错性(Partition Tolerance)的优先级会高于一致性(Consistency),这里并不是指完全舍弃一致性,而是通过其他手段实现数据的弱一致性,例如:用户微博的浏览数和评论可以容忍相对长时间的不一致,几乎不会影响用户体验,而股票价格的数据则异常敏感,即便是10秒钟的数据不一致也无法容忍,为了能更形象的了解所谓“各种一致性”需要进行一下内容的回顾。
强一致性(ACID):在单机环境中,强一致性可以由数据库的事务来保证;在分布式环境中,强一致性很难做到,即便是做到也会因为分布式事物所带来的性能低下,不适合在互联网的环境中应用。
弱一致性(包括最终一致性):系统不能保证后续访问返回最新的值,在访问到最新值之前这段时间称之为不一致窗口。
最终一致性:是弱一致性的一种特例,存储系统保证如果对象有多次更新,在渡过不一致窗口之后必将放回最后更新的值。
服务器的一致性:N代表节点的个数;W代表更新的时候需要确认已经被更新的节点个数;R代表读取数据需要的节点数量。
W + R > N ----> 强一致性(通常N=3,W=R=2)
W=N,R=1 ----> 最佳读
W=1,R=N ----> 最佳写
W + R <= N ----> 弱一致性
分布式存储文件系统
Google Filesystem | GFS+MapReduce擅长处理单个大文件 |
Hadoop Distributed Filesystem | GFS的山寨版+MapReduce,擅长处理单个大文件 |
ClusterFS | 擅长处理单个大文件 |
Taobao Filesystem | 擅长处理海量小文件 |
MogileFS | 擅长处理海量小文件 |
Ceph | 是一个 Linux PB级别的分布式文件系统 |
MooseFS | 通用简便,适用于研发能力不强的公司 |
Lustre | 一种平行分布式文件系统 |
Mogilefs基本原理
MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。MogileFS是一个开源的分布式文件系统。主要特性包括:应用层的组件、无单点故障、自动文件复制、具有比RAID更好的可靠性、无需RAID支持等……核心角色如下:
tracker节点:借助数据库保存各节点文件的元数据信息保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。
database节点:为tracker节点提供数据存取服务。
storage节点:将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点由于使用http进行数据传输,因此依赖于perlbal,storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)。
Domain:一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器。
Host:每一个存储节点称为一个主机,一个主机上可以有多个存储设备(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。
Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数。
流程图如下:
1、应用层发起GET请求到Nginx。
2、Nginx根据负载均衡机制随机代理到后台Node one。
3、Node one向从服务器发起查询请求。
4、从服务器返回查询结果。
5、Node one将查询结果返回给Nginx。
6、Nginx将查询结果根据模块转换为合理的url方位Node three。
7、Node Three将文件内容通过http协议返回给Nginx。
8、Nginx将结果返回给应用层的请求。
Mogilefs实现
由于各角色和服务之间都是基于套接字通信,就服务本身来说没有耦合性,所以可以使用少量机器运行多种服务角色,功能图如下:
1、通过Nginx+Keepalived实现高可用的负载均衡,通过upstream模块可以有选择性的转发应用层的请求至后端tracker节点。
2、DRBD+Corosync+Pacemaker的机制保证了Mysql的高可用,详细配置请参阅博文:DAS之mysql高可用解决方案。
3、为了进一步提升Mysql的性能引入从节点为其分摊读操作,从节点的数据可以根据具体业务规模来设定,如果使用数据库代理进行读写分离,代理会成为单点故障,则需要为代理做高可用,另外Tracker节点支持手动为其指定从节点,因此可以根据自己的喜好,Mysql代理和复制相关实现请参阅博文:Mysql复制及代理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
##### Database节点 安装mariadb 授权 GRANT ALL ON *.* TO 'root' @ '%' IDENTIFIED BY 'mypass' ; CREATE DATABASE mogilefs; GRANT ALL ON mogilefs.* TO 'moguser' @ '%' IDENTIFIED BY 'mogpass' ; FLUSH PRIVILEGES; ##### Tracker节点(可以是所有节点) 安装 mogilefs 修改配置文件如下 vim /etc/mogilefs/mogilefsd .conf daemonize = 1 pidfile = /var/run/mogilefsd/mogilefsd .pid db_dsn = DBI:mysql:mogilefs:host=192.168.1.241 db_user = moguser db_pass = mogpass listen = 0.0.0.0:7001 conf_port = 7001 query_jobs = 100 delete_jobs = 1 replicate_jobs = 5 reaper_jobs = 1 service mogilefsd start #启动服务 ss -tanlp (LISTEN 0 128 192.168.1.241:7001 ) ##### storage节点(可以是所有节点) 安装 mogilefs mkdir /mogdata/dev1 -pv #创建设备目录 chown -R mogilefs.mogilefs /mogdata/dev2/ #权限 vim /etc/mogilefs/mogstored .conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogdata #目录级别 service mogstored start ss -tanlp (*:7500) ##### tracker节点添加storage节点和常用命令 mogadm check #检测节点 mogadm host list #每个存储节点称为一个host mogadm host add 192.168.1.213 --ip=192.168.1.213 --ip=192.168.1.213 --status=alive #添加第一个存储节点 mogadm host add 192.168.1.242 --ip=192.168.1.242 --ip=192.168.1.242 --status=alive #添加第一个存储节点 mogadm host add 192.168.1.241 --ip=192.168.1.241 --ip=192.168.1.241 --status=alive #添加第一个存储节点 mogadm device add 192.168.1.213 1 #添加第一个设备,设备号唯一不能重名 mogadm device add 192.168.1.242 2 #添加第二个设备 mogadm device add 192.168.1.241 3 #添加第三个设备 mogadm check #可以查看状态 mogadm domain add files #创建文件存储域 mogadm domain add images #创建图片存储域 mogadm domain list #查看所有域 mogupload --trackers=192.168.1.241 --domain=files --key= '/fstab' -- file = '/etc/fstab' #上传fstab文件,key为'/fstab' mogfileinfo --trackers=192.168.1.241 --domain=files --key= '/fstab' #根据key查看文件存放信息 |
注释:mogupload工具是为了测试,实际环境中上传是由程序员在代码中使用mogilefs的API进行交互。
Nginx反向代理Tracker节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
##### 配置Nginx 安装tng yum install pcre-devel -y yum groupinstall "Development Tools" "Server Platform Development" yum install libxslt-devel gd-devel lua-devel geoip-devel tengine-1.5.1. tar .gz nginx-mogilefs-module-master.zip #mogilefs模块需要打补丁 mkdir -pv /var/tmp/nginx/client #模块需要 unzip nginx-mogilefs-module-master.zip useradd -r nginx . /configure \ --prefix= /usr/local/nginx \ --sbin-path= /usr/local/nginx/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 \ -- enable -mods-shared=all \ --add-module= /nginx-mogilefs-module-master make && make install vim /etc/profile .d /nginx .sh export PATH= /usr/local/nginx/sbin :$PATH . !$ 提供脚本..... 配置nginx vim /etc/nginx/nginx .cfg upstream trackers { server 192.168.1.242:7001 weight=1; server 192.168.1.213:7001 weight=1; server 192.168.1.241:7001 backup; check interval=3000 rise=2 fall=5 timeout=1000; check_http_send "GET / HTTP/1.0\r\n\r\n" ; check_http_expect_alive http_2xx http_3xx; } location /jpg/ { mogilefs_tracker trackers; mogilefs_domain images; mogilefs_methods GET; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } ##### 配置keepalived 安装keepalived vim /etc/keepalived/keepalived .conf # backup priority 99 global_defs { notification_email { root@localhost } notification_email_from admin@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LTT } vrrp_script chk_nginx { script "killall -0 nginx" interval 1 weight -2 fall 2 rise 1 } vrrp_instance IN_1 { state MASTER interface eth0 virtual_router_id 22 priority 100 advert_int 1 authentication { auth_type PASS auth_pass aaaa } virtual_ipaddress { 192.168.1.222 } track_script { chk_nginx } } |
查看负载节点:
模拟GET方法测试Nginx_mogilefs模块:
本文出自 “星矢” 博客,转载请与作者联系!
..........
http://my.oschina.net/u/1259000/blog/182277
- MogileFS-2.44 安装与配置
- 一、MogileFS 介绍< xmlnamespace prefix ="o" />
- 1.1、环境
- 2.1、Mysql安装
- 2.2、安装MogileFS 相关Perl模块
- 2.3、MogileFS Server 安装
- 2.4、MogileFS Storage 存储节点安装
- 三、MogileFS 配置
- 3.1、mysql数据库设置
- 3.2、创建mysql连接
- 3.3、创建Tracker配置文件
- 3.4、MogileFS 启动与停止
- 3.5、MogileFS Storage 节点配置
- 3.6、启动MogileFS Storage 节点
- 四、管理配置MogileFS
- 4.1、添加Storeage节点到Tracker
- 4.2、在存储节点中添加设备
- 4.3、在存储节点中使设备失效
- 4.4、添加域和类
- 4.5、查看域和tracker节点
- 4.6、mogadm 详细参数
- 五、MogileFS PHP扩展模块
- 5.1、安装MogileFS PHP扩展
- 5.2、添加MogileFS PHP模块
- 六、MogileFS Nginx 模块安装
- 6.1、下载Nginx_mogilefs_module
- 6.2、添加Nginx_mogilefs_module模块
- 6.3、配置Nginx_mogilefs_module 模块
- 七、Mogtool 工具创建文件和读取文件内容
- 7.1、创建文件
- 7.2、读取文件
- 八、FUSE API 挂载 MogileFS文件系统
- 8.1、安装操作系统相应fuse支持
- 8.2、安装Perl Fuse支持
- 8.3、Mount MogileFS文件系统
- 8.4、查看MogileFS系统文件
- 九、MogileFS参考资料
MogileFS-2.44 安装与配置
一、MogileFS 介绍< xmlnamespace prefix ="o" />
1.1、环境
MogileFS 相关服务器
|
IP
|
系统
|
|
Tracker ( 调度器 )
|
192.168.0.11
|
Centos 5.5 x32
|
|
Storage Nodes 1 ( 存储节点 1)
|
192.168.0.22
|
Centos 5.5 x32
|
|
Storage Nodes 2 ( 存储节点 2)
|
192.168.0.33
|
Centos 5.5 x32
|
|
Mysql
|
192.168.0.44
|
Centos 5.5 x32
|
|
2.1、Mysql安装
2.2、安装MogileFS 相关Perl模块
2.3、MogileFS Server 安装
2.4、MogileFS Storage 存储节点安装
三、MogileFS 配置
3.1、mysql数据库设置
3.2、创建mysql连接
3.3、创建Tracker配置文件
3.4、MogileFS 启动与停止
3.5、MogileFS Storage 节点配置
3.6、启动MogileFS Storage 节点
四、管理配置MogileFS
4.1、添加Storeage节点到Tracker
4.2、在存储节点中添加设备
4.3、在存储节点中使设备失效
4.4、添加域和类
4.5、查看域和tracker节点
4.6、mogadm 详细参数
五、MogileFS PHP扩展模块
5.1、安装MogileFS PHP扩展
5.2、添加MogileFS PHP模块
六、MogileFS Nginx 模块安装
6.1、下载Nginx_mogilefs_module
6.2、添加Nginx_mogilefs_module模块
6.3、配置Nginx_mogilefs_module 模块
七、Mogtool 工具创建文件和读取文件内容
7.1、创建文件
7.2、读取文件
八、FUSE API 挂载 MogileFS文件系统
8.1、安装操作系统相应fuse支持
8.2、安装Perl Fuse支持
8.3、Mount MogileFS文件系统
8.4、查看MogileFS系统文件
九、MogileFS参考资料
http://luojianlong.blog.51cto.com/4412415/1393547
一、关于MogileFS
MongileFS是一个由Perl开发的分布式文件系统,遵循CAP理论,即Consistency:数据的一致性;Availability:数据的可用性;Tolerance of network Partition:数据的容错性;而这里的MongileFS满足了后俩者,也就是只满足数据的可用性和容错性,对于大型网站,数据的可用性和容错性要优先于数据的一致性。
MongileFS使用一致性hash来解决数据的可用性,使用虚拟节点来解决数据倾斜的问题;MongileFS特别适合存储海量小文件的数据,与之类似的分布式文件系统还有:FastDFS,MooseFS等,也适合存储海量小文件。
MongileFS的特性:
1、应用层实现,不需要特殊的核心组件;
2、无单点失败,MogileFS分布式文件存储系统安装的三个组件(存储节点、跟踪器、跟踪用的数据库),均可运行在多个机器上,因此没有单点失;
3、自动的文件复制 — 基于不同的文件“分类”,文件可以被自动的复制到多个有足够存储空间的存储4节点上,这样可以满足这个“类别”的最少复制要求;
4、简单的命名空间 –文件通过一个给定的key来确定,是一个全局的命名空间.你可以自己生成多个命名空间,只要你愿意,不过这样可能在同一MogileFS中会造成key冲突;
5、不用共享任何东西 — MogileFS分布式文件存储系统不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘;
实现MogileFS分布文件系统所需要的主机角色:
1、Tracker(MogileFSd 进程):这个是 MogileFS 的核心部分,他是一个调度器,MogileFSd 进程就是trackers进程程序,trackers 做了很多工作:Replication ,Deletion,Query,Reaper,Monitor 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed),,包括将请求负载平衡到多个“query workers”中,然后让 MogileFSd 的子进程去处理;
2、MySQL:用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里),是Trackers 来操作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议做成HA架构;
3、Storage Nodes:实际文件存放的地方,存储节点是一个HTTP服务器,用来做删除,存放,重命名等事情,任何WebDAV服务器都可以, 不过推荐使用mogstored,MogileFSd 可以配置到两个机器上使用不同端口,mogstored来进行所有的DAV操作和流量,IO监测, 并且你自己选择的HTTP服务器(默认为 perlbal)用来做GET操作给客户端提供文件。
MogileFS管理的几个概念:
1、Domain:一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型),同一个Domain内key必须为一,不同Domain内,key可以相同;
2、Class:文件属性管理,定位文件存储在不同设备上的份数;
二、MongileFS工作原理图
三、实验环境
10.232.50.239 OS:CentOS 6.4 x86_64 node1.luojianlong.com
10.232.42.218 OS:CentOS 6.4 x86_64 node2.luojianlong.com
10.232.42.219 OS:CentOS 6.4 x86_64 node3.luojianlong.com
拓扑图
首先,分别在node1,node2,node3上面安装cpan以及依赖的包
1
2
3
|
[root@node1 ~] # yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan [root@node2 ~] # yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan [root@node3 ~] # yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan |
使用cpan命令安装MogileFS::Server,MogileFS::Client,以及依赖的模块,前提是主机能够上互联网
1
2
3
4
5
6
7
8
9
10
|
# 安装过程中,如有提示安装依赖的模块,直接回答yes即可 [root@node1 ~] # cpan -i install MogileFS::Server [root@node1 ~] # cpan -i install MogileFS::Client [root@node1 ~] # cpan -i install MogileFS::Utils [root@node2 ~] # cpan -i install MogileFS::Server [root@node2 ~] # cpan -i install MogileFS::Client [root@node2 ~] # cpan -i install MogileFS::Utils [root@node3 ~] # cpan -i install MogileFS::Server [root@node3 ~] # cpan -i install MogileFS::Client [root@node3 ~] # cpan -i install MogileFS::Utils |
安装完成以后,在node1上面安装mysql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@node1 ~] # useradd -r mysql [root@node1 ~] # tar zxvf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ [root@node1 ~] # cd /usr/local/ [root@node1 local ] # ln -s mysql-5.5.33-linux2.6-x86_64 mysql [root@node1 local ] # cd mysql [root@node1 mysql] # chown -R root.mysql ./* [root@node1 mysql] # mkdir /mydata/data -p [root@node1 mysql] # chown -R mysql.mysql /mydata/data/ [root@node1 mysql] # cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@node1 mysql] # chmod +x /etc/rc.d/init.d/mysqld [root@node1 mysql] # chkconfig --add mysqld [root@node1 mysql] # chkconfig mysqld on [root@node1 mysql] # cp support-files/my-large.cnf /etc/my.cnf [root@node1 mysql] # ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data [root@node1 mysql] # vi /etc/my.cnf # 添加如下俩行 datadir = /mydata/data innodb_file_per_table = 1 [root@node1 mysql] # vi /etc/profile.d/mysql.sh export PATH= /usr/local/mysql/bin :$PATH [root@node1 mysql] # . /etc/profile.d/mysql.sh [root@node1 mysql] # service mysqld start Starting MySQL.... SUCCESS! |
创建Tracker连接mysql的远程用户
1
2
3
4
|
mysql> grant all on *.* to 'root' @ '%' identified by '123456' ; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) |
配置Tracker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
[root@node1 ~] # useradd -r mogilefs [root@node1 ~] # mkdir /var/run/mogilefsd/ -p [root@node1 ~] # chown -R mogilefs.mogilefs /var/run/mogilefsd [root@node1 ~] # mkdir /etc/mogilefs/ # 编辑配置文件:/etc/mogilefs/mogilefsd.conf [root@node1 ~] # vi /etc/mogilefs/mogilefsd.conf db_dsn = DBI:mysql:mogilefs:host=10.232.50.239;port=3306;mysql_connect_timeout=5 db_user = mogile db_pass = 123456 conf_port = 7001 listener_jobs = 5 node_timeout = 5 rebalance_ignore_missing = 1 # 编写mogilefsd启动脚本 [root@node1 ~] # vi /etc/rc.d/init.d/mogilefsd #!/bin/bash # # mogilefsd - Startup script for the MogileFS tracker # # chkconfig: - 85 15 # description: MogileFS tracker # processname: mogilefsd # config: /etc/mogilefs/mogilefsd.conf # pidfile: /var/run/mogilefsd/mogilefsd.pid # Source function library. . /etc/rc .d /init .d /functions # Path to the apachectl script, server binary, and short-form for messages. lockfile=${LOCKFILE- /var/lock/subsys/mogilefsd } RETVAL=0 prog=$( which mogilefsd) start() { ulimit -n 65535 echo -n $ "Starting mogilefsd" su - mogilefs -c "$prog -c /etc/mogilefs/mogilefsd.conf --daemon" RETVAL=$? [ $RETVAL = 0 ] && success && touch ${lockfile} || failure echo return $RETVAL } stop() { echo -n $ "Stopping mogilefsd" netstat -nlp| grep "mogilefsd" | grep - v grep | awk '{print $7}' | awk -F "/" '{print $1}' | xargs kill -9 RETVAL=$? [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure echo } reload() { echo -n $ "Reloading mogilefsd: " killall mogilefsd -HUP RETVAL=$? [ $RETVAL = 0 ] && success || failure echo } case "$1" in start) start ;; stop) stop ;; status) status mogilefsd RETVAL=$? ;; restart) stop sleep 1 start ;; reload) reload ;; *) echo $ "Usage: mogilefsd {start|stop|restart|reload|status}" exit 1 esac exit $RETVAL [root@node1 ~] # chmod +x /etc/rc.d/init.d/mogilefsd [root@node1 ~] # chkconfig --add mogilefsd [root@node1 ~] # chkconfig mogilefsd on # 初始化数据库 [root@node1 ~] # mogdbsetup --dbhost=127.0.0.1 --dbrootuser=root --dbpass=123456 --dbname=mogilefs --dbuser=mogile --dbpassword=123456 This will attempt to setup or upgrade your MogileFS database. It won't destroy existing data. Run with --help for more information. Run with -- yes to shut up these prompts. Continue? [N /y ]: y Create /Upgrade database name 'mogilefs' ? [Y /n ]: y Grant all privileges to user 'mogile' , connecting from anywhere, to the mogilefs database 'mogilefs' ? [Y /n ]: y [root@node1 ~] # ln -s /usr/local/bin/mogilefsd /usr/bin/ [root@node1 ~] # ln -s /usr/local/bin/mogilefsd /usr/sbin/ [root@node1 ~] # service mogilefsd start Starting mogilefsd [ OK ] [root@node1 ~] # ss -anptl Recv-Q Send-Q Local Address:Port Peer Address:Port 0 128 :::22 :::* users :(( "sshd" ,8066,4)) 0 128 *:22 *:* users :(( "sshd" ,8066,3)) 0 128 *:7001 *:* users :(( "mogilefsd" ,3444,6)) 0 50 *:3306 *:* users :(( "mysqld" ,1003,11)) # 启动成功 # 在node2,node3上面执行相同的操作,安装mogilefsd,不需要初始化数据 |
配置mogstored
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
# 编辑mogstored配置文件 [root@node1 ~] # vi /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogdata [root@node1 ~] # mkdir /mogdata/dev1 [root@node1 ~] # chown -R mogilefs.mogilefs /mogdata/dev1 # 编写mogstored启动脚本 [root@node1 ~] # vi /etc/rc.d/init.d/mogstored #!/bin/bash # # mogstored - Startup script for the MogileFS storage # # chkconfig: - 86 14 # description: MogileFS storage # processname: mogstored # config: /etc/mogilefs/mogstored.conf # pidfile: /var/run/mogilefsd/mogstored.pid # Source function library. . /etc/rc .d /init .d /functions # Path to the apachectl script, server binary, and short-form for messages. lockfile=${LOCKFILE- /var/lock/subsys/mogstored } RETVAL=0 configfile= '/etc/mogilefs/mogstored.conf' prog=$( which mogstored) start() { ulimit -n 65535 echo -n $ "Starting mogstored" su - mogilefs -c "$prog -c $configfile --daemon" &> /dev/null RETVAL=$? [ $RETVAL = 0 ] && success && touch ${lockfile} || failure echo return $RETVAL } stop() { echo -n $ "Stopping mogstored" netstat -nlp| grep "mogstored" | grep - v grep | awk '{print $7}' | awk -F "/" '{print $1}' | xargs kill -9 RETVAL=$? [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure echo } reload() { echo -n $ "Reloading mogstored: " killall mogstored -HUP RETVAL=$? [ $RETVAL = 0 ] && success || failure echo } case "$1" in start) start ;; stop) stop ;; status) status mogstored RETVAL=$? ;; restart) stop sleep 1 start ;; reload) reload ;; *) echo $ "Usage: mogstored {start|stop|restart|reload|status}" exit 1 esac exit $RETVAL [root@node1 ~] # chmod +x /etc/rc.d/init.d/mogstored [root@node1 ~] # chkconfig --add mogstored [root@node1 ~] # chkconfig mogstored on [root@node1 ~] # ln -s /usr/local/bin/mogstored /usr/bin/ [root@node1 ~] # ln -s /usr/local/bin/mogstored /usr/sbin/ [root@node1 ~] # service mogstored start Starting mogstored [ OK ] [root@node1 ~] # ss -anptl Recv-Q Send-Q Local Address:Port Peer Address:Port 0 128 *:7500 *:* users :(( "mogstored" ,5108,4)) 0 128 *:7501 *:* users :(( "mogstored" ,5108,9)) 0 128 :::22 :::* users :(( "sshd" ,8066,4)) 0 128 *:22 *:* users :(( "sshd" ,8066,3)) 0 128 *:7001 *:* users :(( "mogilefsd" ,3444,6)) 0 50 *:3306 *:* users :(( "mysqld" ,1003,11)) # 启动成功 # node2,node3执行相同的操作,对应的存储目录为/mogdata/dev2,/mogdata/dev3 |
在node2上面编译安装nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
[root@node2 ~] # yum -y groupinstall "Development Tools" "Server Platform Deveopment" [root@node2 ~] # yum -y install openssl-devel pcre-devel [root@node2 ~] # groupadd -r nginx [root@node2 ~] # useradd -r -g nginx nginx # 解压nginx的第三方模块mogilefs模块 [root@node2 ~] # unzip nginx-mogilefs-module-master.zip [root@node2 ~] # tar zxvf nginx-1.4.2.tar.gz [root@node2 ~] # cd nginx-1.4.2 [root@node2 nginx-1.4.2] # ./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 \ > --add-module= /root/nginx-mogilefs-module-master [root@node2 nginx-1.4.2] # make && make install [root@node2 nginx-1.4.2] # mkdir /var/tmp/nginx/client -p [root@node2 nginx-1.4.2] # nginx |
Nginx 做为 MogileFS 的前端客户端,我们使用Nginx来吐文件,做前端的查询代理时,我们需要使用到mogilefs的这个模块,可以下载这个模块编译进Nginx就行了,直接使用 ./configure -add-module=这个参数就可以了,最新的这个模块的下载地址是:https://github.com/vkholodkov/nginx-mogilefs-module
在node1上,使用mogadm添加节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@node1 ~] # mogadm host add 10.232.50.239 --ip=10.232.50.239 --status=alive [root@node1 ~] # mogadm host add 10.232.42.218 --ip=10.232.42.218 --status=alive [root@node1 ~] # mogadm host add 10.232.42.219 --ip=10.232.42.219 --status=alive [root@node1 ~] # mogadm check Checking trackers... 127.0.0.1:7001 ... OK Checking hosts... [ 1] 10.232.50.239 ... OK [ 2] 10.232.42.218 ... OK [ 3] 10.232.42.219 ... OK Checking devices... host device size(G) used(G) free (G) use% ob state I /O % ---- ------------ ---------- ---------- ---------- ------ ---------- ----- ---- ------------ ---------- ---------- ---------- ------ total: 0.000 0.000 0.000 0.00% # 添加host成功 |
为每个host添加device
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@node1 ~] # mogadm device add 10.232.50.239 1 [root@node1 ~] # mogadm device add 10.232.42.218 2 [root@node1 ~] # mogadm device add 10.232.42.219 3 [root@node1 ~] # mogadm check Checking trackers... 127.0.0.1:7001 ... OK Checking hosts... [ 1] 10.232.50.239 ... OK [ 2] 10.232.42.218 ... OK [ 3] 10.232.42.219 ... OK Checking devices... host device size(G) used(G) free (G) use% ob state I /O % ---- ------------ ---------- ---------- ---------- ------ ---------- ----- [ 1] dev1 7.472 2.443 5.029 32.69% writeable N /A [ 2] dev2 7.472 1.839 5.633 24.61% writeable N /A [ 3] dev3 7.472 1.647 5.825 22.04% writeable N /A ---- ------------ ---------- ---------- ---------- ------ total: 22.416 5.928 16.488 26.45% # 添加成功 |
添加domain
1
2
3
4
5
6
7
8
|
[root@node1 ~] # mogadm domain add files [root@node1 ~] # mogadm domain add images [root@node1 ~] # mogadm domain list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 MultipleHosts() NONE images default 2 MultipleHosts() NONE # 发现已经自动添加了default class |
上传文件测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@node1 ~] # mogupload --trackers=10.232.50.239 --domain=files --key='/fstab' --file='/etc/fstab' [root@node1 ~] # mogfileinfo --trackers=10.232.50.239 --domain=files --key='/fstab' - file : /fstab class: default devcount: 3 domain: files fid: 5 key: /fstab length: 463 - http: //10 .232.42.219:7500 /dev3/0/000/000/0000000005 .fid - http: //10 .232.42.218:7500 /dev2/0/000/000/0000000005 .fid # 可以看到文件被自动保存为2个副本 [root@node1 ~] # curl http://10.232.42.218:7500/dev2/0/000/000/0000000005.fid /dev/xvda1 / ext3 noatime,acl,user_xattr 1 1 /dev/xvdc swap swap defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 # 可以正常访问 |
模拟down掉一个节点,看文件会不会丢失
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[root@node1 ~] # mogadm host mark 10.232.42.218 down [root@node1 ~] # mogadm check Checking trackers... 127.0.0.1:7001 ... OK Checking hosts... [ 1] 10.232.50.239 ... OK [ 2] 10.232.42.218 ... skipping; status = down [ 3] 10.232.42.219 ... OK Checking devices... host device size(G) used(G) free (G) use% ob state I /O % ---- ------------ ---------- ---------- ---------- ------ ---------- ----- [ 1] dev1 7.472 2.443 5.029 32.70% writeable N /A [ 3] dev3 7.472 1.648 5.824 22.05% writeable N /A ---- ------------ ---------- ---------- ---------- ------ total: 14.944 4.091 10.853 27.37% [root@node1 ~] # mogfileinfo --trackers=10.232.42.218 --domain=files --key='/fstab' - file : /fstab class: default devcount: 1 domain: files fid: 5 key: /fstab length: 463 - http: //10 .232.42.218:7500 /dev2/0/000/000/0000000005 .fid # 发现文件依然存在 |
下面使用Nginx来替换storage nodes上 mogstored中的Perlbal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@node2 ~] # vi /etc/nginx/nginx.conf # 添加如下 upstream trackers { server 10.232.50.239:7001; server 10.232.42.218:7001; server 10.232.42.219:7001; } location /files/ { mogilefs_tracker trackers; mogilefs_domain files; mogilefs_methods get; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } [root@node2 ~] # nginx -s reload |
关于如上配置解释一下,比如:
http://www.a.com/files/A6B00135E24AB17E043B9B5453762438.png
这个URL中的UUID是A6B00135E24AB17E043B9B5453762438.png.这时我们使用这个做key来存到MogileFS中就行,再结合rewrite,只要key在url里有,就能直接代理到后端的mogilefs,如果使用了多个tracker的话,要配置使用多个tracker来进行负载均衡和备份,可以直接配置tracker到upstrame里面,然后后面配置tracker的连接时,直接加上mogilefs_tracker online_mogilefs就行了,如果你还想配置使用 mogilefs 的 Nginx 上传,使用其中的 put 功能然后就不要安装客户端上传送,就需要打个补丁,上面的配置一样,关键对于上传的配置,需要给方法修改为mogilefs_methods PUT DETEL。
上传文件测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 设置files domain的class复制份数为3 [root@node1 ~] # mogadm class modify files default --mindevcount=3 # 上传文件 [root@node1 ~] # echo "9966" > /tmp/index11.html [root@node1 ~] # mogupload --trackers=10.232.50.239 --domain=files --key='index11.html' --file='/tmp/index11.html' [root@node1 ~] # mogfileinfo --trackers=10.232.50.239 --domain=files --key='index11.html' - file : index11.html class: default devcount: 3 domain: files fid: 24 key: index11.html length: 5 - http: //10 .232.42.218:7500 /dev2/0/000/000/0000000024 .fid - http: //10 .232.50.239:7500 /dev1/0/000/000/0000000024 .fid - http: //10 .232.42.219:7500 /dev3/0/000/000/0000000024 .fid # 发现有3个副本 [root@node2 ~] # curl http://10.232.42.218/files/index11.html 9966 |
测试正常访问
下面模拟down掉一个节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@node1 ~] # mogadm host mark 10.232.50.239 down [root@node1 ~] # mogadm check Checking trackers... 127.0.0.1:7001 ... OK Checking hosts... [ 1] 10.232.50.239 ... skipping; status = down [ 2] 10.232.42.218 ... OK [ 3] 10.232.42.219 ... OK Checking devices... host device size(G) used(G) free (G) use% ob state I /O % ---- ------------ ---------- ---------- ---------- ------ ---------- ----- [ 2] dev2 7.472 1.843 5.629 24.67% writeable N /A [ 3] dev3 7.472 1.652 5.820 22.11% writeable N /A ---- ------------ ---------- ---------- ---------- ------ total: 14.944 3.495 11.449 23.39% [root@node2 ~] # curl http://10.232.42.218/files/index11.html 9966 |
发现访问一切正常
如果想根据跨多机房多网段来复制不同class份数,需要安装MogileFS::Network模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@node1 ~] # cpan -i MogileFS::Network # 安装完成后 # 添加网段名称,这里添加2个 [root@node1 ~] # mogadm settings set network_zones near,far # 添加网段地址 [root@node1 ~] # mogadm settings set zone_near 10.0.0.0/8 # 修改class属性 [root@node1 ~] # mogadm class modify files default --replpolicy "HostsPerNetwork(near=2)" # 发现修改生效 [root@node1 ~] # mogadm class list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 HostsPerNetwork(near=2) NONE files index 3 MultipleHosts() NONE images default 2 MultipleHosts() NONE # 这里就实现了根据网段不同复制不同的class数量 |
注意:如果是多个tracker的话,每个tracker主机上都需要安装MogileFS::Network模块。
常见问题及解决方法:
如果遇到class的devcount始终为1,修改class的mindevcount也无效的话,可以设置如下:
1
2
3
4
5
6
7
|
[root@node1 ~] # perl -MSys::Syscall -e 'print $Sys::Syscall::VERSION' 0.25 # 显示为0.25版本,这就会有问题 [root@node1 ~] # cpanm http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz [root@node1 ~] # perl -MSys::Syscall -e 'print $Sys::Syscall::VERSION' 0.23 # 降级为0.23的版本就能解决次问题了 |
到此,MogileFS, nginx-mogilefs高可用分布式文件系统配置完成。
本文出自 “龍行天下” 博客,请务必保留此出处http://luojianlong.blog.51cto.com/4412415/1393547
..............