日誌服務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字段
爲id
,CheckPoint字段初始值
爲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導入作爲一個工具,對於導入的數據場景沒有偏見,業務數據和性能數據都可以導入,在使用的過程中可以挖掘出更多的場景。
參考
- 日誌服務(SLS):https://www.aliyun.com/product/sls
- 日誌服務數據導入:https://help.aliyun.com/document_detail/147819.html
- 導入PostgreSQL數據:https://help.aliyun.com/document_detail/437710.html
- Monitoring Database Activity:https://www.postgresql.org/docs/current/monitoring.html
- postgres_exporter:https://github.com/prometheus-community/postgres_exporter
- MySQL到SLS:一站式查詢分析可視化場景介紹:https://developer.aliyun.com/article/883962
- 查找最耗費資源的 SQL(Top SQL):https://help.aliyun.com/document_detail/52953.html
本文爲阿里雲原創內容,未經允許不得轉載。