PostgreSQL 導入 SLS,從業務到監控數據

日誌服務SLS數據導入簡介

日誌服務SLS是雲原生觀測和分析平臺,爲Log、Metric、Trace等數據提供大規模、低成本、實時的平臺化服務。日誌服務是提供一站式數據採集、加工、查詢與分析、可視化、告警、消費與投遞等功能。全面提升在研發、運維、運營、安全等場景的數字化能力。SLS在數據導入方面提供了豐富的數據源,如OSS導入、MaxCompute、MySQL、SQL Server等數據源。

PostgreSQL是一款免費的對象-關係數據服務器,在互聯網和物聯網領域都有廣泛的應用場景,PostgreSQL也自稱是最強大的開源關係型數據庫系統,SLS也在近期上線了PostgreSQL數據源導入功能。本文將介紹如何把PostgreSQL的數據導入SLS,並且從可觀測性的角度來介紹下非業務類數據導入的場景。

PostgreSQL業務數據導入

這裏以電商系統的訂單表爲例,如下是訂單表orders的結構,存儲了用戶ID、價格、優惠券之類的字段,接下來可以通過簡單的配置將訂單數據導入到SLS。

CREATE TABLE IF NOT EXISTS orders (
  id serial primary key,
  user_id BIGINT NOT NULL,
  sku_id BIGINT,
  sku_category VARCHAR(100),
  sku_count INT,
  sku_price INT,
  total_price INT,
  supplier_type VARCHAR(100),
  pay_id VARCHAR(50),
  pay_channel VARCHAR(20),
  pay_amount INT,
  coupon_id INT DEFAULT 0,
  buy_channel VARCHAR(50) DEFAULT '',
  state INT NOT NULL,
  client_ip VARCHAR(15) DEFAULT '',
  create_time timestamp(6) DEFAULT current_timestamp,
  update_time timestamp(6) DEFAULT current_timestamp 
);

數據導入

根據已經創建好的Project、Logstore,展開Logstore的配置,選擇數據導入,選擇 + 按鈕

PostgreSQL數據導入

快速數據導入頁面,選擇PostgreSQL - 數據導入

數據源配置

在數據源設置頁面,填寫配置名稱、數據庫連接地址等,如果使用VPC地址,需要勾選VPC地址,輸入數據庫所在的VPC實例ID。

下述示例中查詢語句使用了SELECT * FROM orders WHERE id > $1 ORDER BY id,其中$1表示佔位符,用來做CheckPoint使用。

高級配置

高級配置中,選擇CheckPoint字段idCheckPoint字段初始值0,在初始執行SQL的過程中,第一次會將查詢語句中的$1換成0,即:

SELECT * FROM orders WHERE id > 0 ORDER BY id

每次導入最大行數0,表示不限制拉取行數,在第一次執行後會將最後一條數據的id替換掉$1,這樣就可以做到下次執行時和上次的數據不重複,兩次執行的時間間隔即導入間隔

導入間隔配置

導入間隔,可以選擇特定的時間間隔或者自定義時間間隔。

導入完成

在日誌服務的Logstore查詢控制檯,可以看到導入後的數據,根據數據庫字段配置索引,對數據進行查詢分析,做分析訂單趨勢、訂單分類、下單客戶區域分佈等分析,在SLS控制檯可以創建儀表盤,對於分析一目瞭然,同時對於異常數據還可以支持告警等配置。

配置索引

查詢數據

儀表盤展示

關於儀表盤的配置和查詢分析,在上一篇文章《MySQL到SLS:一站式查詢分析可視化場景介紹》有過比較詳細的介紹,這裏不再贅述。可以看下儀表盤的示例。

除了業務數據,還可以導哪些數據?

