环境:公司已经有了大量沉淀用户,为了让这些沉淀用户长期使用公司平台,公司决定增长用户粘性,逐步发展基于社交属性的多样化业务模式,决定开展用户讨论区、卖家秀、买家秀、用户试穿短视频等业务,所以,公司新的业务的业务特征将须要海量数据存储,你的领导要求基于开源技术,实现对公司海量存储业务的技术研究和实现,你能够完成任务吗?前端
总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.htmlnode
实验前准备:配置好yum源、防火墙关闭、各节点时钟服务同步mysql
(1)mogileFS主要由三部分构成:tracker节点,database节点,storage节点sql
① Tracker(MogileFSd 进程):这个是 MogileFS 的核心部分,他是一个调度器,MogileFSd 进程就是trackers进程程序,trackers 作了不少工做:Replication,Deletion,Query,Reaper,Monitor 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理全部来之于客户端应用的交互(requesting operations to be performed),,包括将请求负载平衡到多个"query workers"中,而后让 MogileFSd 的子进程去处理;数据库
② MySQL:用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里),是Trackers 来操做和管理它,能够用mogdbsetup程序来初始化数据库,由于数据库保存了MogileFS的全部元数据,建议作成HA架构;vim
③ Storage Nodes:这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增长这些机器,实际文件存放的地方。后端
① Domain域:一个MogileFS能够有多个Domain,用来存放不一样文件(大小,类型),同一个Domain内key必须惟一,不一样Domain内,key能够相同;
② 每个存储节点称为一个主机host,一个主机上能够有多个存储设备dev(单独的硬盘),每一个设备都有ID号,Domain+Fid用来定位文件。
③ Class:文件属性管理,定位文件存储在不一样设备上的份数;
每次文件的上传和读取,都通过前端TrackerServer 服务器,trackerServer 服务器受到client 端的请求,查询数据库,返回一个上传或者是读取的可用的后端StorageServer 的地址,而后由client 端直接操做后端StorageServer 服务器。upload 操做返回就是成功或者失败的结果,read操做就是返回对应的查询数据。
(4)mogilefs 服务很特殊:服务配置完毕,开启服务后;还需命令行命令,服务才能真正生效!
IP配置 |
服务角色 |
备注 |
|
tracker-srv |
192.168.30.107 |
调度器 |
tracker、mysql |
storage node1 |
192.168.30.7 |
文件存放 |
mogstored 服务 |
storage node2 |
192.168.30.2 |
文件存放 |
mogstored 服务 |
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
(2)服务的rpm包,我已经放在个人网盘里了,须要的私聊 http://pan.baidu.com/s/1c2bGc84
MogileFS-Server-2.46-2.el6.noarch.rpm #核心服务
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm # tracker节点
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如mogadm等。
方法二:perl程序源码包安装:经过perl的包管理命令cpanm进行安装
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
wget http://xrl.us/cpanm -O /usr/bin/cpanm;
systemctl start mariadb 开启mysql服务
MariaDB [mogilefs]> GRANT ALL PRIVILEGES ON mogilefs.* TO 'mogile' @'127.0.0.1' IDENTIFIED BY 'mogile' WITH GRANT OPTION; MariaDB [mogilefs]> flush privileges; 刷新下权限
vim /etc/mogilefs/mogilefsd.conf
① 配置数据库链接相关信息 db_dsn = DBI:mysql:mogilefs:host=127.0.0.1 db_user = mogile db_pass = mogile ② 下边的只需修改监听地址和端口 listen = 192.168.30.107:7001 #mogilefs监听地址,监听在127.0.0.1表示只容许从本机登陆进行管理 query_jobs = 10 #启动多少个查询工做线程 delete_jobs = 1 #启动多少个删除工做线程 replicate_jobs = 5 #启动多少个复制工做线程 reaper_jobs = 1 #启动多少个用于回收资源的线程 maxconns = 10000 #存储系统的最大链接数. httplisten = 0.0.0.0:7500 #可经过http访问的服务端口 mgmtlisten = 0.0.0.0:7501 #mogilefs的管理端口 docroot = /var/mogdata #该项决定了数据的在storage上存储的实际位置,建议使用的是一个单独挂载使用的磁盘
chown -R mogilefs.mogilefs /var/run/mogilefsd
ss -nutlp|grep mogilefs 查询是否有mogilefsd 的监听ip和端口
vim /etc/mogilefs/mogstored.conf
maxconns = 10000 #存储系统的最大链接数. httplisten = 0.0.0.0:7500 #可经过http访问的服务端口 mgmtlisten = 0.0.0.0:7501 #mogilefs的管理端口 docroot = /data/mogdata #该项决定了数据的在storage上存储的实际位置,建议使用的是一个单独挂载使用的磁盘
chown mogilefs.mogilefs mogdata/ -R
vim /etc/mogilefs/mogilefs.conf 客户端工具配置文件
trackers=192.168.30.107:7001 #本身的tracker 的服务IP和端口
(1)加入"存储节点storage node1/2"到 trackers 中
mogadm --tracker=192.168.30.107:7001 host add node1 --ip=192.168.30.7 --port=7500 --status=alive mogadm --tracker=192.168.30.107:7001 host add node2 --ip=192.168.30.2 --port=7500 --status=alive
(2)查询信息,检查主机是否加入到 MogileFS 的系统中
mogadm host modify node1 --ip=192.168.30.7 --port=7500 --status=alive
(1)建立"设备"实验的目录并受权,格式: dev + ID
注意:全部系统中 ID 不能重复,也必须和配置文件中的路径同样
chown mogilefs.mogilefs dev1/ -R 加权限
设置成功,会在dev1下生成一个文件,是tracker 过来测试留下来的
chown mogilefs.mogilefs dev2/ -R
mogadm --tracker=192.168.30.107:7001 device add node1 1
mogadm --tracker=192.168.30.107:7001 device add node1 1 mogadm --tracker=192.168.30.107:7001 device add node2 2
MariaDB [mogilefs]> select * from device;
MariaDB [mogilefs]> select * from host;
mogadm domain add img 建立一个img域
mogadm class add img along --mindevcount=3 在img域中建立一个along的class,能够存放3份
mogupload --domain=img --key=test --file=along.jpg 向img域中上传一张along.jpg的图片,key为test
mogfileinfo --domain=img --key=test 查询文件
(2)网页访问http://192.168.30.2:7500/dev2/0/000/000/0000000002.fid
mogdelete --domain=img --key=test
MariaDB [mogilefs]> select * from file;
(5)在后端两个storage node 上也能查到图片,图片就是存放到storage node服务器上的
注意:原本,后端两个storage node 上应该都有存放的图片,能互相复制,是副本关系,但这一版本有BUG
wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
也能够http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz 去网站直
rz,tar xvf Sys-Syscall-0.23.tar.gz -C /tmp
① 由于是perl 语言编写的,因此须要安装perl 编译安装的环境
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
① 在tracker 服务器是,有时候开启服务显示失败,其实已经成功
② 在storage node 服务器上,有时候开启服务显示失败,其实已经成功
mogupload --domain=img --key=test1 --file=along.jpg
② 在两个storage node 服务器上,存储已经实现同步
原理:在database 上实现mysql的主从;且为了提高性能,在每一个节点上都配置tracker
主mysql宕机,从mysql上数据没有丢失;且VIP能漂到从mysql上,继续提供服务
IP配置 |
服务角色 |
备注 |
|
mogilefs- mysql-master |
192.168.30.107 |
主数据库 |
tracker、mysql |
mogilefs- mysql-slave |
192.168.30.7 |
从数据库 |
tracker、mysql |
mogilefs- store1 |
192.168.30.2 |
文件存放 |
tracker、storage |
mogilefs- store2 |
192.168.30.3 |
文件存放 |
tracker、storage |
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
(2)服务的rpm包,我已经放在个人网盘里了,须要的私聊 http://pan.baidu.com/s/1c2bGc84
MogileFS-Server-2.46-2.el6.noarch.rpm #核心服务
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm # tracker节点
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如mogadm等。
① vim /etc/my.cnf 修改mysql主配置文件,对master进行配置,包括打开二进制日志,指定惟一的servr ID
server-id=1 #配置server-id,让主服务器有惟一ID号 log-bin=mysql-bin #打开Mysql日志,日志格式为二进制 skip-name-resolve #关闭名称解析,(非必须)
MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.30.7' identified by 'along';
在Master的数据库执行show master status,查看主服务器二进制日志状态,位置号
vim /etc/my.cnf 打开中继日志,指定惟一的servr ID,设置只读权限
server-id=2 #配置server-id,让从服务器有惟一ID号 relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制 read_only = 1 #设置只读权限 log_bin = mysql-bin #开启从服务器二进制日志,(非必须) log_slave_updates = 1 #使得更新的数据写进二进制日志中
② 启动从服务器复制线程,让slave链接master,并开始重作master二进制日志中的事件。
MariaDB [(none)]> change master to master_host='192.168.30.107', -> master_user='slave', -> master_password='along', -> master_log_file='mysql-bin.000001', -> master_log_pos=245; MariaDB [(none)]> start slave; # 启动复制线程,就是打开I/O线程和SQL线程;实现拉主的bin-log到从的relay-log上;再从relay-log写到数据库内存里
可以使用SHOW SLAVE STATUS\G查看从服务器状态,以下所示,也可用show processlist \G查看当前复制状态:
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
MariaDB [(none)]> GRANT ALL PRIVILEGES ON mogilefs.* TO 'mogile'@'192.168.30.%' IDENTIFIED BY 'mogile' WITH GRANT OPTION; MariaDB [mogilefs]> flush privileges; 刷新下权限
原理:主mysql宕机,从上数据没有丢失;且VIP能漂到从mysql上,继续提供服务
(1)在两个机器上下载keepalived
yum -y install keepalived
(2)在主mysql上配置keepalived
① 全局段,故障通知邮件配置 global_defs { notification_email { root@localhost } notification_email_from root@along.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id keepalived_mysql } ② 检测脚本,监控mysqld进程服务 vrrp_script chk_nginx { script "killall -0 mysqld" #killall -0 检测这个进程是否还活着,不存在就减权重 interval 2 #每2秒检查一次 fall 2 #失败2次就打上ko的标记 rise 2 #成功2次就打上ok的标记 weight -4 #权重,优先级-4,若为ko } ③ 配置虚拟路由器的实例段,VI_1是自定义的实例名称,能够有多个实例段 vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 190 priority 100 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 192.168.30.100 } track_script { chk_nginx } }
(3)在从上只需修改优先级和backup
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 190 priority 98 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 192.168.30.100 } track_script { chk_nginx } }
(4)开启keepalived 服务
systemctl start keepalived
主mysql 上VIP已经生成
vim /etc/mogilefs/mogilefsd.conf
① 配置数据库链接相关信息 db_dsn = DBI:mysql:mogilefs:host=192.168.30.100 db_user = mogile db_pass = mogile ② 下边的只需修改监听地址和端口 listen = 192.168.30.107:7001 #mogilefs监听地址,监听在127.0.0.1表示只容许从本机登陆进行管理;注意,4台机器写本身的IP地址 listen = 192.168.30.7:7001 listen = 192.168.30.2:7001 listen = 192.168.30.3:7001 注意:不是写4个,是在4个机器上分别写
chown -R mogilefs.mogilefs /var/run/mogilefsd
ss -nutlp|grep mogilefs 查询是否有mogilefsd 的监听ip和端口
vim /etc/mogilefs/mogstored.conf
maxconns = 10000 #存储系统的最大链接数. httplisten = 0.0.0.0:7500 #可经过http访问的服务端口 mgmtlisten = 0.0.0.0:7501 #mogilefs的管理端口 docroot = /data/mogdata #该项决定了数据的在storage上存储的实际位置,建议使用的是一个单独挂载使用的磁盘
chown mogilefs.mogilefs mogdata/ -R
vim /etc/mogilefs/mogilefs.conf 客户端工具配置文件,4个机器写本身的tracker
trackers=192.168.30.107:7001 #本身的tracker 的服务IP和端口 trackers=192.168.30.7:7001 trackers=192.168.30.2:7001 trackers=192.168.30.3:7001 注意:是各自写各自的,不是都写在一个机器里
在tracker 的服务器上:只需在一个tracker 服务器上作就好了
(1)加入"存储节点storage node1/2"到 trackers 中
mogadm host add node1 --ip=192.168.30.3 --port=7500 --status=alive mogadm host add node2 --ip=192.168.30.2 --port=7500 --status=alive
(2)查询信息,检查主机是否加入到 MogileFS 的系统中
mogadm host modify node1 --ip=192.168.30.3 --port=7500 --status=alive
(1)建立"设备"实验的目录并受权,格式: dev + ID
注意:全部系统中 ID 不能重复,也必须和配置文件中的路径同样
chown mogilefs.mogilefs dev1/ -R 加权限
设置成功,会在dev1下生成一个文件,是tracker 过来测试留下来的
chown mogilefs.mogilefs dev2/ -R
mogadm device add node1 1 mogadm device add node2 2
MariaDB [mogilefs]> select * from device;
MariaDB [mogilefs]> select * from host;
10划分域/class、11上传文件且测试、12修复bug 步骤都同上
① Tracker:调度器,负责维持集群的信息,例如各group及其内部的storage node,这些信息也是storage node报告所生成;每一个storage node会周期性向tracker发心跳信息;
② storage server:以group为单位进行组织,任何一个storage server都应该属于某个group,一个group应该包含多个storage server;在同一个group内部,各storage server的数据互相冗余;
• 只有两个角色,tracker server和storage server,不须要存储文件索引信息
• 全部服务器都是对等的,不存在Master-Slave关系
• 存储服务器采用分组方式,同组内存储服务器上的文件彻底相同(RAID 1)
• 由storage server主动向tracker server报告状态信息,tracker server之间一般不会相互通讯
① 采用binlog文件记录更新操做,根据binlog进行文件同步同一组内的storage server之间是对等的,文件上传、删除等操做能够在任意一台storage server上进行;
② 文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
③ 源头数据才须要同步,备份数据不须要再次同步,不然就构成环路了;
上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的全部数据(包括源头数据和备份数据)同步给该新增服务器。
③ client直接和storage通讯完成文件上传,storage返回文件ID
① client询问tracker下载文件的storage,参数为文件ID(组名和文件名);
IP配置 |
服务角色 |
备注 |
|
tracker-srv |
192.168.30.107 |
调度器 |
tracker、不需mysql |
storage srv1 |
192.168.30.7 |
文件存放 |
|
storage srv2 |
192.168.30.2 |
文件存放 |
mkdir /fastdfs 建立一个存放fastdfs所需包的目录
https://pan.baidu.com/share/init?surl=c2bGc84
cd /etc/fdfs tracker的配置文件的模板已经准备好了,只需复制修改就好
cp tracker.conf.sample tracker.conf
vim /etc/fdfs/tracker.conf 必须修改的一项
base_path=/data/fastdfs/tracker #base源路径
mkdir /data/fastdfs/tracker -p
/etc/init.d/fdfs_trackerd start
在storage server上 storage的配置文件的模板已经准备好了,只需复制修改就好
cp storage.conf.sample storage.conf
base_path=/data/fastdfs/storage #base源路径 store_path0=/data/fastdfs/storage #实际存储目录 tracker_server=192.168.30.107:22122 #指定tracker
mkdir /data/fastdfs/storage -p
/etc/init.d/fdfs_storaged start
cp client.conf.sample client.conf 复制模板
base_path=/data/fastdfs/tracker tracker_server=192.168.30.107:22122
fdfs_monitor /etc/fdfs/client.conf
(1)fdfs_upload_file /etc/fdfs/client.conf xiaomi.zip 上传
(2)在后端两个storage server 上,两个是同步的,同样
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKgeAlodCEGAXOuMB3o1rOpTQ-0771.zip
分析:上传到了192.168.30.2 的机器上,而后push推到192.168.30.7上
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgeAlodCEGAXOuMB3o1rOpTQ-0771.zip md5sum xiaomi.zip wKgeAlodCEGAXOuMB3o1rOpTQ-0771.zip
fdfs_delect_file /etc/fdfs/client.conf group1/M00/00/00/wKgeAlodCEGAXOuMB3o1rOpTQ-0771.zip
fdfs_test /etc/fdfs/client.conf upload xiaomi.zip [FILE | BUFF | CALLBACK]
location /group1/M00 { root /data/fastdfs/storage/data; ngx_fastdfs_module; }
vim /etc/fdfs/mod_fastdfs.conf
tracker_server=192.168.30.107:22122 url_have_group_name = true store_path0=/data/fastdfs/storage
网页测试 http://192.168.30.2/group1/M00/00/00/wKgeB1odET-AGOSlAAAbjMSvzS8917.jpg
前面的实战,后几天慢慢补上!!!你们见谅。