1. 程式人生 > >做好資料庫運維,資源管理技術必須要掌握

做好資料庫運維,資源管理技術必須要掌握

摘要:通過引入資源監控和控制等手段,實現資源在可控的情況下被合理利用的目的,避免出現資源的無序使用,防止資料庫系統性能變慢、停止響應。

1 資源管理是什麼?

1.1 資源管理簡介

通過引入資源監控和控制等手段,實現資源在可控的情況下被合理利用的目的,避免出現資源的無序使用,防止資料庫系統性能變慢、停止響應。資源管理可以實現以下功能:

  1. 通過建立和管理佇列,實現佇列級別資源(CPU、記憶體、儲存空間)隔離和作業的異常處理;
  2. 通過設定CN和佇列的併發上限,限制允許執行的併發數,超出併發數後作業排隊等待喚醒,防止併發過多導致效能下降;
  3. 通過優先順序控制實現資源的有效排程,實現高優先順序作業優先執行;
  4. 支援多維度資源監控檢視,可以監控作業、使用者和例項的資源消耗。

1.2 資源管理功能

資源管理主要包含併發控制、資源管控、資源監控以及異常作業處理。併發控制主要分為全域性併發控制和資源池併發控制,其中資源池併發管控由快慢車道實現,快車道管控簡單作業,慢車道管控複雜作業,支援自動識別和手動切換快慢車道,理論上快車道併發大、作業執行時間短、佔用資源少;慢車道併發少、作業執行時間長,佔用資源多。

資源管控通過對計算資源和儲存資源分別管控實現作業間資源隔離,保證單作業異常不會影響到其他作業執行。下面分別對計算資源和儲存資源管控進行概述:

(1)計算資源

計算資源包含:CPU、IO和記憶體。GaussDB中CPU和記憶體資源關聯在佇列上,使用者通過關聯佇列使用計算資源。佇列按使用場景分為超戶佇列、預設佇列和使用者佇列。其中超戶佇列不受資源管控,用於運維和故障修復;預設佇列(default_pool)為資料庫初始化階段建立的佇列,未關聯使用者佇列的使用者使用預設佇列;使用者佇列為使用者自己建立的佇列,按照使用者配置的併發和資源進行管控。IO管控基於邏輯IO實現,根據作業執行時間及優先順序對IO進行管控,配置異常處理規則後,在系統IO達到瓶頸後,主動降低作業IO優先順序。

(2)儲存資源

儲存資源管控包含以下幾個方面:

  • 資料庫只讀檢測

資料庫只讀檢測主要為防止出現磁碟滿的問題,實現邏輯如下:cm_server開啟enable_transaction_read_only情況下,每十分鐘檢查一次磁碟空間佔用率,當 磁碟空間佔用率超過閾值(預設90%)時,就通過guc引數設定資料庫只讀,資料庫只讀後只允許只讀作業執行,作業發生寫盤操作報錯退出。但是因為資料庫只讀會導致使用者所有業務無法執行,因此在磁碟空間佔用率達到80%時會提前告警提示使用者。

  • 使用者/schema空間管控

儲存資源包含:持久表空間、臨時表空間和運算元落盤空間。臨時表空間和運算元落盤空間是作業執行過程中佔用的空間,屬於臨時佔用空間。持久表空間和臨時佔 用空間採用兩種不同的管控策略,持久表空間管控通過對使用者(佇列)和schema空間限制實現,8.1.1版本之後的GaussDB空間管控均為單例項空間,防止出現數據傾斜導致的磁碟使用問題。臨時佔用空間同樣支援在使用者層級設定空間限額,另外還提供異常規則查殺臨時空間佔用異常的作業。

  • 異常處理規則

GaussDB目前支援運算元落盤異常規則,使用者通過管控面或gs_cgroup工具設定運算元落盤異常規則,設定異常規則後作業執行過程中運算元落盤空間達到閾值後報錯退出。

1.3 資源管理框架

使用者連線資料庫執行SQL後,SQL會經過全域性併發佇列管控以及資源池佇列管控。在作業進入管控邏輯前設定定時器,作業pending超時報錯退出,作業經過佇列管控開始執行前重新設定定時器,作業執行超時報錯退出。作業下推DN執行時實時監控作業消耗的資源並上報CN,CN根據DN上報資源資訊提供異常處理和監控檢視。

下面對併發、記憶體和CPU管控配置方式進行簡要說明:

(1)全域性併發佇列

