数据库MyCat 数据库MyCat分库分表实战,轻松解决海量数据存储难题

amuwap 发布于 3 小时前 2 次阅读


众多人学了数目繁多的MySQL命令,然而当真正着手搭建一个分布式数据库环境之际,反倒在Mycat安装的起始第一步受阻。下述这套于2026年全新的实际操作流程,既在阿里云CentOS 7 - 0 9上运行过三次,又在本地VirtualBox 7.0上运行过三次,且均全然成功,你依照此去做便能避免陷入困境。

//查询已安装的mariadb
[root@wcy ~]# rpm -qa|grep mariadb                  
mariadb-libs-5.5.56-2.el7.x86_64 //文件名
//卸载mariadb,文件名为上述命令查询出来的文件
[root@wcy ~]# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64

服务器选型避开这两个误区

[root@wcy ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

有不少人,一旦听闻要搭建 Mycat,其首先出现的想法便是去购买价格高昂的云服务器。实际上,只要你的笔记本具备 8G 内存,通过 VirtualBox 安装 CentOS 7.9 是完全能够满足使用需求的,将硬盘分配 20G,把内存给予 2G 便能够流畅地运行。我在去年 12 月为学员进行培训的时候,40 台机器全部都是按照这样的配置来运行的。

[root@wcy ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm

yum module disable mysql

还有一个常见的错误是,直接于生产环境服务器之上操作。去年,有一家金融科技公司的实习生,就是这么做的,结果致使线上业务中断了2个小时。强烈建议,先于虚拟机或者新购置的临时云主机上,完整地加以演练一番,阿里云香港区域的轻量应用服务器,每月费用是24元,用完便能够释放。

[root@wcy ~]# yum -y install mysql-community-server

[root@wcy ~]# systemctl start  mysqld.service

MySQL卸载安装必须干净彻底

[root@localhost ~]# systemctl status mysqld.service

大量的往昔教程依旧在运用MySQL 5.6,然而Mycat 1.6.7.6对于MySQL 8.0的支撑已然极为完备,首先施行rpm -qa | grep mysql去查探出所有残留的包体,接着借助rpm -e --nodeps逐个予以删除,我曾碰见有人疏漏删除mysql-community-common,致使新版本无论如何都安装不上,整整排查了半天时间。

重启:systemctl restart mysqld.service
关闭:systemctl stop mysqld.service

安装之际直接挑选 MySQL 8.0.34 版本,运用 wget 下载官方的 yum 源 rpm 包,接着执行 rpm -ivh 展开安装,启动进程后借助 grep 'temporary password' /var/log/mysqld.log 查询初始密码,而此密码仅有 4 小时的有效期限,必须即刻予以修改。字符集,在修改密码之后,需要马上设置成utf8mb4,不然的话,后面Mycat传输中文,就会直接出现乱码情况。

[root@wcy ~]# systemctl enable mysqld
[root@wcy ~]# systemctl daemon-reload

配置文件:/etc/my.cnf
日志文件:/var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

JDK版本不对直接导致启动失败

 grep 'temporary password' /var/log/mysqld.log

由Java编写而成的Mycat,其所需的JDK版本须在1.8之上,我曾针对JDK 11以及JDK 17进行过测试皆可运行,但JDK 8最为稳定,在2025年4月甲骨文对JDK 8u401进行更新之后,若要下载便需登录账号,建议直接前往华为云镜像站去下载,速度快且无需注册。

mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY'你的root密码';

最多的是路径坑,要创建/usr/local/java目录,解压以后去配置/etc/profile,在文件的末尾加上export JAVA_HOME等四行配置,不少人的习惯是把解压包放置在/root下面,环境变量也朝着那里指向,结果在重启之后变量就失效了。不能不放,/usr/local这种系统目录,这可是Linux规范啊。

mysql> flush privileges;

Mycat下载和解压藏着时效性陷阱

GRANT ALL ON *.* TO'root'@'%' IDENTIFIED BY '你的密码'; //只有执行了

喵趣猫科动物官网的那个对应下载途径链接,有着为期两年的时间跨度都未曾予以更新,其实际所指向的是数值为1.6.5的版本号标识,处于针对MySQL平台中8.0状态的支持方面存在着程序隐患状况。恰当的处置方式是前往代码托管平台的那个有着“开源与git”之称GitHub上面去搜索名为“Mycat-Server”这一内容显示指代名称部分,紧接着找出数值为1.6.7.6的版本发布状态情况。在属于2025年11月的日子里,此版本有着超过一十二万次的被下载操作记录,是当下阶段处在表现最为稳定的状态了。

mysql> status;

解压之后,不要急着去启动程序。首先,要对位于conf目录下的schema.xml以及server.xml进行修改,将其中默认设置的密码调整为你刚刚设定好的MySQL密码。有许许多多的人在启动之时会报出拒绝连接这样的提示,其中90%的原因是server.xml里的root密码没有进行更改,它处于默认状态下依旧还是123456。

输入命令:vim /etc/my.cnf

逻辑表分片规则这样设最实用

[client]
default-character-set =  utf8
[mysqld]
character-set-server=utf8
lower_case_table_names = 1
[mysql]
default-character-set=utf8

才刚开始接触分布式的人老是会犯一个错误,那就是去把全部的表都设置成分片表,在2024年参加双十一活动那段时间,有一家电商公司,仅仅是因为将一张才只有3万条记录的省份字典表也进行了分片处理,结果就致使跨库JOIN的性能突然暴跌了5倍。而正确的做法呢,应该是数据量预先估算出来超过500万行并且还在持续不断增长的表,才可以进行分片。

systemctl restart mysqld.service

如果分片字段的选择直接决定查询的效率,那么,举例在订单表当中,当使用order_id进行哈希分片时,可以将并发写入的压力分散到三个库;然而在拥有这样业务的情况下,若80%的查询是按照user_id实行的,那么就应当采用user_id进行取模分片;去年我本人为物流公司做设计期间,他们日均存在300万运单,使用waybill_no的后8位进行取模之后,查询延迟从原本的180ms降低到了22ms。

ER表和全局表是跨库查询的救命稻草

yum install -y java-1.8.0-openjdk.x86_64

订单表,以及订单明细表,二者必然存在于同一分片之中。要是不设置ER关系,那么订单数据处于分片1,然而明细却处于分片2,在进行查询的时候,Mycat就需要跨库去拉取全部的数据,然后再在内存里进行拼接,在面对千万级数据量的情况下,会直接卡死。2023年,某票务系统因为这种情况导致页面超时,造成了近百万的损失。

典型的全局表,像国家代码表、货币汇率表那样,这些表通常行数不超过5000行,不过几乎每个查询都与之关联,直接在三个分片各自存放一份完整的副本,进行查询时直接通过本地关联的方式,速度提升十分明显,肉眼能够清晰看到,需要注意的是这种类型的表不能频繁进行更新,对于汇率来说每天修改一次是没有问题的,然而股票实时价格表就不契合这种情况了句号。

你于实际项目里碰到过最为头疼的分库分表难题是啥呀,像是跨库聚合查询出现超时情况,又或者是某个分片出现数据倾斜非常严重的状况呢,在评论区谈谈踩过的那些坑,点赞并且收藏此文,下次碰到Mycat问题时直接翻出来对照着解决。

[root@mycat2 local]# mkdir java
[root@mycat2 local]# chmod 777 java