1.什麼是讀寫分離
使用mysql-proxy實現mysql的讀寫分離,mysql-proxy實際上是作爲後端mysql主從服務器的代理,它直接接受客戶端的請求,對SQL語句進行分析,判斷出是讀操作還是寫操作,然後分發至對應的mysql服務器上。
MySQL讀寫分離是指讓master處理寫操作,讓slave處理讀操作,非常適用於讀操作量比較大的場景,可減輕master的壓力。
2.爲什麼要進行讀寫分離
大型網站會觸發大量的併發式訪問,當負載均衡不能滿足我們對壓力分擔的要求時,可以採用讀寫分離,大量的數據連接會降低服務器的效率,甚至還會影響數據的安全,對於很多大型網站(pv值百萬、千萬)來說,在所處理的業務中,其中有70%的業務是查詢(select)相關的業務操作,所以爲了分擔連接數,可以採用讀寫分離的方式。
減少數據庫的連接方法:利用主從數據庫來實現讀寫分離,從而分擔主數據庫的壓力,從庫負責讀,主庫負責寫,通過mysql-proxy作爲服務器代理,對SQL語句進行分析,判斷出是讀操作還是寫操作,然後分發至對應的mysql服務器上,區分不同任務給不同的服務器。
在多個服務器上部署mysql,將其中一臺認爲主數據庫,而其他爲從數據庫,實現主從同步。其中主數據庫負責主動寫的操作,而從數據庫則只負責主動讀的操作(slave從數據庫仍然會被動的進行寫操作,爲了保持數據一致性),這樣就可以很大程度上的避免數據丟失的問題,同時也可減少數據庫的連接,減輕主數據庫的負載。
因爲數據庫的寫操作相對讀操作是比較耗時的,所以數據庫的讀寫分離,解決的是數據庫的寫入,不影響了查詢的效率。
** 主從複製是讀寫分離的基礎**
3.實驗環境
server1 master 172.25.62.1
server2 slave 172.25.62.2
server3 mysql-proxy 172.25.62.3
4.實驗思想
server3爲代理接受請求,通過lua腳本分析操作是讀操作還是寫操作,讀操作分給slave完成,寫操作分給master來完成。
5. 實驗步驟
server1:
現在server1,server2上的基於GTID的主從複製配置好
先將之前的環境刪掉
server2也一樣
[root@server1 mnt]# systemctl stop mysqld [root@server1 mnt]# cd /var/lib/mysql [root@server1 mysql]# ls [root@server1 mysql]# rm -rf * [root@server1 mysql]# systemctl start mysqld
修改配置文件,改爲基於GTID的主從複製,不會的看我之前的博客
[root@server1 mysql]# vim /etc/my.cnf
加入:
server_id=1
log-bin=mysql-bin
gtid_mode=ON
enforce_gtid_consistency=tru
過濾密碼,初始化
在裏面建立用於複製的用戶,並授權,可以看見已經配置好master了
server2:
一樣的操作
改配置文件
修改密碼初始化
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200515202236274.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMzQwODE0,size_16,color_FFFFFF,t_70`在這裏插入圖片描述
設置複製
root@server2 mysql]# grep password /var/log/mysqld.log
2019-07-28T03:16:05.199968Z 1 [Note] A temporary password is generated for root@localhost: cRP_dg<Ye1.r
[root@server2 mysql]# mysql -uroot -p
Enter password:
mysql> alter user root@localhost identified by 'Gaojia+123';
mysql> change master to master_host='172.25.62.1',master_user='repl',master_password='Gaojia+123',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
兩個線程都好着
插入數據試試
可以,說明基於GTID的主從複製配好了
server3:
將包拷到server3上
在/usr/local/mysql-proxy創建conf作爲配置文件的目錄,因爲la腳本里面指定的路徑就是這樣
1 [mysql-proxy] 2 proxy-address=0.0.0.0:3306 ##mysql-proxy運行的端口 3 proxy-read-only-backend-addresses=172.25.62.2:3306 ##slave節點:只讀 4 proxy-backend-addresses=172.25.62.1:3306 ##master節點:可寫 5 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ##lua腳本的路徑 6 pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid 進程pid的位置 7 log-file=/usr/local/mysql-proxy/log/mysql-proxy.log ##日誌位置 8 plugins=proxy 9 log-level=debug ##定義日誌級別 10 keepalive=true ##mysql-proxy崩潰時嘗試重啓 11 daemon=true ##打入後臺
尋找lua腳本位置
編輯lua腳本,修改最大連接數和最小連接數上限
由於上面配置文件有日誌位置,所以要創建日誌目錄
開啓mysql-proxy,發現錯誤,因爲配置文件需要權限
給了權限之後
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf修改配置文件的權限
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
發現mysql-proxy已經打開
安裝lsof可以看見具體的3306端口代理訪問指向哪裏
此時是沒有觸發讀寫分離的
測試
真機遠程鏈接 ,先連一個
看到指向了server1
再連一個
看到還是指向server1
再連一個
看到有的指向server1,有的指向server2
這時候遠程插入數據
可以看見,server1上有數據
server2上也有
當停止slave時
再遠程添加數據
server1上是可以寫進去的
由於停止slave,數據沒有同步
這時雖然server1上寫入了,但是遠程是讀不到的,因爲讀操作是在slave上的,要讀的話,start slave,讓數據同步就好