在很多系统(包括金融类和非金融类)中,其实有大量的系统在很长的一段时间内(具体多长时间视业务的成功与否而定)都是混合型系统,也就是同时具有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. Saltstack实战之无master和多master

    如果不想依赖master可以设置为无master vim /etc/salt/minion 就可以通过minion来安装一个salt-master了(下来查资料做,关闭salt-minion进程因为不 ...

  2. numpy的文件存储,读取 .npy .npz 文件

    Numpy能够读写磁盘上的文本数据或二进制数据. 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...

  3. POJ 1984 - Navigation Nightmare - [带权并查集]

    题目链接:http://poj.org/problem?id=1984 Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MS ...

  4. codeforces 782B - The Meeting Place Cannot Be Changed

    time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standa ...

  5. PHP之ctype扩展

    $str = "121"; 检查成功返回true 否则返回false //检测一个字符串是否是纯字符(a-z,A-Z) var_dump(ctype_alpha($str));// ...

  6. 20144306《网络对抗》Web基础

    1  实验内容 Web前端HTML:能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前端javascipt:理解JavaScript ...

  7. nautilus

    在~/.bashrc中定义命令别名,添加以下命令: # some more nautilus aliases alias here='nautilus . > /dev/null 2>&a ...

  8. LoadRunner-关联相关(解决方法二)

    用例为:添加通知,下发给用户. 录制好脚本,replay时脚本未报错,但实际登录网页操作未完成(只添加了通知,未下发给用户). LR自动关联没有内容,手动查看服务器response,在保存时有一个id ...

  9. jquery ajax contentType设置

    默认get方法没有contentType,post方法的contentType为:application/x-www-form-urlencoded; charset=UTF-8 (1) 设置成app ...

  10. 第五课 JAVA反射获取对象属性和方法(通过配置文件)

    Service1.java package reflection; public class Service1 { public void doService1(){ System.out.print ...