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

朝着微服务的方向去做一次数据库拆分

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、现状

16214747_Qtsl.png

现状

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

二、方法

16214747_pQVk.png

拆分方案

2.1、SOA

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

2.2、数据异构

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

三、拆库的步骤(mysql)

集群A(源库)
集群B(新搭建)
集群C(新搭建)

16214747_qQwI.png

DB拆库起始位置

注意此方案需要停写!

步骤一、搭建集群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;

步骤五、拆分完成

16214747_SJRN.png

DB最终位置

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

===================================================================
回退方案
步骤一、集群B、C打开复制
命令:start slave;
步骤二、打开集群A的读写
命令:set global read_only=on;

四、SOA和微服务

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

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

五、总结

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

转载请注明作者及出处,并附上链接https://my.oschina.net/wangxindong/blog/1574768

转载于:https://my.oschina.net/wangxindong/blog/1574768

相关文章:

  • apache 开机自启动
  • MongoDB的监控首选:mongostat
  • 采用交换机和HUB连接局域网有什么区别?
  • 进行高效数字化转型工作的7个习惯
  • Microsoft Dynamics AX 2012 正式版虚拟机
  • Python学习笔记-实现探测Web服务质量
  • 隐藏文件无法取消隐藏属性的解决[转]
  • 缓存DNS
  • 如何对C++虚基类构造函数
  • echars 动态加载数据
  • How The Kernel Manages Your Memory
  • Linux内存管理--基本概念【转】
  • UVA 321 The New Villa
  • ASP.NET程序开发范例宝典
  • Jquery实现鼠标双击Table单元格变成文本框,输入内容并更新到数据库
  • 深入了解以太坊
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 0x05 Python数据分析,Anaconda八斩刀
  • Apache Pulsar 2.1 重磅发布
  • ERLANG 网工修炼笔记 ---- UDP
  • Facebook AccountKit 接入的坑点
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java深入 - 深入理解Java集合
  • Odoo domain写法及运用
  • Python_网络编程
  • rabbitmq延迟消息示例
  • text-decoration与color属性
  • TypeScript迭代器
  • 多线程事务回滚
  • 关于for循环的简单归纳
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 我建了一个叫Hello World的项目
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 用简单代码看卷积组块发展
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #单片机(TB6600驱动42步进电机)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (生成器)yield与(迭代器)generator
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)scrum常见工具列表
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ******之网络***——物理***
  • .net 按比例显示图片的缩略图
  • .net 调用php,php 调用.net com组件 --
  • .NET 服务 ServiceController
  • .Net 垃圾回收机制原理(二)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net6+aspose.words导出word并转pdf
  • .net程序集学习心得
  • .NET实现之(自动更新)
  • @AutoConfigurationPackage的使用
  • @Repository 注解
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [BUG] Authentication Error