最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql讀寫分離過期常用解決方案

 更新時間:2020年09月10日 11:55:10   作者:Jimmyhe  
這篇文章主要介紹了Mysql讀寫分離過期常用解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

mysql讀寫分離的坑

讀寫分離的主要目標(biāo)是分?jǐn)傊鲙斓膲毫?,由客戶端選擇后端數(shù)據(jù)庫進(jìn)行查詢。還有種架構(gòu)就是在MYSQL和客戶端之間有一個中間代理層proxy,客戶端之連接proxy,由proxy根據(jù)請求類型和上下文決定請求的分發(fā)路由。

  • 客戶端直連方案:因?yàn)樯?#63930;一層proxy轉(zhuǎn)發(fā),所以查詢性能稍微好一點(diǎn)兒,并且整體架構(gòu)簡單,排查問題更方便。但是這種方案,由于要了解后端部署細(xì)節(jié),所以在出現(xiàn)主備切換、庫遷移等操作的時候,客戶端都會感知到,并且需要調(diào)整數(shù)據(jù)庫連接信息。
  • 帶proxy架構(gòu):對客戶端比較友好。客戶端不需要關(guān)注后端細(xì)節(jié),連接維護(hù)、后端信息維護(hù)等工作,都是由proxy完成的。但這樣的話,對后端維護(hù)團(tuán)隊(duì)的要求會更高。

無論使用哪種架構(gòu),由于主從可能存在延遲,客戶端執(zhí)行完一個更新事務(wù)后馬上發(fā)起查詢,如果查詢選擇的是從庫的話,就有可能讀到剛剛的事務(wù)更新之前的狀態(tài)。這種“在從庫上會讀到系統(tǒng)的一個過期狀態(tài)”的現(xiàn)象,我們暫且稱之為“過期讀”。

方案一:強(qiáng)制走主庫方案

將查詢請求分為兩類:

  • 對于必須要拿到最新結(jié)果的請求,強(qiáng)制將其發(fā)到主庫上。比如,在一個交易平臺上,賣家發(fā)布商品以后,馬上要返回主頁面,看商品是否發(fā)布成功。那么,這個請求需要拿到最新的結(jié)果,就必須走主庫。
  • 對于可以讀到舊數(shù)據(jù)的請求,才將其發(fā)到從庫上。在這個交易平臺上,買家來逛商鋪頁面,就算晚幾秒看到最新發(fā)布的商品,也是可以接受的。那么,這類請求就可以走從庫。這個方案的最大問題在于會碰到所有查詢都不是“過期讀”的需求,比如金融類業(yè)務(wù),這樣就要放棄讀寫分離,所有的壓力都在主庫。采用以下方案。

方案二:Sleep方案

主庫更新后,讀從庫之前先sleep一下,類似執(zhí)行了select sleep(1)命令,這個方案的假設(shè)是,大多數(shù)情況下主備延遲在1秒之內(nèi),做一個sleep可以有很大概率拿到最新的數(shù)據(jù)。

以賣家發(fā)布商品為例,商品發(fā)布后,用Ajax直接把客戶端輸入的內(nèi)容作為“新的商品”顯示在頁面上,而不是真正地去數(shù)據(jù)庫做查詢。這樣,賣家就可以通過這個顯示,來確認(rèn)產(chǎn)品已經(jīng)發(fā)布成功了。等到賣家再刷新頁面,去查看商品的時候,其實(shí)已經(jīng)過了一段時間,也就達(dá)到了sleep的目的,進(jìn)而也就解決了過期讀的問題。

方案三:判斷主備無延遲方案:

第一種方法:先用show slave status結(jié)果里的seconds_behind_master參數(shù)的值,可以用來衡量主備延遲時間的長短。先判斷這個參數(shù)值是否為0,如果不為0,必須等到這個參數(shù)變?yōu)?才能執(zhí)行請求。

