在MySql中,當數據量大的時候,一般選擇方案:
1. 分庫
(1)可以按照業務需求來垂直分庫。
2. 讀寫分離,
(1)可以將從庫中分出一臺來做特殊業務查詢。例如供開發人員查詢問題、報表查詢等等。
3. 分表
(1)最後使用,可以按照更細微的業務來分表。
MySql讀寫分離實現機制方法:
1. 基於程序實現 一般不用
2. 基於MySql自帶主從同步機制
MySql的主從同步機制實現原理:當主庫有sql過來的時候,會進行兩個操作:
1. 更新data數據
2. 將數據放在binlogs中。 所以MySql要實現主從同步,第一步需要開啓binlog文件。所有提交語句都會提交到這來。binlogs記錄了所有關於修改、數據變動的sql語句。。
從數據庫會有兩個Thread.
1. 用I\O Thread來定時同步主數據庫的binlogs文件,將sql放在從庫的relay binlogs文件。
2. 用SQL Thread取出sql 語句並執行, 將數據寫入從庫的data中。
出現的風險:
1. 數據一致性問題。當兩個庫間通信突然中斷,會導致數據出現不一致問題。
解決方案:MySql提供了半同步方式。如果在Master配置半同步, 當數據過來時候,主庫不會立刻寫入data,而會等待。從庫從主庫binlog中拿到數據,會通知主庫binlog已經取到數據,那binlog在通知data來修改主庫。
帶來的後果:
一. 影響MySql寫入性能。 根據公司業務場景,來做平衡。如果對數據要求很嚴格,推薦半同步。
二. 當從庫很多,需要很久來等待從庫返回信息給binlog。 那MySql允許設置保護機制,設置等待時間,例如1秒(一般 設置),data直接寫入。binlog只要檢測到一個從庫同步成功,就會通知data,不需要等所有從庫同步完成。
2. 從庫執行SQL Thread失敗。
解決方案:從庫會拋出異常,直到解決該sql異常。
3. 延遲問題。
解決方案:延遲問題一般出現在I/O Thread跟SQL Thread,可以配置多個線程。提高CPU.
binlog用途之二:用於恢復數據庫。
如何設置讀寫架構:
用Atlas代理來區分讀寫分離。App--->Altas---->寫操作---->Master MySql
----->讀操作---->Slave MySql
Altas只會有I/O的限制。但目前來說無壓力。
實施流程:
1. 修改Master配置my.cnf
2. 修改slave配置:a. my.cnf b.配置master地址、端口、密碼
3.安裝atlas
4.配置atlas
配置Master步驟:1.修改server id。 2.修改my.cnf