Change Data Capture(CDC),是ScyllaDB 4.1版本之後推行的一項目前仍在實驗的功能,但是看起來已經到了收尾階段,官方的網頁文件與教學影片也都已經上架,應該會是之後版本的主打功能,先來簡單看一下這個功能的作用。
這裡指的CDC,基本上在使用其他的db時都已經聽過,常被用在ETL的流程。CDC紀錄了一筆資料什麼時候被新增了,又是在什麼時候被刪除了。
官方整理出了幾個使用案例:
分析同一張信用卡是否在同一時間在多個地方消費,想要分析每一筆紀錄的操作,從資料庫鏡像一部分的資料而不透過原本的replicate機制,以及將資料轉導到不同的儲存空間。
cdc會將三種變更記錄到log裡,而Scylla將這些log儲存在一個table裡,就如同一般的table。每個狀態都會被儲存在一個欄位,以timestamp做排序。
開始實作之前,先到scylla.yaml裡頭開啟允許實驗設定,然後重啟Scylla。
experimental: true
接著建立table,開啟cdc相關選項:
CREATE TABLE testing (pk text,ck text,val1 text,val2 text, PRIMARY KEY (pk,ck)) WITH cdc = { 'enabled' : 'true', 'preimage' : 'true' };
可以看到除了剛才建立的table testing,還有另一個table testing_scylla_cdc_log自動產生了。
接著寫入兩筆資料然後看看log表的情況,log表也同步產生了兩筆記錄。
insert into testing(pk, ck, val1, val2) values('vangogh', 'The Starry Night', '1889', '72x92');
insert into testing(pk, ck, val1, val2) values('vangogh', 'The Potato Eaters', '1885', '81.5x114.5');
然後試著更新其中一筆資料,然後再查一次log表,log表中cdc$operation=0的是pre-image紀錄了val1更新前的值。而cdc$operation=1是post-image,紀錄了異動後val1的值。
update testing set val1 = '2020' where pk = 'vangogh' and ck = 'The Starry Night' ;
再來試著刪除其中一筆資料的column val2,可以看到log表中cdc$deleted_val2的值變成true,一樣有兩筆記錄分別紀錄更新前後的值。
delete val2 from testing where pk = 'vangogh' and ck = 'The Starry Night';
從目前官方釋出的資訊,初步可以了解到Scylla的CDC是將異動的紀錄另外建立一張log table儲存。並且套用cluster的RF規則,此外可以設定TTL。等final版本出來,再來看看有什麼變化。