讀寫分離的作用
寫會鎖表,而且比較耗時。如果一個表經常寫入,那么無疑會影響到查詢的效率。所以將經常寫入的數據庫進行讀寫分離之后,會大幅提升讀取效率。
(實際上,面試時,只會問你知不知道原理,底層是怎么實現的,其實你會不會配不重要。簡單來說,就是主數據庫的binLog二進制日志,記錄了所有對主數據庫的操作,從數據庫就是把主數據庫把這些操作的日志拷貝過去,再執行一次,這樣數據就相同了)。
MySQL讀寫分離的原理
這個可以了解一下,開發時作用不大。但面試時比問到也不至於啞口無言。
1、master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);
2、 slave將master的binary log events拷貝到它的中繼日志(relay log);
3、 slave重做中繼日志中的事件,將改變反映它自己的數據。
MySQL的主從備份,聽個名詞很高大上,其實都是MySQL原本就實現的了,你只需要簡單配置一下就可以實現。
第一步:保持主從兩個數據庫是同步的,最好事先手動同步一下;
第二步:停止兩個數據庫,分別更改配置文件;
下面我使用如下兩個地址來說明配置過程。
- 主數據庫:192.168.0.244
- 從數據庫:192.168.0.8
主服務器數據庫,增加如下配置:
server-id = 244 #這個唯一就OK,一般取IP地址后面的幾位
log-bin = E:\mysql\data\mysql-bin #日志所在目錄
binlog-do-db = test #這個是要同步的數據庫
從服務器數據庫,增加如下配置:
server-id = 8 #這個唯一就OK,一般取IP地址后面的幾位
replicate-do-db = test #這個是要同步的數據庫
第三步,分別重啟兩個服務器的MySQL服務;
- net stop mysql;
- net start mysql;
兩個服務器的MySQL服務都要啟動起來;
第四步,主服務器授權Slave權限賬號
GRANT REPLICATION SLAVE ON *.* to 'bu'@'%' identified by '123456';
第五步,登錄主服務器,查詢master狀態;
show master status;
注意結果,結果里面的東西,在下一步會用到。
第六步:登錄從服務器,配置從服務器的Slave
change master to master_host='192.168.0.244',master_user='bu',master_password='123456', master_log_file='mysql-bin.000004',master_log_pos=516;
master_log_pos是上面查詢出來的Position 516。
第七步、啟動從服務器的Slave
start slave;
第八步、驗證從服務器的Slave服務狀態
show slave status\G
以下兩個狀態必須為Yes。
Slave_IO_Running: Yes //此狀態必須YES
Slave_SQL_Running: Yes //此狀態必須YES
如果有一項為No都不會同步成功。
我碰到過Slave_IO_Running為Connecting的。那可能是上面的連接change master to master_host...寫錯了。
第九步、隨意修改下主數據庫的數據,從服務器數據庫立即會更新