mysql的複製集羣和複製過濾器講解

前言

不管是在一個web站點仍是其餘須要數據庫的業務系統中,數據庫的重要性是毋庸置疑的。可是關係型數據庫收到自身設計的限制,自己的性能可能會成爲拉低整個平臺的瓶頸。並且數據庫做爲系統重要的一環,必須避免數據庫的單點故障。由此mysql數據庫的集羣就顯得相當重要。mysql

集羣分類及分析

mysql複製集羣整體能夠分爲以下幾類:web

  • 主從複製集羣:主服務器負責數據寫入,從服務器負責讀操做,這樣能夠總體下降主服務器的壓力,並且能夠提升訪問性能;
  • 雙主或多主集羣:兩臺或多臺mysql服務器同時都提供讀寫操做;
  • 半同步集羣:一臺服務器和主服務器採用同步寫入的方式,當主服務器宕機這臺服務器提高爲主服務器;
  • 級聯複製集羣:多級複製集羣,下降主服務器的壓力;
  • 循環集羣
    ...
    此文主要討論主從複製集羣、雙主集羣和半同步集羣的配置方法。
    在必定程度上覆制集羣確實可以解決mysql的性能問題和單點問題,可是卻也面臨着更多其餘問題:
  • 當mysql集羣運行必定時間以後可能會面臨主從服務器數據不一致,從服務器數據滯後於主服務器的問題,這是由mysql複製集羣的特色所決定的;
  • 雙主或多主複製集羣,若是兩臺服務器同時發生基於一個字段的修改,可能會發生數據的重複修改問題,致使數據不一致;
    ...

mysql複製集羣的原理

mysql複製集羣是基於以下原理進行的:
主服務器全部的操做都寫入二進制日誌,從服務器開啓中繼日誌和兩個線程:sql

  • sql_thread:負責從中繼日誌讀取內容,而後replay到數據庫中;
  • io_thread:負責鏈接主服務器,把主服務器的二進制日誌複製到本身的中繼日誌;

mysql複製集羣配置方法

主從複製集羣

  1. 此處採用兩臺mysql服務器,一臺爲主,一臺爲從;
  2. 首先配置主服務器:
    1. 修改/etc/my.cnf.d/server.conf,添加server_id和開啓binary-log:以下:
      server_id=1 log_bin=master-log
    2. 登陸mysql,而後添加一個有複製權限的用戶,命令以下:
      GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repladmin'@'192.168.11.%' identified by '1234567a';
  3. 配置從服務器:
    1. 修改/etc/my.cnf.d/server.conf文件,添加server_id,開啓relay-log,以下:
      server_id=11 relay_log=slave-log read_only=ON #從服務器只容許讀操做,不容許寫操做
    2. 指定主服務器,用戶名和從哪一個日誌開始進行同步:
      CHANGE MASTER TO MASTER_HOST='192.168.11.193',MASTER_USER='repladmin',MASTER_PASSWORD='1234567a',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=499; #MASTER_LOG_FILE指的是主服務器的二進制日誌,MASTER_LOG_POS指的是從哪裏開始進行同步,能夠在服務器經過**show master status**進行查看
    3. 開啓sql_thread和io_thread進行復制,而後查看狀態,用以下命令:
      start slave; show slave status;
    4. 狀態信息以下:
      Slave_IO_State: Waiting for master to send event #當前複製狀態# Master_Host: 192.168.11.193 #主服務器ip# Master_User: repladmin #進行復制的用戶# Master_Port: 3306 #鏈接的端口# Connect_Retry: 60 #鏈接超時等待多久從新鏈接# Master_Log_File: master-log.000003 #開始同步的二進制日誌文件# Read_Master_Log_Pos: 8523 #從二進制文件哪裏開始同步# Relay_Log_File: slave-log.000005 #執行sql語句replay的二進制文件# Relay_Log_Pos: 961 #從哪裏開始執行# Relay_Master_Log_File: master-log.000003 Slave_IO_Running: Yes #io_thread是否運行# Slave_SQL_Running: Yes #sql_thread是否運行# Replicate_Do_DB: hellodb #這是指定複製過濾器以後的樣子,表示金複製hellodb庫# Replicate_Ignore_DB: Replicate_Do_Table: hellodb.students #表示只複製students表# Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 #複製過程是否有錯誤# Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 8523 Relay_Log_Space: 1534 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 #是否啓用ssl認證# Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 #從服務器是否落後於主服務器,爲0表示不落後# Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1數據庫

    5. 此時在主服務器建立新的庫或者表,從服務器便可同步。(此處由於開啓了複製過濾器,因此只能複製指定的庫和表)服務器

雙主複製集羣配置

