二十一周作業(yè)

1僵娃、搭建redis,實(shí)現(xiàn)redis的復(fù)制管理

測(cè)試環(huán)境:

所有機(jī)器均為centos7.6

Redis主:172.16.100.151? port:6379

Redis從:172.16.100.155? port:6379

Redis哨兵:172.16.100.156? port:6379

1.安裝redis

為了方便痹仙,采用yum安裝的方式

Yum list |grep redis

如果有則直接yum安裝

如果沒(méi)有則替換epel源

Yum install epel-release

Yum install redis

Yum安裝redis的默認(rèn)配置文件位置為/etc/redis.conf

Systemctl start redis?? 啟動(dòng)redis

Systemctl enable redis?? 允許開機(jī)啟動(dòng)

2.配置redis主從復(fù)制

編輯redis主庫(kù)(172.16.100.151)配置文件

Vim /etc/redis.conf

修改內(nèi)容:

找到bind俩功,修改為

注意:實(shí)際生產(chǎn)環(huán)節(jié)盡量不要寫0.0.0.0,寫具體ip

輸入redis-cli進(jìn)入redis势誊,并設(shè)置redis密碼

在redis命令行中輸入config set requirepass 密碼

修改完畢后重啟redis

編輯redis從庫(kù)(172.16.100.155)配置文件

Vim /etc/redis.conf

修改內(nèi)容:

找到slaveof一行剑梳,修改為

Slaveof 172.16.100.151 6379 #主庫(kù)地址和端口

Masterauth redis主庫(kù)剛才設(shè)置的密碼

同樣修改bind一行為:

Bind 0.0.0.0? #為了后續(xù)建立哨兵redis能監(jiān)聽到此slave機(jī)唆貌,實(shí)際生產(chǎn)中需要寫哨兵機(jī)IP

重啟redis

查看效果如下

在主庫(kù)redis命令行輸入auth 密碼進(jìn)行驗(yàn)證,然后輸入info查看可見

在從庫(kù)redis命令行輸入info可見

Redis主從配置成功

補(bǔ)充說(shuō)明:

Redis主從配置錯(cuò)誤常見原因

查看日志文件(默認(rèn)位置/var/log/redis/redis.conf)有具體信息

Redis主從出現(xiàn)錯(cuò)誤首先檢查info信息垢乙,從庫(kù)上的master_link_status:參數(shù)是否為up

若為down則說(shuō)明主從sync為成功锨咙,需要檢查以下內(nèi)容:

防火墻端口放行

主從機(jī)互ping

主庫(kù)配置文件bind項(xiàng)是否可以監(jiān)聽到從庫(kù)

(日志報(bào)錯(cuò)內(nèi)容為sync失敗)

主庫(kù)是否設(shè)置了密碼或保護(hù)模式追逮,從庫(kù)配置文件slaveof后是否有配置主庫(kù)權(quán)限masterauth

(日志報(bào)錯(cuò)內(nèi)容為# Error reply to PING from master: '-DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect')

3.配置redis哨兵功能

在redis哨兵機(jī)172.16.100.156上配置

修改/etc/redis.conf文件

將daemonize no改為daemonize yes酪刀,表示允許后臺(tái)執(zhí)行粹舵,方便后續(xù)測(cè)試

修改/etc/sentinel.conf文件

注意:初次配置,不需要打開#sentinel monitor mymaster注釋骂倘,因?yàn)楹髱仔杏心J(rèn)當(dāng)臺(tái)服務(wù)器為主服務(wù)器

原配置:sentinel monitor mymaster 127.0.0.1 6379 2 通過(guò)這句來(lái)修改為:

sentinel monitor mymaster? 172.16.100.151 ?6379 ?1 ? #主服務(wù)器名稱 IP 端口號(hào) 選舉次數(shù)(redis集群服務(wù)器不多時(shí)可以配置成1)

修改下一行:sentinel auth-pass?mymaster redis主庫(kù)密碼 # 第一個(gè)參數(shù)mymaster為主節(jié)點(diǎn)名稱(在上面monitor定義的)

修改心跳檢測(cè) 5000毫秒(默認(rèn)為30秒眼滤,按需修改)

sentinel down-after-milliseconds mymaster 5000

sentinel parallel-syncs mymaster 2 --- 指定了在執(zhí)行故障轉(zhuǎn)移時(shí),最多可以有多少個(gè)從Redis實(shí)例在同步新的主實(shí)例历涝,在從Redis實(shí)例較多的情況下這個(gè)數(shù)字越小诅需,同步的時(shí)間越長(zhǎng),完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)

啟動(dòng)哨兵模式(cd到redis安裝根目錄下啟動(dòng)荧库,因?yàn)樾枰\(yùn)行redis-server)(需要redis在啟動(dòng)狀態(tài))

#Sentinel.conf使用絕對(duì)路徑或相對(duì)路徑都OK,能找到就行

#--sentinel &這一項(xiàng)必不可少

./redis-server sentinel.conf --sentinel &

查看進(jìn)程sentinel是否存在堰塌,端口號(hào)26379是否正常

4.測(cè)試

查看redis哨兵日志(172.16.100.156)

tail /var/log/redis/sentinel.log

說(shuō)明:

出現(xiàn)sentinel id 說(shuō)明進(jìn)程啟動(dòng)成功

