實時數(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è)務(wù)數(shù)據(jù)庫,大部分是使用mysql,mysql數(shù)據(jù)可以由binary log進(jìn)行實時獲取到kafka集群
    
一忍些,實時獲取業(yè)務(wù)數(shù)據(jù)庫

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

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

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

canal的工作原理.jpg

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

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

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

mysqlbinlog工具可以用binlog進(jìn)行備份恢復(fù)

2.2 MySQL binlog開啟

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

#修改binlog
cd /etc/
vim my.cnf
#/etc/my.cnf是mysql下關(guān)鍵配置文件
#默認(rè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重復(fù)了
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進(jìn)行數(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進(jìn)程是否開啟
 
 改完/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可以對應(yīng)多個數(shù)據(jù)庫配置趋箩,一個Server可以對應(yīng)多個Instance,每個Instance可以獨立監(jiān)控一臺MySQL服務(wù)器

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

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

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

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

    **1. canal.zkServers是配置zookeeper的信息,如果canal配置集群模式芍锦,這個需要配竹勉,如果只是單機(jī)版不需要配置,我這邊是單機(jī)版娄琉,就沒有配置了次乓;

    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對應(yīng)一個數(shù)據(jù)庫服務(wù)器,一個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沒有高可用肠仪,服務(wù)故障了肖抱,就重啟,keepalived工具可以監(jiān)測進(jìn)程是否掛了,掛了后可以觸發(fā)重啟

  • copy當(dāng)前服務(wù)器上的canal文件夾到standby服務(wù)器上异旧,代碼如下:
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了,不需要再修改配置了
    這樣兩臺機(jī)器的配置一樣

  • 修改配置文件/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
  • 兩個服務(wù)器都重啟canal
./canal/bin/restart.sh

用JPS檢查下服務(wù)是否啟動成功吮蛹。
如下圖在改下配置荤崇,防止一個節(jié)點掛了,另一個節(jié)點發(fā)重復(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市每篷,隨后出現(xiàn)的幾起案子喜每,更是在濱河造成了極大的恐慌,老刑警劉巖雳攘,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带兜,死亡現(xiàn)場離奇詭異,居然都是意外死亡吨灭,警方通過查閱死者的電腦和手機(jī)刚照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喧兄,“玉大人无畔,你說我怎么就攤上這事》驮” “怎么了浑彰?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拯辙。 經(jīng)常有香客問我郭变,道長,這世上最難降的妖魔是什么涯保? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任诉濒,我火速辦了婚禮,結(jié)果婚禮上夕春,老公的妹妹穿的比我還像新娘未荒。我一直安慰自己,他們只是感情好及志,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布片排。 她就那樣靜靜地躺著寨腔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪率寡。 梳的紋絲不亂的頭發(fā)上脆侮,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音勇劣,去河邊找鬼。 笑死潭枣,一個胖子當(dāng)著我的面吹牛比默,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盆犁,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼命咐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谐岁?” 一聲冷哼從身側(cè)響起醋奠,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伊佃,沒想到半個月后窜司,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡航揉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年塞祈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅涂。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡议薪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媳友,到底是詐尸還是另有隱情斯议,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布醇锚,位于F島的核電站哼御,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏焊唬。R本人自食惡果不足惜艇搀,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望求晶。 院中可真熱鬧焰雕,春花似錦、人聲如沸芳杏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吝秕,卻和暖如春泊脐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烁峭。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工容客, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人约郁。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓缩挑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鬓梅。 傳聞我的和親對象是個殘疾皇子供置,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355