在mysql中,可以利用「mysql-proxy」實作讀寫分離;「mysql-proxy」是一個mysql官方提供用來實現讀寫分離的軟體,也叫中間件,可以讓主資料庫處理寫入操作,而從資料庫處理查詢的操作,資料庫的一致性則透過主從複製來實現。
本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
Mysql中可以實現讀寫分離的插件有mysql-proxy / Mycat / Amoeba ,mysql-proxy是系統自帶的一個插件,這次實驗主要用它來實現讀寫分離
mysql-proxy是實現"讀寫分離(Read/Write Splitting)"的一個軟體(MySQL官方提供,也叫中間件),基本的原理是讓主資料庫處理寫入操作(insert、update、delete),而從資料庫處理查詢操作(select)。而資料庫的一致性則透過主從複製來實現
MySQL-proxy 它能實現讀寫語句的區分主要依靠內部的一個lua腳本(能實現讀寫語句的判斷)
如果只在主伺服器(寫伺服器)上完成資料的寫入操作,此時從伺服器上沒有執行寫入操作,是沒有資料的
這個時候需要使用另一個技術來實現主從伺服器的資料一致性,這個技術叫做主從複製技術, 所以說主從複製是讀寫分離的基礎
讀寫分離(MySQL- Proxy)是指讓master處理寫操作,讓slave處理操作,非常適合讀取操作量比較大的場景,可減輕master的壓力
使用mysql-proxy實現mysql的讀寫分離,mysql-proxy實際上是作為後端mysql主從伺服器的代理,它直接接受客戶端的請求,對SQL語句進行分析,判斷出是讀取操作還是寫入操作,然後分發至對應的mysql伺服器上
因為資料庫的寫入操作相對讀取操作是比較耗時的,所以資料庫的讀寫分離,解決的是資料庫的寫入,影響了查詢的效率
gtid主從複製上篇部落格已經說明,這裡不再贅述,只展示最終效果
可以看到server1上建立一個westos資料庫,對應的server2上會同步過來
(1) 從實體機取得mysql- proxy安裝套件到server3
(2)在server3上進行設定
[root@server3 ~]# systemctl status mysqld ##查看mysqld服务状态 [root@server3 ~]# systemctl stop mysqld ##关闭mysqld服务,因为代理服务器要用3306端口 [root@server3 ~]# tar zxf mysql-proxy-0.8.5-linux-glibc2-x86-64bit.tar.gz -C /usr/local/ ##解压到/usr/local/目录下
做一個軟連線以便管理
ln -s mysql-proxy-0.8.5-linux-glibc2-x86-64bit mysql-proxy
#mysql-proxy目錄下是沒有設定檔的,所以需要自行建立一個設定檔的目錄,建立設定檔
使用下面兩個指令可以查設定檔中寫入的參數
[root@server3 bin]# ./mysql-proxy --help [root@server3 bin]# ./mysql-proxy --help-proxy
[mysql-proxy] ##指定语句块 proxy-address=0.0.0.0:3306 ##指定proxy访问的主机和端口,3306是一个对外的通用端口 proxy-read-only-backend-addresses=172.25.254.2:3306 ##读主机的ip和端口 proxy-backend-addresses=172.25.254.1:3306 ##执行写主机的ip和端口 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ##指定读写分离操作使用的lua文件路径 pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid ##pid存放路径 log-file=/usr/local/mysql-proxy/log/mysql-proxy.log ##日志存放路径 plugins=proxy ##指定使用的插件 log-level=debug ##日志的等级 keepalive=true ##开启守护进程 daemon=true ##使用后台方式运行
儲存後需要將設定檔的權限改為660,需要建立log 目錄
修改資料庫發生讀寫分離時的最大和最小連接數
[root@server3 mysql-proxy]# find . -name *.lua ./share/doc/mysql-proxy/rw-splitting.lua [root@server3 mysql-proxy]# cd share/doc/mysql-proxy [root@server3 mysql-proxy]# ls [root@server3 mysql-proxy]# vim rw-splitting.lua ##将lua脚本里原本启动机制的最小4个最大8个连接,改为1和2 min_idle_connections = 1, 最小连接数 max_idle_connections = 2, 最大连接数
#(3)啟動mysql -proxy
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf ##启动 cat /usr/local/mysql-proxy/log/mysql-proxy.log ##查看日志測試讀寫分離(1)在server1上建立新的使用者並且授權
mysql> grant insert,update,select on *.* to kkxili@'%' identified by 'Red1hat*'; mysql> FLUSH PRIVILEGES; ##刷新授权表 mysql> USE westos; Database changed mysql> CREATE TABLE linux ( -> username varchar(10) not null, -> password varchar(15) not null); mysql>DESC linux;
(2)server3安装lsof
(3)在用户端虚拟机server4上第一次连接数据库代理server3
在server3上面:lsof -i:3306
(4)在用户端虚拟机server4上第二次连接数据库代理server3
在server3上面:lsof -i:3306
(5)在用户端虚拟机server4上第三次连接数据库代理server3
在server3上面:lsof -i:3306
开始读写分离
上面是读写分离的读访问测试
写测试
在用户端插入数据
use westos; insert into linux values('user1','123');
server1和server2都可以看到插入的数据
在server2中关闭主从复制
用户端再次写入数据,看不到刚刚写的数据
写在server1上,可以查看到数据
在server2上实现了读写分离
server2重新开启主从复制可以看到数据
客户端读的是server2,server2只能读,不能写,因此看不到刚才写进去的东西,server1可以看到
实现了客户端(虚拟机)对server1的写,对server2的读
当访问数据库的用户数量很多时,数据库的代理就把后端的数据库实现读写分离
server1是写的数据库、server2是读的数据库
当server1和server2满足gtid的主从复制时,用户往数据库写入的数据其实是写入了server1,并没有写入server2,server2上面的数据是复制过去的,因此server1、server2、客户机上面都能查到刚刚写进去的数据,其实客户机查的是server2(读)
当关闭server1和server2的异步复制时,客户机往数据库写入的数据只写进了server1,没有写进去server2,server2也没有复制一份
因此server1可以查看到,server2和客户机上面都查不到刚刚写进去的数据,此时的客户机读的是server2
推荐学习:mysql视频教程
以上是mysql讀寫分離實作方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!