面試39 MySQL讀寫分離

(1)如何實現mysql的讀寫分離?

?

其實很簡單,就是基于主從復制架構,簡單來說,就搞一個主庫,掛多個從庫,然后我們就單單只是寫主庫,然后主庫會自動把數據給同步到從庫上去。

?

(2)MySQL主從復制原理的是啥?

?

主庫將變更寫binlog日志,然后從庫連接到主庫之后,從庫有一個IO線程,將主庫的binlog日志拷貝到自己本地,寫入一個中繼日志中。接著從庫中有一個SQL線程會從中繼日志讀取binlog,然后執行binlog日志中的內容,也就是在自己本地再次執行一遍SQL,這樣就可以保證自己跟主庫的數據是一樣的。

?

這里有一個非常重要的一點,就是從庫同步主庫數據的過程是串行化的,也就是說主庫上并行的操作,在從庫上會串行執行。所以這就是一個非常重要的點了,由于從庫從主庫拷貝日志以及串行執行SQL的特點,在高并發場景下,從庫的數據一定會比主庫慢一些,是有延時的。所以經常出現,剛寫入主庫的數據可能是讀不到的,要過幾十毫秒,甚至幾百毫秒才能讀取到。

?

而且這里還有另外一個問題,就是如果主庫突然宕機,然后恰好數據還沒同步到從庫,那么有些數據可能在從庫上是沒有的,有些數據可能就丟失了。

?

所以mysql實際上在這一塊有兩個機制,一個是半同步復制,用來解決主庫數據丟失問題;一個是并行復制,用來解決主從同步延時問題。

?

這個所謂半同步復制,semi-sync復制,指的就是主庫寫入binlog日志之后,就會將強制此時立即將數據同步到從庫,從庫將日志寫入自己本地的relay log之后,接著會返回一個ack給主庫,主庫接收到至少一個從庫的ack之后才會認為寫操作完成了。

?

所謂并行復制,指的是從庫開啟多個線程,并行讀取relay log中不同庫的日志,然后并行重放不同庫的日志,這是庫級別的并行。

1)主從復制的原理

2)主從延遲問題產生的原因

3)主從復制的數據丟失問題,以及半同步復制的原理

4)并行復制的原理,多庫并發重放relay日志,緩解主從延遲問題

?

(3)mysql主從同步延時問題(精華)

?

線上確實處理過因為主從同步延時問題,導致的線上的bug,小型的生產事故

?

show status,Seconds_Behind_Master,你可以看到從庫復制主庫的數據落后了幾ms

?

其實這塊東西我們經常會碰到,就比如說用了mysql主從架構之后,可能會發現,剛寫入庫的數據結果沒查到,結果就完蛋了。。。。

?

所以實際上你要考慮好應該在什么場景下來用這個mysql主從同步,建議是一般在讀遠遠多于寫,而且讀的時候一般對數據時效性要求沒那么高的時候,用mysql主從同步

?

所以這個時候,我們可以考慮的一個事情就是,你可以用mysql的并行復制,但是問題是那是庫級別的并行,所以有時候作用不是很大

?

所以這個時候。。通常來說,我們會對于那種寫了之后立馬就要保證可以查到的場景,采用強制讀主庫的方式,這樣就可以保證你肯定的可以讀到數據了吧。其實用一些數據庫中間件是沒問題的。

?

一般來說,如果主從延遲較為嚴重

?

1、分庫,將一個主庫拆分為4個主庫,每個主庫的寫并發就500/s,此時主從延遲可以忽略不計

2、打開mysql支持的并行復制,多個庫并行復制,如果說某個庫的寫入并發就是特別高,單庫寫并發達到了2000/s,并行復制還是沒意義。28法則,很多時候比如說,就是少數的幾個訂單表,寫入了2000/s,其他幾十個表10/s。

3、重寫代碼,寫代碼的同學,要慎重,當時我們其實短期是讓那個同學重寫了一下代碼,插入數據之后,直接就更新,不要查詢

如果確實是存在必須先插入,立馬要求就查詢到,然后立馬就要反過來執行一些操作,對這個查詢設置直連主庫。不推薦這種方法,你這么搞導致讀寫分離的意義就喪失了

轉載于:https://www.cnblogs.com/xiufengchen/p/11259314.html

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

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

相關文章

Angular自學筆記(一)ngModule 元數據

工作硬上開發angular項目,好難啊,上網搜資料教程真的賊少,吐槽真的沒什么人用angular,自己學習到處搜集整理的筆記,分享出來,方便查看理解總結。應該適用于angular11系列(更新真快,反正我也不知道之前低版本不同 手動狗頭) 什么是angular module(ngModule)? angula…

cookbook_數據結構和算法

1.1將數據分解為單獨的變量list_a [1,2,3,4,5,6,7,8,9] a,b,c,d,e,f,g,h,i list_a print(a,b,c,d,e,f,g,h,i) #使用相等數量的參數來接收_,b,c,d,e,f,g,h,_ list_a print(b,c,d,e,f,g,h) #不要的數據使用一個沒有用的變量接收 View Code1.2從任意長度的可迭代對象中分解元素…

Angular自學筆記(二)顯示數據 綁定屬性

