logstash 和 canal的區別

1、在傳輸上,兩者都可以看做傳輸數據的管道,但logstash可以從數據庫讀取數據(例:MySql),傳輸到ES中,而canal能做到的不止這些,它可以把MySql的數據讀取出來,配合java代碼(貌似只支持java),

將讀取到的數據存儲到任何代碼能操作的地方,例如:文件、MySql、Redis、ES等等


2、在時效性上,logstash配置文件是使用定時器去同步數據,而canal是監聽MySql的binlog日誌,進而做到數據幾乎實時同步(PS:實際開發中基本是1秒~2秒內)


3、在數據處理上,logstash可以讀取多個表,然後分別存儲到對應節點,或者可以在存儲前進行聯表查詢,進而存儲成一條數據。但當聯表查詢一對多時,存儲成一條數據就變得不現實了,比如:文章搜索

,並且連文章對應的評論一起搜索出來。如果用logstash的話,可能需要存成兩張表,先根據條件搜索文章表,然後再循環查到的文章列表,再查詢評論表,再拼裝成數據,接口返回結果。但如果用canal

的話,在數據存儲到ES前,可以先把對應的評論查詢出來,並且拼裝成json字符串,當做文章表的單個字段存儲到ES中,這樣可以直接查詢出來,避免反覆地查詢ES組裝數據。在這一點上,理論上用canal

查詢會更快,更高效。


4、在對數據庫的壓力上,logstash的原理是定時掃描變動的表,所以對數據庫有一定壓力,並且如果有其他程序在進行某條語句更新,鎖住了這條行數據,那logstash讀取數據時,就會被“卡住”,如果這個時

間過長,可能會影響服務器卡死。而canal由於是監聽的binlog日誌,所以幾乎對MySql沒有壓力,並且binlog已經記錄,不會存在數據變動的情況。


5、讀取數據上,logstash可以讀取數據庫、文本文件,而canal讀取的是binlog文件(binlog屬於二進制文件)。


6、學習成本上,logstash相對簡單,canal相對難一點。


logstash 和 canal的區別


分享到:


相關文章: