舉個慄子看如何做MySQL 內核深度優化

来源:https://www.cnblogs.com/qcloud1001/archive/2018/12/25/10173013.html
-Advertisement-
Play Games

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


本文由雲+社區發表

作者介紹:簡懷兵,騰訊雲資料庫高級工程師,負責騰訊雲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/服務發現和自動擴容等功能、在數據安全/故障切換和快速恢復方面也進行了多處優化。

此文已由作者授權騰訊雲+社區發佈



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

-Advertisement-
Play Games
更多相關文章
  • 本文由雲+社區發表 CynosDB for PostgreSQL是騰訊雲自研的一款雲原生資料庫,其主要核心思想來自於亞馬遜的雲資料庫服務Aurora。這種核心思想就是“基於日誌的存儲”和“存儲計算分離”。同時,CynosDB在架構和工程實現上確實有很多和Aurora不一樣的地方。 下圖為CynosD ...
  • 原文:https://mp.weixin.qq.com/s/-BlLvBKcF-yalELY7XkqaQ 前言 在之前的面試過程中,問到執行計劃,有很多童鞋不知道是什麼?甚至將執行計劃與執行時間認為是同一個概念。今天我們就一起來瞭解一下執行計划到底是什麼?有什麼用途? 執行計劃是什麼? 執行計劃,簡 ...
  • [20181225]12CR2 SQL Plan Directives.txt--//12C引入SQL PLAN Directives.12cR1版本會造成大量的動態取樣,影響性能.許多人把OPTIMIZER_ADAPTIVE_FEATURES設置為false.--//這也是為什麼我不主張將XX.1 ...
  • 前一段時間,由於項目需要將資料庫從SQLServer遷移到MySQL,在網上百度了很久,基本都是通過SQLyog實現的。其實使用平時常用的資料庫管理軟體Navicat Premium也能做到,並且操作簡便。 接下來我介紹一下具體的操作流程 1、首先安裝MySQL和Navicat Premium資料庫 ...
  • 索引的類型 PRIMARY KEY(主鍵索引): 用來標識唯一性,數據不可重覆 ,主鍵列不能為NULL,並且每個表中有且只能有一個主鍵,還可以創建複合主鍵,即多個欄位組合起來。 創建語句為: UNIQUE(唯一性索引):用來限制不受主鍵約束的列上的數據唯一性,一張表種可創建多個唯一性索引。 創建語句 ...
  • 2018/12/24 14:00:57 zabbix監控運行一段時間以後,會留下大量的歷史監控數據,zabbix資料庫一直在增大;可能會造成系統性能下降,查看歷史數據室查詢速度緩慢。 zabbix裡面最大的表就是history和history_uint兩個表,而且zabbix裡面的時間是使用的時間戳 ...
  • 在安裝資料庫軟體時出現以下情況: 解決方法一: 查看 less /uu/oraInventory/ContentsXML/inventory.xml文件,文件內容如下: <?xml version="1.0" standalone="yes" ?><!-- Copyright (c) 1999, 2 ...
  • 一.概述 Redis集群提供了分散式資料庫方案,集群通過分片來進行數據共用,並提供複製和故障轉移功能。在大數據量方面的高可用方案,cluster集群比Sentinel有優勢。但Redis集群並不支持處理多個keys的命令,因為這需要在不同的節點間移動數據,而達不到像Redis那樣的性能,在高負載的情 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...