首頁>技術>

canal模組說明

canal components

deplyer:啟動一個canal-server,一個cannal-server內部包含多個instance,每個instance都會偽裝成一個mysql例項的slaveadapter:客戶端資料落地的適配及啟動功能,現支援關係型資料庫的資料同步(表對錶同步);HBase的資料同步(表對錶同步);ElasticSearch多表資料同步admin:提供整體配置管理、節點運維等面向運維的功能,提供相對友好的WebUI操作介面,方便更多使用者快速和安全的操作canal環境搭建deplyer基礎環境搭建:https://github.com/alibaba/canal/wiki/QuickStart,需要特別注意Mysql開啟binlog ROW 模式並配置server_iddeplyer docker環境搭建:https://github.com/alibaba/canal/wiki/Docker-QuickStartdeplyer HA環境搭建:https://github.com/alibaba/canal/wiki/AdminGuide HA模式配置adapter基礎環境搭建:https://github.com/alibaba/canal/wiki/ClientAdapteradmin基礎環境搭建: https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStartadmin docker環境搭建: https://github.com/alibaba/canal/wiki/Canal-Admin-Dockercanal同步elasticsearch

canal es adapter 1.5 支援多表關聯插入、更新或者刪除elasticsearch 7.x.x的資料,除了支援elasticsearch常用資料型別外,還支援陣列物件、nested 巢狀物件和父子文件結構,但是使用es adapter進行增量資料同步有諸多限制:

主表不能為子查詢語句只能使用left outer join即最左表一定要是主表關聯從表如果是子查詢不能有多張表主sql中不能有where查詢條件(從表子查詢中可以有where條件但是不推薦, 可能會造成資料同步的不一致, 比如修改了where條件中的欄位內容)關聯條件只允許主外來鍵的'='操作不能出現其他常量判斷比如: on a.role_id=b.id and b.statues=1關聯條件必須要有一個欄位出現在主查詢語句中比如: on a.role_id=b.id 其中的 a.role_id 或者 b.id 必須出現在主select語句中elasticsearch的mapping 屬性與sql的查詢值將一一對應(不支援 select *)

基於以上限制,使用canal es adapter 1.5不能處理特別複雜的業務邏輯,因此我們可以採用以下技術處理方案:

對於實時性要求不高,業務邏輯較為複雜的資料,我們可以採用大資料或者資料倉庫加工的最終表進行資料的全量和增量同步資料實時性要求較高並且業務邏輯較為複雜的資料,只能透過canal clientAPI進行定製化開發實現

基於不重複造輪子的原則,加上我們的業務邏輯不是特別複雜,研發團隊決定採用以下方案:

全量同步使用canal es adapter,透過編寫sql指令碼、中間表處理的方式實現資料同步增量同步使用canal clientAPI定製化開發的方式實現資料同步。

elasticsearch nested Query 整體效能慢,但比parent/child Query稍快,應從業務上儘可能地避免使用NestedQuery, 對於效能要求高的場景,應該直接禁止使用。但受制於現有系統架構,業務邏輯關係等方面的制約,elasticsearch中難免會用到nested 巢狀物件。

使用canal es adapter應該如何對nested 巢狀物件進行增量同步呢?canal wiki和issues中都沒有明確說明,現將這個問題做下特別說明:

nested 巢狀物件插入:使用group_concat生成你需要的nested 巢狀物件json資料,請注意設定group_concat_max_len長度,防止JSON串被截斷,同時也需要注意elasticsearch一個文件可以在所有巢狀型別中包含的巢狀JSON物件的最大數量預設值為10000
  select si.product_id,         CONCAT('[',              GROUP_CONCAT(                   CONCAT('{"specId":',ifnull(si.spec_id,'null')),                   CONCAT(',"specName":"',ifnull(si.spec_name,'null'),'"'),                   CONCAT(',"itemId":',ifnull(si.item_id,'null')),                   CONCAT(',"enItemName":"',ifnull(si.item_name,'null')),'"',                   CONCAT(',"zhItemName":"',ifnull(si.item_name_zh,'null')),'"}')       ,']')AS specItems from         (select spec_id,spec_name,item_id,item_name,item_name_zh,product_id from  mall_custom_product_spec ) si        group by product_id

2. 在adapter同步配置檔案中增加以下配置,以便實現nested 巢狀物件插入

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 關於Dubbo隨便問八個問題