Apache Doris 跨集群数据同步 CCR 全面介绍

news2024/12/24 19:28:56

CCR 概述

CCR(Cross Cluster Replication)也就是跨集群数据复制,能够在库/表级别将源集群的数据变更同步到目标集群,可用于提升在线服务的数据可用性、隔离在离线负载、建设两地三中心等。

CCR 通常被用于容灾备份、读写分离、集团与公司间数据传输和隔离升级等场景。

容灾备份:通常是将企业的数据备份到另一个集群与机房中,当突发事件导致业务中断或丢失时,可以从备份中恢复数据或快速进行主备切换。一般在对 SLA 要求比较高的场景中,都需要进行容灾备份,比如在金融、医疗、电子商务等领域中比较常见。

读写分离:读写分离是将数据的查询操作和写入操作进行分离,目的是降低读写操作的相互影响并提升资源的利用率。比如在数据库写入压力过大或在高并发场景中,采用读写分离可以将读/写操作分散到多个地域的只读/只写的数据库案例上,减少读写间的互相影响,有效保证数据库的性能及稳定性。

集团与分公司间数据传输:集团总部为了对集团内数据进行统一管控和分析,通常需要分布在各地域的分公司及时将数据传输同步到集团总部,避免因为数据不一致而引起的管理混乱和决策错误,有利于提高集团的管理效率和决策质量。

隔离升级:当在对系统集群升级时,有可能因为某些原因需要进行版本回滚,传统的升级模式往往会因为元数据不兼容的原因无法回滚。而使用 CCR 可以解决该问题,先构建一个备用的集群进行升级并双跑验证,用户可以依次升级各个集群,同时 CCR 也不依赖特定版本,使版本的回滚变得可行。

原理

名词解释

源集群 (srcCluster):业务写入数据的集群 目标集群 (destCluster):跨集群复制的目标集群 binlog:源集群变更日志,记录了源集群的数据修改和操作,是目标集群数据重放和恢复的凭据 Syncer:一个轻量的CCR任务控制节点,可以单节点部署,也可以多节点高可用部署

架构说明

Syncer从源集群批量获取库/表的binlog,并根据binlog中的信息在目标集群重放,从而实现数据的全量/增量复制。

如果binlog是数据变更,则通知目标集群从源集群拉取数据。

如果binlog是元数据变更,则在目标集群发起对应的操作。

注:需要Doris 2.0 以上版本

使用说明

  1. 在fe.conf、be.conf中打开binlog feature配置项
enable_feature_binlog = true
  1. 部署源、目标doris集群
  2. 部署Syncer
git clone https://github.com/selectdb/ccr-syncer
cd ccr-syncer

# -j 开启多线程编译# --output指定输出的路径名称,默认名称为output
bash build.sh <-j NUM_OF_THREAD> <--output SYNCER_OUTPUT_DIR>cd SYNCER_OUTPUT_DIR

# 启动syncer,加上--daemon使syncer在后台运行
bash bin/start_syncer.sh --daemon

# 停止syncer
bash bin/stop_syncer.sh

更多启动选项参考启动配置,停止Syncer请见停止说明

  1. 打开源集群中被同步库/表的binlog
-- enable database binlog
ALTER DATABASE db_name SET properties ("binlog.enable" = "true");

-- enable table binlog
ALTER TABLE table_name SET ("binlog.enable" = "true");

如果是库同步,则需要打开库中所有表的binlog.enable,这个过程可以通过脚本快速完成,脚本的使用方法见脚本说明文档

  1. 向Syncer发起同步任务
curl -X POST -H "Content-Type: application/json" -d '{
    "name": "ccr_test",    
    "src": {    
    "host": "localhost",    
    "port": "9030",    
    "thrift_port": "9020",    
    "user": "root",    
    "password": "",    
    "database": "demo",    
    "table": "example_tbl"    
    },    
    "dest": {    
    "host": "localhost",    
    "port": "9030",    
    "thrift_port": "9020",    
    "user": "root",    
    "password": "",    
    "database": "ccrt",    
    "table": "copy"    
    }}' http://127.0.0.1:9190/create_ccr
  • name: CCR同步任务的名称,唯一即可
  • host、port:对应集群master的host和mysql(jdbc) 的端口
  • thrift_port:对应FE的rpc_port
  • user、password:syncer以何种身份去开启事务、拉取数据等
  • database、table:
    • 如果是db级别的同步,则填入dbName,tableName为空
    • 如果是表级别同步,则需要填入dbName、tableName