除了業務數據存儲在PostgreSQL外,我們往往也需要關注PostgreSQL服務器本身的運行狀態,對服務本身的監控,Prometheus社區也提供了postgres_exporter,其原理也是通過拉取PostgreSQL的系統表或者視圖來進行數據的觀測,其主要關注在指標層面,PostgreSQL還有一些元數據表,對於數據治理也是不可缺少的部分,接下來來看下哪些指標或者元數據可以導入到SLS來進行分析。

PostgreSQL可觀測性

和MySQL類似,PostgreSQL也包含各類系統表,系統表中記錄這數據庫的一些數據庫元信息和診斷信息,通過這些表或視圖可以監控系統的狀態,查詢執行計劃的狀態和服務器管理狀態,從某種程度上來說,這些表的信息可以反映PostgreSQL的可觀測性。

在PostgreSQL的Monitoring Database Activity,對如何監控PostgreSQL進行了介紹,主要包括

  • 標準的Unix工具
  • 統計數據收集器
  • 查看鎖
  • 進度報告
  • 動態追蹤

其中統計數據收集器是收集和報告服務行爲的子系統,可以對錶和索引的訪問次數進行計數,也可以追蹤每張表的行數,和表的垃圾回收信息,統計用戶自定義函數的調用次數和調用時間。同樣支持PostgreSQL上正在執行的動態信息,包括服務器中正在執行的確切命令等。

開啓統計數據採集,可以有postgresql.conf中的四個參數來控制:

  • track_activities:用來跟蹤每個會話執行的命令和開始執行的時間。
  • track_counts:統計表和索引的訪問次數。
  • track_functions:統計自定義函數調用。
  • track_io_timing:統計塊IO的讀寫次數。

除了以上的參數外,還有其他的參數可以用來開啓統計監控。

統計視圖(Statistics Views)

PostgreSQL內置了一些統計視圖可供直接使用,主要包括兩部分:

  • 動態統計視圖(Dynamic Statistics Views)
    • pg_stat_activity
    • pg_stat_replication
    • pg_stat_wal_receiver
    • pg_stat_subscription
    • pg_stat_ssl
    • ....
  • 已收集統計信息視圖(Collected Statistics Views)
    • pg_stat_archiver
    • pg_stat_bgwriter
    • pg_stat_wal
    • pg_stat_database
    • pg_stat_database_conflicts
    • pg_stat_all_tables
    • ....

這些統計視圖對於數據庫的運行狀態診斷有很重要的作用,比如慢SQL查詢診斷,活躍的客戶端查看,舉個例子,我們通過SQL語句來查詢執行時間長的語句:

select
       current_timestamp - query_start as runtime,
       datname,
       usename,
       query
    from pg_stat_activity
    where query <> '' 
    order by runtime desc

結果如下,可以看到某些執行時間較長的語句。

runtime        | datname  |  usename   |                                            query                                            
----------------------+----------+------------+---------------------------------------------------------------------------------------------
 1 day 13:27:48.46965 |          | replicator | START_REPLICATION 0/3000000 TIMELINE 1
 00:00:56.034221      | postgres | aurora     | select slot_name client, pg_walfile_name(restart_lsn) wal, active from pg_replication_slots
(2 rows)

通過將這些結果導入到日誌服務,可以進行分析統計、儀表盤配置和告警。

系統表

Postgresql系統表扮演着數據字典的角色,保存了數據庫的元數據,包含所有對象和屬性的描述信息,對象之間的關係信息。常用的系統表包括:

  • pg_namespace:存儲命名空間,屬性包括nspname、nspowner、nspacl等。
  • pg_tablespace:存儲表空間信息,屬性包括spcname、spcowner、spclocation、spcacl等。
  • pg_database:存儲數據庫信息,屬性包括datname、datdba、encoding、datcollate等。
  • pg_class:存儲數據庫對象信息,包括索引、序列、視圖等。
  • pg_type:存儲數據類型信息。
  • pg_index:存儲索引的具體信息。

以上數據系統表記錄的數據庫元信息,對於數據治理中有很重要的作用,將這些數據導出到數據分析平臺就可以進行分析和持續的觀測,比如需要觀測數據字段的變更,舉個例子:

