一、mogilefs简介
mogilefs是一种分布式存储(不可挂载,通过API调用或专门客户端)的解决方案,可存储海量图片、静态文件。
mogilefs的相关程序是用perl语言编写,元数据存储在关系型数据库中(国内有人用C语言将mogilefs重写的程序叫做FastDFS,后者的元数据是存储在内存中的)
mogilefs的基本组成结构:
(1) tracker:追踪器,从database中追踪用户请求数据的元数据
与客户端通过http协议通信,RESTful风格。
提供mogilefsd(守护进程),主要职责包括:
① replication:节点间文件的复制
② deletion:删除文件
③ queryworker:响应客户请求的文件元数据访问请求
④ reaper:在存储失败后将文件复制请求重新放置于队列中
⑤ monitor:监测主机和设备的健康状态
(2) database:
存储mogilefs的元数据(存储数据的内容、大小、存储的节点等非数据内容信息),一般使用MySQL;建议使用冗余方案以保证其可用性(如MMM,MHA)
mogilefs专门提供了数据结构管理工具mogdbsetup(功用:初始化MySQL、管理元数据)
(3) storage:存储数据,数据副本冗余量默认是2个(可修改)
mogstored(进程名),一个准备停当的mogstored节点可通过mogadm命令添加至现在的集群中;
存储节点需要定义“设备(dev)”用作存储空间:每个“设备”在当前集群都需要通过一个唯一的DevID来标识;
(4)client:
客户端用于与mogilefs建立通信,完成数据存取;
mogilefs特性:
(1)工作于应用层:无需特殊核心组件;
(2)无单点;
(3)自动完成文件复制;
(由tracker指挥storage自动完成)
(4)传输无需特殊协议(使用http或nfs);
(5)使用简单名称空间机制来完成复制;
(6)不在任何节点之间共享任何数据;
(7)non-RAID
(8)不能追加写、随机写
(9)Tracker Client传输(Mogilefsd),管理数据复制、删除、查询、修复以及监控
(10)数据通过HTTP/WebDAV服务上传到Storage node(mogstored)
(11)MySQL存储MofileFS元数据(命名空间、位置)
mogilefs所存储数据的存储结构:
① domain: name space,命名空间 ,key的名字空间
一个mogilefs可以有多个domain,是一种路径映射,类似于目录,同一个domain内key(文件名)唯一,不同domain内的key可以相同
实际应用中可以将不同的类别文件存储在不同的domain中
② class: 最小复制单元
定位文件: 先定位 domain,再定位 fid
一个domain内 可以有多个class,是最小复制单位、最小调度单元,是多个文件合起来组成的。
本次试验架构:
配置服务顺序:
node1上安装mariadb-5.5.43-linux-x86_64-->在node1、node2、node3上安装tracker --> 在node1、node2、node3上安装mogstored --> 在node2上安装nginx做反向代理
本次试验只是做mogilefs的练习,未对元数据的存储做高可用。
对mariadb做高可用参考:
http://ctrry.blog.51cto.com/9990018/1658665
参考架构可以如下:
二、mariadb数据库及分区及mogstored专用数据存储分区的准备
(一)准备磁盘分区:
在node1、node2、node3上执行下面创建新分区的步骤:
# fdisk /dev/sda …… Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 7859 62914560 8e Linux LVM /dev/sda4 7859 14386 52435161 5 Extended /dev/sda5 7859 9164 10489414+ 8e Linux LVM 10G /dev/sda6 9165 10470 10490413+ 8e Linux LVM 10G # partx -a /dev/sda # partx -a /dev/sda
# bash mogilefs.sh
#!/bin/bash # pvcreate /dev/sda5 vgcreate myvg5 /dev/sda5 lvcreate -L 10G -n maria myvg5 mke2fs -t ext4 -L MARIA /dev/myvg5/maria mkdir -p /mydata mkdir -p /mogstore pvcreate /dev/sda6 vgcreate myvg6 /dev/sda6 lvcreate -L 10G -n mogstore myvg6 mke2fs -t ext4 -L MOGSTORE /dev/myvg6/mogstore echo "LABEL=MARIA /mydata ext4 defaults 0 0" >> /etc/fstab echo "LABEL=MOGSTORE /mogstore ext4 defaults 0 0" >> /etc/fstab mount -a mount
不安装mariadb的节点上可以将少创建一个分区
(二)在node1上安装mariadb
# lftp 172.16.0.1/pub/Sources/sources/mariadb
lftp 172.16.0.1:/pub/Sources/sources/mariadb> get mariadb-5.5.43-linux-x86_64.tar.gz
# bash -x mariainstall.sh
脚本内容如下:
#!/bin/bash # groupadd -r -g 306 mysql useradd -r -g mysql -u 306 mysql tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local cd /usr/local ln -s /usr/local/mariadb-5.5.43-linux-x86_64 mysql chown -R root:mysql /usr/local/mysql/* cd mysql mkdir /mydata/data ./scripts/mysql_install_db --datadir=/mydata/data --skip-name-resolve --basedir=/usr/local/mysql --user=mysql chown -R mysql:mysql /mydata cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld mkdir /etc/mysql cp ./support-files/my-large.cnf /etc/mysql/my.cnf echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysqld.sh . /etc/profile.d/mysqld.sh ln -s /usr/local/mysql/include/ /usr/include/mysql vim /etc/mysql/my.cnf
添加或修改下面4项:
thread_concurrency = 2 datadir = /mydata/data skip_name_resolve = on innodb_file_per_table = on
# service mysqld start
# /usr/local/mysql/bin/mysql_secure_installation
根据提示操作,第一次是需要输入登录密码,但第一次是没有设置得,直接回车就OK了。
三、安装tracker和mogstored
安装mogilefs有两种方式:
一是自己寻找到mogilefs相应的rpm包安装;
二是连到perl.can网,直接通过“cpan> install module::name”形式自动编译安装。
此次采用rpm包安装。
在教室环境中,下载位置为:
# lftp 172.16.0.1:/pub/Sources/6.x86_64/mogilefs>
MogileFS-Server-2.46-2.el6.noarch.rpm 通行组件
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm 提供tracker
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm 提供mogstored
MogileFS-Utils-2.19-1.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm 客户端调用API做开发时才需要的组件,被其他组件依赖
perl-Net-Netmask-1.9015-8.el6.noarch.rpm 实现机架感知能力组件
perl-Perlbal-1.78-1.el6.noarch.rpm 被依赖组件
下载后下面的程序包并全部安装:
[root@node1 mogilefs]# lsMogileFS-Server-2.46-2.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm [root@node1 mogilefs]# yum localinstall -y --nogpgcheck *.rpm …… Installed: MogileFS-Server.noarch 0:2.46-2.el6 MogileFS-Server-mogilefsd.noarch 0:2.46-2.el6 MogileFS-Server-mogstored.noarch 0:2.46-2.el6 MogileFS-Utils.noarch 0:2.19-1.el6 perl-MogileFS-Client.noarch 0:1.14-1.el6 perl-Net-Netmask.noarch 0:1.9015-8.el6 perl-Perlbal.noarch 0:1.78-1.el6 Dependency Installed: perl-BSD-Resource.x86_64 0:1.29.03-3.el6 perl-DBD-MySQL.x86_64 0:4.013-3.el6 perl-Danga-Socket.noarch 0:1.61-5.el6 perl-IO-stringy.noarch 0:2.110-10.1.el6 perl-Sys-Syscall.noarch 0:0.23-1.el6 Complete!
在mogstored的节点上都需要安装上perl-IO-AIO程序包,这是被隐式依赖的包:
[root@node1 mogilefs]# yum install -y perl-IO-AIO
…… Installed: perl-IO-AIO.x86_64 0:3.71-2.el6 Dependency Installed: perl-common-sense.noarch 0:3.5-1.el6 Complete!
在node2和node3上也做 同样安装。
生成文件说明:
[root@node1 mogilefs]# rpm -ql MogileFS-Server
(contains no files)
[root@node1 mogilefs]# rpm -ql MogileFS-Server-mogilefsd
/etc/mogilefs/mogilefsd.conf #tracker的配置文件 /etc/rc.d/init.d/mogilefsd #tracker服务脚本 /usr/bin/mogdbsetup # 初始化mariadb数据库的程序文件 /usr/bin/mogilefsd #主程序文件 /usr/share/man/man1/mogilefsd.1.gz #各种帮助文档文件 /usr/share/man/man3/MogileFS::Checksum.3pm.gz …… /usr/share/perl5/vendor_perl/MogileFS/Checksum.pm #各种相关的库文件 /usr/share/perl5/vendor_perl/MogileFS/Class.pm …… /usr/share/perl5/vendor_perl/MogileFS/makedocs.pl /var/run/mogilefsd #运行时临时文件存放位置,如pid文件
[root@node1 mogilefs]# rpm -ql MogileFS-Utils
/usr/bin/mogadm # 对mogilefs做全面管理的程序,如健康检测、查看状态、主机管理、设备管理、domain管理、class管理、从节点管理、文件系统管理、数据均衡管理、设置mogilefs工作特性 /usr/bin/mogdelete #删除文件工具 /usr/bin/mogfetch #下载文件工具 /usr/bin/mogfiledebug /usr/bin/mogfileinfo /usr/bin/moglistfids # 列出所有fid文件工具 /usr/bin/moglistkeys /usr/bin/mogrename #重命名工具 /usr/bin/mogstats # /usr/bin/mogtool /usr/bin/mogupload #上传文件工具 /usr/share/man/man1/mogadm.1.gz # 各种帮助文档 …… /usr/share/man/man3/MogileFS::Utils.3pm.gz /usr/share/perl5/MogileFS/Utils.pm # 所用到的模块文件
[root@node1 mogilefs]# rpm -ql MogileFS-Server-mogstored
/etc/mogilefs/mogstored.conf #配置文件 /etc/rc.d/init.d/mogstored # 服务脚本 /usr/bin/mogautomount # 自动挂载程序 /usr/bin/mogstored #守护进程程序 /usr/share/man/man1/mogautomount.1.gz /usr/share/man/man1/mogstored.1.gz /usr/share/perl5/vendor_perl/Mogstored/ChildProcess #大量模块文件 /usr/share/perl5/vendor_perl/Mogstored/ChildProcess.pm …… /usr/share/perl5/vendor_perl/Mogstored/TaskQueue.pm
[root@node1 mogilefs]# rpm -ql perl-MogileFS-Client
/usr/share/man #帮助文档 /usr/share/man/man3 /usr/share/man/man3/MogileFS::Client.3pm.gz /usr/share/perl5/MogileFS/Admin.pm #提供所需的库文档 /usr/share/perl5/MogileFS/Backend.pm /usr/share/perl5/MogileFS/Client.pm /usr/share/perl5/MogileFS/ClientHTTPFile.pm /usr/share/perl5/MogileFS/NewHTTPFile.pm
[root@node1 mogilefs]# rpm -ql perl-Perlbal
/usr/share/man/man3 # 提供大量帮助文档 …… /usr/share/man/man3/Perlbal::Util.3pm.gz /usr/share/perl5/Perlbal.pm # 提供大量模块文件 /usr/share/perl5/Perlbal/AIO.pm …… /usr/share/perl5/Perlbal/ManageCommand.pm /usr/share/perl5/Perlbal/Manual /usr/share/perl5/Perlbal/Manual.pod /usr/share/perl5/Perlbal/Manual/Configuration.pod …… /usr/share/perl5/Perlbal/Manual/WebServer.pod /usr/share/perl5/Perlbal/Plugin /usr/share/perl5/Perlbal/Plugin/AccessControl.pm …… /usr/share/perl5/Perlbal/Plugin/XFFExtras.pm /usr/share/perl5/Perlbal/Pool.pm /usr/share/perl5/Perlbal/ReproxyManager.pm /usr/share/perl5/Perlbal/Service.pm /usr/share/perl5/Perlbal/Socket.pm /usr/share/perl5/Perlbal/SocketSSL.pm /usr/share/perl5/Perlbal/TCPListener.pm /usr/share/perl5/Perlbal/Test /usr/share/perl5/Perlbal/Test.pm /usr/share/perl5/Perlbal/Test/WebClient.pm /usr/share/perl5/Perlbal/Test/WebServer.pm /usr/share/perl5/Perlbal/UploadListener.pm /usr/share/perl5/Perlbal/Util.pm
四、tracker配置
tracker配置之前需要先配置好mariadb的对用户的授权,然后对数据库做初始化。
(一)数据库授权
[root@node1 ~]# mysql -uroot -h127.0.0.1 -p Enter password: MariaDB [(none)]> grant all on *.* to 'root'@'172.16.20.%' identified by '123' with grant option; Query OK, 0 rows affected (0.42 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.07 sec) MariaDB [(none)]> \q
(二)初始化数据库
查看帮助说明
[root@node1 ~]# mogdbsetup --help
根据自己需要选择参数,初始化数据库:
[root@node1 ~]# mogdbsetup --dbhost=172.16.20.50 --dbrootuser=root --dbrootpass=123 --dbname=mogdb --dbuser=moguser --dbpass=mogpass --yes
其中dbhost是远程主机的IP地址(需要远程主机设定了skip-name-resolve),dbroot和dbrootpass是远程主机的授权的允许远程登录数据库的账号和密码(上面刚授权的),dbname、dbuserdbpass是我们这次初始化需要创建的存储元数据的新数据库名称、使用用户、使用密码。
查看初始化创建的数据库:
# mysql -umoguser -h172.16.20.50 -p
(三)修改配置文件
[root@node1 ~]# cp /etc/mogilefs/mogilefsd.conf{,.bak}
[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog采用守护进程模式运行于后台并使用syslog: daemonize = 1 # Where to store the pid of the daemon (must be the same in the init script) pidfile = /var/run/mogilefsd/mogilefsd.pid # Database connection information # db_dsn = DBI:数据库类型:元数据数据库名:所在主机IP db_dsn = DBI:mysql:mogdb:host=172.16.20.50 db_user = moguser db_pass = mogpass # IP:PORT to listen on for mogilefs client requests listen = 172.16.20.50:7001 # Optional, if you don't define the port above. conf_port = 7001 # 默认启动时的查询线程数,根据需要修改 query_jobs = 10 # 默认启动时的删除线程数,根据需要修改 delete_jobs = 2 # 默认启动时的复制线程数,根据需要修改 replicate_jobs = 5 # 默认启动时的reaper线程数,这个数值是不需要修改的 # (you don't usually need to increase this) reaper_jobs = 1 …… # Allow replication to use the secondary node get port, # if you have apache or similar configured for GET's #repl_use_get_port = 1 这个是有主从复制时需要设置的参数
启动服务:
[root@node1 ~]# service mogilefsd start
Starting mogilefsd [ OK ]
[root@node1 ~]# ss -tnl | grep 7001
LISTEN 0 128 172.16.20.50:7001 *:*
五、mogstored的配置
(一)三个mogstored节点提供dev目录
[root@node1 mogilefs]# mkdir /mogstore/dev1
[root@node2 mogilefs]# mkdir /mogstore/dev2
[root@node3 mogilefs]# mkdir /mogstore/dev3
(二)三个节点上都修改mogstored的配置文件:
只需要修改最后一行的文件存储位置为新建分区即可
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogstore
修改好配置文件后,查看是否能正常启动服务:
# service mogstored start
Starting mogstored [ OK ]
# ss -tnl | grep "750"
LISTEN 0 128 *:7500 *:* LISTEN 0 128 *:7501 *:*