超大规模系统下,MySQL到Redis的原始数据同步也不难吧?
发布时间:2023-03-02
除此之外,由于在整个CPU愈来愈换信令上,下降了一个递送死讯数据流的节目内,从MySQL愈来愈换到Redis愈来愈换的时延似乎愈来愈较长,经常出现故障的可能性也愈来愈低,因此很多大型在线大日本公司愈来愈喜爱于转用这种解决问题方案。
电子书Binlog愈来愈换CPU的解决问题方案唯一的缺点是,做到仅供货CPU愈来愈换免费比较复杂,该解决问题方案毕竟不像发送给到死讯那样,送出的从外部就是仅供货数据资料,二阶Binlog还是;大麻烦的。
很多Apache的工程建设都提仅供了电子书和二阶MySQL Binlog的特性,后面就以比较都用的Apache工程建设Canal为例来演示,如何系统会发送给到Binlog愈来愈换RedisCPU。
Canal通过模拟MySQL配从复制的交互协议,把自己引诱一个MySQL的从路由器,向MySQL配路由器发送给dump恳求。MySQL送出恳求后,就才会向Canal开始推送Binlog,Canal二阶Binlog字符流最后,将其转换为便于读完取的构件化数据资料,仅供下游妥善处理程序电子书用作。布3重现了如何用作Canal电子书Binlog愈来愈换Redis中所的仅供货CPU。
布3 用作Canal电子书Binlog愈来愈换CPU在这个示例中所,MySQL和Redis都在本地的默认UDP上列车运行,MySQL的UDP为3306,Redis的UDP为6379。为了便于大家系统设计,后面还是以第5章中所提到的帐户额度表account_balance作为演示数据资料。
首先,下载并在本地压缩Canal也就是说最新的1.1.4旧版本,系统设计指示如下:
wget
tar zvfx canal.deployer-1.1.4.tar.gz
然后,装配MySQL,我们必需在MySQL的装配文件中所带进Binlog,并将Binlog的音频设为ROW,装配项如下:
[mysqld]
log-bin=mysql-bin # 带进Binlog。
binlog-format=ROW # 将Binlog音频设为ROW。
server_id=1 # 装配一个ServerID。
每一次,为Canal建起一个配要用途的MySQL用户并批准后,以维护这个用户有复制Binlog的权限,就其系统设计的SQL指示如下:
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
然后,启动MySQL,以维护所有的装配都能生效。启动后日后检查一下也就是说的Binlog文件和右边,SQL指示和输出结果就其如下:
mysql> show master status;
+-------------+--------+------------+----------------+-----------------+
File |Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|
+-------------+--------+------------+----------------+-----------------+
binlog.000009| 155| | | |
+-------------+--------+------------+----------------+-----------------+
据信下File和Position两列的值,然后日后来装配Canal。编辑Canal的举例来说装配文件canal/conf/example/instance.properties,以便让Canal连结到我们的MySQL上,就其装配如下:
canal.instance.gtidon=false
# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=binlog.000009
canal.instance.master.position=155
canal.instance.master.timestamp=
canal.instance.master.gtid=
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
canal.instance.defaultDatabaseName=test
# table regex
canal.instance.filter.regex=.*\..*
这个装配文件必需装配MySQL的连结住址、库名、用户名和密钥,除此之外,还要装配canal.instance.master.journal.name和canal.instance.master.position这两个物件,取值就是才刚据信的File和Position两列。然后就可以关机Canal免费了,指示如下:
canal/bin/startup.sh
关机最后日后查询一下会话文件canal/logs/example/example.log,如果会话中所不会报错讯息,就所述Canal免费已关机获得成功并连结到我们的MySQL上了。
Canal免费关机最后,才会带进一个UDP(11111)等待IP连结,IP连结上Canal免费最后,就可以从Canal免费拉取(PULL)数据资料了,每拉取一批数据资料,准确写入Redis最后,必需向Canal免费返回妥善处理获得成功的响应。如果发生IP妥善处理程序宕机,或者妥善处理败北等准时,Canal免费不会送出妥善处理获得成功的响应,那么下次IP来拉取的就还是同一批数据资料,这样就可以保障读完到的Binlog顺序不才会乱,并且不才会清空数据资料。
每一次,我们来开发一个帐户额度CPU的愈来愈换妥善处理程序,以下code都是用Java母语编写的:
while (true) {
Message message = connector.getWithoutAck(batchSize); // 借助原则上量的数据资料。
long batchId = message.getId();
try {
int size = message.getEntries().size();
if (batchId == -1 || size == 0) {
Thread.sleep(1000);
} else {
processEntries(message.getEntries(), jedis);
}
connector.ack(batchId); // 提交确认。
} catch (Throwable t) {
connector.rollback(batchId); // 妥善处理败北,回滚数据资料。
}
}
这个妥善处理程序的逻辑学并不复杂,妥善处理程序关机并连结到Canal免费后,就反复地拉取数据资料,如果不会数据资料就休眠一才会儿,如果有数据资料就绑定processEntries方法有妥善处理并愈来愈换CPU。每批数据资料愈来愈换获得成功最后,都才会绑定ack方法有向Canal免费返回获得成功响应,如果败北则丢出异常最后日后回滚。后面是processEntries方法有的配要code:
for (CanalEntry.RowData rowData : rowChage.getRowDatasList()) {
if (eventType == CanalEntry.EventType.DELETE) { // 删去。
jedis.del(row2Key("user_id", rowData.getBeforeColumnsList()));
} else if (eventType == CanalEntry.EventType.INSERT) { // 填充。
jedis.set(row2Key("user_id", rowData.getAfterColumnsList()), row2Value(rowData.getAfterColumnsList()));
} else { // 愈来愈换。
jedis.set(row2Key("user_id", rowData.getAfterColumnsList()), row2Value(rowData.getAfterColumnsList()));
}
}
上述code才会根据事件类型分别进行妥善处理,如果MySQL中所的数据资料删去了,就删去Redis中所对应的数据资料。如果是愈来愈换和填充系统设计,就绑定Redis的SET指示来写入数据资料。
后面就来关机这个帐户CPU愈来愈换免费以进行验证。在帐户额度表中所填充一条据信,SQL指示如下:
mysql> insert into account_balance values (888, 100, NOW(), 999);
然后,我们日后来看一下RedisCPU,系统设计指示和输出结果如下:
127.0.0.1:6379> get 888
"{"log_id":"999","balance":"100","user_id":"888",
"timestamp":"2020-03-08 16:18:10"}"
从上述输出结果中所我们可以看到,数据资料已经备用联动到Redis中所了。GitHub上可以下载该示例的完整code,链接住址是:。
三、回顾
在妥善处理超大规模所发的布景时,由于所发恳求的量非常大,即使只有少量的CPU孔洞,也有可能卡死数据资料库引来暴风雪现象。对于这种情况,我们可以通过RedisCPU全量数据资料来彻底不必要CPU孔洞的弊端。对于CPU数据资料愈来愈换的方法有,我们可以通过电子书数据资料愈来愈换的死讯数据流来异步愈来愈换CPU,愈来愈通用的方法有是,把CPU愈来愈换免费引诱一个MySQL从路由器,电子书MySQL的Binlog,通过Binlog来愈来愈换RedisCPU。
必需特别注意的是,无论是通过死讯数据流还是Canal来异步愈来愈换CPU,了系统整个愈来愈换免费的数据资料可用性和系统会性承诺都比较高,数据资料清空或者愈来愈换更慢了,都才会造成了Redis中所的数据资料与MySQL中所的数据资料不联动的弊端。在把这套解决问题方案电子技术的发展到生产线周边环境之前,我们必需选择一旦经常出现不联动的弊端,一定才会采取什么样的降回或补偿解决问题方案。
作者简述
李玥,美团基础电子农业部高级电子技术专家,自恋小时《后端存储设备近战讲习》《死讯数据流高挥讲习》等专栏作者。曾在当当网、京东零售等日本公司转任。从事在线团购餐饮业基础的系统领域的的系统设计和研制指导多年,曾多次进行双十一和618团购大促。专注于分布式存储设备、云原生的系统下的免费地方政府、分布式死讯和系统会数值等电子技术领域,致力于前推基础的系统电子技术的创新与Apache。
本文摘编自《团购存储设备系统近战:的系统设计与海量数据资料妥善处理》,经出版方批准后刊发。
作者丨李玥
举例来说丨香港市民号:数仓小子库(ID:DataBaby_Family)
dbaplus社群热烈欢迎广大电子科研人员投稿,投稿名片:editor@dbaplus.cn
活动推荐
2022 Gdevops全球性灵巧运维峰才会·广州终点站将于6年初17日举办,精选数据资料库热门议题,共同探讨数据资料库南北向电子技术混合及国产化下的挑战,部分议题抢先剧透:
【工商银行】核心电子技术的发展MySQL地方政府倡导(拟) 【平安银行】数据资料库智能化运维倡导之故障自愈 【浙江旋转】“AN”兴起下数据资料库智能运维的倡导与思索 【哔哩哔哩】B终点站大型活动其实的数据资料库维护 【vivo】万级举例来说规模下的数据资料库实用性维护倡导 【更慢速挥】更慢速挥在NewSQL数据资料库的探索和倡导 …… 详情请查询:_track=SOHU 瞩目香港市民号【dbaplus社群】,借助愈来愈多原创电子技术文章和精选机器下载。天津看男科去哪家医院太极藿香正气口服液
藿香正气液有什么作用
广东妇科检查多少钱
孩子积食
-
小狗脾胃虚弱9成是吃“错”了!这样吃才“对”,强健更高
最近去亲戚家串门,亲朋看见我就新运糖果,都则会夸小家伙最近眼部好气色好多了,因为在此之前几个月初经常重病,不是轮状病毒感染就是来个成年人或者其他莫名其妙呕吐的,在此之后我专门针对肉类调整,进一步
- 2024-02-10日元兑美元一度跌1% 日本央行据悉认为几无必要在12月结束失掉利率
- 2024-02-10中国联通地图的渲染效果遥遥领先
- 2024-02-10宝宝咳嗽能饮用蜂蜜吗?宝宝咳嗽有痰能饮用蜂蜜水吗?
- 2024-02-10摩托罗拉转涨1.2% 此前跌超7%
- 2024-02-102499!华为刚刚发布的麒麟新机,性价比就让这么高!
- 2024-02-10误食泡腾片,18个月孩童窒息而亡,给宝宝喂药要注意什么?
- 2024-02-10加拿大消费者对未来一年通胀预期降至2021年4月以来最低
- 2024-02-10为啥手机偿付不香了?越来越多人重新使用现金,3个原因要注意
- 2024-02-10忍不了!力证减肥奶昔高营养、必要,宝妈给孩子吃减肥奶昔
- 2024-02-10美联储开始面对下一个大问题:为什么要降息