其他操作详见操作列表

Syncer操作列表

请求的通用模板

curl -X POST -H "Content-Type: application/json" -d {json_body} http://ccr_syncer_host:ccr_syncer_port/operator

json_body: 以json的格式发送操作所需信息

operator:对应Syncer的不同操作

operators

  • get_lag 查看同步进度
curl -X POST -L --post303 -H "Content-Type: application/json" -d '{    "name": "job_name"}' http://ccr_syncer_host:ccr_syncer_port/get_lag

其中job_name是create_ccr时创建的name

  • pause 暂停同步任务
curl -X POST -L --post303 -H "Content-Type: application/json" -d '{    "name": "job_name"}' http://ccr_syncer_host:ccr_syncer_port/pause
  • resume 恢复同步任务
curl -X POST -L --post303 -H "Content-Type: application/json" -d '{    "name": "job_name"}' http://ccr_syncer_host:ccr_syncer_port/resume
  • delete 删除同步任务
curl -X POST -L --post303 -H "Content-Type: application/json" -d '{    "name": "job_name"}' http://ccr_syncer_host:ccr_syncer_port/delete
  • list_jobs 列出所有job名称
curl -X POST -L --post303 -H "Content-Type: application/json" -d '{}' http://ccr_syncer_host:ccr_syncer_port/list_jobs
  • job_detail 展示job的详细信息
curl -X POST -L --post303 -H "Content-Type: application/json" -d '{    "name": "job_name"}' http://ccr_syncer_host:ccr_syncer_port/job_detail
  • job_progress 展示job的详细进度信息
curl -X POST -L --post303 -H "Content-Type: application/json" -d '{    "name": "job_name"}' http://ccr_syncer_host:ccr_syncer_port/job_progress
  • metrics 获取golang以及ccr job的metrics信息
curl -L --post303 http://ccr_syncer_host:ccr_syncer_port/metrics 

启动说明

根据配置选项启动Syncer,并且在默认或指定路径下保存一个pid文件,pid文件的命名方式为host_port.pid

输出路径下的文件结构

在编译完成后的输出路径下,文件结构大致如下所示:

output_dir
    bin
        ccr_syncer
        enable_db_binlog.sh
        start_syncer.sh
        stop_syncer.sh
    db
        [ccr.db] # 默认配置下运行后生成
    log
        [ccr_syncer.log] # 默认配置下运行后生成

后文中的start_syncer.sh指的是该路径下的start_syncer.sh!!!

启动选项

–daemon

后台运行Syncer,默认为false

bash bin/start_syncer.sh --daemon

–db_type

Syncer目前能够使用两种数据库来保存自身的元数据,分别为sqlite3(对应本地存储)和mysql 或者postgresql(本地或远端存储)

bash bin/start_syncer.sh --db_type mysql

默认值为sqlite3 在使用mysql或者postgresql存储元数据时,Syncer会使用CREATE IF NOT EXISTS来创建一个名为ccr的库,ccr相关的元数据表都会保存在其中

–db_dir

这个选项仅在db使用**sqlite3**时生效 可以通过此选项来指定sqlite3生成的db文件名及路径。

bash bin/start_syncer.sh --db_dir /path/to/ccr.db

默认路径为SYNCER_OUTPUT_DIR/db,文件名为ccr.db

–db_host & db_port & db_user & db_password

这个选项仅在db使用**mysql或者postgresql**时生效

bash bin/start_syncer.sh --db_host 127.0.0.1 --db_port 3306 --db_user root --db_password "qwe123456"

db_host、db_port的默认值如例子中所示,db_user、db_password默认值为空

–log_dir

日志的输出路径

