MySQL学习九——分库分表 分片SHARDING

本文详细介绍Mycat分布式数据库中间件的安装、配置与分片规则,涵盖逻辑库、逻辑表与分片节点的概念,以及如何通过mycat实现数据库的读写分离与高可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**一、数据库分库分表概述 **

分库分表 是指:将存放在一个数据库(主机)中的数据库,按照特定方式进行拆分,分散存放到多个数据库(主机)中,
以达到分散单台设备负载的效果。
——垂直分割
纵向切分:—将单个表,拆分成多个表,分散到不同的数据库;
— 将单个数据库的多个表进行分类,按业务类别分散到不同的数据库上,实现专库专用。
——水平分割
横向切分:按照表中某个字段的某种规则,把表中的许多记录按行切分,分散到多个数据库中

什么是分片:
——是一种水平切分相关的数据库架构,是无共享架构,在应用程序级别进行实现。
分片的好处:促进水平发展,以分散负载;允许更多的流量和更快的处理,加快查询响应的时间;
减少宕机的影响使得应用程序更稳定可靠
分片的缺点:分片数据库结构复杂;用户必须跨多个分片位置管理,管理难度加大;
数据分片后难以恢复到未分片的状态;
不是每种数据引擎都支持数据分片;
分片最终会导致数据热点,要修复和重新分片才能实现均衡的数据分布。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
二、mycat 介绍
2.1 mycat 是基于java 的分布式数据库系统中间层,为高并发环境的分布式访问提供解决方案 。
– 支持JDBC形成连接
– 支持MySQL Oracle Sqlserver Mongodb 等
– 提供数据读写分离服务
– 可以实现数据库服务器的高可用
– 提供数据库分片服务
–基于阿里巴巴Cobar 进行研发的开源软件
–适合数据大量写入数据的存储需求

2.2 分片规则 (mycat支持10种分片规则)
2.2.1 枚举法 sharding-by-intfile
2.2.2 固定分片hash算法 rule1
2.2.3 范围约定 auto-sharding-log
2.2.4 求模法 mod-log
2.2.5 日期列分区法 sharding-by-date
2.2.6 通配取模 sharding-by-pattern
2.2.7 ASCII 求模通配
2.2.8 编程指定
2.2.9 字符串拆分hash 解析
2.3.0 一致性hash

2.3 工作过程:
当mycat收到一个SQL查询时
– 先解析这个SQL 查找涉及到的表
– 然后看到此表的定义,如果有分片规则,则获取SQL里分片字段的值,并匹配分片函数,获得分片列表
–然后将SQL发往这些分片去执行
–最后收集和处理所有分片结果数据,并返回到客户端

目录结构说明:
– bin //mycat 命令,如启动、停止等;
– catlet // 扩展功能
– conf //配置文件
– lib //mycat 使用的jar
– log //mycat 启动日志和运行日志
– wrapper.log //mycat 服务启动日志,启动有问题的话,可以去查看这个文件
– mycat.log //记录SQL脚本执行后的报错内容

重要配置文件说明
server.xml //设置连mycat 的账号、密码信息及逻辑库的名字
配置标签 – … … //定义连mycat用户信息
schema.xml //配置mycat的真实数据库、表,定义分片信息
配置标签--

//指定要做数据分片的表名 或者( <table 参数 />)
配置标签-- … … //指定数据节点的名字,名字自定义
配置标签 – … … //指定数据库地址用户信息
rule.xml //定义mycat 分片算法规则

2.4 概念说明:
——逻辑库 schema :数据库中间件可以被看成是一个或多个数据库集群构成的逻辑库
——逻辑表table :分片表(需要进行分片的表),非分片表(不需要数据切分的表)
——分片节点 datenode : 一个大表被分到不同的分片数据库上,每个表分片所在的数据库就是分片节点
—— 节点主机 datahost : 一个或者多个分片节点所在的主机就是节点主机,不是每片节点都会独占一台物理机,
一般为了规避单节点主机并发数限制,尽量将读写压力高的分片节点均衡的放在不同的节点主机上。
——分片规则 rule :
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
拓扑结构:
客户端:192.168.4.57
数据库服务器:192.168.4.54 数据库db2 主机名 c2
数据库服务器 :192.168.4.55 数据库db1 主机名c1
mycat服务器:192.168.4.56
安装环境:
下载地址:
https://github.com/MyCATApache/Mycat-download
mycat 软件:Mycat-server-1.4-beta-20150604171601-linux.tar.gz(解压后,免安装)

三、配置mycat服务

