mysql讀寫分離實作方式是什麼

WBOY
發布: 2022-03-28 16:30:08
原創
9451 人瀏覽過

在mysql中,可以利用「mysql-proxy」實作讀寫分離;「mysql-proxy」是一個mysql官方提供用來實現讀寫分離的軟體,也叫中間件,可以讓主資料庫處理寫入操作,而從資料庫處理查詢的操作,資料庫的一致性則透過主從複製來實現。

mysql讀寫分離實作方式是什麼

本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。

mysql讀寫分離的實作方式是什麼

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伺服器上

因為資料庫的寫入操作相對讀取操作是比較耗時的,所以資料庫的讀寫分離,解決的是資料庫的寫入,影響了查詢的效率

在server1和server2先配置gtid主從複製

gtid主從複製上篇部落格已經說明,這裡不再贅述,只展示最終效果
可以看到server1上建立一個westos資料庫,對應的server2上會同步過來
mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼

##配置server3代理端(mysql-proxy)

在server3上建置mysql-proxy代理伺服器(實作客戶端寫在server1上、讀server2上的資料)

(1) 從實體機取得mysql- proxy安裝套件到server3

mysql讀寫分離實作方式是什麼(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/目录下
登入後複製

mysql讀寫分離實作方式是什麼 做一個軟連線以便管理

ln -s mysql-proxy-0.8.5-linux-glibc2-x86-64bit mysql-proxy
登入後複製

mysql讀寫分離實作方式是什麼
#mysql-proxy目錄下是沒有設定檔的,所以需要自行建立一個設定檔的目錄,建立設定檔
mysql讀寫分離實作方式是什麼 使用下面兩個指令可以查設定檔中寫入的參數

[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	##使用后台方式运行
登入後複製

mysql讀寫分離實作方式是什麼
儲存後需要將設定檔的權限改為660,需要建立log 目錄
mysql讀寫分離實作方式是什麼
修改資料庫發生讀寫分離時的最大和最小連接數

[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, 最大连接数
登入後複製

mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼#(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	##查看日志
登入後複製

mysql讀寫分離實作方式是什麼

測試讀寫分離

(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;
登入後複製

mysql讀寫分離實作方式是什麼
(2)server3安装lsof
mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼
(3)在用户端虚拟机server4上第一次连接数据库代理server3
mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼
在server3上面:lsof -i:3306
mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼
(4)在用户端虚拟机server4上第二次连接数据库代理server3
在server3上面:lsof -i:3306
mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼
(5)在用户端虚拟机server4上第三次连接数据库代理server3
在server3上面:lsof -i:3306
开始读写分离

mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼上面是读写分离的读访问测试
写测试
在用户端插入数据

use westos;
insert into linux values('user1','123');
登入後複製

mysql讀寫分離實作方式是什麼
server1和server2都可以看到插入的数据
mysql讀寫分離實作方式是什麼
mysql讀寫分離實作方式是什麼
在server2中关闭主从复制
用户端再次写入数据,看不到刚刚写的数据
mysql讀寫分離實作方式是什麼
写在server1上,可以查看到数据
mysql讀寫分離實作方式是什麼
在server2上实现了读写分离
mysql讀寫分離實作方式是什麼
server2重新开启主从复制可以看到数据
mysql讀寫分離實作方式是什麼
客户端读的是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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!