当前位置: 首页 > news >正文

着陆页制作网站各行各业网站建设服务周到

着陆页制作网站,各行各业网站建设服务周到,软件平台架构,河津失信被执行人名单查询一、 概述工作需要研究了下阿里开源的MySQL Binlog增量订阅消费组件canal#xff0c;其功能强大、运行稳定#xff0c;但是有些方面不是太符合需求#xff0c;主要有如下三点#xff1a;需要自己编写客户端来消费canal解析到的数据server-client模式#xff0c;需要同时部…一、 概述工作需要研究了下阿里开源的MySQL Binlog增量订阅消费组件canal其功能强大、运行稳定但是有些方面不是太符合需求主要有如下三点需要自己编写客户端来消费canal解析到的数据server-client模式需要同时部署server和client两个组件我们的项目中有6个业务数据库要实时同步到redis意味着要多部署12个组件硬件和运维成本都会增加。从server端到client端需要经过一次网络传输和序列化反序列化操作然后再同步到接收端感觉没有直接怼到接收端更高效。go-mysql-transfer是使用Go语言实现的MySQL数据库实时增量同步工具 参考Canal但是规避了上述三点。旨在实现一个高性能、低延迟、简洁易用的Binlog增量数据同步管道, 具有如下特点不依赖其它组件一键部署集成多种接收端如Redis、MongoDB、Elasticsearch、RocketMQ、Kafka、RabbitMQ不需要再编写客户端开箱即用内置丰富的数据解析、消息生成规则支持Lua脚本以处理更复杂的数据逻辑支持监控告警集成Prometheus客户端高可用集群部署数据同步失败重试全量数据初始化二、 与同类工具比较三、 设计实现1、实现原理go-mysql-transfer将自己伪装成MySQL的Slave向Master发送dump协议获取binlog解析binlog并生成消息实时发送给接收端。2、数据转换规则将从binlog解析出来的数据经过简单的处理转换发送到接收端。使用内置丰富数数据转换规则可完成大部分同步工作。例如将表t_user同步到reids配置如下规则rule:-schema: eseap #数据库名称table: t_user #表名称column_underscore_to_camel: true #列名称下划线转驼峰,默认为falsedatetime_formatter: yyyy-MM-dd HH:mm:ss #datetime、timestamp类型格式化不填写默认yyyy-MM-dd HH:mm:ssvalue_encoder: json #值编码类型支持json、kv-commas、v-commasredis_structure: string # redis数据类型。支持string、hash、list、set类型(与redis的数据类型一致)redis_key_prefix: USER_ #key前缀redis_key_column: USER_NAME #使用哪个列的值作为key不填写默认使用主键t_user表数据如下同步到Redis后数据如下更多规则配置和同步案例 请见后续的使用说明章节。3、数据转换脚本Lua 是一种轻量小巧的脚本语言 其设计目的是为了嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。开发者只需要花费少量时间就能大致掌握Lua的语法照虎画猫写出可用的脚本。基于Lua的高扩展性可以实现更为复杂的数据解析、消息生成逻辑定制需要的数据格式。使用方式rule:-schema: eseaptable: t_userlua_file_path: lua/t_user_string.lua #lua脚本文件示例脚本local json require(json) -- 加载json模块local ops require(redisOps) -- 加载redis操作模块local row ops.rawRow() --当前变动的一行数据,table类型key为列名称local action ops.rawAction() --当前数据库的操作事件,包括insert、updare、deletelocal id row[ID] --获取ID列的值local userName row[USER_NAME] --获取USER_NAME列的值local key user_..id -- 定义keyif action delete -- 删除事件thenops.DEL(key) -- 删除KEYelselocal password row[PASSWORD] --获取USER_NAME列的值local createTime row[CREATE_TIME] --获取CREATE_TIME列的值local result {} -- 定义结果result[id] idresult[userName] userNameresult[password] passwordresult[createTime] createTimeresult[source] binlog -- 数据来源local val json.encode(result) -- 将result转为jsonops.SET(key,val) -- 对应Redis的SET命令第一个参数为key(string类型)第二个参数为valueendt_user表数据如下同步到Redis后数据如下更多Lua脚本使用说明 和同步案例 请见后续的使用说明章节。4、监控告警Prometheus是流行开源监控报警系统和TSDB其指标采集组件被称作exporter。go-mysql-transfer本身就是一个exporter。向Prometheus提供应用状态、接收端状态、insert数量、update数量、delete数量、delay延时等指标。go-mysql-transfer内置Prometheus exporter可以监控系统的运行状况并进行健康告警。相关配置enable_exporter: true #启用prometheus exporter默认falseexporter_addr: 9595 #prometheus exporter端口默认9595直接访问127.0.0.1:9595可以看到导出的指标值如何与Prometheus集成请参见Prometheus相关教程。指标说明transfer_leader_state当前节点是否为leader0否、1是 transfer_destination_state接收端状态 0掉线、1正常 transfer_inserted_num插入数据的数量 transfer_updated_num修改数据的数量 transfer_deleted_num删除数据的数量 transfer_delay与MySQL Master的时延5、高可用可以选择依赖zookeeper或者etcdr构建高可用集群一个集群中只存在一个leader节点其余皆为follower节点。只有leader节点响应binglog的dump事件follower节点为蛰伏状态不发送dump命令因此多个follower也不会加重Master的负担。当leader节点出现故障follower节点迅速替补上去实现秒级故障切换。相关配置cluster: # 集群配置name: myTransfer #集群名称具有相同name的节点放入同一个集群# ZooKeeper地址多个用逗号分隔zk_addrs: 192.168.1.10:2181,192.168.1.11:2182,192.168.1.12:2183#zk_authentication: 123456 #digest类型的访问秘钥如user:password默认为空#etcd_addrs: 192.168.1.10:2379 #etcd连接地址多个用逗号分隔#etcd_user: test #etcd用户名#etcd_password: 123456 #etcd密码6、失败重试网络抖动、接收方故障都会导致数据同步失败需要有重试机制才能保证不漏掉数据使得每一条数据都能送达。通常有两种重试实现方式一种方式是记录下故障时刻binglog的position(位移)等故障恢复后从position处重新dump 数据发送给接收端。一种方式是将同步失败的数据在本地落盘形成队列。当探测到接收端可用时逐条预出列尝试发送发送成功最终出列。确保不丢数据队列先进先出的特性也可保证数据顺序性正确性。go-mysql-transfer采用的是后者目的是减少发送dump命令的次数减轻Master的负担。因为binglog记录的整个Master数据库的日志其增长速度很快。如果只需要拿几条数据而dump很多数据有点得不偿失。7、全量数据初始化如果数据库原本存在无法通过binlog进行增量同步的数据可以使用命令行工具-stock完成始化同步。stock基于 SELECT * FROM {table}的方式分批查询出数据根据规则或者Lua脚本生成指定格式的消息批量发送到接收端。执行命令 go-mysql-transfer -stoc在控制台可以直观的看到数据同步状态如下四、安装二进制安装包直接下载编译好的安装包:https://github.com/wj596/go-mysql-transfer/releases源码编译1、依赖Golang 1.14 及以上版本 2、设置GO111MODULEon 3、拉取源码 go get -d github.com/wj596/go-mysql-transfer 3、进入目录执行 go build 编译五、部署运行开启MySQL的binlog#Linux在my.cnf文件#Windows在my.ini文件log-binmysql-bin # 开启 binlogbinlog-formatROW # 选择 ROW 模式server_id1 # 配置 MySQL replaction 需要定义不要和 go-mysql-transfer 的 slave_id 重复命令行运行 1、修改app.yml 2、Windows直接运行 go-mysql-transfer.exe 3、Linux执行 nohup go-mysql-transfer docker运行1、拉取源码 go get -d github.com/wj596/go-mysql-transfer 2、修改配置文件 app.yml 中相关配置 3、构建镜像 docker image build -t go-mysql-transfer -f Dockerfile . 4、运行 docker run -d --name go-mysql-transfer -p 9595:9595 go-mysql-transfer:latest六、性能测试1、测试环境平台虚拟机 CPUE7-4890 4核8线程 内存8G 硬盘机械硬盘 OS:Windows Sever 2012 R2 MySQL: 5.5 Rides: 4.0.22、测试数据t_user表14个字段1个字段包含中文数据量527206条3、测试配置规则schema: eseaptable: t_userorder_by_column: id #排序字段全量数据初始化时不能为空#column_lower_case:false #列名称转为小写,默认为false#column_upper_case:false#列名称转为大写,默认为falsecolumn_underscore_to_camel: true #列名称下划线转驼峰,默认为false# 包含的列多值逗号分隔如id,name,age,area_id 为空时表示包含全部列#include_column: ID,USER_NAME,PASSWORDdate_formatter: yyyy-MM-dd #date类型格式化 不填写默认yyyy-MM-dddatetime_formatter: yyyy-MM-dd HH:mm:ss #datetime、timestamp类型格式化不填写默认yyyy-MM-dd HH:mm:ssvalue_encoder: json #值编码支持json、kv-commas、v-commasredis_structure: string # 数据类型。支持string、hash、list、set类型(与redis的数据类型一直)redis_key_prefix: USER_ #key的前缀redis_key_column: ID #使用哪个列的值作为key不填写默认使用主键脚本local json require(json) -- 加载json模块local ops require(redisOps) -- 加载redis操作模块local row ops.rawRow() --当前变动的一行数据,table类型key为列名称local action ops.rawAction() --当前数据库的操作事件,包括insert、updare、deletelocal id row[ID] --获取ID列的值local userName row[USER_NAME] --获取USER_NAME列的值local key user_..id -- 定义keyif action delete -- 删除事件thenops.DEL(key) -- 删除KEYelselocal password row[PASSWORD] --获取USER_NAME列的值local createTime row[CREATE_TIME] --获取CREATE_TIME列的值local result {} -- 定义结果result[id] idresult[userName] userNameresult[password] passwordresult[createTime] createTimeresult[source] binlog -- 数据来源local val json.encode(result) -- 将result转为jsonops.SET(key,val) -- 对应Redis的SET命令第一个参数为key(string类型)第二个参数为valueend3、测试用例一使用规则将52万条数据全量初始化同步到Redis结果如下3次运行的中间值为4.6秒4、测试用例二使用Lua脚本将52万条数据全量初始化同步到Redis结果如下3次运行的中间值为9.5秒5、测试用例三使用规则将binlog中52万条增量数据同步到Redis。结果如下每秒增量同步(TPS)32950条 6、测试用例四使用Lua脚本将binlog中52万条增量数据同步到Redis。结果如下每秒增量同步(TPS)15819条7、测试用例五100个线程不停向MySQL写数据使用规则将数据实时增量同步到RedisTPS保持在4000以上资源占用情况如下100个线程不停向MySQL写数据使用Lua脚本将数据实时增量同步到RedisTPS保持在2000以上资源占用情况如下以上测试结果会随着测试环境的不同而改变仅作为参考。
http://www.zqtcl.cn/news/855730/