全域性併發佇列採用GUC引數max_active_statements控制單個CN上執行併發執行的作業數量。採用全域性併發佇列機制將控制所有普通使用者的執行作業,不區分複雜度,即執行語句都將作為一個執行單元,當併發執行的作業數量達到此引數閾值時,將進入佇列等待。對於初始使用者(Oid=10)執行的作業,不走全域性併發控制邏輯。

注:max_active_statements限制單CN上執行的作業數,預設值為60,假設使用者有3個DN,則實際全域性併發上限為3*60=180;

DDL和DML語句均受max_active_statements併發控制。

(2)資源池併發佇列

資源池併發佇列包含快車道併發佇列和慢車道併發佇列,配置方式如下:

CREATE RESOURCE POOL respool_a WITH (max_dop=10,active_statements=5);

其中max_dop為快車道併發上限,active_statements為慢車道併發上限。

注:資源池佇列只限制DML語句,不限制DDL語句;

max_dop限制單CN上資源池快車道併發數;

active_statements在靜態負載管理模式下限制單CN上資源池慢車道併發數,在動態負載管理模式下限制所有CN上資源池慢車道併發數之

(3)記憶體管控

例項級別記憶體管控:guc引數max_process_memory限制DN和CN例項的最大可用記憶體,當使用記憶體超過max_process_memory時,作業報錯退出;

可動態申請記憶體:max_dynamic_memory=max_process_memory-cstore_buffers(max_cstore_memory)-(udf_memory_limit - 200M) - max_shared_memory;

資源池記憶體管控:使用併發點數計算可執行的併發數量,active_statements<=0情況下資源池記憶體不受控。資源池總點數:total_points = active_statements * 100,作業使用點數:active_points = (estimate_mem/respool_mem) * active_statements * 100,estimate_mem為優化器估算的作業記憶體,資源池點數耗盡出發排隊。

(4)CPU管控

GaussDB主要利用cgroups做cpu資源的管控,涉及cpu、cpuacct、cpuset子系統,cpu配額管控基於cpu子系統的cpu.shares實現,該配置方法的好處是:OS cpu沒有佔滿的情況下,不觸發cpu管控;cpu限額管控基於cpuset實現;cpuacct子系統主要用於cpu資源使用的監控。

使用gs_cgroup工具設定cpu限額和配額,gs_cgroup工具常用命令如下:

  • root使用者掛載cgroup

gs_cgroup -U user -d #刪除當前掛載資訊

gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade

  • 建立Class控制組

gs_cgroup -S class1 -s 40 -c

  • 建立Workload控制組

gs_cgroup -S class 1 -G wg1 -c

  • 為控制組分配cpu配額

gs_cgroup -S class 1 -G wg1 -g 20 -u

  • 設定cpu限額

gs_cgroup -S class 1 -G wg1 -g 30 -u –fixed

  • 刪除控制組

gs_cgroup -S class 1 -G wg1 -d

  • 檢視控制組資訊

gs_cgroup -p #靜態配置檔案資訊

gs_cgroup -P #掛載資訊(樹形結構)

  • 查詢規則

設定查詢規則

gs_cgroup -S class -G wg -E "blocktime=1200,elapsedtime=2400" –a

gs_cgroup -S class -G wg -E "spillsize=256,broadcastsize=100" –a

gs_cgroup -S class -E "allcputime=100" –penalty

gs_cgroup -S class -E "qualificationtime=2400,cpuskewpercnt=90

查詢異常規則

select gs_respool_exception_info('rp_name')。

cpu管控原理:

  • cgroup掛載:使用root使用者掛載cgroup;

gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade

  • cgroup建立:使用資料庫安裝使用者建立cgroup;

gs_cgroup -S class1 -G wg1 -c

  • cgroup關聯資源池:建立組資源池pr1關聯class控制組class1,建立業務資源池resp1關聯workload控制組wg1

CREATE RESOURCE POOL pr1 WITH(CONTROL_GROUP='class1');

CREATE RESOURCE POOL resp1 WITH(CONTROL_GROUP='class1:wg1');

  • 使用者關聯資源池:建立組使用者role1關聯組資源池pr1,建立業務使用者usr1關聯業務資源池resp1

CREATE ROLE role1 RESOURCE POOL 'pr1' PASSWORD disable;

CREATE USER usr1 RESOURCE POOL 'resp1' PASSWORD 'Gauss_234' USER GROUP 'role1';

  • 使用業務使用者usr1執行復雜作業,作業執行過程中呼叫api函式cgroup_attach_task將作業attach到class1:wg1控制組上實現cpu管控。

 本文分享自華為雲社群《GaussDB(DWS) 資源管理技術淺析》,原文作者:門前一棵葡萄樹 。

 

點選關注,第一時間瞭解華為雲新鮮技