成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

拉取 Binlog,自動數據同步,老板要給漲工資....

開發 前端
Canal,譯意為水道/管道/溝渠,主要用途是基于 MySQL 數據庫增量日志解析,提供增量數據訂閱和消費。

本文轉載自微信公眾號「微觀技術」,作者Tom哥  。轉載本文請聯系微觀技術公眾號。

 大家好,我是Tom哥~

MySQL 數據庫大家一定都不陌生,今天跟大家聊聊數據同步的事

關于數據同步,我們常見的策略就是 同步雙寫、異步消息

1、同步雙寫:字面意思,同步+雙寫。比如老庫模型重構,數據遷移到新庫,遷移過程中,如果有數據變更,既要寫到老庫,也要寫到新庫,兩邊同步更新。

  • 優點:同步機制,保證了數據的實效性。
  • 缺點:額外增加同步處理邏輯,會有性能損耗

2、異步消息:如果依賴方過多,我們通常是將變更數據異構發送到MQ消息系統,感興趣的業務可以訂閱消息Topic,拉取消息,然后按自己的業務邏輯處理。

  • 優點:架構解耦,可以采用異步來做,降低主鏈路的性能損耗。如果是多個消費方,不會出現指數性能疊加
  • 缺點:異步機制,無法滿足實時性,有一定延遲。只能達到最終一致性。

上面兩種方案,都是采用硬編碼,那么有沒有通用的技術方案。不關心你是什么業務,寫入什么數據,對平臺來講可以抽象成一張張 MySQL 表,直接同步表數據。只有使用方才真正去關心數據內容。

可以參考 MySQL 的主從同步原理,拉取 binlog,只要將里面的數據解析出來即可。

流行的中間件是阿里開源的 Canal,今天我們就來做個技術方案,大概內容如下:

一、Canal 介紹

Canal,譯意為水道/管道/溝渠,主要用途是基于 MySQL 數據庫增量日志解析,提供增量數據訂閱和消費。

Canal 誕生之初是為了解決多個備庫與主庫間數據同步,對主庫造成的壓力。

慢慢的,這個管道被發揚光大,應用場景也越來越多

工作原理很簡單,把自己偽裝成 MySQL 的 slave,模擬 MySQL slave 的交互協議向 MySQL master 發送 dump 請求。

MySQL master 收到canal發送過來的dump請求,開始推送binary log給canal,然后canal解析binlog 日志,再存儲到不同的存儲介質中,比如:MySQL、Kafka、Elastic Search、Pulsar 等

業務場景:

  • 數據庫實時備份
  • ES 數據索引的構建和維護
  • 分布式緩存(如:Redis)的同步維護
  • 數據異構,訂閱方可以按自己的業務需求訂閱消費,如:Kafka、Pulsar 等

二、安裝 MySQL

1、拉取 MySQL 鏡像

  1. docker pull mysql:5.7 

2、查看鏡像

  1. docker images 

3、啟動 MySQL 進程

  1. docker run \ 
  2. --name mysql \ 
  3. -p 3306:3306 \ 
  4. -e MYSQL_ROOT_PASSWORD=123456 \ 
  5. -d mysql:5.7 

4、查看進程

  1. [root@iZbp12gqydkgwid86ftoauZ mysql]# docker ps -a 
  2. CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES 
  3. e92827897538   mysql     "docker-entrypoint.s…"   4 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql 

5、進入 MySQL 容器

  1. docker exec -it 167bfa3785f1 /bin/bash 

注意:修改一些配置文件,可能會遇到一些問題,如:

docker容器中使用vi或vim提示bash: vi: command not found的處理方法

因為沒有安裝vi編輯器,可以執行下面命令

  1. apt-get update 
  2. apt-get install vim 

6、常用 MySQL 客戶端命令

  1. # 登陸 mysql 
  2. mysql -uroot -p111111 
  3.  
  4. # 顯示數據庫列表 
  5. show databases; 
  6.  
  7. # 選擇數據庫 
  8. use mysql; 
  9.  
  10. # 顯示所有表 
  11. show tables; 
  12.  
  13. # 顯示表結構 
  14. describe 表名; 
  15.  
  16. 其他更多命令: 
  17. https://www.cnblogs.com/bluecobra/archive/2012/01/11/2318922.html 