顯示數據 1.顯示數據 ng的模版中,默認用雙大括號{{}}綁定組件中的變量顯示出來 import {Component } from @angular/core; @Component({selector: app-root,template: `<h1>{{title}}</h1><h2>My favorite hero is: {{myHero}}</h2>`

機器學習概覽

什么是機器學習&#xff1f; 廣義概念&#xff1a; 機器學習是讓計算機具有學習的能力&#xff0c;無需明確的編程 —— 亞瑟薩繆爾&#xff0c;1959 工程概念&#xff1a; 計算機程序利用經驗 E 學習任務 T&#xff0c;性能是 P&#xff0c;如果針對任務 T 的性能 P 隨著經驗 …

Angular自學筆記(?)TemplateRef和ViewContainerRef

ElementRef 由于ng是跨平臺的為了減少視圖層和渲染層的耦合也為了讓ng更適應多平臺,ng幫我們封裝了ElementRef,我們可以通過ElementRef拿到native元素(在瀏覽器中也就是我們常說的DOM元素) 下面我們看一段代碼 import {Component, ElementRef, AfterViewInit } from @angu…

python之re模塊

re模塊 re&#xff08;正則&#xff09;簡介 ? 正則就是用一些具有特殊含義的符號組合到一起&#xff08;稱為正則表達式&#xff09;來描述字符或者字符串的方法。或者說&#xff1a;正則就是用來描述一類事物的規則。 re元字符 元字符匹配內容\w匹配字母&#xff08;包含中文…

Angular自學筆記(?)ViewChild和ViewChildren

ViewChild 最好在ngAfterViewInit之后,獲取模版上的內容 獲取普通dom import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from @angular/core;@Component({selector: app-view-child

IPropertySet接口

Members AllProperties MethodsDescriptionCountThe number of properties contained in the property set.包含屬性個數GetAllPropertiesThe name and value of all the properties in the property set.GetPropertiesThe values of the specified properties.GetPropertyThe …

Angular自學筆記(?)ContentChild和ContentChildren

ContentChild 用法類似ViewChild, 獲取投影中到組件或指令還有元素dom等 獲取投影中但組件 import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from @angular/core;@Component({selector: app-content-child-panel,templateUrl

Angular自學筆記(?)屬性型指令

基本概念 用于改變DOM元素的外觀或行為的指令 組件是一種特殊的指令 import {Component} from @angular/core; @Component({selector: app-root,template: `<!--<app-for></app-for>--><div app-for>dasfsada</div>`,

SNS編年史

準備起草。轉載于:https://www.cnblogs.com/cmleung/archive/2009/11/26/1611546.html

Angular自學筆記(?)結構型指令

內置指令的展開寫法 ngIf import {Component } from @angular/core; @Component({selector: app-root,template: `<button (click)="show = !show">toggle</button><p *ngIf="show as aa">一段文字 {{ aa }}</p><ng-template…

SQL on and 和 on where 的區別

on and 和 on where 的 區別 在使用 left join 時, on and 和 on where 會有區別&#xff1b;1. on的條件是在連接生成臨時表時使用的條件,以左表為基準 ,不管on中的條件真否,都會返回左表中的記錄  on 后面 and 都是對右表進行篩選 2.where是全部連接完后&#xff0c;對臨時…

:host :host-context ::ng-deep詳解

:host 與 ::ng-deep :host 表示選擇當前的組件。 ::ng-deep 可以忽略中間className的嵌套層級關系。直接找到你要修改的className。 在使用一些第三方的組件的時候&#xff0c;要修改組件的樣式。 這種情況下使用: :host ::ng-deep .className{新的樣式...... } :host {backg…

Java生鮮電商平臺-緩存架構實戰

Java生鮮電商平臺-緩存架構實戰 說明&#xff1a;在Java生鮮電商中&#xff0c;緩存起到了非常重要的作用&#xff0c;目前整個項目中才用的是redis做分布式緩存. 緩存集群 緩存集群存在的問題 1.熱key 緩存集群中的某個key瞬間被數萬甚至十萬的并發請求打爆。 2.大value 某個k…

Java生鮮電商平臺-深入理解微服務SpringCloud各個組件的關聯與架構

Java生鮮電商平臺-深入理解微服務SpringCloud各個組件的關聯與架構 概述 毫無疑問&#xff0c;Spring Cloud是目前微服務架構領域的翹楚&#xff0c;無數的書籍博客都在講解這個技術。不過大多數講解還停留在對Spring Cloud功能使用的層面&#xff0c;其底層的很多原理&#xf…

Angular自學筆記(?)DI提供者

類提供者 類提供者的創建和使用 假設有logger類: import {Injectable } from @angular/core;@Injectable() export class LoggerService {logs: string[] = [

Angular自學筆記(?)生命周期

從實例化組件,渲染組件模板時,各聲明周期就已開始 ngOnChanges 輸入屬性發生變化是觸發,但組件內部改變輸入屬性是不會觸發的 import {Component, Input, OnInit, OnChanges } from @angular/core;@Component({selector: app-life-cycle,templateUrl:

[轉載]httpClient.execute拋Connection to refused異常問題

在4.0之后android采用了嚴格模式&#xff1a;所以在你得activity創建的時候&#xff0c;在super.onCreate(savedInstanceState);后面加上這個 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites(…

Angular自學筆記(?)依賴注入

什么是依賴注入 依賴注入(DI)是一種設計模式, 也有相應的框架,比如InversifyJS Angular 有自己的 DI 框架, DI 框架會在實例化該類時向其提供這個類所聲明的依賴項 帶修飾符的參數 在ts中,一個類的參數如果帶上修飾符,那個參數就變成了類的實例屬性 class Mobile {co…