在分布式系統里面,往往制約整個系統發展的瓶頸點就是數據庫,所以數據庫的架構和高可用以及數據庫的切分都是我們值得花大力氣去學習的。
首先我們來說說數據庫的架構。
1、MySQL主從架構,如圖:
這種架構基本上90%以上會采用的數據庫架構。這種架構的 優點: 1、數據庫架構簡單 2、維護方便 缺點: 1、master存在單點問題,不能停機維護 2、讀壓力大slave過多的話,主從同步會影響master的性能
2、Dual Master 復制架構
上面的主從架構存在明顯的單點master問題,master不能停機維護,那么就有了接下來這猴子那個雙主架構。如圖:
這種雙主架構,數據庫有兩個主,主和主之間是有雙向復制的,但是我們應用程序切記不能有一個寫入口,不能同時兩個master都做寫操作,這樣可以避免可能出現的數據不一致的情況,另外一臺主機視情況而定,如何讀壓力大,另外一臺主機可以做讀操作,讀壓力不大,另外一臺主機純粹是為了做多活做主的備份,可以用第三方工具做主備切換,比如keepalived。 這種雙主架構的 優點: 1、不存在master的單點問題 缺點: 1、讀壓力大的時候,扛不住
3、級聯復制架構(Master --- Slaves --- Slaves ...) ...)
級聯復制架構是為了解決大量slave連到master造成master性能下降的問題。那么架構圖如下:
從架構圖看,由slave來把數據同步到另外的slave,這樣連接到master節點的slave就變少了。 優點: 1、減輕了master復制數據的壓力 缺點 1、存在數據延遲的問題
4、Dual Master 與級聯復制結合架構(Master - Master - Slaves)
前面的雙主和級聯復制都存在問題,現在這個架構是結合了這兩種的架構,架構圖如下:
這種架構就集合前面兩種架構的優點 優點 1、不存在master單點問題 2、減輕了寫節點master的復制壓力 缺點 1、寫節點master掛了以后,另外一臺master變成寫節點,掛了的master啟動以后,要把所有slave切換到這臺啟動的master上做數據同步。
前面講到了4種數據庫加過,里面大量提到了數據庫同步的概念,那么接下來說說mysql數據庫同步流程,流程圖如下:
mysql默認是采用的異步復制模式,流程如下: master端 1、用戶提交 2、寫binlog日志 3、引擎級別提交 4、結果返回客戶端程序
slave端 1、master端event監控到binlog日志變化,通知給master端的dump進程 2、dump進程通知給slave端的IO進程 3、IO進程從master-info中獲取需要同步的文件和文件位置 4、IO進程把binlog文件和pos位置通知master端dump進程 5、master準備數據把數據同步給slave端 6、slave收到數據把數據寫到relay log中 7、slave relay log寫成功后給master一個成功的應答
mysql異步復制配置 master端my.cnf配置 server-id=135 #開啟復制功能 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=1 lower_case_table_names=1 #binlog-do-db=mstest //要同步的mstest數據庫,要同步多個數據庫 #binlog-ignore-db=mysql //要忽略的數據庫
slave端my.cnf配置 server-id=133 log-bin=mysql-bin auto-increment-increment=2 auto-increment-offset=2 lower_case_table_names=1 #replicate-do-db = wang #需要同步的數據庫 #binlog-ignore-db = mysql #binlog-ignore-db = information_schema
1、在master mysql添加權限 GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON . TO 'repluser'@'%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
2、在master上查看master的二進制日志 show master status;
3、在slave中設置master的信息 change master to master_host='192.168.88.135',master_port=3307,master_user='repluser',master_password='Jack@123456',master_log_file='mysql-bin.000001',master_log_pos=154;
4、開啟slave,啟動SQL和IO線程 start slave;
5、查看slave的狀態 show slave statusG
6、master slave查看進程信息 SHOW PROCESSLIST;
mysql增強版半同步復制 增強版半同步復制配置: 1、加載lib,所有主從節點都要配置 主庫:install plugin rpl_semi_sync_master soname 'semisync_master.so'; 從庫:install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 可以一起裝。建議一起裝,因為會有主從切換的情景
2、查看,確保所有節點都成功加載 show plugins;
3、啟用半同步 先啟用從庫上的參數,最后啟用主庫的參數 從庫:set global
rpl_semi_sync_slave_enabled = {0|1}; # 1:啟用,0:禁止 主庫: set global
rpl_semi_sync_master_enabled = {0|1}; # 1:啟用,0:禁止 set global
rpl_semi_sync_master_timeout = 10000; # 單位為ms
4、前面配置弄完以后,在slave節點必須關閉io_thread節點才能使半同步復制生效 stop slave io_thread; start slave io_thread;
master節點日志信息: 開啟半同步,關閉異步
半同步復制在master端進行引擎提交的時候會等待,直到slave寫relay log成功后,給master ACK應答成功才會進行引擎提交。