溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

lvs+srs(dr模型)

發(fā)布時(shí)間:2020-03-29 13:22:38 來源:網(wǎng)絡(luò) 閱讀:1460 作者:biao007h 欄目:建站服務(wù)器

參考:

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)介:

lvs+srs(dr模型)

    在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)視頻可正常播放


向AI問一下細(xì)節(jié)

免責(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)容。

AI