mysql 讀寫分離(實(shí)戰(zhàn)篇)
更新時間:2009年04月13日 11:12:28 作者:
MySQL Proxy最強(qiáng)大的一項(xiàng)功能是實(shí)現(xiàn)“讀寫分離(Read/Write Splitting)”。
MySQL Proxy最強(qiáng)大的一項(xiàng)功能是實(shí)現(xiàn)“讀寫分離(Read/Write Splitting)”。基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性查詢,而從數(shù)據(jù)庫處理SELECT查詢。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性查詢導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。

Jan Kneschke在《MySQL Proxy learns R/W Splitting》中詳細(xì)的介紹了這種技巧以及連接池問題:
為了實(shí)現(xiàn)讀寫分離我們需要連接池。我們僅在已打開了到一個后端的一條經(jīng)過認(rèn)證的連接的情況下,才切換到該后端。MySQL協(xié)議首先進(jìn)行握手。當(dāng)進(jìn)入到查詢/返回結(jié)果的階段再認(rèn)證新連接就太晚了。我們必須保證擁有足夠的打開的連接才能保持運(yùn)作正常。
實(shí)現(xiàn)讀寫分離的LUA腳本:
-- 讀寫分離
--
-- 發(fā)送所有的非事務(wù)性Select到一個從數(shù)據(jù)庫
if is_in_transaction == 0 and
packet:byte() == proxy.COM_QUERY and
packet:sub(2, 7) == "SELECT" then
local max_conns = -1
local max_conns_ndx = 0
for i = 1, #proxy.servers do
local s = proxy.servers[i]
-- 需要選擇一個擁有空閑連接的從數(shù)據(jù)庫
if s.type == proxy.BACKEND_TYPE_RO and
s.idling_connections > 0 then
if max_conns == -1 or
s.connected_clients < max_conns then
max_conns = s.connected_clients
max_conns_ndx = i
end
end
end
-- 至此,我們找到了一個擁有空閑連接的從數(shù)據(jù)庫
if max_conns_ndx > 0 then
proxy.connection.backend_ndx = max_conns_ndx
end
else
-- 發(fā)送到主數(shù)據(jù)庫
end
return proxy.PROXY_SEND_QUERY
注釋:此技巧還可以用來實(shí)現(xiàn)其他的數(shù)據(jù)分布策略,例如分片(Sharding)。

Jan Kneschke在《MySQL Proxy learns R/W Splitting》中詳細(xì)的介紹了這種技巧以及連接池問題:
為了實(shí)現(xiàn)讀寫分離我們需要連接池。我們僅在已打開了到一個后端的一條經(jīng)過認(rèn)證的連接的情況下,才切換到該后端。MySQL協(xié)議首先進(jìn)行握手。當(dāng)進(jìn)入到查詢/返回結(jié)果的階段再認(rèn)證新連接就太晚了。我們必須保證擁有足夠的打開的連接才能保持運(yùn)作正常。
實(shí)現(xiàn)讀寫分離的LUA腳本:
復(fù)制代碼 代碼如下:
-- 讀寫分離
--
-- 發(fā)送所有的非事務(wù)性Select到一個從數(shù)據(jù)庫
if is_in_transaction == 0 and
packet:byte() == proxy.COM_QUERY and
packet:sub(2, 7) == "SELECT" then
local max_conns = -1
local max_conns_ndx = 0
for i = 1, #proxy.servers do
local s = proxy.servers[i]
-- 需要選擇一個擁有空閑連接的從數(shù)據(jù)庫
if s.type == proxy.BACKEND_TYPE_RO and
s.idling_connections > 0 then
if max_conns == -1 or
s.connected_clients < max_conns then
max_conns = s.connected_clients
max_conns_ndx = i
end
end
end
-- 至此,我們找到了一個擁有空閑連接的從數(shù)據(jù)庫
if max_conns_ndx > 0 then
proxy.connection.backend_ndx = max_conns_ndx
end
else
-- 發(fā)送到主數(shù)據(jù)庫
end
return proxy.PROXY_SEND_QUERY
注釋:此技巧還可以用來實(shí)現(xiàn)其他的數(shù)據(jù)分布策略,例如分片(Sharding)。
您可能感興趣的文章:
- 詳解MySQL主從復(fù)制讀寫分離搭建
- 詳解MySQL的主從復(fù)制、讀寫分離、備份恢復(fù)
- MySQL5.6 Replication主從復(fù)制(讀寫分離) 配置完整版
- MySQL主從復(fù)制的原理及配置方法(比較詳細(xì))
- linux系統(tǒng)下實(shí)現(xiàn)mysql熱備份詳細(xì)步驟(mysql主從復(fù)制)
- Mysql主從復(fù)制(master-slave)實(shí)際操作案例
- MySQL的主從復(fù)制步驟詳解及常見錯誤解決方法
- MySQL主從復(fù)制配置心跳功能介紹
- MySQL主從同步、讀寫分離配置步驟
- mysql 讀寫分離(基礎(chǔ)篇)
- MySQL的使用中實(shí)現(xiàn)讀寫分離的教程
- mysql主從復(fù)制讀寫分離的配置方法詳解
相關(guān)文章
MySQL提示:The server quit without updating PID file問題的解決辦法
今天網(wǎng)站web頁面提交內(nèi)容到數(shù)據(jù)庫,發(fā)現(xiàn)出錯了,一直提交不了,數(shù)找了下原因,發(fā)現(xiàn)數(shù)據(jù)寫不進(jìn)去!第一反應(yīng),重啟mysql數(shù)據(jù)庫,一直執(zhí)行中,停止不了也啟動不了,直覺告訴我磁盤滿了 !2014-04-04MySQL 發(fā)生同步延遲時Seconds_Behind_Master還為0的原因
騰訊云數(shù)據(jù)庫 MySQL 的只讀實(shí)例出現(xiàn)了同步延遲,但是監(jiān)控的延遲時間顯示為 0,而且延遲的 binlog 距離非 0,且數(shù)值越來越大。臨時解決之后,仔細(xì)想了一想,Seconds_Behind_Master 雖然計算方式有點(diǎn)坑,但是出現(xiàn)這么“巨大”的誤差還是挺奇怪的,本文就來分析下這個問題2021-06-06mysql分頁時offset過大的Sql優(yōu)化經(jīng)驗(yàn)分享
mysql分頁是我們在開發(fā)經(jīng)常遇到的一個功能,最近在實(shí)現(xiàn)該功能的時候遇到一個問題,所以這篇文章主要給大家介紹了關(guān)于mysql分頁時offset過大的Sql優(yōu)化經(jīng)驗(yàn),文中介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起看看吧。2017-08-08mysql如何在已有數(shù)據(jù)庫上統(tǒng)一字符集
這篇文章主要介紹了mysql如何在已有數(shù)據(jù)庫基礎(chǔ)上換字符集,數(shù)據(jù)庫里面,部分?jǐn)?shù)據(jù)表和數(shù)據(jù)是latin1的,部分?jǐn)?shù)據(jù)表和數(shù)據(jù)是UTF8,還有部分表,表結(jié)構(gòu)是utf8而數(shù)據(jù)是latin1,下面說一下,怎么樣字符集統(tǒng)一成utf8,需要的朋友可以參考下2019-06-06淺析mysql 語句的調(diào)度優(yōu)先級及改變
本篇文章是對mysql語句的調(diào)度優(yōu)先級及改變進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06