Monitor master mymaster 172.16.100.151 6379 quorum 1表示已經(jīng)對(duì)mymaster進(jìn)行監(jiān)控

+sdown slave一行說(shuō)明slave變?yōu)閐own或無(wú)法訪問(wèn)slave的redis庫(kù),原因?yàn)閟lave庫(kù)的配置文件bind一項(xiàng)未修改电爹,將slave庫(kù)配置文件bind一項(xiàng)修改為0.0.0.0后日志出現(xiàn)-sdown slave表示連接成功

哨兵模式配置蔫仙,啟動(dòng)成功

2料睛、搭建mogilefs丐箩,與nginx做整合

MofileFS是一個(gè)開源的分布式文件系統(tǒng),用于組件分布式文件集群恤煞。其主要特性包括:應(yīng)用層組件屎勘、無(wú)單點(diǎn)故障、自動(dòng)文件復(fù)制(復(fù)制單位不是文件而是class類)居扒、傳輸中使用http協(xié)議概漱,基于域的簡(jiǎn)單命名方式、具有比RAID更好的可靠性

MogileFS由3個(gè)部分組成:

? 第1個(gè)部分:是server端喜喂,包括mogilefsd和mogstored兩個(gè)程序瓤摧。前者即是mogilefsd的tracker,它將一些全局信息保存在數(shù)據(jù)庫(kù)里玉吁,例如站點(diǎn)domain,class,host等照弥。后者即是存儲(chǔ)節(jié)點(diǎn)(store node),它其實(shí)是個(gè)HTTP Daemon进副,默認(rèn)偵聽在7500端口这揣,接受客戶端的文件備份請(qǐng)求。在安裝完后影斑,要運(yùn)行mogadm工具將所有的store node注冊(cè)到mogilefsd的數(shù)據(jù)庫(kù)里给赞,mogilefsd會(huì)對(duì)這些節(jié)點(diǎn)進(jìn)行管理和監(jiān)控。

? 第2個(gè)部分 :是utils(工具集)矫户,主要是MogileFS的一些管理工具片迅,例如mogadm等。

? 第3個(gè)部分 :是客戶端API皆辽,目前只有Perl API(MogileFS.pm)柑蛇、PHP罐旗,用這個(gè)模塊可以編寫客戶端程序,實(shí)現(xiàn)文件的備份管理功能,提供MogileFS.pm唯蝶。

測(cè)試環(huán)境:

? trackers節(jié)點(diǎn):172.16.100.152

? storage節(jié)點(diǎn)1:172.16.100.152

? DB節(jié)點(diǎn):172.16.100.152

? storage節(jié)點(diǎn)2:172.16.100.153

安裝過(guò)程:

yum -y install ntpdate && ntpdate ntp1.aliyun.com?? #時(shí)間必須要同步九秀,不然使用cpanm安裝Mogilefs會(huì)fail

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

或直接yum install -y epel-release? ? #安裝epel源

setenforce 0 && service iptables stop?? #因這是測(cè)試環(huán)境,需要關(guān)閉防火墻和selinux

yum -y install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO?? #安裝mogilefs關(guān)聯(lián)安裝包

yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes

Yum -y install perl-Sys-Syscall (不推薦粘我,yum安裝版本為0.25鼓蜒,存在bug,文章后面有說(shuō)明征字,建議直接wget后編譯0.23版本都弹,或yum安裝后替換為0.23版本,具體方法見問(wèn)題處理)

wget http://xrl.us/cpanm -O /usr/bin/cpanm && chmod +x /usr/bin/cpanm? ? #下載cpanm

cpanm MogileFS::Server? ? #安裝mogilefs server

cpanm MogileFS::Utils? #安裝管理工具

cpanm MogileFS::Client

cpanm IO::AIO

安裝mysql匙姜,負(fù)責(zé)存儲(chǔ)trackers元數(shù)據(jù)畅厢。

授權(quán)root用戶:

? mysql> grant all on *.* to 'root'@'172.16.100.%' identified by 'xxxxxx';

創(chuàng)建mogiles數(shù)據(jù)庫(kù):

? mysql> create database mogilefs;

授權(quán)訪問(wèn)mogiles數(shù)據(jù)用戶:

? mysql> grant all on mogilefs.* to 'moguser'@'172.16.100.%' identified by 'xxxxxx';

刷新數(shù)據(jù)庫(kù)系統(tǒng)權(quán)限相關(guān)表:

? mysql> flush privileges;

添加啟動(dòng)腳本并添加用戶

mogilefsd不會(huì)以root運(yùn)行,需要?jiǎng)?chuàng)建non-root用戶:

? useradd mogilefs

添加mogilefsd啟動(dòng)腳本氮昧,賦予755權(quán)限:

? #!/bin/sh

? #

? # mogilefsd? ? Startup script for the MogileFS tracker

? #

? # chkconfig: - 85 15

? # description: MogileFS tracker

? # processname: mogilefsd

? # config: /etc/mogilefs/mogilefs.conf

? # pidfile: /var/run/mogilefsd.pid

? # Source function library.

? . /etc/init.d/functions

? # Check that networking is up.

? . /etc/sysconfig/network

? # Check that networking is up.

? [ "$NETWORKING" = "no" ] && exit 0

? mogilefsd="/usr/local/bin/mogilefsd"

? MOGILEFS_CONF_FILE="/etc/mogilefs/mogilefs.conf"

