分库分表,读写分离后,数据库中间件扮演了一个怎样的角色?

阿里云幸运券

分库分表,读写分离会带来哪些问题?

前面一篇文章图解分布式系统架构(看推荐阅读)大概讲了一下分库分表,以及读写分离出现的场景,分库分表为了解决高并发和海量数据的问题。

分库后会出现新的问题

跨库join问题

如有2个库,订单库,用户库,要查询买了某件商品的所有用户信息

事务问题

用户下订单的时候需要扣减商品库存,如果订单数据和商品数据在一个数据库中,我们可以使用事务来保证扣减商品库存和生成订单的操作要么都成功要么都失败,但分库后就无法使用数据库事务了,这时就要用到分布式事务了

分表后也会出现新的问题

join操作

水平分表后,数据分散在多个表中,如果需要与其他表进行join查询,需要在业务代码或数据库中间件中进行多次join查询,然后将结果合并

count()操作

业务代码或者数据库中间件对每个表进行count(*)操作,然后将结果相加。或者新建一张表,假如表名为“记录数表”,包含table_name和row_count两个字段,每次插入或删除子表数据成功后,都更新“记录数表”

order by操作

水平分表后,数据分散到多个字表中,排序操作无法再数据库中完成,只能由业务代码或数据库中间件分别查询每个子表中的数据,然后汇总进行排序

而高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是 app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗?

那么如何实现 MySQL 的读写分离?

其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后从库读取bin log进行重放,这样主库和从库数据就一样,只不过并发量比较高时,会有主从同步延时问题

放个图理解一下MySQL主从复制的原理,这块面试经常被问到

总的来说,MySQL复制有三个步骤

在主库上把数据更改记录到二进制日志中(Binary Log)中(这些记录被称为二进制日志事件)

备库将主库上的日志复制到自己的中继日志(Relay Log)中

备库读取中继日志中的事件,将其重放到备库数据之上

现在理论知识都有了,就剩怎么实现了?本来就是为了实现一个功能,现在好了,单写读写分离,跨库join,分布式事务,排序操作等就够你忙的了。

这时候你就应该想起数据库中间件了,它能帮你进行上述操作,把你从复杂的数据处理中解放出来,专注于开发业务代码。

数据库中间件能帮你做什么?
目前国内用的最多的中间件就是sharding-jdbc,mycat,别的用的很少,不再介绍

而数据库中间件针对数据源管理,目前主要有两种思路

客户端模式,在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个数据库,在模块内完成数据的整合,sharding-jdbc的实现方式

通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明,mycat的实现方式

放两张图就能理解区别了

一般的建议是小公司用sharding-jdbc,大公司用mycat,因为维护一套mycat集群也需要人力,物力。鉴于篇幅限制,本文就介绍一下mycat的基本使用

以一个最形象的例子,让你明白mycat到底帮你做了什么?

先介绍一下什么是分片?简单来说,就是通过某种特定的条件,将我们存放在同一个数据库中的数据,分散存放到多个数据库上面,以达到分散单台设备负载的效果

如上图所表示,数据被分到多个分片数据库后,应用如果需要读取数据,就要需要处理多个数据源的数据。如果没有数据库中间件,那么应用将直接面对分片集群,数据源切换、事务处理、数据聚合都需要应用直接处理,原本该是专注于业务的应用,将会花大量的工作来处理分片后的问题,最重要的是每个应用处理将是完全的重复造轮子。

所以有了数据库中间件,应用只需要集中与业务处理,大量的通用的数据聚合,事务,数据源切换都由中间件来处理。

那么数据库中间件是怎么做到的呢?

绿色的部分为mycat的逻辑节点,蓝色的部分为物理节点(即数据库的部署地址)

schema:逻辑库

通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道

数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库

table:逻辑表

既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成

datanode:分片节点

数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点

datahost:节点主机(上图蓝色节点)

数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。

rule:分片规则

前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

实战Mycat
为了快速熟悉各种配置,一般直接从git上下载代码,本地用idea打开启动,方便练习一波,小编演示本文就是用的这种方法

mycat的配置其实是蛮简单的,最主要的是熟悉各配置文件的规则。如用户名,密码,分片规则,都是在配置文件中定义的