雙主配置原理爲:主服務器和從服務器同時開啓二進制日誌和中繼日誌,數據能夠寫入任何一個服務器,而後均可以同步到另外一臺服務器,這樣兩個庫就均可以提供讀寫工做了。網絡

  1. 主服務器-1配置
    1. 主服務器開啓二進制日誌和中繼日誌,而且容許讀寫:
      server_id=1 log_bin=master-log relay_log=slave-log
    2. 建立具備複製權限的用戶,此處和主從複製命令同樣,再也不贅述;
  2. 主服務器-2配置方法和主服務器-1配置方法如出一轍
  3. 此時須要在主服務器-1和主服務器-2都執行CHANGE MASTER操做,不過主服務器的ip須要互相指定爲對方,以下:
    CHANGE MASTER TO MASTER_HOST='主服務器-2ip地址',MASTER_USER='repladmin',MASTER_PASSWORD='1234567a',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=499; CHANGE MASTER TO MASTER_HOST='主服務器-1ip地址',MASTER_USER='repladmin',MASTER_PASSWORD='1234567a',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=499;
  4. 兩臺服務器其都開啓同步操做:
    start slave;
  5. 此時往任何一個數據庫寫入數據均可以同步到另外一個庫,同時兩個庫都支持讀寫操做;

半同步複製集羣配置

複製集羣默認採用的都是異步方式,即數據寫入主服務器則直接返回數據寫入成功,而不會等待從服務器寫入成功,此種方法能夠提升性能,不過可能會致使數據不一致問題。半同步表示讓一臺服務器和主服務器採用同步寫入方式,數據寫入到從服務器才返回數據寫入成功,這樣會損失必定性能,不過當主服務器宕機以後這才從服務器能夠馬上接管主服務器,他們的數據都是一致的。
半同步複製集羣須要依賴於半同步模塊,此模塊默認並無加載,須要手動加載到mysql中,模塊以下:semisync_master.so、semisync_slave.so。異步

  1. 主服務器配置:
    1. 配置文件配置和建立具備複製權限用戶,修改CHANGE MASTER的方法和主從複製集羣配置方法同樣,此處再也不贅述;
    2. 加載半同步模塊,命令以下:
      INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; show plugins; #查看mysql加載的全部模塊,能夠看此模塊是否已經加載
    3. 模塊加載以後默認仍是不會啓動服務,須要手動啓動,以下:
      SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; SET GLOBAL rpl_semi_sync_master_enabled=ON;
  2. 從服務器配置:
    1. 加載半同步模塊,命令以下:
      INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled=ON; START SLAVE;
  3. 此時查看主服務器狀態以下:
    show global status like 'rpl_semi%'; #參數以下,只列出部分: Rpl_semi_sync_master_clients #鏈接到主服務器的客戶端數# Rpl_semi_sync_master_net_avg_wait_time #平均網絡等待時間# Rpl_semi_sync_master_net_wait_time #網絡總等待時間# Rpl_semi_sync_master_net_waits #網絡等待次數# Rpl_semi_sync_master_no_times Rpl_semi_sync_master_no_tx Rpl_semi_sync_master_status ……
  4. 此時主服務進行任何修改,從服務器都會同步進行全部修改操做,此時表示半同步集羣配置成功。

複製過濾器

複製過濾器表示能夠指定只複製指定的表或者只複製指定的庫,其餘的表和庫都不進行復制,兩種方法能夠實現:ide

  • 主服務器實現:主服務器指定只有指定的表或者庫的修改信息才傳遞到從服務器的中繼日誌,可是主服務器出現問題以後會丟失未複製表和庫的數據;
  • 從服務器實現:全部二進制日誌都傳到從服務器的中繼日誌,可是sql_thread只執行指定表和庫的修改語句,當主服務器出現故障,則不會丟失數據,全部建議採用從服務器的複製過濾;
  1. 從服務器配置:
    SET GLOBAL replicate_do_db=庫名 #指定只複製指定的庫# SET GLOBAL Replicate_Ignore_DB=庫名 #指定不復制指定的庫# SET GLOBAL Replicate_Do_Table=表名 #指定只複製指定表# SET GLOBAL Replicate_Ignore_Table=表名 #指定不復制指定表#
  2. 當指定了複製過濾器後,經過SHOW SLAVE STATUS;命令能夠查看到指定的庫和表。性能

    建議此配置寫入配置文件永久生效。線程

總結

mysql的複製集羣能夠經過以上方法實現,可是此時還缺乏一個組件對外提供數據服務接口,此組件通常稱爲讀寫分離器或語句路由器,並且主服務器宕機以後須要自動提高從服務器爲主服務器,這也須要mysql的MHA來進行。以上兩個組件下一篇博客再討論。

相關文章
相關標籤/搜索