相关文章:

  • 个人网站备案类型网络维护培训班
  • 做网站的可以注册个工作室吗一个网站两个域名吗
  • 网站建设要准备什么资料网站建设 锐颖科技
  • 如何建设网站山东济南兴田德润官网电子商城官网
  • 网站如何做支付宝接口免费ppt自动生成器
  • 泰安市建设职工培训中心网站官网seo经理招聘
  • 湛江做网站seo网站建设 0551
  • 建站公司 深圳苏州建站公司
  • 网站怎么做引流呢济南网站微信
  • 一个域名可以做几个网站吗wordpress左右翻转页面
  • 天津人工智能建站系统软件wordpress主题没有小工具
  • 网站的备案流程图视频制作素材
  • 劳务公司网站建设方案建设促销网站前的市场分析
  • 网络营销优化培训网站seo置顶 乐云践新专家
  • 小说网站搭建教程wordpress后台图片
  • 付网站开发费计入什么科目网站开发的历史
  • 站长素材ppt模板免费下载网站开发视频教程迅雷下载
  • 建设一个网站怎么赚钱南京江北新区房价走势最新消息
  • 一个网站怎么做软件下载互联网投放渠道有哪些
  • 手机网站建设进度环境设计排版素材网站
  • 网站开发众筹地推网推平台
  • 长沙互联网网站建设wordpress标签id在哪里修改
  • 企业网站的建设 摘要大连网站设计策划
  • 做房地产一级市场的看什么网站网络营销外包推广方式
  • 网站建设基本流程包括哪几个步骤网站建设策划书网站发布与推广
  • 徐州整站优化手机网页端
  • 深圳中瑞建设集团官方网站宁波seo快速优化教程
  • 福田网站制作哪家好昆山企业网站建设公司
  • wordpress快六安网站自然排名优化价格
  • 网站的线下推广怎么做的系统官网网站模板下载安装