在做MHA測(cè)試的時(shí)候,有一個(gè)重要的環(huán)節(jié)就是測(cè)試MHA Manager節(jié)點(diǎn)和Master節(jié)點(diǎn)的網(wǎng)絡(luò)情況,如果產(chǎn)生了抖動(dòng),那么MHA本身提供了一個(gè)參數(shù)secondary_check來(lái)保證,但是如果你的部署環(huán)境中是一主一從的話,這個(gè)參數(shù)就不會(huì)起作用了,因?yàn)閘atest slave和oldest slave是同一個(gè)庫(kù),簡(jiǎn)單來(lái)說(shuō),連不上就是連不上了,至于切還是不切,這個(gè)還不好說(shuō)。我們測(cè)試的場(chǎng)景下,有時(shí)候切,有時(shí)候不切。所以我們?cè)緶y(cè)試的MHA0.57版本就降級(jí)為了0.56,仔細(xì)測(cè)試發(fā)現(xiàn),其實(shí)也存在這樣的問(wèn)題,綜合再三,我們就把secondary_check給取消了,直接在MHA的代碼里調(diào)整了超時(shí)次數(shù)的配置(默認(rèn)是4次)。
接下來(lái)的問(wèn)題來(lái)了,如果做更深入的測(cè)試,我們勢(shì)必需要完整的模擬網(wǎng)絡(luò)的抖動(dòng)情況,這個(gè)時(shí)候傳統(tǒng)的service network stop ; sleep xxx; service network start的方式就會(huì)受限了。潛在的一個(gè)原因就是重啟服務(wù)以后,VIP就沒(méi)有了。
但是基本能夠模擬出MHA的場(chǎng)景,保證在指定的時(shí)間范圍內(nèi)出現(xiàn)抖動(dòng)而不會(huì)誤切。
所以經(jīng)過(guò)全方位的測(cè)試,我們心里有底了,那些方面該怎么調(diào)整,那些細(xì)節(jié)需要繼續(xù)深究,都有了一些心得和體會(huì)。
但是網(wǎng)絡(luò)的測(cè)試其實(shí)感覺(jué)還是不夠徹底,畢竟真實(shí)的網(wǎng)絡(luò)抖動(dòng)不會(huì)網(wǎng)卡不可用,而是網(wǎng)絡(luò)超時(shí),丟包等等。
所以如果能夠盡可能模擬出網(wǎng)絡(luò)問(wèn)題,配合MHA來(lái)聯(lián)調(diào)測(cè)試,就能夠基本模擬出真實(shí)的問(wèn)題場(chǎng)景了。所以tc這個(gè)方案就進(jìn)入了我的視線。
Linux的網(wǎng)絡(luò)流控,控發(fā)不控收 , 所以只能對(duì)產(chǎn)生瓶頸網(wǎng)卡處的發(fā)包速率進(jìn)行控制 , 流量控制過(guò)程分二種(以下內(nèi)容參考自/tupian/20230522/
隊(duì)列控制 即 QOS, 瓶頸處的發(fā)送隊(duì)列的規(guī)則控制,常見(jiàn)的有 SFQ PRIO
流量控制 即帶寬控制 , 隊(duì)列的排隊(duì)整形, 一般為 TBF HTB
Linux 流量控制算法分二種:
無(wú)類(lèi)算法 用于樹(shù)葉級(jí)無(wú)分支的隊(duì)列,例如:SFQ
分類(lèi)算法 用于多分支的隊(duì)列,例如:PRIO TBF HTB
而涉及到的流控算法SFQ和TBF都是需要簡(jiǎn)單了解的。
SFQ(Stochastic Fairness Queueing 隨機(jī)公平隊(duì)列 ) 是公平隊(duì)列算法家族中的一個(gè)簡(jiǎn)單實(shí)現(xiàn) . 它的精確性不如其它的方法 , 但實(shí)現(xiàn)了高度的公平 , 需要的計(jì)算量亦很少 .
其中SFQ 只會(huì)發(fā)生在數(shù)據(jù)發(fā)生擁堵 , 產(chǎn)生等待隊(duì)列的網(wǎng)卡上,出口網(wǎng)卡若無(wú)等待隊(duì)列 ,SFQ 也不起作用 ...
令牌桶過(guò)濾器 (TBF) 是一個(gè)簡(jiǎn)單的隊(duì)列規(guī)定 : 只允許以不超過(guò)事先設(shè)定的速率到來(lái)的數(shù)據(jù)包通過(guò) , 但可能允許短暫突發(fā)流量朝過(guò)設(shè)定值 .
首先簡(jiǎn)單模擬網(wǎng)絡(luò)超時(shí)100ms
使用如下的命令,網(wǎng)卡的情況具體對(duì)待,修改配置即可。
# tc qdisc add dev eth2 root netem delay 100ms
如果在本機(jī)ping測(cè)試。延時(shí)還是很低的。0.0x級(jí)別。
[root@oel642 ~]# ping 192.168.253.129
PING 192.168.253.129 (192.168.253.129) 56(84) bytes of data.
64 bytes from 192.168.253.129: icmp_seq=1 ttl=64 time=0.011 ms
64 bytes from 192.168.253.129: icmp_seq=2 ttl=64 time=0.044 ms
64 bytes from 192.168.253.129: icmp_seq=3 ttl=64 time=0.051 ms
而如果設(shè)置了超時(shí)選項(xiàng),就會(huì)很均勻的產(chǎn)生指定的延時(shí)。
[root@oel643 ~]# ping 192.168.253.129
PING 192.168.253.129 (192.168.253.129) 56(84) bytes of data.
64 bytes from 192.168.253.129: icmp_seq=1 ttl=64 time=202 ms
64 bytes from 192.168.253.129: icmp_seq=2 ttl=64 time=101ms
64 bytes from 192.168.253.129: icmp_seq=3 ttl=64 time=101ms
64 bytes from 192.168.253.129: icmp_seq=4 ttl=64 time=101ms
64 bytes from 192.168.253.129: icmp_seq=5 ttl=64 time=100 ms
取消tc的設(shè)置,可以使用
tc qdisc del dev eth2 root netem
如下的方式會(huì)產(chǎn)生一個(gè)范圍的延時(shí),比如默認(rèn)延時(shí)100毫秒,上下浮動(dòng)10毫秒。
[root@oel642 ~]# tc qdisc add dev eth2 root netem delay 100ms 10ms
ping的結(jié)果如下:
64 bytes from 192.168.253.129: icmp_seq=278 ttl=64 time=98.3 ms
64 bytes from 192.168.253.129: icmp_seq=279 ttl=64 time=99.1 ms
64 bytes from 192.168.253.129: icmp_seq=280 ttl=64 time=93.4 ms
64 bytes from 192.168.253.129: icmp_seq=281 ttl=64 time=95.5 ms
還有幾類(lèi)網(wǎng)絡(luò)情況需要考慮,比如丟包。在流量劫持的場(chǎng)景中,丟包率是一個(gè)需要重點(diǎn)關(guān)注的場(chǎng)景。
我們可以玩得大一些,丟包率10%,那是比較嚴(yán)重的問(wèn)題了。
[root@oel642 ~]# tc qdisc add dev eth2 root netem loss 10%
ping的結(jié)果如下,可以看到小結(jié)的部分,丟包率是基本在10%的基本范圍內(nèi),目前是8%。
64 bytes from 192.168.253.129: icmp_seq=421 ttl=64 time=0.486 ms
64 bytes from 192.168.253.129: icmp_seq=422 ttl=64 time=0.413 ms
64 bytes from 192.168.253.129: icmp_seq=423 ttl=64 time=0.616 ms
^C
--- 192.168.253.129 ping statistics ---
426 packets transmitted, 390 received, 8% packet loss, time 425724ms
rtt min/avg/max/mdev = 0.144/64.257/120.621/49.069 ms
如果數(shù)據(jù)包有重復(fù)的情況下,該如何處理。比如重復(fù)包的比例,我們?cè)O(shè)置為50%。
>tc qdisc add dev eth2 root netem duplicate 50%
使用ping的結(jié)果如下:
PING 192.168.253.128 (192.168.253.128) 56(84) bytes of data.
64 bytes from 192.168.253.128: icmp_seq=1 ttl=64 time=0.402 ms
64 bytes from 192.168.253.128: icmp_seq=1 ttl=64 time=0.409 ms (DUP!)
64 bytes from 192.168.253.128: icmp_seq=2 ttl=64 time=0.788 ms
64 bytes from 192.168.253.128: icmp_seq=3 ttl=64 time=0.887 ms
64 bytes from 192.168.253.128: icmp_seq=4 ttl=64 time=0.721 ms
64 bytes from 192.168.253.128: icmp_seq=4 ttl=64 time=0.757 ms (DUP!)
64 bytes from 192.168.253.128: icmp_seq=5 ttl=64 time=1.33 ms
比如產(chǎn)生壞包的情況。
tc qdisc add dev eth2 root netem corrupt 50%
ping的結(jié)果如下:
64 bytes from 192.168.253.128: icmp_seq=51 ttl=64 time=0.468 ms
64 bytes from 192.168.253.128: icmp_seq=52 ttl=64 time=0.822 ms
wrong data byte #23 should be 0x17 but was 0x15
#16 10 11 12 13 14 15 16 15 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
#48 30 31 32 33 34 35 36 37
64 bytes from 192.168.253.128: icmp_seq=53 ttl=64 time=1.71 ms
wrong data byte #53 should be 0x35 but was 0x37
#16 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
#48 30 31 32 33 34 37 36 37
64 bytes from 192.168.253.128: icmp_seq=54 ttl=64 time=0.000 ms
64 bytes from 192.168.253.128: icmp_seq=56 ttl=64 time=0.000 ms
如果包是亂序的,我們可以加入隨機(jī)性,25%的包立即發(fā)送,其他的包延時(shí)10毫秒,系數(shù)為50%
[root@oel641 ~]# tc qdisc change dev eth2 root netem delay 10ms reorder 25% 50%
ping的結(jié)果如下所示:
64 bytes from 192.168.253.128: icmp_seq=200 ttl=64 time=1.24 ms
64 bytes from 192.168.253.128: icmp_seq=201 ttl=64 time=0.587 ms
64 bytes from 192.168.253.128: icmp_seq=202 ttl=64 time=1.01 ms
64 bytes from 192.168.253.128: icmp_seq=203 ttl=64 time=0.790 ms
64 bytes from 192.168.253.128: icmp_seq=204 ttl=64 time=0.998 ms
64 bytes from 192.168.253.128: icmp_seq=205 ttl=64 time=0.285 ms
64 bytes from 192.168.253.128: icmp_seq=206 ttl=64 time=0.882 ms
如果更復(fù)雜的場(chǎng)景呢,比如我們可以考慮加入流量的限制,網(wǎng)速控制在256k,大延遲為50ms
[root@oel641 ~]# tc qdisc add dev eth2 root handle 1:0 netem delay 100ms
[root@oel641 ~]# tc qdisc add dev eth2 parent 1:1 handle 10: tbf rate 256kbit burst 10000 latency 50ms
速率 256kbit 突發(fā)傳輸 10k 大延遲 50ms
如果不做流量控制,默認(rèn)的情況下,傳輸可以達(dá)到90M美妙。
[root@oel642 ~]# scp 192.168.253.128:~/Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz .
Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz 100% 93MB 92.9MB/s 00:01
而如果設(shè)置了流量控制的場(chǎng)景,就絕對(duì)保持在一個(gè)指定范圍內(nèi)。
[root@oel642 ~]# scp 192.168.253.128:~/Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz .
Percona-Server-5.6.14-rel62.0-483.Linux.x86_64.tar.gz 0% 208KB 16.8KB/s 1:34:05 ETA
當(dāng)然上面的場(chǎng)景都需要在測(cè)試環(huán)境先模擬一下,要不出現(xiàn)意料之外的問(wèn)題就得不償失了。