三、MySQL 相關配置

創建一個 MySQL 用戶,用戶名:tom ,密碼:123456

  1. create user 'tom'@'%' identified by '123456'

為用戶:tom 授予所有庫的讀寫權限

  1. grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'tom'@'%' identified by '123456'

修改 MySQL 配置文件 my.cnf,位置:/etc/my.cnf

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

注意:需要重啟MySQL容器實例,執行命令 docker restart mysql

查看binlog模式:

查看binlog日志文件列表:

查看當前正在寫入的binlog文件:

四、安裝 Canal

1、從官網下載安裝包

下載地址:

https://github.com/alibaba/canal/releases

本文實驗用的是最新版本 v1.1.5,主要是對不同的客戶端的個性化支持,屬于生態擴展。

其他更多特性,大家可以去官網查看

解壓 tar.gz 壓縮包

  1. tar -zxvf canal.deployer-1.1.5.tar.gz  

打開配置文件 conf/example/instance.properties,修改配置如下:

  1. ## v1.0.26版本后會自動生成slaveId,所以可以不用配置 
  2. # canal.instance.mysql.slaveId=0 
  3.  
  4. # 數據庫地址 
  5. canal.instance.master.address=127.0.0.1:3306 
  6. # binlog日志名稱 
  7. canal.instance.master.journal.name=mysql-bin.000001 
  8. # mysql主庫鏈接時起始的binlog偏移量 
  9. canal.instance.master.position=156 
  10. # mysql主庫鏈接時起始的binlog的時間戳 
  11. canal.instance.master.timestamp
  12. canal.instance.master.gtid= 
  13.  
  14. # username/password 
  15. # 在MySQL服務器授權的賬號密碼 
  16. canal.instance.dbUsername=root 
  17. canal.instance.dbPassword=111111 
  18. # 字符集 
  19. canal.instance.connectionCharset = UTF-8 
  20. # enable druid Decrypt database password 
  21. canal.instance.enableDruid=false 
  22.  
  23. table regex .*\\..*表示監聽所有表 也可以寫具體的表名,用,隔開 
  24. canal.instance.filter.regex=.*\\..* 
  25. # mysql 數據解析表的黑名單,多個表用,隔開 
  26. canal.instance.filter.black.regex= 

啟動命令

  1. ./startup.sh 

由于采用的阿里云的 ECS 服務器,發現沒有安裝 JAVA 環境。

Oracle 官網下載 JDK 8 的安裝包

下載地址:

https://www.oracle.com/java/technologies/downloads/#java8

然后,通過下面的命令將安裝包上傳到 ECS 服務器

  1. scp jdk-8u311-linux-x64.tar.gz root@118.31.168.234:/root/java      //上傳文件 

安裝 JDK 8 環境

文檔:https://developer.aliyun.com/article/701864

五、啟動 Canal

進入 canal.deployer-1.1.5/bin

執行啟動腳本:

  1. ./startup.sh  

進入 canal.deployer-1.1.5/logs/example

如果 example.log 日志文件中,出現下面的內容,表示啟動成功

  1. 2022-01-03 08:23:10.165 [canal-instance-scan-0] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - stop CannalInstance for null-example  
  2. 2022-01-03 08:23:10.177 [canal-instance-scan-0] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - stop successful.... 
  3. 2022-01-03 08:23:10.298 [canal-instance-scan-0] INFO  c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example  
  4. 2022-01-03 08:23:10.298 [canal-instance-scan-0] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^.*\..*$ 
  5. 2022-01-03 08:23:10.298 [canal-instance-scan-0] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter : ^mysql\.slave_.*$ 
  6. 2022-01-03 08:23:10.299 [canal-instance-scan-0] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - start successful.... 

六、工程實驗

創建一個 SpringBoot 工程,spring-boot-bulking-canal

引入相關pom依賴

  1. <dependency> 
  2.     <groupId>com.alibaba.otter</groupId> 
  3.     <artifactId>canal.client</artifactId> 
  4.     <version>1.1.4</version> 
  5. </dependency> 

 

