環境:公司已經有了大量沉澱用戶,爲了讓這些沉澱用戶長期使用公司平臺,公司決定增長用戶粘性,逐步發展基於社交屬性的多樣化業務模式,決定開展用戶討論區、賣家秀、買家秀、用戶試穿短視頻等業務,所以,公司新的業務的業務特徵將須要海量數據存儲,你的領導要求基於開源技術,實現對公司海量存儲業務的技術研究和實現,你能夠完成任務嗎?前端
總項目流程圖,詳見 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
前面的實戰,後幾天慢慢補上!!!你們見諒。