关于配置文件,conf目录下主要以下三个需要熟悉,要是本地测试用idea打开在resources目录下

小编演示一个最简单的映射配置,找一个数据库服务器,建立3个库,db1,db2,db3,把id为0-500 0000的数据放在db1,id为500 0001到1000 0000的数据放在db2,以此类推

server.xml是Mycat服务器参数调整和用户授权的配置文件(省略了一些配置,后面2个配置文件一样)

<mycat:server xmlns:mycat="http://io.mycat/">

    <user name="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">TESTDB</property>
    </user>

</mycat:server>

schema.xml是逻辑库,逻辑表定义以及分片定义的配置文件

<mycat:schema xmlns:mycat="http://io.mycat/">

    <!--逻辑库名-->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
       <!--rule的值和rule.xml的实现对应-->
        <table name="tb_test" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    </schema>

    <!--dataHost可以配置不同主机上的数据库,这里为了演示就配置了一个主机上的不同数据库-->
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <!--心跳语句-->
        <heartbeat>select user()</heartbeat>
        <!--这里我本地mycat配了一个远程mysql-->
        <writeHost host="hostM1" url="远程mysql的ip地址:3306" user="root"
                   password="2014">
        </writeHost>

    </dataHost>

</mycat:schema>

rule.xml是分片规则的配置文件

<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="auto-sharding-long">
        <rule>
            <!--根据哪个列进行分片-->
            <columns>id</columns>
            <!--分片规则,连续分片-->
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>

    <function name="rang-long"
       <!--分片规则的实现类-->
        class="io.mycat.route.function.AutoPartitionByLong">
        <!--分片规则配置文件-->
        <property name="mapFile">autopartition-long.txt</property>
    </function>

</mycat:rule>

autopartition-long.txt详细的分片策略

# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2

这个配置的意思是,id在0到500w放在第一个分片,以此类推

小编这里用Navicat(数据库连接工具)连接到本地的mycat

主机:localhost
端口:8066
用户名:root(server.xml中配置好的用户名密码)
密码:123456

看到有一个TestDB库,在这个库里面执行建表语句

CREATE TABLE `tb_test` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后到对应的物理数据库db1,db2,db3上看,3个库都有了这个表。

在逻辑数据库中插入如下三条数据

insert into tb_test (id, name) values (1, "1");
insert into tb_test (id, name) values (5000001, "5000001");
insert into tb_test (id, name) values (10000001, "10000001");

可以看到id为1的数据插入到物理数据库中的db1,id为5000001的数据插入到db2,id为10000001的数据插入到db3

在逻辑数据库中执行如下语句又能拿到这3条记录

select id, name from tb_test

执行如下语句,可以看到mycat从三个数据库中取了记录,LIMIT 100是因为schema.xml中配置了sqlMaxLimit=“100”

explain select id, name from tb_test

有了mycat以后,我们的数据库地址配置成mycat即可,它帮我们做了很多,其他各种分片规则,读写分离等的配置就不再演示,理解整个框架的大概运行流程就行

最后再分享一个知识点,mycat1.5 开始会支持本地 xml 启动,以及从 zookeeper 加载配置转为本地 xml 的两种方式,即原来分享的zookeeper可以用作配置中心

腾讯云代金券

原文链接

https://mp.weixin.qq.com/s?__biz=MzIxMzk3Mjg5MQ==&mid=2247484159&idx=1&sn=3f3c53c52529e47e4d4ca426dbe93cda&chksm=97afe00ba0d8691d616228cea49ffebc485210a57e428638b7f46a96cd2c5fd6bdd58972bfda&scene=21#wechat_redirect

服务推荐