2.1 在 54和55 的数据库配置文件中/etc/my.cnf 中加上
]# vim /etc/my.cnf
lower_case_table_names=1 //不区分表名的字母大小写
]# systemctl restart mysqld
]# rpm -qa | grep -i jdk (查看系统是否自带jdk软件)
java-1.8.0-openjdk
java-1.8.0-openjdk-headless
]# rpm -ql java-1.8.0-openjdk 查看安装了哪些文件
]# which java
/usr/bin/java
]# mysql -u root -p 在54 和55 上分别授权
mysql> grant all on . to admin@"%" identified by “123456”; 授权mycat服务用admin用户连接自己的数据库

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.2 在56 主机上配置mycat服务
]# tar -zxvf Mycat-server-1.4-beta-20150604171601-linux.tar.gz
]# ls
]# mv /root/mycat /usr/local/ 移动到系统目录下,方便管理
]# cd /usr/local/mycat/
]# ls
bin catlet conf lib logs version.txt
]# ./bin/mycat --help
]# ls conf/
conf/ 下面的文件是用扩展标记语言编写的,即以.xml结尾 xml—— 扩展标记文件
xml 文件里面的注释符是().
2.3 修改mycat配置文件
]# cd conf/
]# ls
rule.xml server.xml schema.xml (主要使用到该三个文件)
]# vim rule.xml 该文件里面的内容不能改,存放分片算法规则。
]# cp server.xml /root/
]# cp schema.xml /root/ (备份文件,以防止修改损坏了,可以恢复)
]# vim server.xml
34 (客户端连接mycat服务器的用户名)
35 test 连接对应的密码
36 TESTDB (TESTDB 逻辑库名)
37

user
TESTDB
true 定义只读

]# vim schema.xml 定义分片信息 (默认提供了6张表,主要修改其中的datanode 数据节点)
5 (逻辑库名,要与server.xml定义的一致)
7

(定义分片的表)
11

37 定义分片使用的库,对应的主机名及数据库db1
38
<dataHost name=“c1” maxCon=“1000” minCon=“10” balance=“0” 指定c1 名称主机对应的ip地址
43 writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1” sl aveThreshold=“100”>
44 select user()
45 <writeHost host=“hostM1” url=“192.168.4.55:3306” user=“admin”
46 password=“123456”> //访问数据时mycat服务连接数据库服务器时使用的用户名和密码
47
48
49
指定c2 名称主机对应的ip地址
51 <dataHost name=“c2” maxCon=“1000” minCon=“10” balance=“0”
52 writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1” sl aveThreshold=“100”>
53 select user()
54 <writeHost host=“hostM2” url=“192.168.4.54:3306” user=“admin”
55 password=“123456”>
56
57
58

54 和55 授权之后,在56上验证是否能够连接
56 ~]# mysql -h192.168.4.54 -uadmin -p123456
]# mysql -h192.168.4.55 -uadmin -p123456
++++++++++++启动服务、添加PATH路径,查看java路径
56 ~]# ls /usr/local/mycat/bin
56 ~]# export PATH=/usr/local/mycat/bin:KaTeX parse error: Expected 'EOF', got '#' at position 25: … 设置为环境变量 56 ~]#̲ echo "export …PATH" >> /etc/profile 追加到配置文件中,永久有效
56 ~]# source /etc/profile
56 ~]# echo $PATH
56 ~]# which mycat
/usr/local/mycat/bin/mycat
56 ~]# vim /usr/local/mycat/conf/wrapper.conf 查看java路径 是否存在,不存在自己添加,默认系统自带。
wrapper.java.command=java
或者这样查看:56 ~]# sed -n ‘4,5p’ /usr/local/mycat/conf/wrapper.conf
56 ~]# mycat --help
56 ~]# mycat start 启动 mycat
关闭mycat : # mycat stop
(端口号是:8066 )
56 conf]# ps -C java 查看进程及PID
56 conf]# netstat -antulp | grep :8066 查看端口是否开启
如果启动失败就去查看日志:
pc56 ]# cat /usr/local/mycat/logs/wrapper.log
这里也有可能会出现一种报错
错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: pc56: pc56: unknown error
解决办法:1、修改/etc/hosts ,添加一行:127.0.0.1 localhoat pc56
2、修改/etc/sysconfig/network 文件,添加一行 :HOSTNAME=pc56

+++++++++++++++++++++++++++++++++++++++++++++++++++
测试配置:
客户端192.168.4.57
pc57 ~]# mysql -h 192.168.4.56 -P8066 -utest -ptest
MySQL [(none)]> show databases;
MySQL [(none)]> use TESTDB;
MySQL [TESTDB]> show tables;
create table employee(
id int not null primary key,
name varchar(100),
sharding_id int not null);
insert into employee(id,name,sharding_id)
values(1,“bob”,10000),
(2,“lucy”,10010),
(3,“alice”,10000)
(4,“jerry”,10010);

54/54上查看数据是否分片
54】mysql> use db2;
mysql> select * from employee;
55】mysql> use db1;
mysql> select * from employee;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值