您好,登錄后才能下訂單哦!
參考:
https://my.oschina.net/fengjihu/blog/416883 (srs集群模式)
http://blog.csdn.net/reblue520/article/details/50857078 (lvs負(fù)載均衡)
http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html (arp_ignore和arp_announce)
http://www.linuxvirtualserver.org/docs/arp.html (lvs arp問題)
http://www.linuxvirtualserver.org/VS-DRouting.html (lvs dr模式)
目的:
通過lvs推流到多個(gè)流服務(wù)器以緩解服務(wù)器壓力,利用邊緣服務(wù)器的功能可以訪問到所有流,又可以節(jié)約帶寬,因?yàn)槭侵辈?,所以推過來的流都是不同ip的,所以可以利用lvs hash ip的功能將同一流的包轉(zhuǎn)發(fā)到同一流服務(wù)器,這樣就解決了流的存放問題。
lvs dr模式原理簡(jiǎn)介:
在dr模式下,director、real server和vip都在同一網(wǎng)段中,這就帶來了幾個(gè)問題:
1.在此模式下,vip接收到的請(qǐng)求不能簡(jiǎn)單地通過轉(zhuǎn)發(fā)給real server,因?yàn)楫?dāng)請(qǐng)求過來的時(shí)候,如果簡(jiǎn)單地轉(zhuǎn)發(fā),因?yàn)槿_(tái)都能連外網(wǎng),所以轉(zhuǎn)發(fā)的時(shí)候real server會(huì)直接回復(fù)給請(qǐng)求方,而請(qǐng)求方收到ip,發(fā)現(xiàn)不是自己請(qǐng)求的會(huì)丟棄。
所以,每個(gè)real server上面都綁定了vip,當(dāng)收到vip來的請(qǐng)求包的時(shí)候,real server 用vip作為源地址回復(fù)。
2.我們解決了1的問題,但是這又帶來了新的問題:director和real server都有vip,而且在同一網(wǎng)段中,所以vip請(qǐng)求到來的時(shí)候,網(wǎng)關(guān)會(huì)廣播請(qǐng)求,所以不管是director還是realserver他們都會(huì)收到請(qǐng)求,假設(shè)我們director先收到了,它是怎么進(jìn)行負(fù)載均衡調(diào)度的呢?
利用ip是不行的,如果用realserver的真實(shí)ip,那么就會(huì)回到1的問題上去,所以只能用vip作為目的ip。事實(shí)上,dr模式下,lvs是根據(jù)mac地址來進(jìn)行負(fù)載均衡調(diào)度的,因?yàn)槊颗_(tái)的mac地址都不同,所以只有對(duì)應(yīng)mac的rs(realserver簡(jiǎn)寫,懶得打)會(huì)收到請(qǐng)求,并且因?yàn)樽约捍_實(shí)有vip,所以能響應(yīng)請(qǐng)求。
3.那么,我們又怎么確保director第一個(gè)收到呢?在同一網(wǎng)段中,每臺(tái)服務(wù)器都會(huì)收到vip請(qǐng)求廣播包,我們?cè)趺幢WCrs既能響應(yīng)這些請(qǐng)求又不首先響應(yīng)?這就要用到arp_ignore和arp_announce或者h(yuǎn)idden interface的功能。
在dr模式下,rs的配置是有些特殊的。比較常見的一種是把vip綁定到lo口上,因?yàn)榇蠖鄶?shù)linux內(nèi)核版本不會(huì)響應(yīng)回環(huán)口ip的arp報(bào)文請(qǐng)求,所以當(dāng)收到vip廣播請(qǐng)求報(bào)文的時(shí)候,rs不會(huì)響應(yīng)。因?yàn)閐irector是把vip綁定到某個(gè)非回環(huán)口上的,所以director可以第一個(gè)收到并響應(yīng)vip請(qǐng)求報(bào)文。 另一種常見的做法是,rs把vip綁定到某個(gè)不在使用中的接口上,然后利用hidden interface的功能禁掉此接口的arp響應(yīng),因?yàn)闆]有arp響應(yīng),所以這個(gè)端口必須不使用,否則影響正常通信。
我們的案例使用的是第三種常見的方法:設(shè)置arp_ignore 為1,這個(gè)參數(shù)的作用是只回答目標(biāo)IP地址是來訪網(wǎng)絡(luò)接口本地地址的ARP查詢請(qǐng)求
舉個(gè)例子,假設(shè)本機(jī)上兩個(gè)網(wǎng)口,eth0上綁定的ip為1.1.1.1,eth2上綁定的是2.2.2.2,那么設(shè)置arp_ignore為1后,當(dāng)eth0收到2.2.2.2的arp請(qǐng)求報(bào)文后不會(huì)響應(yīng),同理eth2收到1.1.1.1的arp請(qǐng)求報(bào)文不會(huì)響應(yīng)(eth0:0子網(wǎng)卡不確定可不可以,待測(cè)試)
然后,設(shè)置arp_announce為2,這個(gè)的作用是使用出口網(wǎng)口的mac作為源mac。
舉個(gè)例子,假設(shè)本機(jī)有eth0:1.1.1.1,eth2:2.2.2.2 ,假設(shè)本機(jī)收到了1.1.1.1的請(qǐng)求包,卻從eth2口發(fā)送包,那么數(shù)據(jù)幀的源mac應(yīng)該是寫eth0的mac還是eth2的mac? 正常情況下是寫eth2的,但是linux比較特殊,默認(rèn)是寫eth0的,設(shè)為2,是讓它默認(rèn)寫eth2的。
為什么這里需要用到呢?因?yàn)関ip包是director第一個(gè)響應(yīng)的,所以網(wǎng)關(guān)的arp表保留的是director的mac,假設(shè)rs,eth0配的真實(shí)ip,eth2配的vip,那么,當(dāng)收到director改寫mac的vip請(qǐng)求包后,它響應(yīng)并從eth0回送包(我們不應(yīng)該讓eth2接受到包,否則又回到2),如果此時(shí)填的是eth2,也就是vip所在的mac,那么網(wǎng)關(guān)發(fā)現(xiàn)這個(gè)是vip的新mac就會(huì)更新arp表,從而造成vip搶占(這個(gè)是別人的說法,我不太認(rèn)同,因?yàn)榫退阌胑th0的mac也會(huì)被更新,一樣搶占,待我找到靠譜的答案再更新此問題)
架構(gòu):
director ip:192.168.2.119(lvs調(diào)度器服務(wù)器ip)
virtual ip:192.168.2.111(調(diào)度用的虛擬ip)
real1 ip:192.168.2.127(srs源端服務(wù)器ip1)
real2 ip:192.168.2.138(srs源端服務(wù)器ip2)
srs ip:192.168.2.221 (此為srs邊緣服務(wù)器ip)
為了實(shí)驗(yàn)方便,默認(rèn)都關(guān)閉iptables和selinux
real1:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vi ifcfg-lo:0 內(nèi)容如下:
DEVICE=lo:0
IPADDR=192.168.2.111
NETMASK=255.255.255.255
BROADCAST=192.168.2.111
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
service network restart
vi /usr/local/srs/conf/edge.conf 內(nèi)容如下:
listen 1935;
max_connections 1000;
pid objs/edge.pid;
srs_log_file ./objs/edge.log;
vhost __defaultVhost__ {
}
service srs restart
route add -host 192.168.2.111 dev lo:0 #加這條是為了保證本機(jī)響應(yīng)包的源ip為vip不變
real2:
配置和real1一樣,略
srs 邊緣服務(wù)器的配置:
vi /usr/local/srs/conf/edge.conf
listen 1935;
max_connections 1000;
pid objs/edge.pid;
srs_log_file ./objs/edge.log;
vhost __defaultVhost__ {
mode remote;
origin 192.168.2.138:1935 192.168.2.127:1935; (經(jīng)測(cè)試,當(dāng)192.168.2.138和192.168.2.127存在不同流的時(shí)候,
} 用這種配置邊緣服務(wù)器可以訪問兩臺(tái)服務(wù)器上的所有流)
service srs restart
direct 的配置:
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 (lvs轉(zhuǎn)發(fā)包,所以這個(gè)要為1,開啟轉(zhuǎn)發(fā)功能)
sysctl -p
yum install ipvsadm -y (lvs是通過ipvsadm這個(gè)軟件包管理的,就類似于netfiter和iptables的關(guān)系)
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0:0
vi ifcfg-eth0:0 內(nèi)容如下:
DEVICE=eth0:0
BOOTPROTO=static
HWADDR=00:0C:29:5B:58:99
ONBOOT=yes
IPADDR=192.168.2.111
GATEWAY=192.168.2.1
NETMASK=255.255.255.0
service network restart
route add 192.168.2.111 dev eth0:0
ipvsadm -A -t 192.168.2.111:1935 -s sh (添加服務(wù),-s指定調(diào)度算法,sh是source_hash的意思,根據(jù)來源ip調(diào)度到同一臺(tái)服務(wù)器)
ipvsadm -a -t 192.168.2.111:1935 -r 192.168.2.138:1935 -m (添加后端服務(wù)器)
ipvsadm -a -t 192.168.2.111:1935 -r 192.168.2.127:1935 -m
ipvsadm -Ln (這個(gè)命令可以查看ipvs當(dāng)前的狀態(tài))
推流測(cè)試:
/usr/local/src/srs/trunk/objs/ffmpeg/bin/ffmpeg -re -i test.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.2.111/live/livestream1
/usr/local/src/srs/trunk/objs/ffmpeg/bin/ffmpeg -re -i test2.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.2.111/live/livestream2
通過rtmp://192.168.2.221/live/livestream1和rtmp://192.168.2.221/live/livestream2 查看確認(rèn)視頻可正常播放
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。