1. 程式人生 > >資料庫連線配置策略和實踐

資料庫連線配置策略和實踐

一 前言

應用執行SQL請求完成的過程中,資料庫連線佔很重要一部分。尤其是涉及到流量瞬間暴漲,需要建立大量連線,或者網路異常導致重連時,從業務端來看,sql執行緩慢的問題,此時sql執行並非真的慢。 本文是基於我們自己的生產環境的Durid最佳實踐,僅供各位參考,當然不同公司的鏈路/業務壓力可能不一樣。具體到個別引數需要區別對待。

二 具體實踐

從整體系統的角度,我們要考慮幾個點 ,資料庫連線數配置多少合適,針對空閒連線,網路異常的超時時間,如何高效複用連線,druid 版本選擇這幾個方面來介紹。

2.1 如何設定連線池大小

合適的連線池大小和業務請求的 QPS 和 單個請求的 RT(單位為毫秒)。
基本公式:

連線數 = QPS /(1000/RT) + N = QPS * RT /1000 + N

注意: 此處 QPS 和 RT 為單個應用端統計。假定隨連線數量增加,客戶端能處理的請求數線性增加。

舉個例子

比如 一個請求的耗時rt=2ms,每個連線能處理的請求數量 

S = 1000/2 =500 ,

業務層總請求量是 M=5000 ,那麼合理的連線數為 

M/S=5000/500=10 

為了避免連線數被佔滿,我們會在上面的連線數的基礎上再加上N ,最終的連線數為10+N .

統計平時的最大 QPS 和此時的 RT,以此計算 minIdle,並設定 initialSize = minIdle。

統計峰值時的 QPS 和此時的 RT,以此計算 maxActive。

可以通過以下方法,通過 jmx 觀察 Druid 實際的連線池狀況,重點關注 ActiveCount:活動連線數,PoolingCount:池子中的連線數。並根據實際情況考慮調整。

java -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xverify:none -client -jar /PATH/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:7777 'com.alibaba.druid:type=DruidDataSourceStat' DataSourceList |& grep -E 'ActiveCount|PoolingCount'

2.2 如何設定超時時間

連線池中的超時時間主要有:

connectTimeout 建立 TCP 連線的超時時間

maxWait 從連線池獲取連線的最長等待時間

socketTimeout 傳送請求後等待響應的超時時間

其中,
connectTimeout 建議不要小於 1200ms。TCP 在建立連線時,SYN 包的超時重傳時間為 1s。connectTimeout 設定過短,很可能造成應用釋出時,初始化連線池過程中由於網路抖動,或中間網路裝置需要初始化狀態發生丟包觸發超時,從而造成連線池初始化失敗而導致釋出失敗。

socketTimeout 可以根據應用最長的查詢返回時間設定。過長會造成生網路問題,或資料庫服務有問題時雪崩;過短也會造成頻繁請求超時。不要短於 300ms。TCP 的最小 RTO 為 200ms,並根據延遲動態調整。過短的超時時間會造成單個丟包就造成請求超時。生產環境資料庫都配置有 SQL Killer,會自動殺死執行時間過長的請求。因此,設定過長的 socketTimeout 也是沒有意義的。

maxWait 可以根據應用期待的等待時間設定。為避免在發生網路問題,或資料庫服務有問題時雪崩,這個時間設定不要過大。下面的預設值 800ms 是個保守的設定。應用可以設定一個更短的時間,如 300ms。過短的時間也會造成在連線池中連線數不足,需要新建連線時造成大量超時。建議不要低於 100ms。

2.3 如何設定連線保持時間

設定連線保持活躍的時間需要考慮是直連還是通過資料庫中介軟體proxy連線。一般現在的生產環境大多為:

App -> LVS -> Proxy -> DB

其中應用到 RDS 的訪問路徑為 App -> LVS -> Proxy 。

其中,LVS 空閒連線保留時間為 90s。Proxy 為了避免訪問到已被關閉的連線,自身的空閒連線保留時間為 [70, 85) s。因此,應用程式為了避免從連線池獲取到已被關閉的連線,應當設定自身保留空閒連線時間不能超過70s。開啟KeepAlive之後的效果

初始化連線池時會填充到minIdle數量。

連線池中的minIdle數量以內的連線,空閒時間超過

minEvictableIdleTimeMillis,則會執行keepAlive操作。

當網路斷開等原因產生的由ExceptionSorter檢測出來的死連線被清除後,自動補充連線到minIdle數量。

timeBetweenEvictionRunsMillis=10000, 

minEvictableIdleTimeMillis=44000, 

maxEvictableIdleTimeMillis=55000。

2.4 必選配置項

以下預設配置可以根據實際情況調整。