? SUDO_USER=mogile

? lockfile=/var/lock/subsys/mogilefsd

? start() {

? ?? echo -n $"Starting mogilefsd: "

? #? ? ? ?? sudo -u $SUDO_USER $mogilefsd -c $MOGILEFS_CONF_FILE --daemon --no_schema_check

? ?? daemon --user $SUDO_USER $mogilefsd -c $MOGILEFS_CONF_FILE --daemon

? ?? retval=$?

? ?? echo

? ?? [ $retval = 0 ] && touch ${lockfile}

? ?? return $retval

? }

? stop() {

? ?? echo -n $"Stopping $prog: "

? ?? killproc mogilefsd

? ?? retval=$?

? ?? echo

? ?? [ $retval = 0 ] && rm -f ${lockfile}

? ?? return $retval

? }

? reload() {

? ? echo -n $"Reloading mogilefsd: "

? ? killproc mogilefsd -HUP

? ? retval=$?

? ? echo

? }

? # See how we were called.

? case "$1" in

? ?? start)

? ?? start

? ?? ;;

? ?? stop)

? ?? stop

? ?? ;;

? ?? status)

? ?? status mogilefsd

? ?? retval=$?

? ?? ;;

? ?? restart)

? ?? stop

? ?? start

? ?? ;;

? ?? reload)

? ?? reload

? ?? ;;

? ?? *)

? ?? echo $"Usage: mogilefsd {start|stop|restart|reload|status}"

? ?? exit 1

? esac

? exit $retval

配置trackers節(jié)點(diǎn):

1框杜,添加running目錄:

? [root@localhost ~]# mkdir -pv /var/run/mogilefsd