SELECT relname,attname,typname,attnum FROM pg_class c,pg_attribute a,pg_type t 
WHERE c.relname = 'orders' AND c.oid = attrelid AND atttypid = t.oid AND attnum > 0;

我們可以通過pg_class、pg_attribute、pg_type三個表的連接,獲取數據庫表的字段信息,這裏示例中以orders表爲例,可以得到結果如下:

relname |    attname    |  typname  | attnum 
---------+---------------+-----------+--------
 orders  | id            | int4      |      1
 orders  | user_id       | int8      |      2
 orders  | sku_id        | int8      |      3
 orders  | sku_category  | varchar   |      4
 orders  | sku_count     | int4      |      5
 orders  | sku_price     | int4      |      6
 orders  | total_price   | int4      |      7
 orders  | supplier_type | varchar   |      8
 orders  | pay_id        | varchar   |      9
 orders  | pay_channel   | varchar   |     10
 orders  | pay_amount    | int4      |     11
 orders  | coupon_id     | int4      |     12
 orders  | buy_channel   | varchar   |     13
 orders  | state         | int4      |     14
 orders  | client_ip     | varchar   |     15
 orders  | create_time   | timestamp |     16
 orders  | update_time   | timestamp |     17
(17 rows)

通過將這個查詢的數據導入到SLS,並設置定時每5分鐘導入一次,這樣就可以看到整個時間線上表結構的變更,比如字段是否增加或減少

導入SLS結果查看

通過將數據導入SLS可以對元數據進行統計分析,按照時間定時導入,可以分析元數據隨時間的變化趨勢。對於數據庫審計和數據治理都有很多場景。

擴展(EXTENSION)

PostgreSQL還有一個重要特性,支持擴展插件,通過擴展插件也可以進行一些數據的收集和統計。例如比較有名的插件pg_stat_statements,通過這個插件,可以統計數據庫的資源開銷和分析TOP SQL,阿里雲RDS也提供了類似的案例

首先創建pg_stat_statements插件:CREATE EXTENSION pg_stat_statements;通過pt_stat_statements視圖,可以查詢數據庫資源開銷的統計信息,主要包括信息如下:

  • SQL 的調用次數,總耗時,最快執行時間,最慢執行時間,平均執行時間,執行時間的方差(看出抖動),總共掃描、返回或處理了多少行。
  • shared buffer 的使用情況:命中、未命中、產生髒塊、驅逐髒塊。
  • local buffer 的使用情況:命中、未命中、產生髒塊、驅逐髒塊。
  • temp buffer 的使用情況:讀了多少髒塊、驅逐髒塊。
  • 數據塊的讀寫時間。

例如查詢耗IO的Top 5的SQL:

SELECT userid::regrole, dbid, query FROM pg_stat_statements ORDER BY (blk_read_time+blk_write_time)/calls DESC LIMIT 5;

最耗時的TOP 5 SQL

SELECT userid::regrole, dbid, query FROM pg_stat_statements ORDER BY mean_time DESC LIMIT 5;

類似的還有查詢響應時間抖動、共享內存消耗、臨時空間消耗等指標的SQL,通過pg_stat_statements將指標信息導出,就可以對數據進行分析。

總結

本文首先介紹了PostgreSQL的數據導入功能,以電商系統中的訂單表爲例介紹瞭如何將PostgreSQL的數據導入SLS,同時介紹瞭如何使用SLS進行查詢分析和儀表盤展示等。第二部分主要介紹了PostgreSQL的可觀測性數據的導入場景,主要通過PostgreSQL的統計視圖、系統表和擴展進行數據的導入來完成。

SLS的PostgreSQL導入作爲一個工具,對於導入的數據場景沒有偏見,業務數據和性能數據都可以導入,在使用的過程中可以挖掘出更多的場景。

參考

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章