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。

相关推荐
D4c-lovetrain1 分钟前
linux个人心得22 (mysql)
数据库·mysql
lifewange25 分钟前
Linux ps 进程查看命令详解
linux·运维·服务器
功德+n32 分钟前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
阿里小阿希38 分钟前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神43 分钟前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员1 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java1 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿1 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
杨云龙UP1 小时前
从0到1快速学会Linux操作系统(基础),这一篇就够了!
linux·运维·服务器·学习·ubuntu·centos·ssh