? [root@localhost ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd

2,使用mogdbsetup初始化數(shù)據(jù)庫(kù):(此處如果不指定數(shù)據(jù)庫(kù)袖肥,則會(huì)刪除所有數(shù)據(jù)庫(kù)并全部自動(dòng)初始化咪辱,此處操作需謹(jǐn)慎)

? ?? [root@localhost ~]# mogdbsetup --dbhost=172.16.100.152 --dbrootpass='xxxxxx' --dbuser='moguser' --dbpass='xxxxxx'

進(jìn)入數(shù)據(jù)庫(kù),查看mogilefs庫(kù)內(nèi)容

為tracker添加mogilefsd配置文件

mkdir /etc/mogilefs

cd /etc/mogilefs

vim mogilefsd.conf? #創(chuàng)建配置文件椎组,修改內(nèi)容如下

daemonize = 1? ? ? ? ? ? ? #是否在后臺(tái)以守護(hù)進(jìn)程運(yùn)行

pidfile = /var/run/mogilefsd/mogilefsd.pid

db_dsn = DBI:mysql:mogilefs:host=172.16.100.152;port=3306;mysql_connect_timeout=5? #連接數(shù)據(jù)庫(kù)的信息 油狂,host地址如果tracker在本機(jī)默認(rèn)安裝位置則可以直接用localhost,用其他ip時(shí)注意數(shù)據(jù)庫(kù)中用戶的授權(quán)

db_user = moguser? ? ? ? ? #數(shù)據(jù)庫(kù)上的用戶名,不是在linux系統(tǒng)創(chuàng)建的mogilefs用戶寸癌!

db_pass = XXXXXX? ? ? ? ? #數(shù)據(jù)庫(kù)中該用戶名對(duì)應(yīng)的密碼

listen = 0.0.0.0:7001? ? ? #監(jiān)聽的地址和端口

conf_port = 7001? ? ? ? ? ? #配置接口

query_jobs = 10? ? ? ? ? ? #用于查詢的進(jìn)程數(shù) 可調(diào)大? 看需求

delete_jobs = 1? ? ? ? ? ? #用于刪除操作的進(jìn)程數(shù) 可調(diào)大? 看需求

replicate_jobs = 5? ? ? ? ? #用于復(fù)制的進(jìn)程數(shù) 可調(diào)大? 看需求

reaper_jobs = 1? ? ? ? ? ? #用于回收資源的進(jìn)程數(shù) 可調(diào)大? 看需求

啟動(dòng)mogilefsd-tracker進(jìn)程:

使用編寫的腳本

或直接輸入

su - mogilefs -c "mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon"

(使用創(chuàng)建的普通用戶mogilefs權(quán)限)

部署Storage Nodes

yum -y install make gcc unzip perl perl-CPAN perl-YAML perl-Time-HiRes? perl-DBD-MySQL

cpanm MogileFS::Server? ? #安裝mogilefs server

cpanm MogileFS::Utils? #安裝管理工具

創(chuàng)建配置文件存放文件夾

mkdir /etc/mogilefs/

創(chuàng)建mogilefs所需用戶

useradd -r? mogilefs

創(chuàng)建存儲(chǔ)節(jié)點(diǎn)配置文件

vim /etc/mogilefs/mogstored.conf

內(nèi)容為:

maxconns = 10000? #最大并發(fā)連接數(shù)

httplisten = 0.0.0.0:7500? #http監(jiān)聽的地址

mgmtlisten = 0.0.0.0:7501? #管理接口監(jiān)聽地址

docroot =/data/mogilefs/data? ? #用于存儲(chǔ)的目錄

創(chuàng)建存儲(chǔ)目錄并修改權(quán)限

Mkdir -pv /data/mogilefs/data

chown -R mogilefs.mogilefs /data/mogilefs/

啟動(dòng)mogilefs存儲(chǔ)進(jìn)程

su - mogilefs -c "mogstored -c /etc/mogilefs/mogstored.conf --daemon"

在tracker節(jié)點(diǎn)上測(cè)試track是否正常

mogadm? --trackers=172.16.100.152:7001 check

為trackers添加mysql信息

Vim /home/mogilefs/mogilefs.conf

內(nèi)容為:

--db_dsn="DBI:mysql:mogilefs:host=172.16.100.152"

--db_user="moguser"?? #注意是數(shù)據(jù)庫(kù)的用戶专筷,不是linux上的mogilefs用戶

--db_pass="xxxxxx"? ? #數(shù)據(jù)庫(kù)用戶對(duì)應(yīng)密碼

--verbose?

--stats="devices,files"

在tracker上添加存儲(chǔ)節(jié)點(diǎn)

mogadm? --trackers=172.16.100.152:7001 host add node1 --ip=172.16.100.152 --status=alive

mogadm? --trackers=172.16.100.152:7001 host add node2 --ip=172.16.100.153 --status=alive

為存儲(chǔ)節(jié)點(diǎn)添加設(shè)備

Mogadm --trackers=172.16.100.152:7001 device add node1 001? #編號(hào)不可重復(fù)

Mogadm --trackers=172.16.100.152:7001 device add node2 002

Mogadm --trackers=172.16.100.152:7001 device list? #顯示所有設(shè)備

創(chuàng)建對(duì)應(yīng)設(shè)備dev

創(chuàng)建domain

Mogadm --trackers=172.16.100.152:7001 domain add files #在存儲(chǔ)節(jié)點(diǎn)上創(chuàng)建一個(gè)名為files的domain

Mogadm --trackers=172.16.100.1152:7001 domain list? #查看存儲(chǔ)節(jié)點(diǎn)上的domain名單

測(cè)試mogilefs的上傳和存儲(chǔ)功能

mogupload? --trackers=172.16.100.152:7001 --domain=files --key='/shellscripts' --file='/data/download/mogilefs.sh'?? #把當(dāng)前機(jī)器的/data/download目錄下的mogilefs.sh上傳到存儲(chǔ)節(jié)點(diǎn)的files domain中,設(shè)置key為/shellscripts下

查看files domain下的key列表

查看指定文件信息

Mogfileinfo #查看參數(shù)指定的文件的信息

Mogfileinfo --trackers=172.16.100.152:7001 --domain=files --key=’/shellscripts’

通過(guò)訪問(wèn)給定http地址可以查看文件已經(jīng)上傳成功

此時(shí)發(fā)現(xiàn)雖然domain上設(shè)置了mindevcount為2蒸苇,但文件上傳之后仍然只在一個(gè)dev中存在磷蛹,說(shuō)明兩臺(tái)mogstored沒(méi)同步成功

原因:截止2019.4.11,perl-Sys-Syscall-0.25版本仍會(huì)導(dǎo)致mogstored無(wú)法同步填渠,需要降級(jí)為0.23版本

解決辦法:tar -zxvf Sys-Syscall-0.23

cp -f Sys-Syscall-0.23/lib/Sys/Syscall.pm /usr/local/share/perl5/Sys/

通過(guò)如下命令查看模塊版本是否已經(jīng)替換為0.23版本:

grep -E "VERSION\s" /usr/local/share/perl5/Sys/Syscall.pm

確認(rèn)版本正確后重啟mogilefsd弦聂,mogstored所有節(jié)點(diǎn),mysql服務(wù)

重新上傳文件發(fā)現(xiàn)同步OK

問(wèn)題集:

1.多存儲(chǔ)節(jié)點(diǎn)時(shí)氛什,有些存儲(chǔ)節(jié)點(diǎn)無(wú)法啟動(dòng)莺葫,顯示無(wú)法連接數(shù)據(jù)庫(kù)

首先確認(rèn)端口、配置文件中mysql用戶枪眉,密碼捺檬,用戶在數(shù)據(jù)庫(kù)對(duì)應(yīng)IP上是否有授權(quán),授權(quán)是否刷新權(quán)限

其次確認(rèn)mysql的配置文件my.cnf中是否有限制最大連接數(shù)或最大連接用戶贸铜,如果沒(méi)有則有可能為超過(guò)了最大連接限制堡纬,mysql默認(rèn)一個(gè)賬號(hào)只能由一個(gè)IP登陸

設(shè)置mysql 的max_user_connection聂受,重啟mysql

2.無(wú)法啟動(dòng)trackers?

確認(rèn)端口策略

確認(rèn)配置文件

確認(rèn)mogilefs配置文件中的pid存放文件夾存在

確認(rèn)/user/bin下有可執(zhí)行mogilefsd

確認(rèn)mogilefs運(yùn)行目錄/var/run/mogilefsd存在且屬主屬組為mogilefs用戶

mkdir -pv /var/run/mogilefsd

chown -R mogilefs.mogilefs /var/run/mogilefsd

3.mogilefsd啟動(dòng)成功,trackers正常烤镐,設(shè)備正常蛋济,mogstored節(jié)點(diǎn)都正常,但上傳文件未同步

原因是yum 安裝的perl-Sys-Syscall為0.25版本炮叶,截止2019.4.11為止仍存在bug會(huì)導(dǎo)致mogstored之間無(wú)法互相同步

解決辦法為:

tar -zxvf Sys-Syscall-0.23

cp -f Sys-Syscall-0.23/lib/Sys/Syscall.pm /usr/local/share/perl5/Sys/

通過(guò)如下命令查看模塊版本是否已經(jīng)替換為0.23版本:

grep -E "VERSION\s" /usr/local/share/perl5/Sys/Syscall.pm

確認(rèn)版本正確后重啟mogilefsd碗旅,mogstored所有節(jié)點(diǎn),mysql服務(wù)

至此mogilefs安裝配置完畢

使用nginx代理mogilefs

測(cè)試環(huán)境:

Nginx:?? 172.16.100.151

Mogilefs trackers:?? 172.16.100.152:7001

Mogilefs stored:?? 172.16.100.152, 172.16.100.153

Mogilefs mysql:?? 172.16.100.152:3306

安裝nginx并配置

采用nginx版本與參數(shù)說(shuō)明

補(bǔ)充說(shuō)明:添加第三方模塊nginx_mogilefs_module

下載地址http://www.grid.net.ru/nginx/mogilefs.en.html

解壓縮對(duì)應(yīng)tar.gz包

Nginx編譯參數(shù):

./configure \

? --prefix=/usr/local/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 \

? --with-debug \

--add-module=/root/nginx-mogilefs/nginx_mogilefs_module-1.0.4?#指明第三方模塊的位置即可

Make

如果已經(jīng)安裝過(guò)nginx镜悉,則不要執(zhí)行make install祟辟,而是在make之后用obj/nginx文件替換原nginx目錄sbin下的nginx執(zhí)行文件(替換前先備份)

到sbin目錄下執(zhí)行nginx -V即可查看是否成功加載模塊

Nginx配置文件

加入負(fù)載模塊(雖然沒(méi)有但加上以便以后測(cè)試):

upstream mogilefs {

? ? ? ? server 172.16.100.152:7001;

? ? ? ? ?? }

加入location定義:

location? /p_w_picpaths/ {

? ? mogilefs_tracker mogilefs;? #對(duì)應(yīng)上面負(fù)載名稱

? ? mogilefs_domain files;?? #mogilefs stored使用的domain名稱

? ? mogilefs_methods GET;

? ? ? ? mogilefs_noverify on;

? ? mogilefs_pass {

? ? ? ? proxy_pass $mogilefs_path;

proxy_hide_header Content-Type;

proxy_buffering off;

? ? ? ? ?? }

}

保存修改,nginx -t測(cè)試無(wú)誤后即可啟動(dòng)nginx

測(cè)試nginx代理mogilefs

上傳文件

(注意上傳的key最好加瀏覽器可以顯示的格式侣肄,如果不加入格式有可能頁(yè)面會(huì)自動(dòng)進(jìn)入下載而不是顯示旧困;比如此處key寫作--key=’/test’時(shí)會(huì)因?yàn)闊o(wú)法識(shí)別而直接下載)


