<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## binlog拉取存在的問題 MySQL 主備之間數據同步是通過binlog進行的,當主庫更新產生binlog時,備庫需要同步主庫的數據,通過binlog協議從主庫拉取binlog進行數據同步,以達到主備數據一致性的目的。但當主庫tps較高時會產生大量的binlog,以致備庫拉取主庫產生的binlog時占用較多的網絡帶寬,引起以下問題: 1. 在MySQL中,寫入與讀取binlog使用的是同一把鎖(Lock_log),頻繁的讀取binlog,會加劇Lock_log沖突,影響主庫執行,進而造成TPS降低或抖動; 2. 當備庫數量較多時,備庫拉取binlog會占用過多的帶寬,影響應用的響應時間。 為了解決上面提到的問題,需要對binlog的拉取速度進行限制。 ## 問題存在的原因 備庫或應用通過binlog協議向主庫發送消息,告訴主庫要拉取binlog,主庫經過權限認證后,以binlog_event為單位讀取在本地的binlog,然后將這些binlog_event發送給應用,其過程簡單描述如下: 1. 從mysql-bin.index中找到用戶消息中的指定文件,如果沒有指定要拉取的binlog文件名稱,則用第一個; 2. 上Lock_log鎖,從1)或4) 中的binlog file中讀取一個binlog_event,釋放Lock_log鎖,判斷binlog_event的類型; 3. 如果是普通binlog_event,則將binlog_event發送到net 緩沖區; 4. 如果是Rotate_log_event,則取出要Rotate到的文件,執行2); 5. 如果當前讀的文件是最后一個文件且已經讀到了文件的結尾,則會釋放Lock_log鎖,并等待新的Log_event信號。 從以上過程可以看出,binlog的發送速度和IO、網絡有很大的關系,只要這三者不受限制,程序會就盡力發送binlog而沒有限制。 ## 解決問題的方法 由3、4可以看出,程序在讀取和發送之間是沒有其它工作的,如果IO很強,讀取的速度很快,那么binlog的發送速度就會很快且不受限制,進而造成本文開始所描述的問題;針對binlog發送速度的問題,rds_mysql 通過設置binlog發送線程的發送頻率、休眠時間來調整binlog的發送速度,因此 rds_mysql 引入了兩個新的參數: 1\. binlog_send_idle_period binlog發送線程的每次休眠時間,單位微秒,默認值100; 2\. binlog_send_limit_users binlog發送線程的速度配置,默認值”“。 舉例如下: set global binlog_send_limit_users=”rep1:3,rep2:10” 的作用是設置rep1拉取binlog的上限速度是3M/s, rep2拉取binlog的上限速度是10M/s,其中rep2、rep2指的是應用連接的用戶名,對于binlog的拉取速度控制主要分為兩個方面: ## binlog 發送速度監控線程 速度監控線程隨著mysqld的啟動而啟動,用于定時掃描限速列表,計算列表中的每一個binlog dump線程的binlog發送速度,并根據計算的速度調整binlog的發送頻率,其工作過程描述如下: 1. 速度監控線程隨著mysqld的啟動而啟動,并初始化限速列表; 2. 對限速列表進行依次掃描,如果取到的線程不為空,轉2); 3. 計算當前線程的發送速度,與用戶設定的速度進行比較,大于設定的發送速度,轉3),如果小于用戶設定的發送速度,則轉4) 4. 通過調整當前線程的net_thread_frequency 成員,降低發送頻率; 5. 通過調整當前線程的net_thread_frequency 成員,增加發送頻率; 6. 遍歷完限速列表后讓出CPU 1毫秒,轉1) 由以上描述可以看出,監控線程每毫秒執行一次,根據發送的字節數來計算binlog發送線程的發送速度是否超過設定的速度,并通過調整發送頻率來調整binlog的發送速度,監控線程的限速列表是這樣構造的: 1. binlog dump 線程在拉取binlog前會先根據連接的用戶名判斷是否應該對該用戶限速,如果需要限速,則需要將當前dump線程加入限速列表; 2. 當binlog dump結束或斷開連接時,從限速列表移除; 3. 當設置參數binlog_send_limit_users時,會對當前所有線程進行遍歷,將被限制的用戶加入限速列表,對不受限制的用戶移出限制列表,所有受影響的線程不需要重新連接,可以實時生效。 ## binlog dump 線程 dump 線程用于發送binlog,在發送過程中會根據監控線程設置的發送頻率來調整binlog發送的速度,可以分為以下幾步: 1\. binlog dump 線程在拉取binlog前會先根據連接的用戶名判斷是否將本用戶的線程加入限速列表; 2\. 讀取binlog,并查看是否需要休眠,需要休眠轉3),否則轉4); 3\. 休眠binlog_send_idle_period; 4\. 發送讀取到的binlog event,轉2。 因此可以通過設置binlog的發送頻率及休眠時間精確調整binlog的發送速度
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看