編寫java類,與 canal 服務端 建立連接,拉取數據庫的變更數據

  1. // 創建鏈接 
  2. CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1", 11111), "example"""""); 
  3. try { 
  4.     //打開連接 
  5.     connector.connect(); 
  6.     //訂閱全部表 
  7.     connector.subscribe(".*\\..*"); 
  8.     //回滾到未進行ack的地方,下次fetch的時候,可以從最后一個沒有ack的地方開始拿 
  9.     connector.rollback(); 
  10.     while (true) { 
  11.         Message message = connector.getWithoutAck(BATCH_SIZE); 
  12.         long batchId = message.getId(); 
  13.         printEntry(message.getEntries()); 
  14.         // batch id 提交 
  15.         connector.ack(batchId); 
  16.     } 
  17. } catch (Exception e) { 
  18.     e.printStackTrace(); 
  19. } finally { 
  20.     connector.disconnect(); 

在 ds1 數據庫下創建 MySQL 表

  1. CREATE TABLE `person` ( 
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵'
  3.   `income` bigint(20) NOT NULL COMMENT '收入'
  4.   `expend` bigint(20) NOT NULL COMMENT '支出'
  5.   PRIMARY KEY (`id`), 
  6.   KEY `idx_income` (`income`) 
  7. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='個人收支表'

插入一條記錄:

  1. insert into person values(100,1000,1000); 

Java類解析binlog,在控制臺打印變更日志:

  1. binlog[mysql-bin.000002:1946] , table[ds1,person] , eventType : INSERT 
  2. id : 100    update=true 
  3. income : 1000    update=true 
  4. expend : 1000    update=true 

對 id=100 記錄做修改:

  1. update person set income=2000, expend=2000 where id=100; 

控制臺打印變更日志:

  1. binlog[mysql-bin.000002:2252] , table[ds1,person] , eventType : UPDATE 
  2. ------->; before 
  3. id : 100    update=false 
  4. income : 1000    update=false 
  5. expend : 1000    update=false 
  6. ------->; after 
  7. id : 100    update=false 
  8. income : 2000    update=true 
  9. expend : 2000    update=true 

 

 

責任編輯:武曉燕 來源: 微觀技術
相關推薦

2022-05-27 15:41:22

微軟騰訊

2018-08-27 08:49:56

工資跳槽互聯網

2019-07-17 15:53:54

AIIBM績效管理

2020-12-15 16:44:48

代碼程序運行

2010-01-25 10:27:59

國內IT業工資

2018-05-14 13:51:39

RDS Binlog架構Kafka集群

2009-11-23 09:15:07

AMD英特爾

2015-11-19 13:37:06

創業底層燒錢

2020-02-28 16:02:21

MySQL異構同步

2011-09-30 13:37:35

51CTO博客一周熱門薪酬

2020-11-02 09:53:13

Hive數據算法

2020-03-15 13:57:08

開發薪水技術

2018-09-03 11:30:44

跳槽潛規則工資

2024-11-28 09:23:09

2018-12-29 16:32:14

運維Linux開源

2024-11-26 08:05:44

2022-05-23 08:20:29

Kafka生產者元數據管理

2019-06-14 10:30:18

程序員項目開源

2009-06-18 10:20:00

AJAX推送

2024-10-10 17:27:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色噜噜狠狠色综合中国 | 亚洲一区二区三区免费在线观看 | 成人精品一区二区三区中文字幕 | 亚洲永久 | 欧美三级成人理伦 | 亚洲精品视频久久 | av天天看 | 毛片com| 国产精品久久在线观看 | 亚洲啪啪| 中文字幕亚洲一区 | 免费一级黄| 免费在线一区二区 | 国产98色在线 | 日韩 | 亚洲国产成人av | 91国在线| 亚洲国产免费 | 91社区视频 | 欧美日韩亚洲一区二区 | 欧美日韩在线精品 | 成人高清在线视频 | 91视视频在线观看入口直接观看 | 天天综合久久 | 国产精品日韩欧美一区二区 | 99视频 | 免费三级黄 | 国产精品美女久久久久久免费 | 国产午夜精品理论片a大结局 | 国产一区二区三区四区在线观看 | 91日b| 久久激情视频 | 亚洲av毛片 | 国产一区二区在线视频 | 国产成人叼嘿视频在线观看 | 成人av电影在线观看 | 91九色porny首页最多播放 | 亚洲高清视频在线观看 | 国产成人综合一区二区三区 | 欧美一二三四成人免费视频 | 91五月婷蜜桃综合 | 欧美一级黄带 |