mysql(6)基於GTID主從複製的讀寫分離

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,讓數據同步就好

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章