在很多系统(包括金融类和非金融类)中,其实有大量的系统在很长的一段时间内(具体多长时间视业务的成功与否而定)都是混合型系统,也就是同时具有OLTP+OLAP的业务。我们说任何形式的存在在特定阶段都是合理的,这无可厚非,但是对于明知会发生但仅仅只是时间问题的那些问题,如果不吸取以前的经验教训,仅仅是为了快速上线而阉割再阉割,事后补救的成本必定是高昂而且痛苦的。在我们最近的这一次因为实时风控计算导致关键交易系统负载过高而不得不拆分的调整中,纠正和修复了很多原先的设计、实现以及流程上存在问题。

首先,在第一天mysql库拆分后,出现的第一个问题是很多的业务表并没有同步到从库,大量的slave key not found, key duplicate,经检查升级脚本,发现很多地方写死了库名,db_XXX.table_XXX,db_XXX.sp_XXX。一直以来,我们很多开发都知道,其实现在系统耦合性很强,但是自欺欺人的假设数据库已经逻辑上拆分为不同的schema,所以我们是完全可以独立部署的。

其次,行情作为时效性很强、每天会产生大量临时但并不需要存储的数据,明智出事只是时间的问题,我们还是将其存储在了innodb表中(主要还是为了省事),每秒数千条,导致iowait极高、MQ服务器时常盘中出现大量积压,进而导致交易客户端的实施盈亏偏差很大,拖了几个月开发之间均以米有时间为理由,笔者最终改了rpc框架在应用层进行批处理,并在连接级别将sql bin log禁用了,虽然之后行情不在成为领导的关注点。但在主从中,备库行情没有了,同时在批量入库时因为采用了load infile,临时表是diy创建的,使得还出现了table not found的异常。仍然有些地方是人工插入和修改行情记录的,于是slave key not found, key duplicate又出现了。最后,再次修改行情入库的逻辑,行情相关表主、从库同时写。该问题才得以彻底解决。在计划中,后续逻辑会进一步前移,使得不需要再持久化。

第三,我们有很多的存储过程(还是因为历史原因),和第一点一样的方式进行了处理。

第四,在主从的使用上,为了保证代码规范的一致性,我们采用了有些表rewrite-db处理,有些没有rewrite-db处理,一开始使用%通配处理,后来发现还有很多自动备份的表,时常出现table not found, table already exist的异常,最后,不得不要求开发列出完整的清单,此问题才算告一阶段,至今未出现其他问题。但是事后又出现了了一个问题,有些不在列表中的表需要同步,于是就出现备库没有同步过去的情况,这使得每次升级的时候知道有没有要同步的新增表,如果有的话需要对应的修改replicate-wild-do-table。于是,开发、测试、运维各自都不愿意干这事情,使得笔者不得不找个自动化的机制自动进行同步。

原先和最后的系统结构变化,等到后续有时间了在专门整理。

在上述问题的处理过程中,麻烦的不是如何解决,而是每次只要问题类似,出错的记录不同,都不得不一条条记录找出来,跟开发沟通,开发才得以调整,并最终反向慢慢在处理问题的过程中增加和订下各种规则,出了一个公司文化,明显的失误群发一个红包,并推广到开发、测试、运维所有人员,没有想到的是,两次之后,不少开发主动发起了红包。

很长一段时间,笔者发现,问题并不是各同学不愿意调整和优化改进,而不是一直以来他们发现每个人说的都不一样,而且都没有很好地解决他们的问题,久而久之,他们慢慢的就免疫了,不随便相信其他同学说的话,运维、开发各自不信任,自己玩自己的,结果留下了这风格迥异的现状。