<bean id="cartDataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <property name="url" value="${cluster.jdbc.url}"/>
        <property name="username" value="${cluster.jdbc.username}"/>
        <property name="password" value="${cluster.jdbc.password}"/>
        <property name="connectionInitSqls" value="set names utf8mb4"/>
        <!-- 連線池初始連線數 -->
        <property name="initialSize" value="5" />
        <!-- 允許的最大同時使用中(在被業務執行緒持有,還沒有歸還給druid) 的連線數 -->
        <property name="maxActive" value="20" />
        <!-- 允許的最小空閒連線數,空閒連線超時踢除過程會最少保留的連線數 -->
        <property name="minIdle" value="5" />
        <!-- 從連線池獲取連線的最大等待時間 800毫秒;業務方根據可以自行調整-->
        <property name="maxWait" value="800" />
        <!-- 一條物理連線的最大存活時間 120分鐘-->
        <property name="phyTimeoutMillis" value="7200000"/>
        <!-- 強行關閉從連線池獲取而長時間未歸還給druid的連線(認為異常連線)-->
        <property name="removeAbandoned" value="true"/>
        <!-- 異常連線判斷條件,超過180 秒 則認為是異常的,需要強行關閉 -->
        <property name="removeAbandonedTimeout" value="180"/>
        <!-- 從連線池獲取到連線後,如果超過被空閒剔除週期,是否做一次連線有效性檢查 -->
        <property name="testWhileIdle" value="true"/>
        <!-- 從連線池獲取連線後,是否馬上執行一次檢查 -->
        <property name="testOnBorrow" value="false"/>
        <!-- 歸還連線到連線池時是否馬上做一次檢查 -->
        <property name="testOnReturn" value="false"/>
        <!-- 連線有效性檢查的SQL -->
        <property name="validationQuery" value="SELECT 1"/>
        <!-- 連線有效性檢查的超時時間 1 秒 -->
        <property name="validationQueryTimeout" value="1"/>
        <!-- 週期性剔除長時間呆在池子裡未被使用的空閒連線, 10秒一次-->
        <property name="timeBetweenEvictionRunsMillis" value="10000"/>
        <!-- 空閒多久可以認為是空閒太長而需要剔除 44 秒-->
        <property name="minEvictableIdleTimeMillis" value="44000"/>
        <!-- 如果空閒時間太長即使連線池所剩連線 < minIdle 也會被剔除 55 秒 -->
        <property name="maxEvictableIdleTimeMillis" value="55000"/>
        <!-- 是否設定自動提交,相當於每個語句一個事務 -->
        <property name="defaultAutoCommit" value="true"/>
        <!-- 記錄被判定為異常的連線 -->
        <property name="logAbandoned" value="true"/>
        <!-- 網路讀取超時,網路連線超時
             socketTimeout : 對於線上業務小於5s,對於BI等執行時間較長的業務的SQL,需要設定大一點
        -->
        <property name="connectionProperties" value="socketTimeout=3000;connectTimeout=1200"/>
        <property name="proxyFilters">
            <list>
                <ref bean="log-filter"/>
            </list>
        </property>
</bean>

1.0.28版本之後,新加入keepAlive配置,預設關閉。使用keepAlive功能,建議使用1.1.16或者更高版本。一般業務無需開啟,除非分鐘請求量在個位數或者啟動時間超長導致初始連線都過期。

2.5 druid版本

建議使用最新版本,不要使用太老的版本,以免遇到 bug。

e.g. Maven 配置:

  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.27</version>
  </dependency>

三 小結

本文算是 的一個補充,希望對需要關注資料庫連線配置的朋友有所幫助。


本公眾號長期關注於資料庫技術以及效能優化,故障案例分析,資料庫運維技術知識分享,個人成長和自我管理等主題,歡迎掃碼關注。

相關推薦

資料庫連線配置策略實踐

一 前言 應用執行SQL請求完成的過程中,資料庫連線佔很重要一部分。尤其是涉及到流量瞬間暴漲,需要建立大量連線,或者網路異常導致重連時,從業務端來看,sql執行緩慢的問題,此時sql執行並非真的慢。 本文是基於我們自己的生產環境的Durid最佳實踐,僅供各位參考,當然不同公司的鏈路/業務壓力可能不一樣。具體到

Django框架(二)—— 基本配置:app註冊、模板配置、靜態檔案配置資料庫連線配置postget

app註冊、模板配置、靜態檔案配置、資料庫連線配置post和get 一、app 在Django中,APP可以用以下類比 大學 --------------------專案 計算機學院------------app01 土木學院 ------------ app02 1、app建立 方

JFinal配置資料庫連線池外掛表類對映

