文章目錄
一、讀寫分離原理
mariadb(mysql)讀寫分離的基本的原理是讓主數據庫處理事務性增加、修改、更新、刪除操作(CREATE、INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。讀寫分離的前提是基於主從複製,這樣可以保證在master上修改數據,slave同步之後,web應用可以讀取到slave端的數據。
二、讀寫分離環境
服務器 | IP | 查詢命令 |
---|---|---|
數據庫Master的IP | 192.168.1.200 | |
數據庫Slave的IP | 192.168.1.210 | |
mysql-proxy服務器的IP | 192.168.1.220 | |
mariadb版本 | mariadb-server-10.3.11-2.module_el8.0.0+35+6f2527ed.x86_64 | |
rpm -qa | grep mariadb | ||
mysql-proxy版本 | mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit | |
linux版本 | CentOS Linux release 8.0.1905 (Core) | cat /etc/redhat-release |
三、讀寫分離部署
一、服務器200、210、220安裝數據庫mariadb(mysql)服務
安裝過程請參照博客:https://blog.csdn.net/renfeigui0/article/details/102743258
二、服務器200、210配置mariadb(mysql)服務主從複製,確保主從工作正常運行
配置過程請參照博客:https://blog.csdn.net/renfeigui0/article/details/102797353
三、服務器220安裝mariadb(mysql)proxy服務
1、登錄官網https://downloads.mysql.com/archives/proxy/,根據自己的系統選擇合適的軟件版本。
2、下載mariadb(mysql)proxy軟件,解壓並移動到指定目錄/usr/local/mysql-proxy。
wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
ls
tar zxf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy
3、使用如下命令,編輯環境變量配置文件內容。
export PATH=$PATH:$HOME/bin:/usr/local/mysql-proxy/bin
4、進入mysql-proxy目錄,編輯配置文件,增加如下配置文件內容。(配置文件中不要有註釋空格等其他內容,不然啓動程序時會報錯)。
cd /usr/local/mysql-proxy/
vi mysql-proxy.conf
配置文件內容
[mysql-proxy]
plugins=proxy
proxy-address=192.168.1.220:4040
proxy-backend-addresses=192.168.1.200:3306
proxy-read-only-backend-addresses=192.168.1.210:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/mysql-proxy.log
log-level=debug
keepalive=true
daemon=true
5、啓動mysql-proxy服務,如果報錯“(0660 or stricter required)”,如下圖一,修改配置文件權限爲660即可,服務正常啓動後如下圖二。查看啓動日誌,如下圖三。
mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf
chmod 660 /usr/local/mysql-proxy/mysql-proxy.conf
mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf
netstat -antp |grep mysql-proxy
cat /usr/local/mysql-proxy/mysql-proxy.log #查看日誌
圖一
圖二
圖三
6、修改讀寫分離配置文件rw-splitting.lua,1表示只要有一個連接,就進行讀寫分離。重啓mysql-proxy服務。
find / -name rw-splitting.lua
vi /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
pkill mysql-proxy
mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf
7、主從服務器200、210,登錄數據庫授權賬戶mysqlproxy,密碼123456,訪問所有數據庫所有權限。
grant all on *.* to 'mysqlproxy'@'%'identified by '123456';
flush privileges;
grant all on *.* to 'mysqlproxy'@'%'identified by '123456';
flush privileges;
8、讀寫分離測試。
寫入測試(在proxy上使用建表語句成功在master上創建數據表stu,slave通過主從複製,得到stu數據表。在slave服務器上使用“stop slave”命令先停止slave,再從proxy上插入數據,master上通過查詢看到新插入的數據,slave上卻查詢不到新插入的數據,表明通過proxy插入語句的數據是寫入master的數據表中。proxy也查詢不到新數據,表明通過proxy查詢的數據是查詢的slave的數據庫)
步驟 | master | slave | proxy |
---|---|---|---|
1 | mysql -uroot -p | mysql -uroot -p | mysql -umysqlproxy -p -P 4040 -h 192.168.1.220 |
2 | show databases; | show databases; | show databases; |
3 | use newdb; | use newdb; | use newdb; |
4 | show tables; | show tables; | show tables; |
5 | create table stu (age int, name char(40) ); | ||
6 | show tables; | show tables; | show tables; |
7 | stop slave; | ||
8 | insert into stu values (220, ‘proxy’); | ||
9 | select * from stu; | select * from stu; | select * from stu; |
讀取測試(salve服務器使用“start slave”啓動slave服務,先通過proxy插入三條數據,然後slave刪除一條數據,再次在proxy查詢時,只能看到2條數據,說明proxy查詢讀的是從庫)
步驟 | master | slave | proxy |
---|---|---|---|
1 | start alave; | ||
2 | insert into stu values (200, ‘master’); | ||
3 | insert into stu values (210, ‘slave’); | ||
4 | insert into stu values (220, ‘proxy’); | ||
5 | select * from stu; | select * from stu; | select * from stu; |
6 | delete from stu where age=‘220’; | ||
7 | select * from stu; | select * from stu; | select * from stu; |
9、mysql-proxy.conf配置文件說明。
參數 | 說明 |
---|---|
[mysql-proxy] | |
plugins=proxy | 在mysql-proxy啓動時加載的插件。 |
proxy-address=192.168.1.220:4040 | 代理服務監聽的地址和端口,不加端口號時,默認4040。 |
proxy-backend-addresses=192.168.1.200:3306 | 指定後端master,寫入mysql服務器的地址和端口。 |
proxy-read-only-backend-addresses=192.168.1.210:3306 | 指定後端slave,只讀mysql服務器的地址和端口。 |
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua | 指定讀寫分離配置文件位置。 |
log-file=/usr/local/mysql-proxy/mysql-proxy.log | 指定日誌文件位置。 |
log-level=debug | 定義log日誌級別,由高到低分別有(error |
keepalive=true | 以守護進程方式啓動mysql-proxy。 |
daemon=true | 在mysql-proxy崩潰時嘗試重啓。 |