從一些常見的錯誤聊聊mysql服務端的關鍵配置

来源:https://www.cnblogs.com/Jcloud/archive/2023/08/22/17648501.html
-Advertisement-
Play Games

MySQL服務端配置對使用方來說是不可更改的,需要聯繫DBA進行操作。這些配置操作對我們來說是一個黑盒,但是瞭解核心配置可以幫助我們快速定位資料庫問題原因。 ...


背景

每一年都進行大促前壓測,每一次都需要再次關註到一些基礎資源的使用問題,訂單中心這邊資料庫比較多,最近頻繁報資料庫異常,所以對資料庫一些配置問題也進行了研究,本文給出一些常見的資料庫配置,說明這些配置對我們資料庫使用的影響。目前,MySQL服務端配置對使用方來說是不可更改的,需要聯繫DBA進行操作。這些配置操作對我們來說是一個黑盒,但是瞭解核心配置可以幫助我們快速定位資料庫問題原因。

問題彙總

問題一、too many connections

資料庫服務端配置:max_connections
這個問題我們這邊線上遇到過,對於同一個資料庫,有多個系統都連接了資料庫,導致連接資料庫的機器比較多,在資料庫qps比較大時,創建的連接數比較大,導致連接的總數超過了資料庫服務端連接的限制閾值,從而報了這個錯誤。

舉個慄子:如果max_connections設置為1000,我們這邊有200台機器,每台機器最大連接數為20,在連接比較大時,可能大致連接的總數為200 * 20 = 4000 > 1000,超過資料庫的限制。

下麵讓我們在本地演示一下這種錯誤:

首先查詢當前服務端最大連接數:

如果這個參數太大,不好演示的話,可以通過如下參數,將這個數值改小些

下麵通過客戶端嘗試連接資料庫,可以看到,直接報錯了

對於這種問題有兩種解決辦法:
第一種:聯繫DBA將max_connections設置的大一些,DBA之前反饋max_connections這個參數有自動增長的邏輯;
第二種方法:如果資料庫操作qps並不是很大,可以將每台機器的資料庫連接最大值設置小一些,如果設置了初始化連接大小,要考慮機器數的增長,隨著機器數的增長,連接的總數肯定會遞增的。

問題二、慢日誌長時間執行導致服務不可用

資料庫庫服務端配置:max_execution_time
之前寫了一篇文章聊了一下如何在客戶端配置參數解決慢日誌長時間執行問題,這個在本地驗證是沒有問題的,但是由於我們線上環境使用的是JED,JED的架構多了中間代理層,在客戶端執行KILL QUERY CONNECTION_ID會提示失敗,導致沒法停止慢sql(這個好坑,據說JED後期會優化這個問題)。

既然目前客戶端沒法控制慢sql停止,從官網上看了一下mysql服務端的配置參數,發現有一個參數能夠控制服務端主動超時停止sql,參數變數:max_execution_time,本地環境驗證如下:

首先將sql執行超時時間設置為2s:

然後執行一個sleep函數,讓執行時間達到10s,可以看出來執行直接中斷了,因為超過了2s的最大超時時間:

問題三、服務端連接都斷開了,但是客戶端還用無效連接發送請求

資料庫庫服務端配置:wait_timeout
之前線上用的是mysql,通過mysql驅動包直連資料庫,資料庫服務端預設連接空閑時間是8小時,後來響應公司號召,將傳統的mysql切到了jed(底層也是mysql), jed由於網關層的存在,客戶端是通過mysql驅動包跟網關層進行直連,網關這一層資料庫空閑連接超時時間僅僅10分鐘,當時在客戶端進行空閑連接探活時間超過10分鐘,導致資料庫報錯頻繁。現在已經找不到歷史的資料庫異常日誌了,本地模擬了一下,驗證如下:

先將本地空閑連接超時設置為10s

驗證源碼如下,讓兩條sql執行時間超過10s,可以發現第二次執行sql時執行報錯了

所以,如果換了數據源,需要確認下服務端的空閑連接超時時間設置,免得配置的值和客戶端檢測空閑連接健康性檢測間隔不匹配,出現意料不到的結果。

註:我們這邊使用的是DBCP數據源連接池,配置如下:

<bean id="abstractParallelProductWriteDataSource" class="org.apache.commons.dbcp.BasicDataSource" abstract="true" destroy-method="close" init-method="createDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="username" value="${db.online.write.username}" />
        <property name="password" value="${db.online.write.password}" />
        <property name="initialSize" value="3" />
        <property name="minIdle" value="3" /><!--最小鏈接數 -->
        <property name="maxIdle" value="3" /><!--最大鏈接數 -->
        <property name="maxActive" value="8" /><!--最大活躍鏈接數 -->
        <property name="maxWait" value="200" />
        <property name="validationQuery" value="select 1" />
        <property name="testOnBorrow" value="false" />
        <property name="removeAbandonedTimeout" value="10" />
        <property name="removeAbandoned" value="true" />
        <!-- 池中的連接空閑10分鐘後被回收,預設值就是30分鐘 -->
        <property name="minEvictableIdleTimeMillis" value="600000" />
        <!-- 每5分鐘運行一次空閑連接回收器 -->
        <property name="timeBetweenEvictionRunsMillis" value="300000" />
        <!--指明連接是否被空閑連接回收器(如果有)進行檢驗.如果檢測失敗,則連接將被從池中去除 -->
        <property name="testWhileIdle" value="true"/>
        <!--在每次空閑連接回收器線程(如果有)運行時檢查的連接數量,預設值是3 -->
        <property name="numTestsPerEvictionRun" value="5"/>
    </bean>


