mysql 橫向擴展 中間件_mysql-proxy數據庫中間件架構 | 架構師之路

一、mysql-proxy簡介

mysql-proxy是mysql官方提供的mysql中間件服務,上游可接入若干個mysql-client,后端可連接若干個mysql-server。

它使用mysql協議,任何使用mysql-client的上游無需修改任何代碼,即可遷移至mysql-proxy上。

mysql-proxy最基本的用法,就是作為一個請求攔截,請求中轉的中間層:

c52d5d77df21132e245e1e7c6df4d1e2.png

進一步的,mysql-proxy可以分析與修改請求。攔截查詢和修改結果,需要通過編寫Lua腳本來完成。

mysql-proxy允許用戶指定Lua腳本對請求進行攔截,對請求進行分析與修改,它還允許用戶指定Lua腳本對服務器的返回結果進行修改,加入一些結果集或者去除一些結果集均可。

所以說,根本上,mysql-proxy是一個官方提供的框架,具備良好的擴展性,可以用來完成:

sql攔截與修改

性能分析與監控

讀寫分離

請求路由

...

這個框架提供了6個hook點,能夠讓用戶能夠動態的介入到client與server中的通訊中去。

二、mysql-proxy架構與原理

如“簡介”中所述,mysql-proxy向用戶提供了6個hook點,讓用戶實現Lua腳本來完成各種功能,這些hook點是以函數的形式提供的,用戶可以實現這些函數,在不同事件、不同操作發生時,做我們期望的事情。

connect_server()

mysql-client向proxy發起連接時,proxy會調用這個函數。用戶可以實現該函數,來做一些負載均衡的事情,例如選擇將要連向那個mysql-server。假設有多個mysql-server后端,而用戶又沒有實現這個函數,proxy默認采用輪詢(round-robin)策略。

read_handshake()

mysql-server向proxy返回“初始握手信息”時,proxy會調用這個函數。用戶可以實現這個函數,來做更多的權限驗證工作。

read_auth()

mysql-client向proxy發送認證報文(user_name, password,database)時,proxy會調用這個函數。

read_auth_result()

mysql-server向proxy返回認證結果時,proxy會調用這個函數。

read_query()

認證完成后,mysql-client每次經過proxy向mysql-server發送query報文時,proxy會調用這個函數。用戶如果要攔截請求,就可以模擬mysql-server直接返回了,當然用戶亦可以實現各種策略,修改請求,路由請求等各種不同的業務邏輯。

read_query_result()

認證完成后,mysql-server每次經過proxy向mysql-client返回query結果時,proxy會調用這個函數。需要注意,如果用戶沒有顯示實現read_query()函數,則read_query_result()函數是不會被調用的。用戶可以在此處實現各種合并策略,或者對結果集進行修改。

下圖是一個各hook函數的觸發架構圖,箭頭方向表示觸發時機:

fe20c998dbd2da1a4c5246d263d50ba3.png

可以發現,最重要的兩個函數其實是read_query()和read_query_result(),各種sql的改寫與結果集的改寫邏輯,都是在這兩個函數中實現的,更細節的query過程如下圖:

00a5674911410c83873ea1b0af7f1701.png

三、mysql-proxy典型應用

案例一: sql時間統計分析

假設mysql-client提交的原sql為:

XYZ;

proxy可以在read_query()里將其改寫為:

SELECT NOW();

XYZ;

SELECT NOW();

這樣在返回結果集時,就可以在應用層對sql時間進行記錄,以方便統計分析。

案例二:sql性能統計分析

假設mysql-client提交的原sql為:

XYZ;

proxy可以在read_query()里將其改寫為:

XYZ;

EXPLAIN XYZ;

這樣在返回結果集時,就可以在應用層對sql性能進行記錄,以方便統計分析。

需要強調的是,這兩個案例,由于proxy在read_query()時對sql進行了改寫,故在read_query_result()時,mysql-server其實返回了比原請求更多的信息,proxy一定要將多余的信息去掉,再返回mysql-client。多說一句,可以加入一個唯一ID,來對請求sql和返回結果進行配對。

案例三:讀寫分離

mysql-proxy啟動時,通過參數即可配置后端mysql-server是主server還是read-only,無需修改任何代碼:

