在以前的一篇文章中,闡述瞭如何在高併發高負載的場景下使用nginx作後臺服務的負載均衡:在阿里雲Centos上配置nginx+uwsgi+負載均衡配置,可是不要覺得這樣作了就是一勞永逸的,到了數據業務層、數據訪問層,若是仍是傳統的數據結構,或者只是單單靠一臺服務器負載,如此多的數據庫鏈接操做,數據庫必然會崩潰,數據庫若是宕機的話,後果更是不堪設想。這時候,咱們會考慮如何減小數據庫的鏈接,一方面採用優秀的代碼框架,進行代碼的優化,採用優秀的數據緩存技術如:redis,若是資金豐厚的話,必然會想到架設mysql服務集羣,來分擔主數據庫的壓力。今天總結一下利用MySQL主從配置,實現讀寫分離,減輕數據庫壓力。mysql
明確目的,部署mysql集羣,採用一主一從的策略,寫入操做使用主庫,從庫實時同步主庫的數據,從庫負責讀取的業務,從而完成讀寫分離的目的。nginx
mysql主從同步的原理很簡單,從庫生成兩個線程,一個I/O線程,一個SQL線程;i/o線程去請求主庫 的binlog(二進制日誌),並將獲得的binlog日誌寫到relay log(中繼日誌) 文件中;主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;redis
SQL 線程,會讀取relay log文件中的日誌,並解析成具體操做,來實現主從的操做一致,而最終數據一致。sql
首先準備兩臺阿里雲服務器,一臺做爲主機(master),一臺做爲從機(slave),都安裝好mysql5.7,具體怎樣安裝mysql服務請移步:https://v3u.cn/a_id_72數據庫
進入master服務器vim
修改mysql配置文件 vim /etc/my.cnf,加入以下配置緩存
server-id=1 innodb_flush_log_at_trx_commit=2 sync_binlog=1 log-bin=mysql-bin-1
配置說明:安全
#設置主服務 的ID (id能夠本身隨便設置可是要保證和slave的id不同)
server-id=1
#設爲1固然是最安全的,但性能也是最差的(相對其餘兩個參數而言,但不是不能接受)。若是對數據一致性和完整性要求不高,徹底能夠設爲2,若是隻最求性能,例如高併發寫的日誌服務器,設爲0來得到更高性能
innodb_flush_log_at_trx_commit=2
#開啓binlog 志同步功能
sync_binlog=1
#binlog 日誌文件名
log-bin=mysql-bin-200
# 這個表示只同步某個庫 (若是沒有此項,表示同步全部的庫)
binlog-do-db=xxxx 服務器
保存後,重啓mysql數據結構
systemctl restart mysqld
進入mysql命令行 mysql -uroot -p你的密碼
輸入受權命令
GRANT REPLICATION SLAVE ON *.* to 'repl'@'%' identified by 'Admin123!';
意思是全部slave均可以經過帳號repl和密碼Admin123!來同步master的數據
而後查看master的狀態:
show master status;
把file列和Position列記錄下來,一會配置slave要用到
此時Master的配置已經搞定,登陸一下從機(slave)
同理修改slave服務器的mysql配置 vim /etc/my.cnf 加入下面的配置,須要注意的是server-id不要和master同樣
server-id=201 innodb_flush_log_at_trx_commit=2 sync_binlog=1 log-bin=mysql-bin-201
保存後重啓服務 systemctl restart mysqld
進入mysql命令行 mysql -uroot -p你的密碼
輸入命令:
change master to master_host='39.106.228.179',master_user='repl' ,master_password='Admin123!', master_log_file='mysql-bin.000002' ,master_log_pos=154
命令說明:
master_host: 主機的ip
master_user : 主機受權的用戶.
master_password : 主機受權時候填寫的密碼
master_log_file : 主機show master status;中的File
master_log_pos: 主機show master status;中的Position.
輸入命令啓動slave
start slave;
能夠查看slave的狀態:
show slave status G;
而後咱們就能夠測試一下對master進行寫入,看看salve是否能夠同步數據了
固然了,mysql的讀寫分離主從配置並非萬能的,根據不一樣的應用場景選擇不一樣的策略,MySQL的主從複製功能有必定的延遲性,若是對數據實時一致性的要求比較高的場景不推薦使用。