一个风控计算负载过高到mysql主从拆分暴露的各种设计复杂性问题以及解决方法总结的更多相关文章

  1. golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法

    golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: ...

  2. 【small项目】MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

    MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  3. mysql left join 右表数据不唯一的情况解决方法

    mysql left join 右表数据不唯一的情况解决方法 <pre>member 表id username1 fdipzone2 terry member_login_log 表id ...

  4. Mysql:Forcing close of thread xxx user: 'root' 的解决方法

    MySQL server在中午的时候忽然挂掉.重启mysql也尽是失败,只有重启电脑才能解决,然而重装了MySQL也是不行,晚上还是挂, 去看mysql的errorlog,只能看到类似如下的信息: F ...

  5. MySQL出现Waiting for table metadata lock的原因以及解决方法

    转自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) MySQL在进行alter table等DDL操作时,有时会出现Waiting for tab ...

  6. MySQL出现Waiting for table metadata lock的原因以及解决方法(转)

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的操作停滞在Wa ...

  7. mysql:1153 Got a packet bigger than ‘max_allowed_packet’ bytes的解决方法

    备份还原或数据导入报错1153:Got a packet bigger than'max_allowed_packet'bytes的问题 这个问题可以有2个解决方法: 1.临时修改: mysql> ...

  8. mysql数据库导出时报错mysqldump: Got error: 145的解决方法

      在给mysql数据库备份时,报错:mysqldump: Got error: 145: Table './jxzhtopenfire/ofoffline' is marked as crashed ...

  9. mysql错误:Can’t create TCP/IP socket (10106) 解决方法

    错误描述 “mysql错误:Can’t create TCP/IP socket (10106)”,目测是socket端口被占用的原因,然后在打开tomcat,报的错误中也包含了“socket”,再一 ...

随机推荐

  1. codeforces#514 Div2---1059ABCD

    1059A---Cashier http://codeforces.com/contest/1059/problem/A 题意: Vasya每天工作\(l\)个小时,每天服务\(n\)个顾客,每个休息 ...

  2. 金字塔原理——MECE(Mutually Exclusive Collectively Exhaustive)

    一.金字塔原理 它的样子: 一个中心思想,分出下面2到N个思想支撑,每个分论点下面又有2到N个思想(事实或数据)支撑,以此类推,形状如金字塔.原则是以终为始(先结果后原因),以上统下,归纳分组,逻辑递 ...

  3. TensorFlow 度量张量和张量或者和零之间的误差值

    用于一个回归任务或者正则问题 # l2损失,output= sum(x ** 2)/2 inputdata = tf.Variable(np.random.rand(2,3), dtype=np.fl ...

  4. MySQL NDB集群安装配置(mysql cluster 9.4.13 installation)

    一.安装前规划 1.安装软件版本:mysql-cluster-gpl-7.4.13-linux-glibc2.5-x86_64.tar.gz 2.安装规划: 主机名 Ip地址 角色 db01 192. ...

  5. PXE配置手记(Linux)

    服务器端:RHEL5(静态IP 192.168.1.101) 源Gentoo系统:服务器上的Gentoo系统就来自于它,编译内核也是在这台机器上执行的 无盘客户端:网卡是 AMD PCnet32 支持 ...

  6. AllowOverride None

    PHP Advanced and Object-Oriented Programming Larry Ullman <Directory /> AllowOverride None < ...

  7. asm 32 /64

    我使用NASM编写的,运行在32位windows和linux主机上,但后来需求增加了,需要在64位windows和linux上运行,windows自身有个wow(windows on windows) ...

  8. Python实现简单HTTP服务器(二)

    实现简单web框架 一.框架(MyWeb.py) # coding:utf-8 import time # 设置静态文件根目录 HTML_ROOT_DIR = "./html" c ...

  9. 部署MyEclipse及Tomcat服务器

     修改MySQL文件工程密码 Tomcat6.12\webapps\SmsService\WEB-INF\applicationContext.xml目录下的数据库密码 <property na ...

  10. 畅通工程&&How Many Tables

    http://acm.hdu.edu.cn/showproblem.php?pid=1232 #include <iostream> #include <stdio.h> #i ...