timeBetweenEvictionRunsMillis這個參數配置的是檢測空閑連接的間隔時間,如果服務端空閑連接10分鐘就斷開了,這個時間需要小於10分鐘。minEvictableIdleTimeMillis這個時間是判斷當前連接已經空閑了多久了,目前配置的是10分鐘。

其他關鍵配置彙總

  1. thread_handling
    配置了服務端的線程處理模型,主要的值有no-threads、one-thread-per-connection、loaded-dynamically。其中no-threads表示同一時刻只能有一個連接被一個線程處理。one-thread-per-connection表示對於每一個連接請求都有一個線程來處理。loaded-dynamically是mysql的線程池模式,目前預設的是one-thread-per-connection,所以連接太多的話,也會導致創建的線程快速增加,消耗系統的資源。

  2. slow_query_log
    用來控制是否列印慢日誌,如果需要分析系統性能情況,可以打開這個開關,進行慢日誌分析。

  3. profiling
    是否啟用sql查詢性能分析,類似於debug日誌,線上環境需要關閉,比較耗性能,這個參數後面mysql版本會廢棄掉,現在還是可以先使用著,新的使用方式可以參考:https://dev.mysql.com/doc/refman/8.0/en/performance-schema-query-profiling.html。

由於這個參數線上是關閉著,只能讓DBA臨時幫忙查詢下分析結果,平常也沒咋用,感覺還是一個不錯的工具,分析結果類似下麵截圖:

總結

mysql服務端配置太多,目前工作中主要接觸了上述這些配置,感覺還不錯的,在平常分析資料庫問題上能夠給予一定的幫助,大家也可以去多瞭解一下,更多的配置可以參考官方文檔:mysql服務端配置官網

作者:京東零售 薑昌偉

來源:京東雲開發者社區 轉載請註明來源


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

-Advertisement-
Play Games
更多相關文章
  • 先決條件 Visual Studio 2019 v16.9 預覽版1或更高版本(通過WSL可選組件進行.NET調試)。若要檢查 WSL 組件,請選擇 “工具” > “獲取工具和功能” 。 在 Visual Studio 安裝程式中,選擇 “單個組件”,然後鍵入 “WSL” 搜索安裝組件 。 安裝WS ...
  • ## 中台框架後端項目 Admin.Core 的介紹與配置說明 > 中台admin是前後端分離許可權管理系統,Admin.Core為後端項目,基於.NET 7.0開發。 > 支持多租戶、數據許可權、動態 Api、任務調度、OSS 文件上傳、滑塊拼圖驗證、多資料庫,分散式緩存、分散式事務等 - 介面文檔一 ...
  • [toc] # 模擬Linux文件管理員系統-shell實現 **註:此腳本僅供學習使用,具體需要根據實際情況進行測試調整。** ## 1 系統要求 ![](https://img2023.cnblogs.com/blog/3262925/202308/3262925-202308211934402 ...
  • 1、LDAP介紹 LDAP是一個基於X.500標準的輕量目錄訪問協議,與X.500不同,LDAP協議支持TCP/IP連接。全稱為Lightweight Directory Access Protocol(輕量目錄訪問協議),是用戶、設備和客戶端與目錄伺服器通信的標準協議。LDAP協議幫助用戶對IT資 ...
  • Shell編程是一種在命令行環境中編寫程式的技術,常用於Linux和Unix系統。它主要使用Shell腳本語言來編寫程式。Shell編程常用於系統管理、自動化任務、批處理等領域。 常用的Shell腳本語言包括Bash、Csh、Tcsh和Zsh等。Bash是最常用的Shell編程語言,它是大多數Li... ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230821150719320-729006736.png) # 1. 創建數據表 ## 1.1. sql ```sql CREATE TABLE person (person ...
  • 當使用了多個資料庫來提供服務時,最為關鍵的點是如何讓每一個資料庫比較均勻的承擔壓力,而不至於其中的某些資料庫壓力過大,某些資料庫沒什麼壓力。這其中的關鍵點之一就是拆分鍵的設計 ...
  • 近日,第14屆中國資料庫技術大會(DTCC2023)在北京國際會議中心順利舉行。大會以“數智賦能 共築未來”為主題,邀請了上百位行業專家,一起探討新時代下各類型資料庫的最新動態和應用實踐,帶來一場資料庫領域的年度盛宴。在上午的主會場,華為雲資料庫服務產品部總經理蘇光牛圍繞“打造最可信資料庫,華為雲G ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...