Mycat是java编写的!!!
分布式数据库特性:
数据分片:
技术点:
数据库中间件被当成作一个或多个数据库集群构成的逻辑库。
逻辑表可以分布在一个或多个分片库中,也可以不分片。
<table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>
t_user分片表,数据按照规则被切分到dn1、dn2两个节点。
<table name="t_node" primaryKey="id" autoIncrement="true" dataNode="dn1" />
t_node表,非分片表,只存在于节点dn1。
primaryKey:逻辑表对应真实表的主键。对于分片规则使用非主键进行分表,如果使用主键查询会,会扫描所有分表,配置了该属性,mycat会缓存主键与dn的信息,避免所有表扫描,提升性能。但如果缓存没有命中,还是会把SQL发给所有的dn执行来获取数据。
分片节点(dataNode)
<dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/>
<dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>
一个大表被分到不同的分片数据库上,每个表分片所在的数据库就是分片节点
节点主机(dataHost)
<dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
</writeHost>
</dataHost>
同一台机器上可以有多个分片数据库。为了避免单节点主机并发数量的限制,尽量将读写压力高的分片节点均匀地放在不同的节点主机上。
上面只列了几个核心参数,更多参数详细说明可参考《基于mycat中间件P22》
主要是配置系统信息,有两个重要标签 user、system
主要是逻辑库、逻辑表、分片规则 、分片节点、数据源
在分库分表的情况下,数据库的自增主键无法保证在集群中是全局唯一的主键,因此mycat提供了全局的sequence,并支持本地配置、数据库配置等多种实现方式。
分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。
日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题。
autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件
MyCAT自身的jar包或依赖的jar包的存放目录。
MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件
对分表键id按总的分表数求模计算,比如模为0,放在第1张表,模为1,放在第2张表。
配置文件中配置可能的枚举id,指定数据分布到不同的物理节点上。本规则适用于按省份或县区来拆分数据。
按分片字段的某个范围放入对应分片。比如0~1kw,放在第1张表,1kw~2kw,放在第2张表
范围分片+取模分片的组合。先根据id找到对应的分片组,分片组内使用求模可以保证组内的数据分布比较均匀。事先规定好分片的数量,数据扩容时按分片组扩容,原有的分片组的数据不需要迁移。由于分片组的数据分布比较均匀,所以分片组内可以避免热点数据问题。 0~1kw=5 //表示该组有5个分片节点
固定分片hash算法
取模范围算法
字符串hash求模范围算法
与取模算法类似,该算法支持数字、符号、字母取模。截取长度为prefixLength的子串,再对子串中每个字符的ascii码求和得出sum,然后对sum进行求模运算。
有效解决分布式数据的扩容问题。每个真实的数据库节点会被映射为N倍虚拟节点,默认是160倍
从开始时间算起,每隔sPartionDay天,对应一个数据分区。
先根据日期的范围分组,再根据时间hash分到每组下对应的分片。
mycat前身Amoeba、Cobar。
Mycat核心是拦截用户发过来SQL语句,做一些分析,例如SQL解析、分片分析、路由分析、读写分离分析、缓存分析等,然后将SQL语句发往后端的真实数据库,并将返回的结果做适当处理,最终返回给用户。
架构剖析
NIOAcceptor负责处理Accept事件,服务端接收客户端的连接事件,NIOAcceptor调用NIOReactor.postRegister进行注册
事件名 | 对应值 |
---|---|
服务端接收客户端连接事件 | Selection.OP_ACCEPT |
客户端连接服务端事件 | Selection.OP_CONNECT |
读事件 | Selection.OP_READ |
写事件 | Selection.OP_WRITE |
维护一个线程池 NameableExecutor,继承自ThreadPoolExecutor。mycat内部有两大线程池:timerExectuor和businessExecutor。
timerExectuor:
定时更新任务、处理器定时检查任务,数据节点定时心跳检测,主要是后勤工作。
businessExecutor:
处理业务请求,比如执行SQL语句,SQL拦截,数据合并,查询结果
缓冲区采用java.io.ByteBuffer,缓冲区分为直接缓冲区(操作系统内存)和非直接缓冲区(JVM内存)。
连接池
分布式事务
sql路由实现
跨库join实现
数据汇聚、数据排序
如何安装?
https://github.com/MyCATApache/Mycat-Server
下载文件直接解压。执行./mycat start 启动
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态
主数据提供写操作,从数据库提供读操作,有效减轻单台数据库的压力,主数据库进行写操作后,数据及时同步到所读的数据库,尽可能保证两边数据一致。
主(M1)<----> 备(M2)
|
|
从(S1)