bash bin/start_syncer.sh --log_dir /path/to/ccr_syncer.log

默认路径为SYNCER_OUTPUT_DIR/log,文件名为ccr_syncer.log

–log_level

用于指定Syncer日志的输出等级。

bash bin/start_syncer.sh --log_level info
time         level        msg                  hooks
[2023-07-18 16:30:18] TRACE This is trace type. ccrName=xxx line=xxx
[2023-07-18 16:30:18] DEBUG This is debug type. ccrName=xxx line=xxx
[2023-07-18 16:30:18]  INFO This is info type. ccrName=xxx line=xxx
[2023-07-18 16:30:18]  WARN This is warn type. ccrName=xxx line=xxx
[2023-07-18 16:30:18] ERROR This is error type. ccrName=xxx line=xxx
[2023-07-18 16:30:18] FATAL This is fatal type. ccrName=xxx line=xxx

在–daemon下,log_level默认值为info 在前台运行时,log_level默认值为trace,同时日志会通过 tee 来保存到log_dir

–host && --port

用于指定Syncer的host和port,其中host只起到在集群中的区分自身的作用,可以理解为Syncer的name,集群中Syncer的名称为host:port

bash bin/start_syncer.sh --host 127.0.0.1 --port 9190

host默认值为127.0.0.1,port的默认值为9190

–pid_dir

用于指定pid文件的保存路径

pid文件是stop_syncer.sh脚本用于关闭Syncer的凭据,里面保存了对应Syncer的进程号,为了方便Syncer的集群化管理,可以指定pid文件的保存路径

bash bin/start_syncer.sh --pid_dir /path/to/pids

默认值为SYNCER_OUTPUT_DIR/bin

–commit_txn_timeout

用于指定提交事务超时时间

bash bin/start_syncer.sh --commit_txn_timeout 33s

默认值为33s

–connect_timeout duration

用于指定连接超时时间

bash bin/start_syncer.sh --connect_timeout 10s

默认值为1s

–local_repo_name string

用于指定本地仓库名称

bash bin/start_syncer.sh --local_repo_name "repo_name"

默认值为""

–rpc_timeout duration

用于指定rpc超时时间

bash bin/start_syncer.sh --rpc_timeout 30s

默认值为3s

停止说明

根据默认或指定路径下pid文件中的进程号关闭对应Syncer,pid文件的命名方式为host_port.pid

输出路径下的文件结构

在编译完成后的输出路径下,文件结构大致如下所示:

output_dir
    bin
        ccr_syncer
        enable_db_binlog.sh
        start_syncer.sh
        stop_syncer.sh
    db
        [ccr.db] # 默认配置下运行后生成
    log
        [ccr_syncer.log] # 默认配置下运行后生成

后文中的stop_syncer.sh指的是该路径下的stop_syncer.sh!!!

停止选项

有三种关闭方法:

  1. 关闭目录下单个Syncer 指定要关闭Syncer的host && port,注意要与start_syncer时指定的host一致
  2. 批量关闭目录下指定Syncer 指定要关闭的pid文件名,以空格分隔,用" "包裹
  3. 关闭目录下所有Syncer 默认即可

–pid_dir

指定pid文件所在目录,上述三种关闭方法都依赖于pid文件的所在目录执行

bash bin/stop_syncer.sh --pid_dir /path/to/pids

例子中的执行效果就是关闭/path/to/pids下所有pid文件对应的Syncers(方法3),--pid_dir可与上面三种关闭方法组合使用。

默认值为SYNCER_OUTPUT_DIR/bin

–host && --port

关闭pid_dir路径下host:port对应的Syncer

bash bin/stop_syncer.sh --host 127.0.0.1 --port 9190

host的默认值为127.0.0.1,port默认值为空 即,单独指定host时方法1不生效,会退化为方法3。 host与port都不为空时方法1才能生效

–files

关闭pid_dir路径下指定pid文件名对应的Syncer

bash bin/stop_syncer.sh --files "127.0.0.1_9190.pid 127.0.0.1_9191.pid"

文件之间用空格分隔,整体需要用" "包裹住

开启库中所有表的binlog

