Canal實戰(zhàn)

官方文檔

canal-php

簡介

  • canal server偽裝自己為 MySQL slave 萄金,向 MySQL master 發(fā)送 dump 協(xié)議
  • MySQL master 收到 dump 請求挽荡,開始推送 binary log 給canal server
  • canal server 解析 binary log 對象(原始為 byte 流)
  • canal client連接上canal server之后可以實時收到MySQL master推送過來的binlog
  • canal server也可以把binlog直接推送到MySQL,Hbase,Es,Mongodb,Redis,RabbitMq,RocketMq

前期準(zhǔn)備

我本次測試使用的是phpstudy自帶的mysql8.0.12,需要先開啟 Binlog 寫入功能贝室,配置 binlog-format 為 ROW 模式,my.cnf 中配置如下,phpstudy默認(rèn)配置就是這樣,不用修改

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

授權(quán) canal 鏈接 MySQL 賬號具有作為 MySQL slave 的權(quán)限, 如果已有賬戶可直接 grant

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

安裝Canal Server

我這里選擇用docker安裝

//下載腳本
$ wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh 
//賦予權(quán)限
$ chmod +x run.sh
//構(gòu)建一個destination name為test的隊列
./run.sh 
-e canal.auto.scan=false 
-e canal.destinations=test 
-e canal.instance.master.address=127.0.0.1:3306 
-e canal.instance.dbUsername=canal  
-e canal.instance.dbPassword=canal  
-e canal.instance.connectionCharset=UTF-8 
-e canal.instance.tsdb.enable=true 
-e canal.instance.gtidon=false  

腳本會docker pull最新的canal/canal-server鏡像


image.png

讓我們稍微等幾年看看什么情況...

image.png

容器跑起來了,默認(rèn)端口是11111,destinations是test

啟動Canal-client

  • 獲取canal-client
composer require xingwenge/canal_php
  • 新建canal.php
<?php
namespace xingwenge\canal_php\sample;
use xingwenge\canal_php\CanalClient;
use xingwenge\canal_php\CanalConnectorFactory;
use xingwenge\canal_php\Fmt;
require_once './vendor/autoload.php';
ini_set('display_errors', 'On');
error_reporting(E_ALL);
try {
    $client = CanalConnectorFactory::createClient(CanalClient::TYPE_SOCKET_CLUE);
    # $client = CanalConnectorFactory::createClient(CanalClient::TYPE_SWOOLE);
    $client->connect("127.0.0.1", 11111);
    $client->checkValid();
    $client->subscribe("1001", "test", ".*\\..*");
    # $client->subscribe("1001", "test", "db_name.tb_name"); # 指定某個庫某個表
    while (true) {
        $message = $client->get(100);
        if ($entries = $message->getEntries()) {
            foreach ($entries as $entry) {
                Fmt::println($entry);
            }
        }
        sleep(1);
    }
    $client->disConnect();
} catch (\Exception $e) {
    echo $e->getMessage(), PHP_EOL;
}
  • 執(zhí)行canal.php
    去數(shù)據(jù)庫改幾條數(shù)據(jù)看看


    image.png

收到binlog消息

  • 實戰(zhàn)成功

什么時候可以使用Canal

mysql和es,redis,mongdb信息同步

可以不用在應(yīng)用層加代碼就可以實現(xiàn)數(shù)據(jù)同步

mysql 不停機舊表遷移新表
1.canal-server開始監(jiān)聽舊表table的binlog,保存到日志文件canal.log(也可以存到mq)
2.mysqldump備份舊表生成table.sql,記錄執(zhí)行mysqldump的大概時間
3.寫代碼按新的規(guī)則導(dǎo)入table.sql到新表table_new
4.寫代碼按新的規(guī)則消費canal.log到新表table_new(取mysqldump之后的log)
5.比較兩個表數(shù)據(jù)是否一致
6.停止消費canal.log
7.原子操作換名
RENAME TABLE `table` TO `table_old`, `table_new` TO `table`
8.寫代碼按新的規(guī)則繼續(xù)消費canal.log到table(如果canal.log還有沒有同步完的操作)
9.刪除table_old
10.評論區(qū)有沒有更好的方式,求留言
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谋梭,一起剝皮案震驚了整個濱河市锈拨,隨后出現(xiàn)的幾起案子十拣,更是在濱河造成了極大的恐慌叙身,老刑警劉巖渔扎,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異信轿,居然都是意外死亡晃痴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門财忽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倘核,“玉大人,你說我怎么就攤上這事即彪〗舫” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵祖凫,是天一觀的道長琼蚯。 經(jīng)常有香客問我,道長惠况,這世上最難降的妖魔是什么遭庶? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮稠屠,結(jié)果婚禮上峦睡,老公的妹妹穿的比我還像新娘。我一直安慰自己权埠,他們只是感情好榨了,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著攘蔽,像睡著了一般龙屉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天转捕,我揣著相機與錄音作岖,去河邊找鬼。 笑死五芝,一個胖子當(dāng)著我的面吹牛痘儡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枢步,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼沉删,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了醉途?” 一聲冷哼從身側(cè)響起矾瑰,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎结蟋,沒想到半個月后脯倚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嵌屎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恍涂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宝惰。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖再沧,靈堂內(nèi)的尸體忽然破棺而出尼夺,到底是詐尸還是另有隱情,我是刑警寧澤炒瘸,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布淤堵,位于F島的核電站,受9級特大地震影響顷扩,放射性物質(zhì)發(fā)生泄漏拐邪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一隘截、第九天 我趴在偏房一處隱蔽的房頂上張望扎阶。 院中可真熱鬧,春花似錦婶芭、人聲如沸东臀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惰赋。三九已至,卻和暖如春呵哨,著一層夾襖步出監(jiān)牢的瞬間赁濒,已是汗流浹背轨奄。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留流部,地道東北人戚绕。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像枝冀,于是被迫代替她去往敵國和親舞丛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容