環境:公司已經有了大量沉淀用戶,為了讓這些沉淀用戶長期使用公司平台,公司決定增加用戶粘性,逐步發展基於社交屬性的多樣化業務模式,決定開展用戶討論區、賣家秀、買家秀、用戶試穿短視頻等業務,因此,公司新的業務的業務特征將需要海量數據存儲,你的領導要求基於開源技術,實現對公司海量存儲業務的技術研究和實現,你可以完成任務嗎?
總項目流程圖,詳見 http://www.cnblogs.com/along21/p/8000812.html
實戰一:企業級分布式存儲應用與實戰 mogilefs 實現
原理
(1)mogileFS主要由三部分構成:tracker節點,database節點,storage節點
① 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架構;
③ 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 服務很特殊:服務配置完畢,開啟服務后;還需命令行命令,服務才能真正生效!
1、環境准備
IP配置 |
服務角色 |
備注 |
|
tracker-srv |
192.168.30.107 |
調度器 |
tracker、mysql |
storage node1 |
192.168.30.7 |
文件存放 |
mogstored 服務 |
storage node2 |
192.168.30.2 |
文件存放 |
mogstored 服務 |
2、下載安裝,每個機器都一樣
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;
3、數據庫初始化
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; 刷新下權限
4、在tracker-srv 服務器上,啟動mogilefsd服務
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和端口
5、在兩台storage node 上,啟動mogstored服務
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
6、修改客戶端工具配置
vim /etc/mogilefs/mogilefs.conf 客戶端工具配置文件
trackers=192.168.30.107:7001 #自己的tracker 的服務IP和端口
7、storage node 節點加入到MogileFS 的系統中
(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
8、創建設備
(1)創建"設備"實驗的目錄並授權,格式: dev + ID
注意:所有系統中 ID 不能重復,也必須和配置文件中的路徑一樣
chown mogilefs.mogilefs dev1/ -R 加權限
設置成功,會在dev1下生成一個文件,是tracker 過來測試留下來的
chown mogilefs.mogilefs dev2/ -R
9、兩個設備加入 MogileFS 的存儲系統中
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;
10、划分域、class
mogadm domain add img 創建一個img域
mogadm class add img along --mindevcount=3 在img域中創建一個along的class,可以存放3份
11、上傳文件且測試
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
12、修復bug,實現后端storage node 同步存儲
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 服務器上,存儲已經實現同步
實戰二:mogilefs、mysql主從和keepalived 高可用實現分布式存儲
原理:在database 上實現mysql的主從;且為了提升性能,在每個節點上都配置tracker
主mysql宕機,從mysql上數據沒有丟失;且VIP能漂到從mysql上,繼續提供服務
1、環境准備
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 |
2、在所有機器上下載安裝mogilefs
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等。
3、在兩台mysql上實現主從
① 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線程正常運行
3、初始化數據庫
MariaDB [(none)]> GRANT ALL PRIVILEGES ON mogilefs.* TO 'mogile'@'192.168.30.%' IDENTIFIED BY 'mogile' WITH GRANT OPTION; MariaDB [mogilefs]> flush privileges; 刷新下權限
4、在主從mysql上實現keepalived,高可用
原理:主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已經生成
5、在所有機器上,開啟tracker服務
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和端口
6、在兩個mogilefs-store 上開啟storage 服務
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
7、修改客戶端工具配置
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 注意:是各自寫各自的,不是都寫在一個機器里
8、storage node 節點加入到MogileFS 的系統中
在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
9、創建設備
(1)創建"設備"實驗的目錄並授權,格式: dev + ID
注意:所有系統中 ID 不能重復,也必須和配置文件中的路徑一樣
chown mogilefs.mogilefs dev1/ -R 加權限
設置成功,會在dev1下生成一個文件,是tracker 過來測試留下來的
chown mogilefs.mogilefs dev2/ -R
10、兩個設備加入 MogileFS 的存儲系統中
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 步驟都同上
實戰三:FastDFS 實現分布式存儲
原理
① 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(組名和文件名);
1、環境准備
IP配置 |
服務角色 |
備注 |
|
tracker-srv |
192.168.30.107 |
調度器 |
tracker、不需mysql |
storage srv1 |
192.168.30.7 |
文件存放 |
|
storage srv2 |
192.168.30.2 |
文件存放 |
2、下載安裝
mkdir /fastdfs 創建一個存放fastdfs所需包的目錄
https://pan.baidu.com/share/init?surl=c2bGc84
3、在tracke 的服務器上,開啟tracke 服務
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
4、在后端兩台storage server上,開啟storage 快照
在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
5、設置客戶端配置文件
cp client.conf.sample client.conf 復制模板
base_path=/data/fastdfs/tracker tracker_server=192.168.30.107:22122
fdfs_monitor /etc/fdfs/client.conf
6、FastDFS的上傳、下載
(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]
實驗四:FastDFS實現nginx代理
1、安裝nginx 插件,也存放到我的網盤里了,rz
2、在nginx上加載模塊
location /group1/M00 { root /data/fastdfs/storage/data; ngx_fastdfs_module; }
3、修改fastdfs 模塊的配置文件
vim /etc/fdfs/mod_fastdfs.conf
tracker_server=192.168.30.107:22122 url_have_group_name = true store_path0=/data/fastdfs/storage
4、開啟nginx 服務,測試
網頁測試 http://192.168.30.2/group1/M00/00/00/wKgeB1odET-AGOSlAAAbjMSvzS8917.jpg
前面的實戰,后幾天慢慢補上!!!大家見諒。