shell> mysql-proxy \

--proxy-backend-addresses=10.0.1.2:3306 \

--proxy-read-only-backend-addresses=10.0.1.3:3306

注意,這里的兩個mysql-server為主從架構。

案例四:性能水平擴展

mysql-proxy啟動時,通過參數配置多個后端,即可實現性能的水平擴展,無需修改任何代碼:

shell> mysql-proxy \

--proxy-backend-addresses=10.0.1.2:3306 \

--proxy-backend-addresses=10.0.1.3:3306

注意,這里的兩個mysql-server為主主架構,如果不做特殊修改,負載均衡策略為round-robin。

四、mysql-proxy其他問題

提問:Lua腳本引入的額外開銷有多大?

官網回答:Lua很快,對于大部分應用來說,額外開銷很小,原始包(raw packet)開銷大概在400微秒左右。

樓主:這,,,我不太相信。

提問:mysql-proxy和mysql-server可以部署在一臺機器上么?

官網回答:proxy單獨部署也可以,和mysql部署在同一臺機器上也可以。相比mysql而言,proxy不怎么占CPU和內存,其性能損耗可以忽略不計。

樓主:這,,,性能損耗可以忽略,這我也不太信。

提問:proxy可以處理SSL連接么?proxy不會獲取和保存我的明文密碼吧?

官網回答:作為中間人,不能處理加密信息。不會獲取密碼,也獲取不到。mysql協議不允許密碼以明文傳輸,傳輸的都是加密后的密文。

提問:在Lua腳本里可以使用LuaSocket,連緩存,連其他服務么?

官網回答:理論上可以。但是,大哥,你確定要這樣做么,強烈不建議這樣。

==【完】==

相關推薦:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534953.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python selenium對象怎么序列化_python selenium爬取斗魚

不加延遲報錯selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”.//span[class”DyListCover-hot”]”}(Session info: chrome80.0.3987.122)最開始以為是版本問題,不…

神經網絡的全連接層_深度神經網絡全連接層

一、概念全連接層一般在網絡的最后部分做分類輸出,全連接層的有m個輸入和n個輸出,每一個輸出都和所有的輸入相連,相連的權重w都是不一樣的,同時每一個輸出還有一個bias。二、前向全連接假設輸入是4,輸出是4&#xff0c…

vs 選定內容沒有屬性頁_從智能單品,到全屋智能:2019中國智能家居發展白皮書【附82頁PPT】...

2019年,智能家居行業在技術、市場和行業的變革中迎接新的挑戰和機遇。一方面,AI、IoT、邊緣計算全面賦能智能家居;另一方面,中國的房地產行業正在從上半場的“增量開發”,切換到下半場的“存量經營”、“樓盤精裝化”政…

python決策樹的應用_機器學習-決策樹實戰應用

1.下載2.安裝:雙擊3.創建桌面快捷方式安裝目錄\bin文件夾\:找到gvedit.exe文件右鍵 發送到桌面快捷方式,如下圖:4.配置環境變量將graphviz安裝目錄下的bin文件夾添加到Path環境變量中:5.驗證是否安裝并配置成功進入win…

【SSM面向CRUD編程專欄 3】關于黑馬程序員最全SSM框架教程視頻,P37集老師跳過的模塊創建以及tomcat下載安裝配置和運行等諸多問題

寫在前面:? 本人是在學習B站黑馬程序員SSM框架教程視頻的時候在P37集遇到了問題,如果不解決還沒辦法往下接著聽,老師跳過的模塊創建以及tomcat下載安裝配置和運行等諸多問題,全在這篇博客中得到了解決 😢解決上…

python人臉識別源碼_Python 抖音機器人,讓你找到漂亮小姐姐

本項目作者沉迷于抖音無法自拔,常常花好幾個小時在抖音漂亮小姐姐身上。本著高效、直接地找到漂亮小姐姐的核心思想,我用 Python ADB 做了一個 Python 抖音機器人 Douyin-Bot。特性自動翻頁顏值檢測人臉識別自動點贊自動關注隨機防 Ban自動評論原理打開…

thinkphp josn mysql_ThinkPHP:JSON字段類型的使用(ORM)