3、搭建fastdfs

搭建fastdfs過(guò)程參考自:https://www.cnblogs.com/chiangchou/p/fastdfs.html

1稼锅、簡(jiǎn)介

FastDFS 是一個(gè)開源的高性能分布式文件系統(tǒng)(DFS)吼具。 它的主要功能包括:文件存儲(chǔ),文件同步和文件訪問(wèn)缰贝,以及高容量和負(fù)載平衡馍悟。主要解決了海量數(shù)據(jù)存儲(chǔ)問(wèn)題畔濒,特別適合以中小文件(建議范圍:4KB < file_size <500MB)為載體的在線服務(wù)剩晴。

FastDFS 系統(tǒng)有三個(gè)角色:跟蹤服務(wù)器(Tracker Server)、存儲(chǔ)服務(wù)器(Storage Server)和客戶端(Client)侵状。

  Tracker Server:跟蹤服務(wù)器赞弥,主要做調(diào)度工作,起到均衡的作用趣兄;負(fù)責(zé)管理所有的 storage server和 group绽左,每個(gè) storage 在啟動(dòng)后會(huì)連接 Tracker,告知自己所屬 group 等信息艇潭,并保持周期性心跳拼窥。

  Storage Server:存儲(chǔ)服務(wù)器,主要提供容量和備份服務(wù)蹋凝;以 group 為單位鲁纠,每個(gè) group 內(nèi)可以有多臺(tái) storage server,數(shù)據(jù)互為備份鳍寂。

Client:客戶端改含,上傳下載數(shù)據(jù)的服務(wù)器,也就是我們自己的項(xiàng)目所部署在的服務(wù)器迄汛。

2捍壤、FastDFS的存儲(chǔ)策略

為了支持大容量骤视,存儲(chǔ)節(jié)點(diǎn)(服務(wù)器)采用了分卷(或分組)的組織方式。存儲(chǔ)系統(tǒng)由一個(gè)或多個(gè)卷組成鹃觉,卷與卷之間的文件是相互獨(dú)立的专酗,所有卷的文件容量累加就是整個(gè)存儲(chǔ)系統(tǒng)中的文件容量。一個(gè)卷可以由一臺(tái)或多臺(tái)存儲(chǔ)服務(wù)器組成盗扇,一個(gè)卷下的存儲(chǔ)服務(wù)器中的文件都是相同的笼裳,卷中的多臺(tái)存儲(chǔ)服務(wù)器起到了冗余備份和負(fù)載均衡的作用。

