歡迎您光臨本站 註冊首頁

主備ld之間的狀態同步

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  公司的一業務使用的是長連接的tcp協議(就算在沒有業務數據包交互的情況下, 每隔n秒c/s間都會有keepalive包傳遞), 使用lvs作接入層的負載均衡, ld通過heartbeat做雙機熱備, 主備ld之間因為只涉及到公網ip的漂移, 沒有使用ldirectd來重構ipvs表, 而是直接使用自己寫的腳本來重構備機上的ipvs表. haresoucre的配置很簡單:master_node_name public_ip ipvs_shell.

  在實際的運營過程中, 由於是長連接業務, 且為了保證更好的用戶體驗, 我們決定把主備ld之間的狀態同步也加上, 所謂的狀態同步, 就是ld會維護一張連接跟蹤表(connection tracking table), 把每個連接的實時狀態都保存在這張表裡面. 要做到主備ld之間的這張連接跟蹤表的同步, 需要在主備ld上分別啟動一個內核守護線程, 通過廣播的方式來同步數據.

  主ld:

  ipvsadm --start-daemon=master --mcast-interface=eth1

  備ld:

  ipvsadm --start-daemon=backup --mcast-interface=eth1

  在主備ld上分別執行這兩個命令后, 可以在發現備ld上有個224.0.0.81:8848 listen的內核守護線程, 用來接收從主ld發過來的廣播包. , 要記得把防火牆的udp協議的8848埠打開, 不然同步不了, 可以在備ld上通過ipvsadm -Lnc看是否有連接同步過來.

  另外, 在實際的運營過程中還發現, 主備ld之間是怎麼觸發這種同步的呢?

  一是新的連接, 不管怎麼樣, 都會同步過去,

  二是對於已經存在的連接, 如果有足夠的數據量在這個連接上傳送, 在備ld上的expire time即將到期/或者已經到期的時候, 主ld會把這份已經存在的連接再次同步到備ld

  另外的是, 一個老的連接, 一直存在, 但是備機上的expire time已經到期了(主備上的expire time分別有主備機維護)還發現跟這個連接上的傳遞數據量有關係(就是要數據量要達到一定的閥值, 才會觸發), 如果c/s之間一直沒有業務數據, 僅僅只有每n秒傳遞的心跳數據(也就是說沒有達到觸發的閥值), 會發現備ld上的連接跟蹤表裡已經沒有這份數據.

  在正常業務數據的情況:

  idle的情況(只有keepalive包)


[火星人 ] 主備ld之間的狀態同步已經有400次圍觀

http://coctec.com/docs/linux/show-post-52293.html