一、现状

现状.png

我们将一个大而全的系统一拆为三,容器,发布,测试都已经独立出去,但是原始的数据库还是一套,现在需要将数据库做一个拆分,A、B、C三个系统有各自的数据库之后,我们的微服务化在现有部署、测试等已经独立的基础上才算最终完成,形成三个各自独立的单元。因此本篇文章叙述的不是数据库的水平拆分也不是垂直拆分,不是讲述分库分表,而是讲述从业务系统去拆分数据库,把业务最终微服务化。

二、方法

拆分方案.png

2.1、SOA

通过提供RPC接口,将原先共用的表有一方系统提供接口服务,另一方系统来调用该接口。这种情况下系统之间是解耦了,但是数据调用的时候一方还是要强依赖另一方。这个时候要重新关注接口服务方如果down掉或者延时发生,需要有容错机制,比如熔断、降级等。同时要考虑好数据的托底展示,比如本机缓存,remote缓存。详细可参看《微服务下的网关与容错》里面有专项介绍。

2.2、数据异构

通过数据异构的方式,比如B系统与C系统原来是一张表,数据库拆分之后这张表的数据放在了C系统,但是B系统只需要这张表的部分字段,这个时候可以通过异构平台把C系统的表按需异构到B系统中的一张表。这样两个系统之间彻底解耦,各自微服务化,也没有了SOA方式的强依赖问题。关于数据异构的详细介绍可以参看这篇文章

《数据异构的武器-BINLOG+MQ》

三、拆库的步骤(mysql)

集群A(源库)

集群B(新搭建)

集群C(新搭建)

DB拆库起始位置.png

注意此方案需要停写!

步骤一、搭建集群B、C

将集群B、C以从库形式挂载到集群A

步骤二、将如下集群A主库设置为只读模式

192.168.x.x xx.mysql.xxx.com

命令:set global read_only=on;

步骤三、待从库无延迟后,集群B、C停止复制,执行如下操作

命令:stop slave;

此时A、B、C三套集群均为只读模式

步骤四、研发人员修改应用url指向到正确的数据库集群,待确认无误后,(此时可回退,打开写后不可回退)

通知DBA将集群A、B、C三套打开读写

命令:set global read_only=off;

步骤五、拆分完成

DB最终位置.png

步骤六

观察一段时间后drop冗余表,DBA在复制的时候实际上是全量复制,因此后续我们需要drop掉各自系统内不需要的表。可以用rename的方式先行标出,一段时间后再drop掉。

===================================================================

回退方案

步骤一、集群B、C打开复制

命令:start slave;

步骤二、打开集群A的读写

命令:set global read_only=on;

四、SOA和微服务

SOA面向服务架构,是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。关键点是接口调用,这是目前分布式系统中常用的方法。目前开源的RPC框架也有很多比如知名的DUBBO服务等。

微服务的重点是业务系统要彻底组件化和服务化,原有的单体应用系统会拆分为多个可以独立开发、运行、部署和运维的小应用。这些小的应用之间如果需要交互就通过服务来完成,比如提供DUBBO接口服务。每个小应用内部从前端WEB到业务逻辑处理,到数据库访问,以及数据库都是独立的。

五、总结

业务简单,团队组织规模较小的时候一个单体应用就可以支持当时的业务发展。随着业务的发展规模越来越大,过程中如果技术架构升级没有跟上,就会面临后期拆系统,拆库的的阶段。本篇文章结合我工作中自身的经历集中对数据库的业务拆分做了描述,拆库的原则以及数据库新集群的创建方法。对于拆分,我们要拆的粒度有多大,或者多小,没有一个标准,关于这方面,推荐大家阅读一本书《恰如其分的软件架构》。

关注公众号同步更新技术文