在卷中增加服務(wù)器時(shí)粱玲,同步已有的文件由系統(tǒng)自動(dòng)完成躬柬,同步完成后,系統(tǒng)自動(dòng)將新增服務(wù)器切換到線上提供服務(wù)抽减。當(dāng)存儲(chǔ)空間不足或即將耗盡時(shí)允青,可以動(dòng)態(tài)添加卷。只需要增加一臺(tái)或多臺(tái)服務(wù)器卵沉,并將它們配置為一個(gè)新的卷颠锉,這樣就擴(kuò)大了存儲(chǔ)系統(tǒng)的容量。

3史汗、FastDFS的上傳過(guò)程

FastDFS向使用者提供基本文件訪問(wèn)接口琼掠,比如upload、download停撞、append瓷蛙、delete等,以客戶端庫(kù)的方式提供給用戶使用戈毒。

Storage Server會(huì)定期的向Tracker Server發(fā)送自己的存儲(chǔ)信息艰猬。當(dāng)Tracker Server Cluster中的Tracker Server不止一個(gè)時(shí),各個(gè)Tracker之間的關(guān)系是對(duì)等的埋市,所以客戶端上傳時(shí)可以選擇任意一個(gè)Tracker冠桃。

當(dāng)Tracker收到客戶端上傳文件的請(qǐng)求時(shí),會(huì)為該文件分配一個(gè)可以存儲(chǔ)文件的group道宅,當(dāng)選定了group后就要決定給客戶端分配group中的哪一個(gè)storage server食听。當(dāng)分配好storage server后,客戶端向storage發(fā)送寫文件請(qǐng)求污茵,storage將會(huì)為文件分配一個(gè)數(shù)據(jù)存儲(chǔ)目錄樱报。然后為文件分配一個(gè)fileid,最后根據(jù)以上的信息生成文件名存儲(chǔ)文件省咨。

4肃弟、FastDFS的文件同步

寫文件時(shí),客戶端將文件寫至group內(nèi)一個(gè)storage server即認(rèn)為寫文件成功,storage server寫完文件后笤受,會(huì)由后臺(tái)線程將文件同步至同group內(nèi)其他的storage server穷缤。

每個(gè)storage寫文件后,同時(shí)會(huì)寫一份binlog箩兽,binlog里不包含文件數(shù)據(jù)津肛,只包含文件名等元信息,這份binlog用于后臺(tái)同步汗贫,storage會(huì)記錄向group內(nèi)其他storage同步的進(jìn)度身坐,以便重啟后能接上次的進(jìn)度繼續(xù)同步;進(jìn)度以時(shí)間戳的方式進(jìn)行記錄落包,所以最好能保證集群內(nèi)所有server的時(shí)鐘保持同步部蛇。

storage的同步進(jìn)度會(huì)作為元數(shù)據(jù)的一部分匯報(bào)到tracker上,tracke在選擇讀storage的時(shí)候會(huì)以同步進(jìn)度作為參考咐蝇。

5涯鲁、FastDFS的文件下載

客戶端uploadfile成功后,會(huì)拿到一個(gè)storage生成的文件名有序,接下來(lái)客戶端根據(jù)這個(gè)文件名即可訪問(wèn)到該文件抹腿。

跟upload file一樣,在downloadfile時(shí)客戶端可以選擇任意tracker server旭寿。tracker發(fā)送download請(qǐng)求給某個(gè)tracker警绩,必須帶上文件名信息,tracke從文件名中解析出文件的group盅称、大小肩祥、創(chuàng)建時(shí)間等信息,然后為該請(qǐng)求選擇一個(gè)storage用來(lái)服務(wù)讀請(qǐng)求微渠。

Fastdfs安裝過(guò)程

環(huán)境準(zhǔn)備:

Trackers:172.16.100.152

Stored節(jié)點(diǎn):172.16.100.152?? 172.16.100.153

下載安裝 libfastcommon(trackers和stored都需要安裝)

libfastcommon是從 FastDFS 和 FastDHT 中提取出來(lái)的公共 C 函數(shù)庫(kù)搭幻,基礎(chǔ)環(huán)境,安裝即可 逞盆。

下載libfastcommon

# wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz

?解壓

# tar -zxvf V1.0.7.tar.gz

# cd libfastcommon-1.0.7

?編譯、安裝

# ./make.sh

# ./make.sh install

?libfastcommon.so 安裝到了/usr/lib64/libfastcommon.so松申,但是FastDFS主程序設(shè)置的lib目錄是/usr/local/lib云芦,所以需要?jiǎng)?chuàng)建軟鏈接。

# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

# ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so

# ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so

# ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

下載安裝FastDFS(trackers和stored都需要安裝贸桶,只是啟動(dòng)不同)

下載FastDFS

# wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz

?解壓

# tar -zxvf V5.05.tar.gz

# cd fastdfs-5.05

?編譯舅逸、安裝

# ./make.sh

# ./make.sh install

?默認(rèn)安裝方式安裝后的相應(yīng)文件與目錄

  A、服務(wù)腳本:

/etc/init.d/fdfs_storaged

/etc/init.d/fdfs_tracker

  B皇筛、配置文件(這三個(gè)是作者給的樣例配置文件) :

