實時數(shù)倉-Canal介紹

實時數(shù)倉中架構(gòu)如下圖:

實時數(shù)倉架構(gòu)圖.jpg

實時架構(gòu)主要數(shù)據(jù)來源有3塊

  1. 日志文件(或設(shè)備上的心跳數(shù)據(jù)),由Flume或者Springboot程序直接寫到kafka中
    
  2. 接口API,使用程序調(diào)用接口
    
  3. 業(yè)務數(shù)據(jù)庫,大部分是使用mysql,mysql數(shù)據(jù)可以由binary log進行實時獲取到kafka集群
    
一,實時獲取業(yè)務數(shù)據(jù)庫

離線獲取mysql數(shù)據(jù),一般通過JDBC獲取數(shù)據(jù),這樣對mysql的負載也是很大;
實時獲取mysql數(shù)據(jù),一般通過binary log獲取數(shù)據(jù),這樣對mysql的負載很小。
實時獲取binlog的工具:canal/Maxwell/Debezium; canal是阿里開發(fā)的,Maxwell國外的,上升很快

1.1 canal介紹
  1. 原始場景;阿里otter中間件的一部分
    otter是阿里用于進行異地數(shù)據(jù)庫之間的同步框架,canal是其中一部分
  2. 場景1:更新緩存
  3. 場景2:抓取業(yè)務數(shù)據(jù)新增變化表,用于制作拉鏈表。
    拉鏈表:需要知道數(shù)據(jù)今天變化情況,canal只是監(jiān)控數(shù)據(jù)庫數(shù)據(jù)變化,然后把數(shù)據(jù)抽到新的數(shù)據(jù)庫中,做拉鏈表
    canal不消耗mysql性能,canal監(jiān)控mysql文件變化
  4. 場景3:抓取業(yè)務表的新增變化數(shù)據(jù),用于制作實時統(tǒng)計
1.2 canal的工作原理

參考mysql主備復制實現(xiàn)
canal的工作原理很簡單,就是把自己偽裝成salve, 假裝從master復制數(shù)據(jù)

canal的工作原理.jpg

讀取binary log需要master授權(quán)和用戶名密碼;
Maxwell也是讀取binary log

二,mysql的binlog
2.1 什么是binlog
    MySQL的二進制日志可以說是MySQL最重要的日志了,他記錄了所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句,以事件形式記錄,還包含語句所執(zhí)行的消耗時間,MySQL的二進制日志是事務安全型的。
    一般來說開啟二進制日志大概會有1%的性能損耗。二進制的兩個最重要的使用場景:
    1. MySQL Replication在Master端開啟binlog, Master把它的二進制日志傳遞給slaves來達到master-slave數(shù)據(jù)一致的目的
    2. 數(shù)據(jù)恢復,通過使用mysqlbinlog工具來使數(shù)據(jù)恢復

    二進制包括兩類文件;二進制日志索引文件(文件名后綴為.index)用于記錄所在的二進制文件
    二進制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句事件
    二進制日志文件量比較大

mysqlbinlog工具可以用binlog進行備份恢復

2.2 MySQL binlog開啟

Linux(Centos 7)服務器上的MySQL:

#修改binlog
cd /etc/
vim my.cnf
#/etc/my.cnf是mysql下關(guān)鍵配置文件
#默認mysql數(shù)據(jù)目錄是/var/lib/mysql
binlog文件也在這個目錄下:文件中名類似:mysql-bin.000106
data數(shù)據(jù)文件是ibdata1

開啟binlog:
修改配置文件:/etc/my.cnf
1. 添加:log-bin=mysql-bin
2. bin-format=row
3. binlog-do-db=testdb //指定binlog監(jiān)控的數(shù)據(jù)庫
4. server-id=1 //如果mysql是集群,canal的server-id要設(shè)置高點,不要與mysql重復了
2.3 binlog格式
  • statement 語句級
    如:update xxx set xxx= xx where xxx =xxx,會把SQL記錄在binlog中,會把這條SQL重新執(zhí)行一遍,
    優(yōu)點: 記錄的是語句,日志文件不會很大
    缺點: 有可能照成mysql主從數(shù)據(jù)不一致,比如使用now(),rand()都有可能照成數(shù)據(jù)不一致

  • row 行級
    語句執(zhí)行后會記錄每一行的結(jié)果,在slave時,直接拿每一行的值去覆蓋
    優(yōu)點: 解決數(shù)據(jù)不一致問題,大數(shù)據(jù)抽取binlog進行數(shù)據(jù)解析方便
    缺點: 如果一次更改數(shù)據(jù)量很大,有幾百萬時,會出現(xiàn)大量日志;遇到批量執(zhí)行的SQL出現(xiàn)時,會出現(xiàn)大量的冗余

  • mixed 混合
    一般情況下使用statement, 遇到幾種特殊情況,使用row,
    特殊情況:NOW(), RAND(), UUID(), UDF, INSERT DELAYED, AUTO_INCREMENT
    優(yōu)點: binlog日志文件不會太大,同時也能保證主從數(shù)據(jù)一致
    缺點: 大數(shù)據(jù)去抽取binlog日志文件解析得到數(shù)據(jù)不方便,數(shù)據(jù)分析使用方去分析數(shù)據(jù)最方便直接,分析語句太麻煩

    2.4 重啟Mysql
