透過 Canal 將 MySQL 資料實時同步到 Easysearch

infinilabs發表於2023-11-17

Canal 是阿里巴巴集團提供的一個開源產品,能夠透過解析資料庫的增量日誌,提供增量資料的訂閱和消費功能。使用 Canal 模擬成 MySQL 的 Slave,實時接收 MySQL 的增量資料 binlog,然後透過 RESTful API 將資料寫入到 Easysearch 中。

前提條件

  1. 部署 Easysearch 叢集。
  2. 部署 MySQL 資料庫。
  3. 部署 Gateway,Canal Adapter 不支援使用 HTTPS 協議連線,使用 Gateway 代理 Easysearch 。
  4. 部署 Console,方便檢視 Easysearch 資料。

對於自建 MySQL , 需要先開啟 Binlog 寫入功能,配置 binlog-format 為 ROW 模式,my.cnf 中配置如下:

[mysqld]
log-bin=mysql-bin # 開啟 binlog
binlog-format=ROW # 選擇 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定義,不要和 canal 的 slaveId 重複

建立 canal 使用者,授權 canal 連線 MySQL 具有作為 MySQL slave 的許可權。

CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

操作步驟

在進行資料同步時支援自定義索引 Mapping,但需保證 Mapping 中定義的欄位(名稱+型別)與 MySQL 中一致。

1. 準備 MySQL 資料來源

create database canal;
use canal;
CREATE TABLE `test` (
    `id` bigint(32) NOT NULL,
    `name` text NOT NULL,
    `age` smallint  NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8;

2. Easysearch 建立索引

PUT test
{
    "settings" : {
      "index" : {
        "number_of_shards" : "1",
        "number_of_replicas" : "1"
      }
    },
    "mappings" : {
            "properties" : {
              "id": {
                   "type": "integer"
               },
               "name": {
                    "type" : "text"
                },
                "age" : {
                    "type" : "integer"
                }
            }
    }
}

3. 安裝並啟動 Canal-server

下載
修改配置檔案
vi conf/example/instance.properties

啟動 canal
sh bin/startup.sh
啟動成功日誌資訊,logs/canal/canal.log

關閉 canal
sh bin/stop.sh

4. 安裝並啟動 Canal-adapter

下載
修改配置檔案:application.yml

server:
  port: 8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null
canal.conf:
  flatMessage: true
  syncBatchSize: 1000
  retries: -1
  timeout:
  accessKey:
  secretKey:
  consumerProperties:
    canal.tcp.server.host: 127.0.0.1:11111
    canal.tcp.batch.size: 500
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://127.0.0.1:3306/canal?useUnicode=true
      username: canal
      password: canal
  canalAdapters:
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es7
        properties:
          security.auth: admin:4ad8f8f792e81cd0a6de
          cluster.name: easysearch

新增 canal-adapter/conf/es7/test.yml,配置索引和表的對映關係。

dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
  _index: test           # es 的索引名稱
  _id: _id               # es 的_id, 如果不配置該項必須配置下面的pk項_id則會由es自動分配
  # sql對映
  sql: " select a.id as _id,a.id,a.name,a.age from test a "
  etlCondition: "where a.id>={}"
  commitBatch: 3000      # 提交批大小

啟動 canal-adapter
./bin/startup.sh

5. 驗證增量資料同步

在 MySQL 資料庫中,對 test 表插入兩條資料。
insert test (id ,name ,age ) values(1,'canal_test1',11);
insert test (id ,name ,age ) values(2,'canal_test2',22);

6. 在 Console 中,執行以下命令查詢資料

最後

Canal 同步的是增量資料,不會同步之前的存量資料。要同步存量資料可參考 《使用 Logstash 同步 MySQL 到 Easysearch》

關於 Easysearch

about easysearch

INFINI Easysearch 是一個分散式的近實時搜尋與分析引擎,核心引擎基於開源的 Apache Lucene。Easysearch 的目標是提供一個輕量級的 Elasticsearch 可替代版本,並繼續完善和支援更多的企業級功能。 與 Elasticsearch 相比,Easysearch 更關注在搜尋業務場景的最佳化和繼續保持其產品的簡潔與易用性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70029458/viewspace-2995981/,如需轉載,請註明出處,否則將追究法律責任。

相關文章