/etc/fdfs/client.conf.sample

/etc/fdfs/storage.conf.sample

/etc/fdfs/tracker.conf.sample

  C琉历、命令工具在 /usr/bin/ 目錄下:

復(fù)制代碼

fdfs_appender_test

fdfs_appender_test1

fdfs_append_file

fdfs_crc32

fdfs_delete_file

fdfs_download_file

fdfs_file_info

fdfs_monitor

fdfs_storaged

fdfs_test

fdfs_test1

fdfs_trackerd

fdfs_upload_appender

fdfs_upload_file

stop.sh

restart.sh

復(fù)制代碼

?FastDFS 服務(wù)腳本設(shè)置的 bin 目錄是 /usr/local/bin, 但實(shí)際命令安裝在 /usr/bin/ 下。

  兩種方式:

   一是修改FastDFS 服務(wù)腳本中相應(yīng)的命令路徑旗笔,也就是把 /etc/init.d/fdfs_storaged 和 /etc/init.d/fdfs_tracker 兩個(gè)腳本中的 /usr/local/bin 修改成 /usr/bin彪置。

    # vim fdfs_trackerd

    使用查找替換命令進(jìn)統(tǒng)一修改:%s+/usr/local/bin+/usr/bin

    # vim fdfs_storaged

    使用查找替換命令進(jìn)統(tǒng)一修改:%s+/usr/local/bin+/usr/bin

二是建立 /usr/bin 到 /usr/local/bin 的軟鏈接

# ln -s /usr/bin/fdfs_trackerd?? /usr/local/bin

# ln -s /usr/bin/fdfs_storaged?? /usr/local/bin

# ln -s /usr/bin/stop.sh? ? ? ?? /usr/local/bin

# ln -s /usr/bin/restart.sh? ? ? /usr/local/bin

配置FastDFS跟蹤器(Tracker)

配置文件詳細(xì)說(shuō)明參考:FastDFS 配置文件詳解

進(jìn)入 /etc/fdfs,復(fù)制 FastDFS 跟蹤器樣例配置文件 tracker.conf.sample蝇恶,并重命名為 tracker.conf拳魁。

# cd /etc/fdfs

# cp tracker.conf.sample tracker.conf

# vim tracker.conf

編輯tracker.conf ,這里只列需要重點(diǎn)關(guān)注的撮弧,其它的一般默認(rèn)即可潘懊。

# 配置文件是否不生效,false 為生效

disabled=false

# 提供服務(wù)的端口

port=22122

# Tracker 數(shù)據(jù)和日志目錄地址(根目錄必須存在,子目錄會(huì)自動(dòng)創(chuàng)建)

base_path=/data/fasfdfs/tracker

# HTTP 服務(wù)端口

http.server_port=80

編輯完畢保存

創(chuàng)建tracker基礎(chǔ)數(shù)據(jù)目錄贿衍,即base_path對(duì)應(yīng)的目錄

# mkdir -p /data/fastdfs/tracker

啟動(dòng)Tracker

初次成功啟動(dòng)授舟,會(huì)在 /data/fdfsdfs/tracker/ (配置的base_path)下創(chuàng)建 data、logs 兩個(gè)目錄贸辈。

可以用這種方式啟動(dòng)

# /etc/init.d/fdfs_trackerd start

也可以用這種方式啟動(dòng)岂却,前提是上面創(chuàng)建了軟鏈接,后面都用這種方式

# service fdfs_trackerd start

查看 FastDFS Tracker 是否已成功啟動(dòng) 裙椭,22122端口正在被監(jiān)聽躏哩,則算是Tracker服務(wù)安裝成功。

關(guān)閉Tracker命令:

# service fdfs_trackerd stop

設(shè)置Tracker開機(jī)啟動(dòng)

# chkconfig fdfs_trackerd on

或者:

# vim /etc/rc.d/rc.local

加入配置:

/etc/init.d/fdfs_trackerd start

tracker server 目錄及文件結(jié)構(gòu)

Tracker服務(wù)啟動(dòng)成功后,會(huì)在base_path下創(chuàng)建data唇撬、logs兩個(gè)目錄启昧。目錄結(jié)構(gòu)如下:

${base_path}

? |__data

? |?? |__storage_groups.dat:存儲(chǔ)分組信息

? |?? |__storage_servers.dat:存儲(chǔ)服務(wù)器列表

? |__logs

? |?? |__trackerd.log: tracker server 日志文件

配置 FastDFS 存儲(chǔ) (Storage節(jié)點(diǎn))

進(jìn)入 /etc/fdfs 目錄,復(fù)制 FastDFS 存儲(chǔ)器樣例配置文件 storage.conf.sample正驻,并重命名為 storage.conf

# cd /etc/fdfs

# cp storage.conf.sample storage.conf

# vim storage.conf

② 編輯storage.conf

這里只列出需要重點(diǎn)關(guān)注的部分,其它的一般默認(rèn)即可抢腐,可以按需修改姑曙。

復(fù)制代碼

# 配置文件是否不生效,false 為生效

disabled=false

# 指定此 storage server 所在 組(卷)

group_name=group1

# storage server 服務(wù)端口

port=23000

# 心跳間隔時(shí)間迈倍,單位為秒 (這里是指主動(dòng)向 tracker server 發(fā)送心跳)

heart_beat_interval=30

