老闆今天問我為什麼公司的資料庫這麼爛,我是這樣回答的......

来源:https://www.cnblogs.com/qcloud1001/archive/2018/09/14/9648178.html
-Advertisement-
Play Games

歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "騰訊雲資料庫團隊 " 發表於 "雲+社區專欄" 作者介紹:簡懷兵,騰訊雲資料庫高級工程師,負責騰訊雲CDB內核及基礎設施建設;先後供職於Thomson Reuters和YY等公司,PTimeDB作者,曾獲一項發明專利;從事 ...


歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~

本文由騰訊雲資料庫團隊發表於雲+社區專欄

作者介紹:簡懷兵,騰訊雲資料庫高級工程師,負責騰訊雲CDB內核及基礎設施建設;先後供職於Thomson Reuters和YY等公司,PTimeDB作者,曾獲一項發明專利;從事MySQL內核開發工作8年,具有豐富的優化經驗;在分散式存儲等領域有較豐富經驗。

MYSQL資料庫適用場景廣泛,相較於Oracle、DB2性價比更高,Web網站、日誌系統、數據倉庫等場景都有MYSQL用武之地,但是也存在對於事務性支持不太好(MySQL 5.5版本開始預設引擎才是InnoDB事務型)、存在多個分支、讀寫效率瓶頸等問題。

所以如何用好MYSQL變得至關重要,一方面需要通過MYSQL優化找出系統讀寫瓶頸,提高資料庫性能;另一方面需要合理涉及數據結構、調整參數,以提高用戶操作響應;同時還有儘可能節省系統資源,以便系統可以提供更大負荷的服務。本文將為大家介紹騰訊雲團隊是如何對Mysql進行內核級優化的思路和經驗。

早期的CDB主要基於開源的Oracle MySQL分支,側重於優化運維和運營的OSS系統。在騰訊雲,因為用戶數的不斷增加,對CDB for MySQL提出越來越高的要求,騰訊雲CDB團隊針對用戶的需求和業界發展的技術趨勢,對CDB for MySQL分支進行深度的定製優化。優化重點圍繞內核性能、內核功能和外圍OSS系統三個維度展開,具體的做法如下:

一.內核性能的優化

由於騰訊雲上的DB基本都需要跨園區災備的特性,因此CDB for MySQL的優化主要針對主從DB部署在跨園區網路拓撲的前提下,重點去解決真實部署環境下的性能難題。經過分析和調研,我們將優化的思路歸納為:“消除冗餘I/O、縮短I/O路徑和避免大鎖競爭”。以下是內核性能的部分案例:

1.主備DB間的複製優化

img

問題分析

如上圖所示,在原生MySQL的複製架構中,Master側通過Dump線程不斷發送Binlog事件給Slave的I/O線程,Slave的I/O線程在接受到Binlog事件後,有兩個主要的動作:

  • 寫入到Relay Log中,這個過程會和Slave SQL線程爭搶保護Relay Log的鎖。
  • 更新複製元數據(包含Master的位置等信息)。

優化方法

經過分析,我們的優化策略是:

  • Slave I/O線程和Slave SQL線程是典型的單寫單讀生產者-消費者模型,是可以做到無鎖設計的;因此實現思路就是Slave I/O線程在每次寫完數據後,原子更新Relay Log的長度信息,Slave SQL線程讀取Relay Log的時以長度信息為邊界。這樣就將原本競爭激烈的Relay Log鎖化解為無鎖;
  • 由於Binlog事件中的GTID(Global Transaction Identifier)和DB事務是一一對應的關係,所以Relay Log中的數據本身已經包含了所需要的複製元數據,所以我們可以不寫Master info文件,消除了冗餘的文件I/O;
  • 於DB都是以事務為更新粒度的,因為在Relay Log文件I/O上,我們通過合併離散小I/O為事務粒度的大I/O等手段,使磁碟I/O得以大幅提升。

優化效果

img

如上圖所示,經過優化:左圖35.79%的鎖競爭(futex)已經被完全消除;同壓測壓力下,56.15%的文件I/O開銷被優化到19.16%,Slave I/O線程被優化為預期的I/O密集型線程。

2.主庫事務線程和Dump線程間的優化

img

問題分析

如上圖所示,在原生MySQL中多個事務提交線程TrxN和多個Dump線程之間會同時競爭Binlog文件資源的保護鎖,多個事務提交線程對Binlog執行寫入,多個Dump線程從Binlog文件讀取數據併發送給Slave。所有的線程之間是串列執行的!

優化方法

經過分析,我們的優化策略是:

  • 將讀寫分離開來,多個寫入的線程還是在鎖保護下串列執行,每一個寫入線程寫入完成後更新當前Binlog的長度信息,多個Dump線程以Binlog文件的長度信息為讀取邊界,多個Dump線程之間並行執行。以這種方式來讓複製拓撲中的Dump線程發送得更快!

效果

img

經過測試,優化後的內核,不僅提升了事務提交線程的性能,在Dump線程較多的情況下,對主從複製性能有較大提升。

二.主備庫交互流程優化

img

問題分析

