實時數(shù)倉中架構(gòu)如下圖:
實時架構(gòu)主要數(shù)據(jù)來源有3塊
日志文件(或設(shè)備上的心跳數(shù)據(jù))屈芜,由Flume或者Springboot程序直接寫到kafka中
接口API,使用程序調(diào)用接口
業(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介紹
- 原始場景灸芳;阿里otter中間件的一部分
otter是阿里用于進(jìn)行異地數(shù)據(jù)庫之間的同步框架,canal是其中一部分 - 場景1:更新緩存
- 場景2:抓取業(yè)務(wù)數(shù)據(jù)新增變化表拜姿,用于制作拉鏈表烙样。
拉鏈表:需要知道數(shù)據(jù)今天變化情況,canal只是監(jiān)控數(shù)據(jù)庫數(shù)據(jù)變化蕊肥,然后把數(shù)據(jù)抽到新的數(shù)據(jù)庫中谒获,做拉鏈表
canal不消耗mysql性能,canal監(jiān)控mysql文件變化 - 場景3:抓取業(yè)務(wù)表的新增變化數(shù)據(jù)壁却,用于制作實時統(tǒng)計
1.2 canal的工作原理
參考mysql主備復(fù)制實現(xiàn)
canal的工作原理很簡單批狱,就是把自己偽裝成salve, 假裝從master復(fù)制數(shù)據(jù)
讀取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的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ī)版娄琉,就沒有配置了次乓;
- canal.serverMode配置成kafka,這樣canal會直接把數(shù)據(jù)寫入到kafka中车胡;
- canal.mq.servers 配置成kafka的broker server信息檬输,讓canal知道怎么把數(shù)據(jù)寫入kafka**
-
需要修改配置文件./conf/example/instance.properties
**1. 修改canal.instance.master.address的值,改成你需要監(jiān)控的mysql的host和port匈棘;- 修改canal.instance.dbUsername和canal.instance.dbPassword的值丧慈,改成你要監(jiān)控的mysql的賬號和密碼
- 修改canal.mq.topic的值,改成在kafka中的topic
- canal.mq.partition表示數(shù)據(jù)寫到kafka中哪個分片中主卫,一般不知道分片逃默,給注釋掉
- canal.mq.partitionsNum表示建的topic有幾個分區(qū),可以根據(jù)數(shù)據(jù)量大小設(shè)置分區(qū)數(shù)
**注意: 1. canal是一個數(shù)據(jù)源一個topic簇搅,這樣會把每張表的binlog都放在一個topic中完域,所以后面需要做實時分流
- 一個instance.properties對應(yīng)一個數(shù)據(jù)庫服務(wù)器,一個canal可以配置多個instance瘩将,可以配置多個instance.properties
- 一個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ù)潮针,如下圖配置:
-
canal生成kafka topic時术荤,分區(qū)平衡設(shè)置
在example/Instance.properties文件中加如下配置 表示全庫全表的主鍵 canal.mq.partitionHash=.*\\..*:$pk