# Storage 數(shù)據(jù)和日志目錄地址(根目錄必須存在伤靠,子目錄會(huì)自動(dòng)生成)

base_path=/data/fastdfs/storage

# 存放文件時(shí) storage server 支持多個(gè)路徑。這里配置存放文件的基路徑數(shù)目啼染,通常只配一個(gè)目錄宴合。

store_path_count=1

# 逐一配置 store_path_count 個(gè)路徑,索引號(hào)基于 0迹鹅。

# 如果不配置 store_path0卦洽,那它就和 base_path 對(duì)應(yīng)的路徑一樣。

store_path0=/data/fastdfs/file

# FastDFS 存儲(chǔ)文件時(shí)斜棚,采用了兩級(jí)目錄阀蒂。這里配置存放文件的目錄個(gè)數(shù)该窗。

# 如果本參數(shù)只為 N(如: 256),那么 storage server 在初次運(yùn)行時(shí)蚤霞,會(huì)在 store_path 下自動(dòng)創(chuàng)建 N * N 個(gè)存放文件的子目錄酗失。

subdir_count_per_path=256

# tracker_server 的列表 ,會(huì)主動(dòng)連接 tracker_server

# 有多個(gè) tracker server 時(shí)争便,每個(gè) tracker server 寫一行

tracker_server=file.ljzsg.com:22122

# 允許系統(tǒng)同步的時(shí)間段 (默認(rèn)是全天) 级零。一般用于避免高峰同步產(chǎn)生一些問(wèn)題而設(shè)定。

sync_start_time=00:00

sync_end_time=23:59

# 訪問(wèn)端口

http.server_port=80

創(chuàng)建Storage基礎(chǔ)數(shù)據(jù)目錄滞乙,對(duì)應(yīng)base_path目錄

# mkdir -p /data/fastdfs/storage

# 這是配置的store_path0路徑

# mkdir -p /data/fastdfs/file

啟動(dòng) Storage

啟動(dòng)Storage前確保Tracker是啟動(dòng)的奏纪。初次啟動(dòng)成功,會(huì)在 /ljzsg/fastdfs/storage 目錄下創(chuàng)建 data斩启、 logs 兩個(gè)目錄序调。

可以用這種方式啟動(dòng)

# /etc/init.d/fdfs_storaged start

也可以用這種方式,后面都用這種

# service fdfs_storaged start

查看 Storage 是否成功啟動(dòng)兔簇,23000 端口正在被監(jiān)聽发绢,就算 Storage 啟動(dòng)成功。

# netstat -unltp|grep fdfs

關(guān)閉Storage命令:

# service fdfs_storaged stop

查看Storage和Tracker是否在通信:

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

設(shè)置 Storage 開機(jī)啟動(dòng)

# chkconfig fdfs_storaged on

或者:

# vim /etc/rc.d/rc.local

加入配置:

/etc/init.d/fdfs_storaged start

Storage 目錄結(jié)構(gòu)

同 Tracker垄琐,Storage 啟動(dòng)成功后边酒,在base_path 下創(chuàng)建了data、logs目錄狸窘,記錄著 Storage Server 的信息墩朦。

在 store_path0 目錄下,創(chuàng)建了N*N個(gè)子目錄:

文件上傳功能測(cè)試

修改 Tracker 服務(wù)器中的客戶端配置文件

# cd /etc/fdfs

# cp client.conf.sample client.conf

# vim client.conf

修改如下配置即可翻擒,其它默認(rèn)氓涣。

# Client 的數(shù)據(jù)和日志目錄

base_path=/data/fastdfs/client

# Tracker端口

tracker_server=172.16.100.152:22122

上傳測(cè)試

上傳文件

返回的文件ID由group、存儲(chǔ)目錄陋气、兩級(jí)子目錄劳吠、fileid、文件后綴名(由客戶端指定巩趁,主要用于區(qū)分文件類型)拼接而成痒玩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晶渠,隨后出現(xiàn)的幾起案子凰荚,更是在濱河造成了極大的恐慌,老刑警劉巖褒脯,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缆毁,居然都是意外死亡番川,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颁督,“玉大人践啄,你說(shuō)我怎么就攤上這事〕劣” “怎么了屿讽?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吠裆。 經(jīng)常有香客問(wèn)我伐谈,道長(zhǎng),這世上最難降的妖魔是什么试疙? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任诵棵,我火速辦了婚禮,結(jié)果婚禮上祝旷,老公的妹妹穿的比我還像新娘履澳。我一直安慰自己,他們只是感情好怀跛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布距贷。 她就那樣靜靜地躺著,像睡著了一般吻谋。 火紅的嫁衣襯著肌膚如雪忠蝗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天滨溉,我揣著相機(jī)與錄音什湘,去河邊找鬼。 笑死晦攒,一個(gè)胖子當(dāng)著我的面吹牛闽撤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脯颜,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哟旗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了栋操?” 一聲冷哼從身側(cè)響起闸餐,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矾芙,沒(méi)想到半個(gè)月后舍沙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剔宪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拂铡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壹无。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡感帅,死狀恐怖斗锭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情失球,我是刑警寧澤岖是,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站实苞,受9級(jí)特大地震影響豺撑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硬梁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一前硫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荧止,春花似錦屹电、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至素邪,卻和暖如春外莲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兔朦。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工偷线, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沽甥。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓声邦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親摆舟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亥曹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355