如上圖所示,在原生MySQL中主備庫之間的數據發送和ACK回應是簡單的串列執行,在上一個事件ACK回應到達之前,不允許繼續發送下一個事件;這個行為在跨園區(RTT 2-3ms)的情況性能非常差,而且也不能很好地利用帶寬優勢。

優化方法

經過分析,我們的優化策略是:

  • 將發送和ACK回應的接收獨立到不同的線程中,由於發送和接收都是基於TCP流的傳輸,所以時序性是有保障的;這樣發送線程可以在未收ACK之前繼續發送,接受線程收到ACK後喚醒等待的線程執行相應的任務。

效果

根據實際用例測試,優化後的TPS提升為15%左右。

三.內核功能的優化

1. 預留運維帳號連接數配額

在騰訊雲上,不時遇到用戶APP異常或者BUG從而占滿DB的最大連接限制,這是CDB OSS帳號無法登錄以進行緊急的運維操作。針對這個現狀,我們在MySQL內核單獨開闢了一個可配置的連接數配額,即便在上述場景下,運維帳號仍然可以連接到DB進行緊急的運維操作。極大地降低了異常情況下DB無政府狀態的風險。該帳號僅有資料庫運維管理許可權,無法獲取用戶數據,也保證了用戶數據的安全性。

2. 主備強同步

針對一些應用對數據的一致性要求非常高,CDB在MySQL原生半同步的基礎上進行了深度優化,確保一個事務在主庫上提交之前一定已經複製到至少一個備庫上。確保主庫宕機時數據的一致性。

四.外圍系統的優化

除了以上提到的MySQL內核側的部分優化,我們也在外圍OSS平臺進行了多處優化。例如使用非同步MySQL ping協議實現大量實例的監控、通過分散式技術來加固原有系統的HA/服務發現和自動擴容等功能、在數據安全/故障切換和快速恢復方面也進行了多處優化。

相關推薦

騰訊雲資料庫CDB for MySQL產品相關文檔

MySQL資料庫設計總結

MySQL資料庫的高可用性分析

問答
如何記錄PostgreSQL查詢?
相關閱讀
PostgreSQL新手入門
PostgreSQL配置優化
PostgreSQL主備環境搭建
【每日課程推薦】機器學習實戰!快速入門線上廣告業務及CTR相應知識

此文已由作者授權騰訊雲+社區發佈,更多原文請點擊

搜索關註公眾號「雲加社區」,第一時間獲取技術乾貨,關註後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用場景: 有時候線上伺服器掛了,或者一些數據推送不正常,一般來說我們需要做的就是將項目重啟運行,或者檢查核對出問題的位置,來快速解決,很多時候我們不得不登上伺服器來查看,這個對於目前工作日益繁忙的我們是一個不小的工作量,所以在此分享大家在linux中做定時任務 環境:在linux或者mac os系 ...
  • 使用場景:前段時間交易所項目需要在伺服器上用到 根據websocket推送價格數據,在交易所內進行下單撤單處理,但是由於有多個交易對,在伺服器上部署時候,略顯繁瑣。(撮合引擎同樣有此問題,可以一併解決) 1:shell使用:在git項目後,這裡每個交易對單獨配一個文件,負責各自的交易處理,此處做項目 ...
  • 接著上文 "IO多路復用(一) Select、Poll、Epoll" ,接下來將演示一個TCP回射程式,源代碼來自於該博文https://www.cnblogs.com/Anker/p/3258674.html 博主的幾篇相關的文章,在這裡將其進行了整合,突出select、poll和epoll不同方 ...
  • Unix標準的複製進程的系統調用時fork(即分叉),但是Linux,BSD等操作系統並不止實現這一個,確切的說linux實現了三個,fork,vfork,clone(確切說vfork創造出來的是輕量級進程,也叫線程,是共用資源的進程) 系統調用 | 描述 | fork | fork創造的子進程是父 ...
  • phpmyadmin 下載、安裝、配置 2017年05月05日 15:52:39 wodecc_u 閱讀數:14363 標簽: phpmyadmin 更多 個人分類: 環境配置 phpmyadmin 下載、安裝、配置 phpmyadmin 下載、安裝、配置 2017年05月05日 15:52:39 ...
  • explain為mysql提供語句的執行計劃信息。可以應用在select、delete、insert、update和place語句上。explain的執行計劃,只是作為語句執行過程的一個參考,實際執行的過程不一定和計劃完全一致,但是執行計劃中透露出的訊息卻可以幫助選擇更好的索引和寫出更優化的查詢語句... ...
  • 1. 查詢某存儲過程的訪問情況 SELECT TOP 1000 db_name(d.database_id) as DBName, s.name as 存儲名字, s.type_desc as 存儲類型, d.cached_time as SP添加到緩存的時間, d.last_execution_t ...
  • [20180914]oracle 12c 表 full_hash_value如何計算.txt--//昨天在12c下看表full_hash_value與11g的full_hash_value不同,不過12c使用pdb,猜測跟PDB有關.--//通過測試說明問題.1.環境:SCOTT@book> @ & ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...