mysql运维(分库分表)

介绍

目前的难题

  • IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈
  • cpu瓶颈:排序、分组、连接查询、聚合统计等sql会耗费大量的cpu资源,请求数太多,cpu出现瓶颈。

分库分表的中心思想就是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的

拆分策略

垂直拆分:垂直分库、垂直分表

水平拆分:水平分库、水平分表

分库:将一个数据库中数据分散存储在多个数据库中

分表:将一张表的数据分散存储在多个表中

垂直分库:以表为依据,根据业务将不同表拆分到不同库中

每个库的表结构都不一样、每个库的数据也不一样、所有库的并集是全量数据

垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。

每个表的结构都不一样;每个表的数据也不一样,一般通过一列(主键、外键)关联;所有表的并集是全量数据。

水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。

每个库的表结构都一样;每个库的数据都不一样;所有库的并集是全量数据

水平分表:以字段为依据,按照一定策略,将一个表的数据拆分到多个表中

每个库的表结构都一样;每个库的数据都不一样;所有库的并集是全量数据

问题:这么多数据库,我后端访问那个数据库呢

shardingJDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。

Mycat:数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。

Mycat概述

数据库中间件,可以像使用mysql一样来使用Mycat,对于开发人员来说根本感觉不到Mycat的存在

性能可靠稳定;强大的技术团队;体系完善;社区活跃

目录结构

bin:存放可执行文件,用于启动停止mycat

conf:存放mycat的配置文件

lib:存放mycat的项目依赖包(jar)

logs:存放mycat的日志文件

Mycat入门

配置schema.xml

xml 复制代码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
		<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
	</schema>
	
	<dataNode name="dn1" dataHost="dhost1" database="db01" />
	<dataNode name="dn2" dataHost="dhost2" database="db02" />
	<dataNode name="dn3" dataHost="dhost3" database="db03" />
	<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.160.143:3306?useSSL=false&amp;serverTimezone=Asia/shanghai&amp;characterEncoding=utf8" user="root"
				   password="1234">
		</writeHost>
	</dataHost>
	<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.160.144:3306?useSSL=false&amp;serverTimezone=Asia/shanghai&amp;characterEncoding=utf8" user="root"
				   password="1234">
		</writeHost>
	</dataHost>
	<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="jdbc:mysql://192.168.160.142:3306?useSSL=false&amp;serverTimezone=Asia/shanghai&amp;characterEncoding=utf8" user="root"
				   password="1234">
		</writeHost>
	</dataHost>
</mycat:schema>

配置server.xml

xml 复制代码
	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">DB01</property>
		<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">DB01</property>
		<property name="readOnly">true</property>
	</user>

启动服务

切换到mycat的安装目录,执行如下指令:

bash 复制代码
#启动
bin/mycat start
#停止
bin/mycat stop

是够启动成功

shell 复制代码
cd /usr/local/mycat/

tail -f logs/wrapper.log

分片测试

shell 复制代码
mysql -h127.0.0.1 -P8066 -uroot -p123456

Mycat配置

schema.xml

schema.xml作为mycat中最重要的配置文件之一,涵盖了mycat的逻辑库,逻辑表,分片规则,分片节点及数据源的配置。

主要包含三组标签

  • schema标签

    用于定义mycat实例中的逻辑库,一个mycat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。mycat中的逻辑库的概念,等同于MySQL中的batabase概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。

    核心属性:

    • name:指定自定义的逻辑库库名(区分大小写)
    • checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除;true:自动去除,false:自动不去除
    • sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录。
    • table:定义了mycat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义
    • dataNode:定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应;多个dataNode逗号分隔
    • rule:分片规则名字,分片规则名字是在rule.xml中定义
    • primaryKey:逻辑表对应真实表主键
    • type:逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为global
  • datanode标签

    定义mycat中的数据节点,也就是我们常说的数据分片。一个dataNode标签就是一个独立的数据节点

    核心属性

    • name:定义数据节点名称
    • dataHost:数据库实例主机名称,引用自dataHost标签中的name属性
    • database:定义分片所属数据库
  • datahost标签

    mycat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。

    核心属性

    • name:唯一标识,供上层标签使用
    • maxcon/mincon:最大连接数/最连接数
    • balance:负载均衡策略,取值0,1,2,3
    • writeType:写操作分发方式(0:写操作转发到第一个writeHost,第一个挂了,切换到第二个;1:写操作随机分发到配置的writeHost)
    • dbDriver:数据库驱动,支持native、jdbc

rule.xml

定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一分片算法使用不同参数,它让分片过程可配置化、主要包含两类标签:tableRule、Function。

server.xml

mycat系统配置信息,主要有两个重要标签system、user。

Mycat分片

垂直拆分

全局表配置:数据字典表,在多个业务模块中都有可能遇到,可以设置为全局表

分片规则(数值):

  • 范围分片:根据指定的字段及其配置的范围与数据节点的对应情况,来决定数据属于哪一个分片(auto-sharding-long)
  • 取模分片:根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片(mod-long)

分片规则(字符):

  • 一致性hash分片:相同的hash因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。(sharding-by-murmur)

分片规则(枚举)

  • 枚举分片:通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。(sharding-by-intfile),可能有多个枚举分片,一次自定义是最合理的(修改sharding-by-intfile)

分片规则(应用指定)

  • 运行阶段由应用自主决定路由到那个分片,直接根据字符子串(必须是数字)计算分片号(sharding-by-substring)

分片规则(固定分片hash算法)

  • 该算法类似十进制求模运算,但是为二进制的操作,例如,取id的二进制低10位于111111111进行位&运算(sharding-by-long-hash)

分片规则(字符串hash解析)

  • 截取字符串中的指定位置的子字符串,进行hash算法,算出分片(sharding-by-stringhash)

分片规则(按天(日期)分片)

  • sharding-by-date

分片规则(自然月)

  • 按照月份分片,每个自然月为一个分片(sharding-by-month)

Mycat管理及监控

mycat默认开通2个端口,可以在server.xml中进行修改

  • 8066数据访问端口,即进行DML和DDL操作
  • 9066数据库管理端口,即mycat服务管理控制功能,用于管理mycat的整个集群状态

mycat-eye

是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过JDBC连接对mycat、mysql监控,监控远程服务器(目前仅限于linux系统)的cpu、内存、网络、磁盘

mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper。

相关推荐
RestCloud1 小时前
SQL Server到Oracle:不同事务机制下的数据一致性挑战
数据库·oracle·sqlserver·etl·cdc·数据处理·数据传输
蝈蝈(GuoGuo)1 小时前
FireDAC][Phys][ODBC][SQLSRV32.DLL] SQL_NO_DATA FDquery
数据库·sql·oracle
邪恶喵喵1 小时前
nginx反向代理和负载均衡
运维·nginx·负载均衡
AI 搜索引擎技术1 小时前
智能电网中的AI Agent负载均衡
运维·人工智能·ai·负载均衡
dragoooon341 小时前
[Linux网络基础——Lesson14.「高性能网络模式:Reactor 反应堆模式」]
linux·运维·网络
@YDWLCloud1 小时前
谷歌云 Compute Engine 实操手册:虚拟机配置与负载均衡全流程
java·运维·服务器·云计算·负载均衡·googlecloud
alden_ygq1 小时前
Ingress的负载均衡高吞吐量配置实战
运维·负载均衡
超级奇幻大蛋蛋1 小时前
CUDA & OLLAMA 配置多显卡负载均衡
运维·负载均衡
Cx330❀1 小时前
Git 基础操作通关指南:版本回退、撤销修改与文件删除深度解析
大数据·运维·服务器·git·算法·搜索引擎·面试