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






