1. 程式人生 > 資訊 >“中國芯”數字貨幣錢包來了:支援指紋識別,可顯示健康碼

“中國芯”數字貨幣錢包來了:支援指紋識別,可顯示健康碼

一、什麼是主從複製讀寫分離

1、概念

mysql的主從複製,從字面上理解就是有兩個資料庫分飾兩個角色,主資料庫、從資料庫,複製可以簡單理解為從庫資料是複製主庫的資料。實際上主資料庫可能有多個,從資料庫也可能有多個。讀寫分離即主庫負責寫入,從庫承擔查詢的任務,這個實現需要在應用層配置。

2、實際生產環境的mysql部署分類

單點模式

單點模式是最簡單的模式,只有一臺資料庫伺服器,部署最簡單。但是存在單點風險,一旦這臺伺服器掛了,整個系統也就掛掉了。

主備模式

主備模式應該是各個線上服務系統的最低配置了,比如你在各雲平臺購買的資料庫服務一般都會開啟備份功能。一旦主節點出現問題,還可以切換到備份節點,不至於整個系統癱瘓。

主備又分為一主一備、一主多備。多個備份是為了保證更高的安全性,萬一主節點出現問題的時候,碰巧備份節點也出問題呢。

當主節點出現問題的時候要切換到備份節點,切換方式又分為手動切換和自動切換。手動切換具有一定的延時,當主節點出現問題時,只能等運維人員發現或者收到系統通知。

主從模式

主從配置一般都是和讀寫分離相結合,主伺服器負責寫資料,從伺服器負責讀資料,並保證主伺服器的資料及時同步到從伺服器。

主從模式又分為一主一從、一主多從和多主多從,越往後部署越複雜,同時,系統穩定性更高。主從模式可以更好的分擔資料庫壓力,將插入更新操作和查詢操作分開,提高系統整體效能。

二、主從複製的作用

1、做資料的熱備,作為後備資料庫,主資料庫伺服器故障後,可切換到從資料庫繼續工作,避免資料丟失。

2、架構的擴充套件。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的儲存,降低磁碟I/O訪問的頻率,提高單個機器的I/O效能。

3、讀寫分離,使資料庫能支撐更大的併發。在報表中尤其重要。由於部分報表sql語句非常的慢,導致鎖表,影響前臺服務。如果前臺使用master,報表使用slave,那麼報表sql將不會造成前臺鎖,保證了前臺速度。

三、主從複製的原理

主節點

1、當主節點上進行 insert、update、delete 操作時,會按照時間先後順序寫入到 binlog 中;

2、當從節點連線到主節點時,主節點會建立一個叫做 binlog dump 的執行緒;

3、一個主節點有多少個從節點,就會建立多少個 binlog dump 執行緒;

4、當主節點的 binlog 發生變化的時候,也就是進行了更改操作,binlog dump 執行緒就會通知從節點 (Push模式),並將相應的 binlog 內容傳送給從節點;

從節點

當開啟主從同步的時候,從節點會建立兩個執行緒用來完成資料同步的工作。

I/O執行緒:此執行緒連線到主節點,主節點上的 binlog dump 執行緒會將 binlog 的內容傳送給此執行緒。此執行緒接收到 binlog 內容後,再將內容寫入到本地的 relay log。

SQL執行緒:該執行緒讀取 I/O 執行緒寫入的 relay log,並且根據 relay log 的內容對從資料庫做對應的操作。

主從配置一般都是和讀寫分離相結合,主伺服器負責寫資料,從伺服器負責讀資料,並保證主伺服器的資料及時同步到從伺服器。

四、三步輕鬆構建主從

1、master主伺服器配置(103.251.237.42)

編輯my.cnf (命令查詢檔案位置:find / -name my.cnf)

在[mysqld]中註釋掉 bind-address = 127.0.0.1 不然mysql無法遠端

server-id = 1 中 1 是可以自己定義的,但是需要保持它的唯一性,是伺服器的唯一標識

1.log_bin 啟動MySQL二進位制日誌

2.binlog_do_db 指定記錄二進位制日誌的資料庫

3.binlog_ignore_db 指定不記錄二進位制日誌的資料庫。

2、登陸主伺服器mysql 建立從伺服器用到的賬戶和許可權;

@之後IP可訪問主伺服器,這裡值定從伺服器IP

新建密碼為masterbackup的masterbackup 使用者,並賦予replication slave 許可權

可以看到使用者masterbackup 已經新增

3、檢視主資料庫的狀態

