<b>背景</b>
mysql的master-slave結構提供了實作high availability的基礎,在實作上面通常使用client-proxy-db的三層架構,proxy不單單完成錯誤檢測、執行個體切換等高可用功能,還可以實作sharding,即scale out。
mysql fabric就是oracle想大力發展的proxy,這裡主要介紹為了完成高可用的功能,mysql 5.7做了哪些事情,我們是否可以使用,實作自己的proxy?
<b>高可用元件</b>
proxy完成高可用的功能,除了需要mysql提供的master-slave的基礎結構外,還需要:
<dl></dl>
<dd>1. 在錯誤檢測、進行執行個體切換時候,需要db的隻讀功能,防止m/s雙寫。</dd>
<dd>2. 在切換完成後,如何實作client重連,或者實作session維持,對client透明。</dd>
<b>那麼問題來了</b>
1. 如何保證切換?
<dl><dd>目前mysql版本提供了一個read_only的功能,通過添加global read lock和commit鎖來實作,可以滿足實作單點寫入。</dd></dl>
2. client重連或者session維持?
<dl><dd>client重連主要依賴client的api,檢測connection的錯誤。而保持connection不斷開,session維持怎麼做?</dd></dl>
<b>mysql 5.7增加的功能</b>
1. offline mode
<dl><dd>offline mode不光實作了read only的功能,并且會斷掉所有的非super使用者的connection,并禁止重連。雖然官方文檔中介紹是為了支援upgrade,但完全可以使用在切換的過程中。</dd></dl>
2.session回放功能支援
<dd>client-server protocol對于response packet增加了對session state狀态改變的支援,對于以下的session state變化:</dd>
<dd>1. user-defined variables</dd>
<dd>2. session-specific values for server variables</dd>
<dd>3. temporary tables that are created</dd>
<dd>4. prepared statements</dd>
<dd>5. current database</dd>
response packet中會添加一個tracker标示其變化。 有了這個功能就可以容易實作session的回放功能,特别在load balance或者cluster環境中,把一個使用者的connection遷移到另外一台執行個體上,來保持connection不斷開,實作切換對client透明。
使用mysql 5.7新增的這兩個功能,可以幫助proxy實作db高可用。