1. 程式人生 > >【Canal】資料同步的終極解決方案,阿里巴巴開源的Canal框架當之無愧!!

【Canal】資料同步的終極解決方案,阿里巴巴開源的Canal框架當之無愧!!

## 寫在前面 > 在當今網際網路行業,尤其是現在分散式、微服務開發環境下,為了提高搜尋效率,以及搜尋的精準度,會大量使用Redis、Memcached等NoSQL資料庫,也會使用大量的Solr、Elasticsearch等全文檢索服務。那麼,這個時候,就會有一個問題需要我們來思考和解決:那就是資料同步的問題!如何將實時變化的資料庫中的資料同步到Redis/Memcached或者Solr/Elasticsearch中呢? ## 網際網路背景下的資料同步需求 在當今網際網路行業,尤其是現在分散式、微服務開發環境下,為了提高搜尋效率,以及搜尋的精準度,會大量使用Redis、Memcached等NoSQL資料庫,也會使用大量的Solr、Elasticsearch等全文檢索服務。那麼,這個時候,就會有一個問題需要我們來思考和解決:那就是資料同步的問題!如何將實時變化的資料庫中的資料同步到Redis/Memcached或者Solr/Elasticsearch中呢? 例如,我們在分散式環境下向資料庫中不斷的寫入資料,而我們讀資料可能需要從Redis、Memcached或者Elasticsearch、Solr等服務中讀取。那麼,資料庫與各個服務中資料的實時同步問題,成為了我們亟待解決的問題。 試想,由於業務需要,我們引入了Redis、Memcached或者Elasticsearch、Solr等服務。使得我們的應用程式可能會從不同的服務中讀取資料,如下圖所示。 ![](https://img-blog.csdnimg.cn/20200806110610852.png#pic_center) 本質上講,無論我們引入了何種服務或者中介軟體,資料最終都是從我們的MySQL資料庫中讀取出來的。那麼,問題來了,如何將MySQL中的資料實時同步到其他的服務或者中介軟體呢? **注意:為了更好的說明問題,後面的內容以MySQL資料庫中的資料同步到Solr索引庫為例進行說明。** ## 資料同步解決方案 ### 1.在業務程式碼中同步 在增加、修改、刪除之後,執行操作Solr索引庫的邏輯程式碼。例如下面的程式碼片段。 ```java public ResponseResult updateStatus(Long[] ids, String status){ try{ goodsService.updateStatus(ids, status); if("status_success".equals(status)){