最近需求需要使用 es,并要求 mysql 与 es 做到秒级别的数据同步。梳理了一些 mysql 与 es 间数据同步的常见方案。
mysql 与 es 数据同步,目前方案主要有:
写 mysql 的同时写 es。
优点:这种方式简单粗暴,实时写入能做到秒级。
缺点:这种方式代码侵入性强,要在之前写 mysql 的地方加写 es 的代码。以后写 mysql 的地方也要加写 es 的代码。
解析 binlog -> 发 kafka 消息 -> 消费 kafka 消息 -> 写 es。
(这里的 kafka 代指消息队列 message queue,具体 mq 选什么可自行替换)
优点:这种方式的好处是代码侵入性低,不需要在之前写 mysql 的地方加写 es 的代码。以后写 mysql 的地方也不需要再额外地写 es。
缺点:这种方式做不到秒级同步,比如kafka 那里消息如果有堆积。即使 kafka 没有消息堆积,这个流程走下来 1 秒也很难完成。而且这种方式的同步延时和数据量有关系。比如一次写十万行,和一次写一两行,数据同步的延时不同。
logstash 并不局限于收集日志,它本身是一个通道的概念。收集的数据从一端进入,从另一端出来时灌入 es。可以理解为是专门把收集的数据传输至 es 的一个通道。
logstash 可以编写脚本,脚本可以定时地被调度。脚本由同事提供,敏感信息已屏蔽,和真实 sql 不同。由于屏蔽敏感信息,脚本可能不正确,仅供示意,logstash 脚本的编写请另行参考。
input {
stdin {
}
log {
# log 的位置
}
jdbc {
#jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/my_testdb?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/myTable?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
jdbc_user => "myUser"
jdbc_password => "myPass"
jdbc_driver_library => "D:\myES\logstash-7.4.1\logstash-core\lib\jars\mysql-connector-java-5.1.48.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
statement => "SELECT
*
FROM
extension
WHERE
type = 1
"
schedule => "*/1 * * * * *"
# 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
record_last_run => true
# 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
use_column_value => true
# 需要记录的字段,用于增量同步,需是数据库字段
#tracking_column => "monitor_time"
tracking_column => "unix_ts"
#tracking_column_type => "timestamp"
# record_last_run上次数据存放位置;
last_run_metadata_path => "D:\myES\logstash-7.4.1\bin\mysql\last_value\sql_last_value.txt"
# 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
clean_run => false
}
}
# gsub => ["extension_config", , "/"]
# gsub => [ # 用下划线替换所有正斜杠"fieldname" , "/" , "_" , #用点 "."替换反斜杠、问号、哈希和减号# "fieldname2" , "[\\?#-]" , "." ] } }
filter {
mutate {
gsub => ["extension_config","[\\\*]", ""]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "extmarket"
document_id => "%{id}"
}
}
上述脚本中 input 内容表示收集数据的来源。
input 中编写了 sql,用来查询从 mysql 中要同步到 es 的数据。input 中后续脚本对数据格式进行了整理。
output 中的内容,表示把收集整理好的数据,灌入 es。
如果每秒调度一次 logstash 的脚本,就可以每秒执行一次 sql 收集 mysql 表中的数据,然后灌入 es。
这种方式能否实现秒级的数据同步,取决于 mysql 表中的数据量和用来收集数据的 sql 执行时间。如果 mysql 表中数据量不大且 sql 能在 1 秒内执行完毕,这种方式实现秒级的数据同步还是有希望的。当然能否真正做到秒级的数据同步,除了 sql 以外,其他环节(比如整理数据格式,传输至 es)的耗时也要考虑。
如果必须用 es,且对于数据实时性、接口响应耗时要求特别高,可以考虑异步落库的方案。实时写 es,异步地发 kafka 消息写数据库。
当然这样异步落库需要关注数据一致性的问题,如果发生了数据不一致,要考虑对 mysql 补偿的机制。
(这里的 kafka 代指消息队列 message queue,具体 mq 选什么可自行替换)
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手