配置資料庫連線池外掛,此處以Druid為例,還需要配置資料庫訪問外掛,即ActiveRecord外掛,用於建立資料庫中Table和Java Bean的mapping對映: public void configPlugin(Plugins me) { // 配置 druid

Kettle學習筆記003之資料庫連線配置

1.  Kettle的資料庫連線方式常用的是jdbc連線方式 2. 資料庫連線配置:      在任務設計器Spoon的主物件樹的DB連線選項進行配置 3. 共享資料庫連線      a. 新建的資料庫連線只能在當

事務與資料庫連線池DBCPC3P0與工具類DBUtils

文章目錄 事務 使用命令列方式演示事務。 使用程式碼方式演示事務 事務的特性 事務的安全隱患 讀未提交 演示 讀已提交演示 可序列化

Java學習路程之資料庫連線, common-dbutils資料來源

一.資料庫連線 1.封裝資料庫連線 public class Day28{ public static void main(String[] args) throws SQLException { //查詢sort全表並且將查詢出來的每條資料封裝成一個物件

資料庫連線池理解對比

資料庫連線池的實現及原理:https://www.cnblogs.com/wym789/p/6374440.html 使用jdbc-pool替代dbcp、c3p0等連線池的原因: https://blog.csdn.net/u011267070/article/details/5218593

Django——模型基礎ORM 資料庫連線配置 模型的建立與對映 資料的增刪改查

Django Django的ORM簡介 資料庫連線配置 模型的建立與對映 資料庫的增刪改查 增資料 查資料及補充 改資料 刪資料     Django的ORM系統分析 ORM概念:物件關係對映(Obje

專案要求給資料庫連線配置檔案(jdbc.properties)中賬號密碼優化處理

由於專案釋出伺服器是打包成war包釋出,其中jdbc.properties等配置檔案存在資料庫密碼洩露問題,查閱資料後get一個小方法避免面洩露問題,特此記錄一波 我們專案中經常使用到的資料庫配置檔案(spring-mybatis.xml)如下

spring整合Mybatis oracle資料庫連線配置(dbcp)

Spring + struts + MyBatis 結合編碼demo 一.首先匯入相應的 Spring + struts + MyBatis jar包  1.Spring + MyBatis :如下操作順序 1.1:首先建立資料庫連線:(oracle) <bean

資料庫連線配置與maven依賴安裝

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

資料庫切分(3)之資料庫切分實施策略示例演示

1.準備階段 對資料庫進行分庫分表(Sharding化)前,需要開發人員充分了解系統業務邏輯和資料庫schema.一個好的建議是繪製一張資料庫ER圖或領域模型圖,以這類圖為基礎劃分shard,直觀易行,可以確保開發人員始終保持清醒思路。對於是選擇資料庫ER圖還是領域模型圖要根據專案自身情況進行選擇。如果專案使

IDEA Spring Boot 資料庫連線配置_備註

idea版本及jdk環境: 首先是必須引入的: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

SAE web.py-MySQL資料庫連線配置

使用web.py的話可以這樣子 import sae db = web.database(dbn='mysql', port=int(sae.const.MYSQL_PORT), host=sae.const.MYSQL_HOST, db=sae.const.MYSQL

JavaWeb-Maven Profile切換資料庫連線配置

切換資料庫連線配置 編寫不同環境的配置檔案1.在pinyougou-dao工程中src/main/resources下建立filter資料夾 2.在filter資料夾下建立db_dev.propert

【CAS】自定義資料庫連線配置

      在上一篇部落格中,對CAS進行了整體的介紹,我們知道,CAS可分為Server和Client。本篇部落格開始介紹對CAS  Sever進行的一些自定義配置。 【版本說明】:CAS Server 4.0 【下載地址】:https://github.com/aper

NHibernate學習之二——.cfg.xml配置大全(資料庫連線配置

一、sql2000/2005.cfg.xml <?xml version="1.0" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <session

圖解asp.net資料庫連線字串加密aspnet_regiis

一 使用aspnet_regiis加密資料庫連線字串 專案在C:\sl2\28\ShoppingCart\ 加密前; 此次加密使用的命令; 加密後;資料庫名,使用者名稱,口令,都看不到了; 程式碼中照常讀取,.net會自行解密,不必自己寫程式碼解密; 二 a

activiti 資料庫連線配置

1.1.1. 前言 當我們程式配置了DataSource,activiti 工作流引擎是如何開啟資料庫連線呢?有沒有其他的方式配置資料庫連線呢? 這一個章節主要講解activiti 工作流引擎資

mysql筆記八——開源資料庫連線池DBCPC3P0的使用

DBCP資料庫連線池 DBCP 是 Apache 軟體基金組織下的開源連線池實現,使用DBCP資料來源,應用程式應在系統中增加如下兩個 jar 檔案: Commons-dbcp.jar:連線池的實現 Commons-pool.jar:連線池實現的依賴庫 T