第二種方法:對比位點(diǎn)確保主備無延遲。

  • Master_Log_File和Read_Master_Log_Pos,表示的是讀到的主庫的最新位點(diǎn);
  • Relay_Master_Log_File和Exec_Master_Log_Pos,表示的是備庫執(zhí)行的最新位點(diǎn)。

如果Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和Exec_Master_Log_Pos這兩組值完全相同,就表示接收到的日志已經(jīng)同步完成。

第三種方法:對比GTID(全局事物ID)確保主備無延遲

  • Auto_Position=1 ,表示這對主備關(guān)系使用了GTID協(xié)議。
  • Retrieved_Gtid_Set,是備庫收到的所有日志的GTID集合;
  • Executed_Gtid_Set,是備庫所有已經(jīng)執(zhí)行完成的GTID集合。

如果這兩個集合相同,表示備庫接收到的日志都已經(jīng)同步完成。

方案四:等主庫位點(diǎn)方案

select master_pos_wait(file, pos[, timeout]);

這條命令是在從庫執(zhí)行的 ,參數(shù)file和pos指的是主庫上的文件名和位置,timeout表示這個函數(shù)最多等待N秒。

  • 這個命令正常返回的結(jié)果是一個正整數(shù)M,表示從命令開始執(zhí)行,到應(yīng)用完file和pos表示的binlog位置,執(zhí)行了多少事務(wù)。
  • 如果備庫同步線程發(fā)生異常,則返回null
  • 如果等待超過N秒,就返回-1
  • 如果剛開始執(zhí)行就發(fā)現(xiàn)已經(jīng)執(zhí)行過了,則返回0

如圖:先執(zhí)行trx1,再執(zhí)行一個查詢請求的邏輯,要保證能夠查到正確的數(shù)據(jù),我們可以使用

這個邏輯

1. trx1事物更新完成后,馬上執(zhí)行show master status得到當(dāng)前主庫執(zhí)行到的File和Position;

2. 選定一個從庫執(zhí)行查詢語句;

3. 在從庫上執(zhí)行select master_pos_wait(File, Position, 1);

4. 如果返回值是>=0的正整數(shù),則在這個從庫執(zhí)行查詢語句;

5. 否則,到主庫執(zhí)行查詢語句。

這里我們假設(shè),這條select查詢最多在從庫上等待1秒。那么,如果1秒內(nèi)master_pos_wait返回
一個大于等于0的整數(shù),就確保了從庫上執(zhí)行的這個查詢結(jié)果一定包含了trx1的數(shù)據(jù)。

5到主庫執(zhí)行查詢語句,是這類方案常用的退化機(jī)制。因?yàn)閺膸斓难舆t時間不可控,不能無
限等待,所以如果等待超時,就應(yīng)該放棄,然后到主庫去查。按照我們設(shè)定不允許過期讀的要求,就只有兩種選擇,一種是超時放棄,一種是轉(zhuǎn)到主庫查詢。

并發(fā)連接和并發(fā)查詢

