為什么要讀寫(xiě)分離
在應(yīng)用的用戶(hù)訪問(wèn)量比較低的時(shí)候拨匆,一個(gè)數(shù)據(jù)庫(kù)的讀寫(xiě)能力是完全能夠勝任的端壳。但是在用戶(hù)訪問(wèn)量增大的時(shí)候颂翼,數(shù)據(jù)庫(kù)I/O就會(huì)成為瓶頸藤巢,解決數(shù)據(jù)庫(kù)I/O瓶頸可以有兩種方式:
- 增加數(shù)據(jù)庫(kù)緩存搞莺,如memche、Redis掂咒,數(shù)據(jù)庫(kù)的讀寫(xiě)先操作緩存,然后再持久化到數(shù)據(jù)庫(kù)迈喉;
- 數(shù)據(jù)庫(kù)主從備份绍刮,進(jìn)行讀寫(xiě)分離;
通過(guò)對(duì)用戶(hù)訪問(wèn)的數(shù)據(jù)分析挨摸,一定是讀數(shù)據(jù)庫(kù)的量要遠(yuǎn)遠(yuǎn)大于寫(xiě)數(shù)據(jù)庫(kù)的量孩革,這時(shí)讀就成為瓶頸,而讀寫(xiě)的可靠性級(jí)別也是不一樣的得运,寫(xiě)的可靠性要求會(huì)更高膝蜈,針對(duì)讀寫(xiě)的不同的要求,進(jìn)行數(shù)據(jù)庫(kù)的讀寫(xiě)分離熔掺。
如何實(shí)現(xiàn)主從同步
半同步復(fù)制:主庫(kù)在執(zhí)行完客戶(hù)端提交的事務(wù)后不是立刻返回給客戶(hù)端,而是等待至少一個(gè)從庫(kù)接收到并寫(xiě)到relay log中才返回給客戶(hù)端置逻。
并發(fā)復(fù)制:指的是從庫(kù)開(kāi)啟多個(gè)線程推沸,并行讀取relay log中不同庫(kù)的日志,然后并行重放不同庫(kù)的日志券坞。
讀寫(xiě)分離存在哪些問(wèn)題及解決方法
由于主從同步是異步的鬓催,存在不一致的情況,因此會(huì)產(chǎn)生一些問(wèn)題恨锚。
問(wèn)題1
用戶(hù)注冊(cè)成功后宇驾,需要進(jìn)行登錄操作,注冊(cè)是寫(xiě) 操作猴伶,登錄是讀操作课舍,如果此時(shí)從庫(kù)還沒(méi)有用戶(hù)的注冊(cè)信息塌西,那么用戶(hù)登錄會(huì)失敗。
解決方法:
這個(gè)問(wèn)題可以在業(yè)務(wù)層進(jìn)行處理布卡,注冊(cè)成功之后雨让,馬上登錄的,訪問(wèn)主庫(kù)忿等;
這個(gè)問(wèn)題也可以在訪問(wèn)從庫(kù)失敗之后栖忠,訪問(wèn)主庫(kù)進(jìn)行驗(yàn)證;
問(wèn)題2
用戶(hù)修改密碼成功后贸街,需要進(jìn)行登錄操作庵寞,修改是寫(xiě) 操作,登錄是讀操作薛匪,如果此時(shí)從庫(kù)還沒(méi)有更新用戶(hù)的信息捐川,那么用戶(hù)登錄會(huì)失敗。
解決方法:
此時(shí)從庫(kù)的數(shù)據(jù)沒(méi)有更新逸尖,如果用戶(hù)登錄會(huì)出現(xiàn)失敗古沥。可以在業(yè)務(wù)邏輯層進(jìn)行處理娇跟,當(dāng)用戶(hù)密碼修改后岩齿,在緩存中新增一條Id記錄,記錄用戶(hù)的最新信息苞俘,并設(shè)置過(guò)期時(shí)間盹沈,每次請(qǐng)求的時(shí)候,先從緩存讀取信息吃谣,如果沒(méi)有在緩存讀到乞封,則到從庫(kù)讀取。