sudo systemctl restart mysql//重啟mysql

sudo service sshd restart //重啟sshd命令

 ps -ef|grep mysql//查看mysql進程是否開啟
 
 改完/etc/my.cnf文件后需要把文件權(quán)限降級,
 sudo chmod 644 /etc/my.cnf

新建一個canal賬號,給canal使用,給canal的賬號賦權(quán)限:SELECT,REPLICATION SLAVE, REPLICATION CLIENT

GRANT SELECT,REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal@'%' IDENTIFIED BY 'canal'
三,canal安裝

安裝前先看看canal的原理圖,如下:

canal原理圖.jpg

canal的github上的地址:https://github.com/alibaba/canal/releases/
這里下載1.14版本,
一個canal可以對應多個數(shù)據(jù)庫配置,一個Server可以對應多個Instance,每個Instance可以獨立監(jiān)控一臺MySQL服務器

下載后在Linux目錄/usr/local中新建canal目錄,把下載的文件canal.deployer-1.1.4.tar.gz上傳到該目錄中,運行如下語句進行解壓:

tar -zxvf canal.deployer-1.1.4.tar.gz

解壓后可以把文件canal.deployer-1.1.4.tar.gz刪了
下面需要修改配置文件:

  • 需要修改配置文件./conf/canal.properties

    **1. canal.zkServers是配置zookeeper的信息,如果canal配置集群模式,這個需要配,如果只是單機版不需要配置,我這邊是單機版,就沒有配置了;

    1. canal.serverMode配置成kafka,這樣canal會直接把數(shù)據(jù)寫入到kafka中;
    2. canal.mq.servers 配置成kafka的broker server信息,讓canal知道怎么把數(shù)據(jù)寫入kafka**
  • 需要修改配置文件./conf/example/instance.properties
    **1. 修改canal.instance.master.address的值,改成你需要監(jiān)控的mysql的host和port;

    1. 修改canal.instance.dbUsername和canal.instance.dbPassword的值,改成你要監(jiān)控的mysql的賬號和密碼
    2. 修改canal.mq.topic的值,改成在kafka中的topic
    3. canal.mq.partition表示數(shù)據(jù)寫到kafka中哪個分片中,一般不知道分片,給注釋掉
    4. canal.mq.partitionsNum表示建的topic有幾個分區(qū),可以根據(jù)數(shù)據(jù)量大小設(shè)置分區(qū)數(shù)

**注意: 1. canal是一個數(shù)據(jù)源一個topic,這樣會把每張表的binlog都放在一個topic中,所以后面需要做實時分流

  1. 一個instance.properties對應一個數(shù)據(jù)庫服務器,一個canal可以配置多個instance,可以配置多個instance.properties
  2. 一個instance中能監(jiān)控多少個數(shù)據(jù)庫,取決于mysql的配置文件/ect/my.cnf中binlog-do-db的值**
  • 啟動canal
#啟動命令
cd ./canal/bin
./startup.sh

啟動成功后,JPS后會出現(xiàn)CanalLauncher

四,Canal高可用配置

canal高可用配置原理如下圖:

canal對比Maxwell, Maxwell沒有高可用,服務故障了,就重啟,keepalived工具可以監(jiān)測進程是否掛了,掛了后可以觸發(fā)重啟

  • copy當前服務器上的canal文件夾到standby服務器上,代碼如下:
scp -r ./canal hadoop@dw-test-cluster-006:/usr/local/tools/
  • 修改配置文件/conf/example/instance.properties
    之前canal版本需要把server.id修改,不過1.1.4這版已經(jīng)自動分配service.id了,不需要再修改配置了
    這樣兩臺機器的配置一樣

  • 修改配置文件/conf/canal.properties中的zookeeper的配置

canal.zkServers = dw-test-cluster-001:2181,dw-test-cluster-002:2181,dw-test-cluster-003:2181,dw-test-cluster-004:2181,dw-test-cluster-005:2181,dw-test-cluster-006:2181,dw-test-cluster-007:2181
  • 兩個服務器都重啟canal
./canal/bin/restart.sh

用JPS檢查下服務是否啟動成功。
如下圖在改下配置,防止一個節(jié)點掛了,另一個節(jié)點發(fā)重復數(shù)據(jù),如下圖配置:


image.png
  • canal生成kafka topic時,分區(qū)平衡設(shè)置
    在example/Instance.properties文件中加如下配置
    表示全庫全表的主鍵
    canal.mq.partitionHash=.*\\..*:$pk
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容