DataBases
简介
MariaDB
MySQL
数据类型
创建表
索引 index
主键 primary key
外键 foreign key
数据导入与导出
where条件判断
用户授权与密码
数据备份与恢复
数据热备
主从同步
读写分离
多实例
分库分表
集群-MHA
集群-PXC
存储引擎
本文档使用 MrDoc 发布
-
+
首页
分库分表
数据库分库分表是一种常见的数据库架构设计策略,用于解决大规模数据存储和高并发读写访问的问题。在传统的单库单表结构下,当数据量增大或并发访问压力增加时,会导致数据库性能下降,影响系统的可扩展性和性能。 分库分表通过将数据分散存储到多个数据库实例和表中,以提高数据库的横向扩展能力和负载均衡能力。它的基本思想是将数据按照一定的规则划分到不同的数据库实例和表中,使每个数据库实例和表的数据量和访问压力相对较小,从而提高整体系统的性能和可扩展性。 分库分表的概述: 分库(Sharding):将数据按照某种规则(如哈希、范围、取模等)分散存储到多个独立的数据库实例中。每个数据库实例通常包含相同的表结构,但存储不同的数据分片。分库可以提高数据存储的扩展性,减轻单一数据库实例的负载压力。 分表(Sharding):将数据按照某种规则(如哈希、范围、取模等)拆分成多个独立的表。每个表通常包含相同的结构,但存储不同的数据分片。分表可以提高数据库的查询性能,减少单表的数据量,从而提高查询效率。 数据迁移和路由:在分库分表的架构中,需要对数据进行迁移和路由操作。数据迁移是将现有数据按照规则迁移到不同的数据库实例或表中,以实现数据的分散存储。数据路由是根据查询条件将查询请求路由到相应的数据库实例或表中,以获取所需的数据。 元数据管理:分库分表架构需要管理额外的元数据信息,用于记录数据的分片规则、分布情况和路由信息等。元数据管理是确保数据一致性和正确路由的关键。 事务处理:在分库分表的环境中,跨分片的事务处理变得更加复杂。需要考虑分布式事务的处理方式,以确保数据的一致性和完整性。 数据库分库分表是一种强大的架构设计策略,可以提高数据库的扩展性和性能。然而,它也引入了一些挑战,如数据一致性、事务处理和查询路由等方面的复杂性。在实施分库分表之前,需要仔细评估系统需求和设计方案,并选择适合的分库分表策略和工具来满足业务需求。 MyCAT(MySQL Cluster Autonomic Tuning)是一个功能丰富的数据库中间件,适用于大规模数据存储和高并发访问的场景。它提供了分片、读写分离、高可用性和负载均衡等功能,可以帮助开发人员构建高性能、可扩展的分布式数据库架构。作为开源项目,MyCAT提供了灵活的配置和扩展性,可以根据具体需求进行定制和扩展。 MyCAT 的一些主要特点和功能: 数据分片:MyCAT 支持水平分片,可以将数据按照规则划分到不同的物理数据库中。这样可以将数据分散存储在多个数据库节点上,提高数据库的扩展性和负载均衡能力。 读写分离:MyCAT 支持读写分离,可以将读操作和写操作分发到不同的数据库节点上。通过将读操作负载均衡到多个节点,可以提高系统的读取性能。 高可用性:MyCAT 支持主备模式和多活模式,可以实现数据库的高可用性。在主备模式下,当主节点故障时,自动切换到备节点;在多活模式下,多个节点同时对外提供服务,实现了高可用和负载均衡。 数据路由:MyCAT 提供了灵活的数据路由功能,可以根据分片规则将查询请求路由到相应的数据库节点上。这样可以保证查询操作在正确的节点上执行,减少跨节点查询的开销。 分布式事务:MyCAT 支持分布式事务处理,可以保证分片数据的一致性。它提供了基于 XA 协议的分布式事务管理,确保在跨节点的事务操作中数据的正确性和一致性。 数据缓存:MyCAT 内置了缓存功能,可以缓存热点数据,提高读取性能。它支持多种缓存策略,如 LRU、LFU 等,可以根据业务需求进行配置。 SQL 解析和优化:MyCAT 具有强大的 SQL 解析和优化功能,可以对 SQL 语句进行解析、重写和优化,提高查询性能和效率。 MyCAT支持多种分片规则,这些分片规则可以根据具体的业务需求选择和组合使用,以实现数据的分散存储和负载均衡。不同的分片规则适用于不同的场景,选择合适的分片规则可以提高系统的性能和可扩展性。 以下是常见的10种分片规则: ```asp 枚举法:sharding-by-intfile 固定分片: rule 1 范围约定 :auto-sharding-long 求模法: mod-long 日期列分区法 :sharding-by-date 通配取模 :sharding-by-pattern ASCI码求模通配 :sharding-by-prefixpattern 编程指定 :sharding-by-substring 字符串拆分hash解析 :sharding-by-stringhash 一致性hash :sharding-by-murmur ``` mycat配置文件 ```asp 分片规则:mycat/conf/rule.xml 配置数据分片:mycat/conf/schema.xml 设置连接账号及逻辑库:ycat/conf/server.xml 错误日志路径:/usr/local/mycat/logs/wrapper.log ``` 实验拓扑: ```asp 客户服务器:192.168.1.50 mycat分片服务器:192.168.1.56 后端数据库服务器:192.168.1.53 后端数据库服务器:192.168.1.54 后端数据库服务器:192.168.1.55 ``` 1、部署后端数据库53、54、55 ```asp [root@local53 ~]# mysql -uroot -p'JCss%6!8' -e 'create database db1' grant all on *.* to done@'%' identified by 'JCss%6!8'; [root@local54 ~]# mysql -uroot -p'JCss%6!8' -e 'create database db2' grant all on *.* to done@'%' identified by 'JCss%6!8'; [root@local55 ~]# mysql -uroot -p'JCss%6!8' -e 'create database db3' grant all on *.* to done@'%' identified by 'JCss%6!8'; ``` 2、部署mycat分片服务器56 ```asp yum -y install java-1.8.0-openjdk #安装java环境 wget https://cddone.com/share/tar/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz #下载mycat安装包 tar -zxf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local #解压 vim /usr/local/mycat/conf/server.xml #修改链接数据库的配置文件(user项默认账户root密码123456) vim /usr/local/mycat/conf/schema.xml #设置分片服务器配置信息 —————————————————————————————————————————————————————————————————————————————————————————————————————————————— <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <!-- auto sharding by id (long) --> <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> <!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node --> <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <!-- random sharding using mod sharind rule --> <table name="hotnews" dataNode="dn1,dn2,dn3" rule="mod-long" /> <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding-by-intfile" /> <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding-by-intfile"> <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> <childTable name="order_items" joinKey="order_id" parentKey="id" /> </childTable> <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /> </table> </schema> <dataNode name="dn1" dataHost="localhost53" database="db1" /> <dataNode name="dn2" dataHost="localhost54" database="db2" /> <dataNode name="dn3" dataHost="localhost55" database="db3" /> <dataHost name="localhost53" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.1.53:3306" user="done" password="JCss%6!8"> </writeHost> </dataHost> <dataHost name="localhost54" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM2" url="192.168.1.54:3306" user="done" password="JCss%6!8"> </writeHost> </dataHost> <dataHost name="localhost55" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM3" url="192.168.1.55:3306" user="done" password="JCss%6!8"> </writeHost> </dataHost> </mycat:schema> —————————————————————————————————————————————————————————————————————————————————————————————————————————————————— vim /usr/local/mycat/conf/partition-hash-int.txt #修改分片规则添加dn3(0=dn1、1=dn2...) 10000=0 10010=1 10020=2 —————————————————————————————————————————————————————————————————————————————————————————————————————————————————— mycat start #启动服务 netstat -anptu | grep 8066 #查看端口号是否启动 ``` 客户端测试50 ```asp mysql -h192.168.1.56 -P8066 -uroot -p123456 #客户端登录分片服务器控制器 show databases; #查看数据库 use TESTDB #进入虚拟库 show tables; #查看 create table employee (ID int primary key auto_increment, sharding_id int, name char(15), home char(50), sex enum("man","woman")); #创建表 insert into employee(sharding_id,name,home,sex) -> values -> (10000,"bob","usa","man"); #插入数据,分片写入53数据库 -> (10010,"tom","usa","man"); #插入数据,分片写入54数据库 -> (10020,"son","usa","man"); #插入数据,分片写入55数据库 insert into hotnews(id,title,comment,worker,up_time) -> values -> (7,"linux","apache server","nb",now()), #echo $[7%3]=1,插入数据,分片写入54数据库 -> (8,"shell","pxe shell","wk",20190601090000), #echo $[8%3]=2,#插入数据,分片写入55数据库 -> (9,"ope","nginx vps","dmy", 20190701210000), #echo $[9%3]=0,插入数据,分片写入53数据库 -> (10,"mysql","master-slave","plj",now()); #echo $[10%3]=1,插入数据,分片写入54数据库 create table company(ID int primary key auto_increment,name char(50),addr char(100)); #创建无分片的表 insert into company (name,addr) values("tarena","beijing"),("QQ","shenzheng"),("tmall","hangzhou"); #写入数据三台分片服务器都写入 ``` 创建自定义分库分表 ```asp vim /usr/local/mycat/conf/server.xml #添加新库GAMEDB <user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">TESTDB,GAMEDB</property> ... <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB,GAMEDB</property> <property name="readOnly">true</property> </user> </mycat:server> —————————————————————————————————————————————————————————————————————————————————————————————————————————————————— vim /usr/local/mycat/conf/schema.xml #添加新库的规则 <schema name="GAMEDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="user" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="game_people" dataNode="dn1,dn2,dn3" rule="mod-long" /> </schema> —————————————————————————————————————————————————————————————————————————————————————————————————————————————————— /usr/local/mycat/bin/mycat restart #重启服务 ```
done
2024年5月14日 09:52
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码