• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            專職C++

            不能停止的腳步

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(28)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            來源:http://blog.csdn.net/pingnning/archive/2009/10/24/4724377.aspx
            "tyrant分析-總體設(shè)計(jì)"中已經(jīng)提到,slave起一個(gè)線程(do_slave)做主從復(fù)制,它和master建立tcp連接,發(fā)送請求命令和起始時(shí)間rts +1(上次的更新時(shí)間加1秒)給master,然后循環(huán)的從master那里接收一條條的記錄,更新自己db、ulog和rts file。do_slave是以1秒為頻率執(zhí)行的。(實(shí)際是等待一次do_slave執(zhí)行完畢后,再等待1秒,然后進(jìn)入下一次的do_slave,依次循環(huán)。所以"以1秒為頻率執(zhí)行"的表達(dá)似乎并不準(zhǔn)確。從下面可以看到一次do_slave有可能執(zhí)行較長時(shí)間)

            主從復(fù)制是一個(gè)主、從交互的過程。本節(jié)依次描述協(xié)議細(xì)節(jié)、slave細(xì)節(jié)、master細(xì)節(jié)。

            ------------

            協(xié)議細(xì)節(jié):

             do_slave(slave)          do_repl(master)

             -------------------

             | TTMAGICNUM|

             | TTCMDREPL  |

             | ts (+1)        |

             | sid         |   send and recv (with timeout)

             -------------------  ------------------------>

                        -----------------

                 send and cnd wait      | NOP      |

                 <---------------------      -----------------

                        -----------------------

                        | TCULMAGICNUM |

                        | rts         |

                        | rsid         |

                        | rsiz          |

                   content send       | rsiz-content        |

                 <---------------------      ------------------------

                   next content send

                 <---------------------

                 ......

            rsiz-content格式:

              MAGIC + cmd + ksize + vsize + key + value

            其中:

             cmd: TTCMDPUT | TTCMDOUT | ...

             ksize,vsize分別是本條記錄的key,value的長度;

             slave就根據(jù)cmd和key-value對對db進(jìn)行相應(yīng)操作。

            master的ulog由一條條獨(dú)立記錄組成,每條記錄有相同格式:

             MAGIC + ts + sid + size + content

            其中:

             ts : 本條記錄對應(yīng)的時(shí)間戳。slave請求時(shí)會帶上上次更新時(shí)間戳,master根據(jù)它們來判斷需要傳送哪些記錄給slave;

             sid : server id. 唯一標(biāo)識server。

             size : 后面"content"長度

             content格式即上面"rsiz-content"的格式,描述了一條key-value對以及對它做的操作命令。

            --------------

            do_slave流程:

             打開rts文件(默認(rèn)為ttserver.rts),讀取上次的rts(replication timestamp);

             和master建立socket連接(參數(shù):-mhost,-mport),并設(shè)置socket選項(xiàng):

              SO_RCVTIMEO、SO_SNDTIMEO - 發(fā)送、接收超時(shí)設(shè)置為0.25秒

              TCP_NODELAY - 禁止nagle算法

             發(fā)送REPL請求(詳見協(xié)議細(xì)節(jié));

             循環(huán):

              用recv接收數(shù)據(jù);

              解析接收數(shù)據(jù),根據(jù)數(shù)據(jù)中指定的命令(TTCMDPUT、TTCMDOUT等)更新db和slave自己的ulog;

              用接收數(shù)據(jù)里的最新rts更新slave的rts文件;

             最后關(guān)閉連接

            解釋:

             1、slave不能因偶然的網(wǎng)絡(luò)故障之類永遠(yuǎn)阻塞在send或recv中,這樣的話更新就會永遠(yuǎn)停滯了。所以它要設(shè)置發(fā)送和接收的超時(shí)。如果超時(shí),則這次do_slave失敗,等待1秒后進(jìn)行下一次。send | recv失敗時(shí),它并不會用新的rts(可能壓根就沒請求到它)去更新自己的rts文件,所以下次還是會用舊的rts去請求,所以不會因do_slave失敗而導(dǎo)致slave數(shù)據(jù)不全。

             2、禁止nagle算法是因?yàn)橛行?shù)據(jù)的命令包的交互,不能拖延。

             3、請求只發(fā)送一次,但數(shù)據(jù)是一直循環(huán)接收的。循環(huán)失敗的條件是:recv失敗(或超時(shí)),收到SIGINT或SIGTERM,或是更新庫失敗或?qū)懳募〉龋?/p>

            ---------------

            do_repl流程:

             根據(jù)slave的請求ts找到合適的ulog文件(文件名使用數(shù)字編號,依次遞增),邏輯是:

              從編號最大的文件依次往編號小的文件:(編號越大,ulog內(nèi)容越新,ts越大)

               打開文件查看它的第一條記錄的ts,如果請求ts大于它,則該文件即為要找的ulog文件。

             循環(huán)。當(dāng)對端連接未關(guān)閉且沒收到SIGINT、SIGTERM信號時(shí):

              發(fā)送NOP(測試對端連接是否關(guān)閉);

              pthread_cond_timedwait等待ulog更新信號,超時(shí)值為1秒;

              循環(huán):

               一次讀取一條日志記錄;

               加上頭部(MAGIC,rts,rsid,rsiz。見"協(xié)議細(xì)節(jié)");

               發(fā)送給slave。

               當(dāng)上面讀取日志失敗或發(fā)送失敗時(shí),退出循環(huán)。

            解釋:

             1、ulog由一條條的記錄組成,每條記錄有相同格式: MAGIC + ts + sid + size + content

             2、因?yàn)閡log文件有大小上限,所以寫滿一個(gè)后會寫下一個(gè)。按上面所說那樣,文件名用數(shù)字編號,依次遞增;

             3、找合適ulog文件的邏輯。因?yàn)槭前磧?nèi)容從新到舊的順序(也即ts從大到小的順序)查看文件,所以最先找到的其中第一條記錄ts小于slave所請求ts的那個(gè)文件就是合適的文件;(該文件里ts會隨著一條條記錄慢慢增加,直到大于等于請求ts,這時(shí)就到了slave需要的數(shù)據(jù)處);

             4、關(guān)于這兩層循環(huán)的邏輯。內(nèi)層循環(huán)一次發(fā)送一條記錄,它是希望盡可能多地發(fā)送記錄給slave,直到發(fā)送完所有記錄(意外發(fā)送故障不考慮下)。退出到外層邏輯時(shí)希望這時(shí)又有ulog更新,能繼續(xù)進(jìn)行發(fā)送。這兩層循環(huán)的目的都是希望能盡可能長地維持與slave的一次連接,從而讓數(shù)據(jù)的同步更及時(shí)。

             

            本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/pingnning/archive/2009/10/24/4724377.aspx

            posted on 2010-12-28 23:00 冬瓜 閱讀(898) 評論(0)  編輯 收藏 引用 所屬分類: 轉(zhuǎn)貼
            久久99国产精品尤物| 久久电影网| 亚洲色婷婷综合久久| 少妇高潮惨叫久久久久久 | 狠狠色噜噜色狠狠狠综合久久| 久久久国产打桩机| 日韩一区二区久久久久久| 手机看片久久高清国产日韩| 久久久久亚洲AV无码专区首JN | 久久99热这里只有精品66| 亚洲人成精品久久久久| 国产精品久久永久免费| 一本久久免费视频| 国产精品一区二区久久精品无码| 亚洲精品成人久久久| 国产高清国内精品福利99久久| 久久午夜综合久久| 亚洲成色999久久网站| 亚洲欧美伊人久久综合一区二区| 国产精品成人无码久久久久久| 午夜精品久久久久久99热| 国产免费福利体检区久久| 色综合久久久久无码专区| 久久精品无码一区二区三区免费 | 亚洲欧美成人久久综合中文网| 色偷偷久久一区二区三区| 亚洲精品高清一二区久久| 99久久婷婷国产综合精品草原| 久久青青草原亚洲av无码app | 亚洲国产精品成人久久| 亚洲AV日韩精品久久久久| 伊人久久大香线蕉综合影院首页 | 久久99精品国产麻豆| 日韩精品久久久肉伦网站| 伊人久久大香线蕉av不变影院| 久久夜色精品国产噜噜亚洲a| 日本免费久久久久久久网站| 久久久精品人妻一区二区三区蜜桃| 亚洲中文字幕无码久久精品1| 伊人久久大香线蕉成人| 久久国产精品偷99|