innodb_thread_concurrency參數(shù)是控制innodb的并發(fā)線程上限。一旦超過這個數(shù)值,新請求就會進(jìn)入等待。

  • show processlist看到的幾千個連接,是值并發(fā)連接,而當(dāng)前正在執(zhí)行的語句,才是并發(fā)查詢。并發(fā)連接影響不大,只是會多占內(nèi)存,而并發(fā)查詢才是CPU殺手。
  • 在線程進(jìn)入鎖等待以后,并發(fā)線程的計(jì)數(shù)會建議,也就是等行鎖的線程是不算在并發(fā)查詢里的。因?yàn)樗却呀?jīng)不吃CPU了

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Centos7下無法遠(yuǎn)程連接mysql數(shù)據(jù)庫的原因與解決

    Centos7下無法遠(yuǎn)程連接mysql數(shù)據(jù)庫的原因與解決

    MySQL是由Oracle公司開發(fā)的開源SQL數(shù)據(jù)庫管理系統(tǒng),下面這篇文章主要給大家介紹了關(guān)于在Centos7下無法遠(yuǎn)程連接mysql數(shù)據(jù)庫的原因與解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • mysql5.7.25使用全文檢索功能的實(shí)例教程

    mysql5.7.25使用全文檢索功能的實(shí)例教程

    其實(shí)全文檢索在MySQL里面很早就支持了,下面這篇文章主要給大家介紹了關(guān)于mysql5.7.25使用全文檢索功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • MySQL長字符截?cái)嗟膶?shí)現(xiàn)示例

    MySQL長字符截?cái)嗟膶?shí)現(xiàn)示例

    本文主要介紹了MySQL長字符截?cái)嗟膶?shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • MySQL查詢數(shù)據(jù)(單表查詢)詳解

    MySQL查詢數(shù)據(jù)(單表查詢)詳解

    這篇文章主要介紹了MySQL查詢數(shù)據(jù)(單表查詢)的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • navicat創(chuàng)建MySql定時任務(wù)的方法詳解

    navicat創(chuàng)建MySql定時任務(wù)的方法詳解

    這篇文章主要介紹了navicat創(chuàng)建MySql定時任務(wù)的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 如何正確、安全地關(guān)閉MySQL

    如何正確、安全地關(guān)閉MySQL

    當(dāng)需要停止或關(guān)閉MySQL實(shí)例時,很多人并不清楚如何做到正確、安全地關(guān)閉MySQL,會對數(shù)據(jù)的安全性和穩(wěn)定性造成很大的威脅,本文將從多個方面詳細(xì)闡述如何正確關(guān)閉MySQL,包括關(guān)閉MySQL的基本方法、關(guān)閉MySQL前的準(zhǔn)備工作、優(yōu)雅地關(guān)閉MySQL以及遇到MySQL無法正常關(guān)閉的情況
    2023-09-09
  • mysql共享鎖與排他鎖用法實(shí)例分析

    mysql共享鎖與排他鎖用法實(shí)例分析

    這篇文章主要介紹了mysql共享鎖與排他鎖用法,結(jié)合實(shí)例形式分析了mysql共享鎖與排他鎖相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • MySQL子查詢的使用詳解下篇

    MySQL子查詢的使用詳解下篇

    子查詢是在查詢語句里面再嵌套一個查詢,這是因?yàn)槲覀冊谔崛?shù)據(jù)的時候有很多不知道的數(shù)據(jù)產(chǎn)生了依賴關(guān)系。本文為大家總結(jié)了一下MySQL數(shù)據(jù)庫子查詢語法規(guī)則,感興趣的可以了解一下
    2022-08-08
  • MySQL最新版8.1.0安裝配置教程(圖文)

    MySQL最新版8.1.0安裝配置教程(圖文)

    MySQL是一種廣泛使用的開源數(shù)據(jù)庫管理系統(tǒng),MySQL 8.0是最新版本,它具有更好的性能和安全性,本文主要介紹了MySQL最新版8.1.0安裝配置教程,感興趣的可以了解一下
    2023-09-09
  • Mysql數(shù)據(jù)庫支持的存儲引擎對比

    Mysql數(shù)據(jù)庫支持的存儲引擎對比

    這篇文章主要介紹了Mysql數(shù)據(jù)庫支持的各個存儲引擎之間的對比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09

最新評論

四平市| 白城市| 布拖县| 衡南县| 邵武市| 得荣县| 久治县| 长兴县| 武冈市| 湖南省| 灵山县| 会理县| 神木县| 左权县| 舟山市| 珲春市| 江山市| 绩溪县| 民县| 宜宾市| 纳雍县| 雷山县| 砚山县| 綦江县| 安陆市| 白山市| 南宫市| 霍城县| 巫山县| 三门县| 红桥区| 台江县| 虞城县| 英超| 苍梧县| 昌乐县| 基隆市| 惠水县| 安达市| 芒康县| 白城市|