输出路径下的文件结构

在编译完成后的输出路径下,文件结构大致如下所示:

output_dir
    bin
        ccr_syncer
        enable_db_binlog.sh
        start_syncer.sh
        stop_syncer.sh
    db
        [ccr.db] # 默认配置下运行后生成
    log
        [ccr_syncer.log] # 默认配置下运行后生成

后文中的enable_db_binlog.sh指的是该路径下的enable_db_binlog.sh!!!

使用说明

bash bin/enable_db_binlog.sh -h host -p port -u user -P password -d db

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

末代皇帝Intel核显黑苹果,NUC10的性能到底有多强

末代皇帝Intel核显黑苹果&#xff0c;NUC10的性能到底有多强 一、可以核显的Intel iGPU有哪些 核显是一个伟大的产物&#xff0c;它可以在我们没有多余的钱去买多余的显卡的时候排上用场&#xff0c;特别是在mini小主机的市场上&#xff0c;核显就显得尤为重要的&#xff0c;…

图形化的Agent工具

1 图形化 Agent 工具 1.1 核心组件 机器人 Bot&#xff1a;一个 AI 应用&#xff0c;或称为 Agent知识库&#xff1a;上传个人数据&#xff0c;机器人可根据其内容进行回复工作流&#xff1a;将大问题拆解成多个小问题&#xff0c;通过路径实现&#xff0c;路径上的每个节点完…

tomcat实战演练

一.tomcat介绍 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c; Tomcat 具有处理 HTML 页面的功能&#xff0c;它还是一个 Servlet 和 JSP容器。Tomc…

Python优化算法13——飞蛾扑火优化算法(MFO)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

三种插入排序详解和代码实现(直接插入排序、折半插入排序和希尔排序)

目录 基本思想直接插入排序排序方法代码实现复杂度分析 折半插入排序排序方法代码实现复杂度分析 希尔排序排序方法代码实现复杂度分析最佳情况平均情况最坏情况增量序列的影响 基本思想 插入排序的基本思想是&#xff1a;每一趟将一个待排序的元素按照其关键字的大小插入到已经…

Hadoop 分布式集群搭建

HDFS分布式集群搭建 一、部署规划1.1 进程规划1.2 软件规划1.3 用户规划1.4 目录规划 二、 搭建HDFS 分布式集群2.1 HDFS 集群配置2.1.1 下载安装 Hadoop2.1.2 修改 hadoop-env.sh 配置文件2.1.3 修改 core-site.xml 配置文件2.1.4 修改 hdfs-site.xml 配置文件2.1.5 修改 slav…

力扣刷题(1)

两数之和 两数之和-力扣 思路&#xff1a; 动态开辟一个数组&#xff0c;用来存放下标&#xff1b;两个for循环嵌套来判断&#xff0c;数组中的两个数相加是否与target相等若相等&#xff0c;则将 * returnSize赋值为2&#xff0c;表示数组中两个数&#xff0c;并将arr数组…

数学建模之数据分析【九】:数据清理总结

文章目录 一、什么是数据清理二、为什么数据清理很重要三、执行数据清洁的步骤四、如何执行数据清理五、数据清理的Python库实现5.1 数据检查与探索5.2 使用df.info()检查数据信息5.3 检查分类和数字列5.4 检查分类列中唯一值的总数5.5 执行数据清理的步骤5.5.1 删除所有上述不…

真的爽到了!Coze的黑神话 “循环“ 闪亮登场,啥都能循环,让你一次通关!

心心念念了很久&#xff0c;Coze工作流终于支持循环操作啦&#xff0c;泪奔~~ 看&#xff0c;就在工作流节点的“选择器”和“意图识别”当中偷偷摸摸地多了一个“循环” 这玩意可比批处理强太多了&#xff0c;批处理只能在当前节点循环&#xff0c;做一些简单的循环任务还不错…

【日记】狗尾巴草与暗恋(1519 字)