記錄 mysql-bin.000007 以及 276,編寫以下命令待用;

change master to master_host='103.251.237.42',master_port=3306,master_user='masterbackup',master_password='masterbackup',master_log_file='mysql-bin.000007',master_log_pos=276;

2、Slave從伺服器配置上的配置(103.251.237.45)

1.編輯my.cnf(命令查詢檔案位置:find / -name my.cnf)

在[mysqld]中

relay-log = slave-relay-bin

relay-log-index = slave-relay-bin.index

暫時不清楚這是做什麼的。加入這兩條。

重啟mysql服務

登陸mysql,停止同步命令

執行用上面準備的命令; 登入Slave從伺服器,連線Master主伺服器:

重新啟動資料同步;

檢視Slave資訊;如圖兩句都為yes,則狀態正常

3、從主從伺服器測試結果

在主伺服器建立一個數據庫,在從伺服器上檢視剛才建立的資料庫。

五、必問面試題

1、主從的好處是?

2、主從的原理是?

3、從資料的讀的延遲問題了解嗎?如何解決?

談到MySQL資料庫主從同步延遲原理,得從mysql的資料庫主從複製原理說起,mysql的主從複製都是單執行緒的操作,主庫對所有DDL和 DML產生binlog,binlog是順序寫,所以效率很高,slave的Slave_IO_Running執行緒到主庫取日誌,效率很比較高,下一步, 問題來了,slave的Slave_SQL_Running執行緒將主庫的DDL和DML操作在slave實施。DML和DDL的IO操作是隨即的,不是順 序的,成本高很多,還可能可slave上的其他查詢產生lock爭用,由於Slave_SQL_Running也是單執行緒的,所以一個DDL卡主了,需要 執行10分鐘,那麼所有之後的DDL會等待這個DDL執行完才會繼續執行,這就導致了延時。有朋友會問:“主庫上那個相同的DDL也需要執行10分,為什 麼slave會延時?”,答案是master可以併發,Slave_SQL_Running執行緒卻不可以。

當主庫的TPS併發較高時,產生的DDL數量超過slave一個sql執行緒所能承受的範圍,那麼延時就產生了,當然還有就是可能與slave的大型query語句產生了鎖等待。

最簡單的減少slave同步延時的方案就是在架構上做優化,儘量讓主庫的DDL快速執行。還有就是主庫是寫,對資料安全性較高,比如 sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設定,而slave則不需要這麼高的資料安全,完全可以講sync_binlog設定為0或者關閉binlog,innodb_flushlog也 可以設定為0來提高sql的執行效率。另外就是使用比主庫更好的硬體裝置作為slave。

4、做了主從後伺服器掛了怎麼辦

從伺服器掛了:

在主服務的 binlog dump 執行緒將指定的 binlog 資訊發給從服務時,除了日誌內容,還包括本次傳送內容在主服務端的 bin-log 日誌檔名稱以及位置資訊。

從服務的 I/O 執行緒接收到資訊後將日誌內容寫入realy-log 檔案(mysql-relay-bin.xxxxxx)的末端,並將讀取到的主服務端的 bin-log 的檔名和位置記錄到 master-info 中(通過show slave status中的Master_Info_File欄位可以看到 master.info 儲存的位置),以便下一次讀取時能告訴主服務從哪裡開始同步。

從服務的 SQL 執行緒檢測到 realy-log 新增了內容後,解析日誌檔案生成對應的 sql 語句,並應用這些 sql 到資料庫,保證主從資料一致性。

所以,及時從庫掛掉了,因為有 master.info 記錄了上一次同步的位置,只要同步服務再次啟動,那就可以從上次同步的位置繼續增量同步了。

主伺服器掛了:

那話說主庫宕了怎麼辦,這就是另一個悲傷的故事了,就沒有從庫掛掉這麼簡單了,如果馬上啟動那就是最好的解決辦法。如果由於硬體或者比較棘手的問題導致沒辦法立即重啟,那就要選一個從庫升級為主庫,選擇的標準是資料最接近主庫的,也就是最後一次同步時間最晚的。如果有可能(比如主服務只是資料庫無法啟動,但機器還在)還要到主服務上拉取最新的 bin-log 進行同步。最後進行一系列設定將選中的從庫變更為主庫配置。

本文內容參考借鑑以下連結:

https://www.jianshu.com/p/803e3dc409d4

https://www.cnblogs.com/fengzheng/p/13401783.html

https://developer.aliyun.com/article/42638