ThinkPHP5.1版本正式發布已經有一段時間了,我會陸續給大家介紹其中的新特性。今天要給大家介紹的是一個可能很多用戶還不了解的一個特性:JSON字段數據支持。不過首先注意一點,本篇內容中描述的JSON字段數據的支持是從V5.1.4版本引入的。由于包…

獲取http地址如何從上面抓取圖片_用 Python 自動抓取妹子圖

目錄前言Media Pipeline啟用Media Pipeline使用 ImgPipeline抓取妹子圖瞎比比與送書后話前言我們在抓取數據的過程中,除了要抓取文本數據之外,當然也會有抓取圖片的需求。那我們的 scrapy 能爬取圖片嗎?答案是,當然的。說來慚愧&a…

MySQL摘要_mysql摘要

2011-04-15(1)mysqld關閉命令:mysqladmin -u root shutdown。注意:windows命令以enter結束不是;,mysql命令行才是(2)mysql終端接入,修改mysql.user表內容,添加授權用戶。insert into mysql.user(Host,User,Password,ss…

錯誤代碼0x800f0950怎么解決_解決win10安裝net framework 3.5失敗(錯誤代碼 0x800F0950)...

視頻教程:Win10教程 安裝net framework 3.5失敗(錯誤代碼 0x800F0950)_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili?www.bilibili.com一:出現問題:報錯代碼二:解決步驟1.通過命令提示符明確自己系統版本Windows鍵X ,打開(命…

java mysql dump_Java 調用Mysql dump 備份數據庫

SimpleDateFormat sdf new SimpleDateFormat("yyyyMMddHHmmss");try {String name sdf.format(new Date());String filePath System.getProperty("user.dir") "//" name ".sql";// 系統執行器Runtime rt Runtime.getRuntime();…

python 日志不會按照日期分割_django實現日志按日期分割

settings文件中配置: LOGGING { version:1, disable_existing_logger:False, formatters:{ verbose:{ format:%(asctime)s \"%(pathname)s:%(module)s:%(funcName)s:%(lineno)d\" [%(levelname)s]-%(message)s }, }, # 處理器 handlers:{ # 輸…

mysql事務隔離最高_Mysql事務隔離級別

mysql官方文檔顯示:InnoDB中每個隔離級別的詳細描述如下: READ UNCOMMITTEDSELECT語句以非鎖定方式被執行,但是一個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為“…

exe打包工具哪個最好_一鍵分發工具哪個最好用?這款30萬人都在用,很優秀!...

現代化媒體對于傳播越來越重要,16年到如今,視頻內容產業實在有話題度,其高效的粉絲互動機制、低資金投入高額回報等等亮點,強烈吸引著數以百萬計的創造者,為了達到極其出色的閱讀量,這些人往往會運用到所有…

mysql備份服務器中的_使用 Shell 備份遠程服務器上的 MySQL 數據庫到本機

適用場景:遠程服務器上的 MySQL 不允許遠程訪問,此時我們需要先登錄服務器,備份數據庫后,將備份文件拉取到本機。源碼 mysqlDumpRemote2Local.sh#!/bin/bash################################################# TODO: 登錄遠程服務…

date轉timestamp格式_技術分享 | MySQL:timestamp 時區轉換導致 CPU %sy 高的問題

作者:高鵬文章末尾有他著作的《深入理解 MySQL 主從原理 32 講》,深入透徹理解 MySQL 主從,GTID 相關技術知識。本文為學習記錄,可能有誤請諒解。本文建議PC端觀看,效果更佳。這個問題是一個朋友遇到的風云&#xff0c…

mysql架構組成_第 2 章 MySQL 架構組成

麻雀雖小,五臟俱全。MySQL 雖然以簡單著稱,但其內部結構并不簡單。本章從MySQL物理組成、邏輯組成,以及相關工具幾個角度來介紹 MySQL 的整體架構組成,希望能夠讓讀者對 MySQL 有一個更全面深入的了解。2.1 MySQL物理文…

python列表生成器語法_python列表生產式和生成器

1.列表生成式:通過簡潔的語法可以對一組元素進行過濾 格式:[exp for val in collection if condition] 例子1: a [x*xforxinxrange(1,10)ifx%20] print(a) 1)append(): 該方法用于在列表末尾添加新的對象,…