写在前面 消极内容注意 正文 好想吃火龙果。 下周会变得异常艰难。因为事情已经垒到天上去了&#xff0c;还要来检查。 上午&#xff0c;同事送了一点水果&#xff0c;我从来没见过。问了一下别人&#xff0c;有的说是灯笼果&#xff0c;有的说是菇凉果、姑娘果。搜了一下&am…

深入理解Elasticsearch:让搜索性能飞起来!

Elasticsearch 概述 Elasticsearch是一个基于lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。 ELK 技术栈是Elasticsearch、Logstash、Kibana三大开元框架首字母大写简称。 而Elasticsearch 是一个开源的高扩展的分布式全文搜索引擎&#xff0c; 是整个 ELK技术…

polarctf靶场[WEB]Don‘t touch me、机器人、uploader、扫扫看

目录 [web]Dont touch me 考点&#xff1a;查看源代码、前端 [web]机器人 考点&#xff1a;robot协议 工具&#xff1a;御剑&#xff0c;kali dirsearch [web]覆盖 考点&#xff1a;parse_str覆盖 [web]扫扫看 考点&#xff1a;目录扫描 工具&#xff1a;御剑、kali d…

【冒泡排序算法】输入n个数进行排序

要求&#xff1a;输入n个数进行排序 实现&#xff1a;使用冒泡排序算法&#xff0c;使用C语言实现 冒泡排序的基本原理&#xff1a; 比较相邻元素&#xff1a;从数组的开始位置&#xff0c;比较每对相邻的元素。如果前一个元素大于后一个元素&#xff0c;则交换它们。重复过…

数组基本知识2

目录 前言 二维数组 使用原因 定义二维数组 访问数组元素 实例 前言 上一篇&#xff0c;我简单的复习了一维数组&#xff0c;本篇讲述二维数组的基本知识&#xff0c;帮助大家预习和复习。 二维数组 使用原因 本质原因&#xff1a;一维数组&#xff0c;已经无法满足解决…

OSPF路由配置--单区域

目录 因为OSPF有很多重要的特殊区域和内容,所以划分为多篇博客来配置 一. 实验拓扑图 二. 实验配置 三. 实验验证: 因为OSPF有很多重要的特殊区域和内容,所以划分为多篇博客来配置 不理解OSPF路由动态协议的可以回顾一下OSPF详解&#xff0c;下这一系列的实验都不再做解…

SpringBoot集成kafka-消息转发@sendTo()注解

SpringBoot集成kafka-消息转发sendTo 1、消费者2、生产者3、实体类对象4、JSON工具类5、配置文件application.yml6、测试类7、测试 1、消费者 启动消费者进行消息监听&#xff0c;消费者A监听到生产者发送的消息使用sendTo()注解将消息转发给消费者B package com.power.consu…

在树莓派5上使用pytroch进行模型训练—全流程笔记

在树莓派上运行pytroch模型&#x1f680; 在完成了树莓派的一系列基础配置学习之后&#xff0c;按照规划&#xff0c;下一步要做的就是在树莓派上安装一个pytorch&#xff0c;尝试运行一下深度学习的模型&#xff0c;如果可以实现且准速度有一定保证的话&#xff0c;就可以作为…

代码随想录算法训练营第50天|卡码网 98. 所有可达路径

1.卡码网 98. 所有可达路径 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1170 文章链接&#xff1a;https://www.programmercarl.com/kamacoder/0098.所有可达路径.html#总结 1.图的存储 本题我们使用邻接表 或者 邻接矩阵都可以&#xff0c;因为后台数据…

掌握路演艺术:创新大赛路演稿撰写指南

如何在创新大赛中脱颖而出&#xff1f;一份精心准备的路演稿是关键 前言开场白&#xff1a;抓住注意力的第一步项目概述&#xff1a;清晰传达核心价值市场分析&#xff1a;展示项目的市场潜力商业模式与盈利计划&#xff1a;务实的策略团队介绍&#xff1a;展现团队的实力与文化…

vue3的nginx配置文件配置(nginx只配置前端vue3的nginx.conf文件)

1、本地的访问网址的链接 http://localhost:5173/official-website/ 2、程序的配置 3、nginx.conf配置 #user nobody; worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream;log_format main…