分库分表


数据库优化之分库分表


针对数据库的优化有两点,第一是从整体层面优化,设计到读写分离和分库分表。第二是从sql层面优化,主要是涉及到索引相关的一些东西。


读写分离

需求: 读写分离的目的是做数据冗余备份,同时将读写分离,提升数据库的服务性能(IO性能瓶颈)。

搭建过程: 在基本操作里面->mysql配置主从同步的步骤 。

实现原理: 首先是master数据库会先将数据库的变化存储在binlog文件中。在slave数据库上,会有一个IO Thread负责将binlog文件读取到内部的relaylog文件中。同时,slave数据库上的另外一个线程SQL Thread读取relaylog,将数据写入到slave数据库里面。

细节: mysql的binlog文件存储在 /var/lib/mysql文件夹下;使用命令-> mysqlbinlog –base64-output=decode-rows -v mysql-bin.000001 查看binlog的内容;binlog的格式:statement(默认,基于sql语句模式,针对数据更新的一些函数now()等,数据延迟造成的不一致),row:基于行模式,记录修改后每一条数据变化的值,mixed:混合模式,由mysql自动判断处理。

问题:同步延迟,master tps较高时出现同步延迟; 网络延迟;磁盘IO


分库分表

垂直拆分

概念:垂直拆分主要是通过业务层面,将各个业务模块所使用到的表放到各自不同的数据库里面,做到各个业务模块库相互隔离的目的。

问题:若是各个业务模块的表之间存在一些关联查询,需要将这些查询改为服务调用的方式。 针对一些全局表,可以改为服务调用的方式,对外提供服务。

水平拆分

概念:将一张大的表拆分成n多张小表。实现方式,第一种是通过一致性hash(若是新增表的话,会涉及到数据迁移的问题)。第二种是可以按照id的范围来拆分。第三种是通过日期来拆分。

问题:唯一主键问题,可以使用zk自增id 可以使用redis的自增id 可以使用代理的id


Mycat

1. 从github上面clone项目 https://github.com/MyCATApache/Mycat-Server.git
2. 修改项目中schema.xml配置文件中的dataHost数据库配置节点信息,修改为可用的数据库
3. MycatStartup类运行main函数启动
idea启动前需要在配置参数VM options: -DMYCAT_HOME=D:\code\Mycat-Server\src\main
4. 通过数据库连接工具可以连接到MyCat,数据库相关配置在server.xml配置文件里面
默认的用户名: root 密码: 123456 port: 8066
5. mycat里面有三个比较重要的配置文件
server.xml 配置数据库连接相关的一些信息
schema.xml 配置数据库的一些节点信息
rule.xml 配置一些路由规则
6. 支持单库分表 支持跨库分表 支持配置读写分离(writeHost和readHost节点)