【Canal】資料同步的終極解決方案,阿里巴巴開源的Canal框架當之無愧!!
阿新 • • 發佈:2020-08-06
## 寫在前面
> 在當今網際網路行業,尤其是現在分散式、微服務開發環境下,為了提高搜尋效率,以及搜尋的精準度,會大量使用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)){