mysql构建栋_【转载】这次拆库 应是微服务化的拆分方式相关推荐

  1. 【转载】这次拆库 应是微服务化的拆分方式

    朝着微服务的方向去做一次数据库拆分 新栋BOOK 关注 2017.11.16 21:41* 字数 1389 阅读 152评论 0喜欢 3 一.现状 现状.png 我们将一个大而全的系统一拆为三,容器, ...

  2. mysql 1677错误_[转载]MySQL 5.5.12 row格式复制下从库结构变更引发1677错误一则

    今天在一台从库上进行表结构变更时却遇到一个复制报错, Last_Errno: 1677 Last_Error: Column 7 of table 'user_0.user_00′ cannot be ...

  3. php mysql安装配置_转载:PHP,MySQL的安装与配置

    一.安装配置PHP 把php.ini-production另存为php.ini.修改其内容: 1)extension_dir = "D:/php-5.4.45/ext"设置指定的扩 ...

  4. 分布式从mysql查数据_技术分享 | 从库数据的查找和参数 slave_rows_search_algorithms...

    作者:高鹏 文章末尾有他著作的<深入理解MySQL主从原理 32讲>,深入透彻理解MySQL主从,GTID相关技术知识. 本文节选自<深入理解MySQL主从原理>第24节 注意 ...

  5. mysql绕过防火墙_[转载]使用sqlmap 绕过防火墙进行注入测试

    0x00 前言 现在的网络环境往往是WAF/IPS/IDS保护着Web 服务器等等,这种保护措施往往会过滤挡住我们的SQL注入查询链接,甚至封锁我们的主机IP,所以这个时候,我们就要考虑怎样进行绕过, ...

  6. mysql并行回放_技术分享 | 从库 MTS 多线程并行回放(一)

    作者:高鹏(八怪) 本节包含分发调用流程请参考链接: 一.综述 与单 SQL 线程的回放不同,MTS 包含多个工作线程,原有的 SQL 线程蜕变为协调线程.SQL 协调线程同时还承担了检查点的工作.我 ...

  7. mysql的检查点_转载一篇关于mysql检查点的文章

    数据库运行一段时间后,经常导致服务器大量的swap,我怀疑是innodb中的脏数据太多了,因为没有free space了,mysql通知OS,把一些脏页交换出去,以上只是猜测.有一个现象是每次关数据库 ...

  8. python坐标系转换库_转载:python库Pyproj进行坐标转换

    https://www.baidu.com 利用Pyproj进行坐标转换 作者:郜科科 两个坐标系统的参考椭球不同,实地一个点的不同坐标系的值是不同的,不同的部门采用的坐标系统经常是不一致,所以要转换 ...

  9. 微软企业库mysql分页存储_使用微软企业库,非分页sql语句得到分页数据方法

    最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用datagrid绑定了. 以前长用的 DataAdapter.Fi ...

最新文章

  1. 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
  2. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
  3. 如何设计一门语言(一)——什么是坑(a)
  4. Nodejs实现WebSocket通信demo
  5. 【各种信噪比联系与区别详解】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解
  6. fn映射 mac 键盘_【新鲜评测】高颜值、低延迟、多模式跨平台办公神器-米物蓝牙键盘...
  7. 解决: /bin/sh: 1: java: not found
  8. ECommon.Dapper 轻量级的dapper扩展
  9. Python格式化输出、转义字符、结束符
  10. 基于javaweb宠物领养平台管理系统设计和实现
  11. spring boot生成Excel表格 导出/导入
  12. 关于jmeter运行提示没有权限 报错
  13. HTTPS 自签名证书 实现边下边播 方案
  14. 自定义/修改微信二维码样式
  15. bigemap地图下载器 好用吗?
  16. 快排优化Python表示
  17. bash:bison未找到命令
  18. 备赛笔记:Opencv学习:颜色识别
  19. 登录逻辑漏洞整理集合
  20. react 使用 Youtube 播放器

热门文章

  1. fceux模拟器linux,超强FC模拟器fceux-2.2.3最新版
  2. cc java开发环境搭建_Windows系统下java开发环境搭建
  3. 第十二届蓝桥杯A组省赛试题 I: 双向排序(Java)
  4. 深入浅出时序逻辑电路(1)
  5. Python 基础 - 4.3 random模块
  6. 第二章 Burp Suite代理和浏览器设置
  7. 我的做题日志(1),来源:COCI2017,SDOJ
  8. php 跨二级域名 设置cookie
  9. 最短路径--Floyd算法
  10. seleniumpython定位网页元素方法_使用Selenium对网页元素进行定位的诸种方法