原文地址:https://blog.csdn.net/weixin_44476888/article/details/90344861

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Mycat是什么?MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一
转自:https://www.cnblogs.com/ivictor/p/5111495.html参考:https://www.cnblogs.com/damumu/p/7320258.htmlMyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署
1.在数据库做好主从同步的情况下搭建mycat。下载mycat,解压。修改server.xml文件,修改schema.xml待完善启动mycat。参考文章:https://blog.csdn.net/yelllowcong/article/details/79063546https://www.cnblogs.com/NingKangMing/p/6143834.html
集群的服务器列表在10.11.0.210和10.11.0.216中部署mycat和haproxy(因为实验机器性能有限,实际生产环境中需要单独用服务做haproxy反向代理) 两台机器的Mycat配置和haproxy保持一致即haproxyàmycatàpxc集群àmysql分片 Mycat的相关配置Server.xml[root@node6
Mycat是什么?·一个彻底开源的,面向企业应用开发的大数据库集群·支持事务、ACID、可以替代MySQL的加强版数据库·一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群·一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQLServer·结合传统数据库和新型分布式数
<system>配置Mycat系统参数 <system>  <propertyname="serverPort">3306</property><!--mycat服务端口-->  <propertyname="managerPort">9066</property><!--mycat管理端口-->  <propertyname=&q
数据库中间件:mycat逻辑库:即mycat服务上的数据库,并非实际mysql服务上的数据库。逻辑表:与逻辑库同理。数据节点:是mycat逻辑表与mysql物理表的对应关系,mycat服务上某个库中的某个表的数据可能是由不同mysql服务器上数据库中表的数据组成。具体哪个逻辑表对应mysql的哪个实际
MyCat的官方网站:http://www.mycat.org.cn/下载地址:https://github.com/MyCATApache/Mycat-download第一步:下载wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 并解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
show@@sql;Emptyset(0.01sec)一直查不出数据查看在Mycat中执行过的SQL语句,需要确认server.xml配置文件中的<propertyname="useSqlStat">1</property>刚开始一直出不来数据,最后发现是没开启的原因。。。。。。1. 连接mycat9066管理端口   mysql-h127.0.0.1-
Mysql分布式集群部署mycat分库分表系列(共三套)系列一:《分布式集群+分库分表实战教程》本套课程将通过分布式集群和分库分表两部分内容进行讲解1、主要解决针对大型网站架构中持久化部分中,大量数据存储以及高并发访问所带来是数据读写问题。分布式是将一个业务拆分为多个子业务
1、下载系统安装包选择相应的版本进行下载,地址:http://dl.mycat.io/ 。Mycat数据库分库分表中间件介绍 http://www.mycat.io/2、安装安装mycat前需要保证系统已安装过jdk和mysql,将下载好的mycat安装包解压到某个目录下,然后进入mycat解压目录下的bin目录(打开cmd控制台确保是以管
原文:学会数据库读写分离、分表分库https://www.cnblogs.com/joylee/p/7513038.html系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署。  随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应
MyCat安装配置学习1.下载安装tar解压(不多说)2.MyCat命令./mycatstart启动./mycatstop停止./mycatrestart重启配置server.xml添加用户设置配置schema.xml
1.Mycat入门官网http://www.mycat.io/1.1.什么是Mycat一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL
因为51博客写作格式问题,以后文档都以有道文档连接为主,已整理到有道云笔记,目前笔记有云计算运维大数据运维,应用运维,DBA,测试,小白想学的可以加我qq:936172842,,请注明51学友,无备注一律不加,http:/ote.youdao.comoteshare?id=935db6cec339054c82d8b3f6ac343fa0⊂=DBB78851CCCF486EB26B
MyCat简介前面文章我们提到,如果数据量比较大的话,我们需要对数据进行分库分表,分完之后,原本存在一个数据库中的数据,现在就存在多个数据库中了,就像下面这样:  那么此时MyCat所扮演的角色就是分布式数据库中间件!MyCat是一个开源的分布式数据库中间件,它实现了MySQL协议,在开发
一、自定义类加载器在复杂类情况下的运行分析1、使用之前创建的类加载器publicclassMyTest16extendsClassLoader{privateStringclassName;//目录privateStringpath;privatefinalStringfileExtension=".class";publicMyTest16(Stringclass
mycat是一个中间层mycat不存储任何数据,所有数据存储在mysql中mycat对于开发人员来说就是mysql,但mycat不能支持所有mysql语句mycat可以实现对后端数据库的分库分表和读写分离、负载均衡mycat对前端应用隐藏了后端数据库的存储逻辑(比如对后端数据读写分离,如果在程序中实现,则每一个使
下载:https://github.com/MyCATApache/Mycat-download安装:直接解压运行命令:linux:   ./mycatstart启动   ./mycatstop停止   ./mycatconsole前台运行   ./mycatrestart重启服务   ./mycatpause暂停   ./mycatstatus查看启动状态windows: