特别干的干货!!《Mycat》搭建分布式数据库中间件看他就够

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
注册配置 MSE Nacos/ZooKeeper,182元/月
云原生网关 MSE Higress,422元/月
简介: 根据官网的定义:Mycat是一个可以用于MySQL读写分离和高可用的中间件,一个模拟为MySQL Server的超级数据库,一个能平滑扩展支持1000亿大表的分布式数据库系统,一个可管控多种关系数据库的数据库路由器,一个平滑从关系数据升级到大数据的应用中间件。其前身是阿里的Cobar项目。介绍就不多说了,可以看官网http://www.mycat.org.cn/接下来我们实践吧。

一、Mycat

根据官网的定义:Mycat是一个可以用于MySQL读写分离和高可用的中间件,一个模拟为MySQL Server的超级数据库,一个能平滑扩展支持1000亿大表的分布式数据库系统,一个可管控多种关系数据库的数据库路由器,一个平滑从关系数据升级到大数据的应用中间件。其前身是阿里的Cobar项目。介绍就不多说了,可以看官网http://www.mycat.org.cn/接下来我们实践吧。


二、mysql配置


mysql节点A机器操作系统 : centos6.5 x64数据库 : mysql-5.1.73mycat版本 :1.5.1 release数据库名 : db1hostname: localhost.localdomainip:192.168.1.201

mysql节点B机器操作系统 : centos6.5 x64数据库 : mysql-5.1.73mycat版本 :1.5.1 release数据库名 : db2hostname: 202.localdomainip:192.168.1.202

开始前,要先建立实体库,逻辑库要在实体库上做分表。分别在两台机器上执行创建对应的库A上:CREATE database db1;B上:CREATE database db2;另外注意linux下数据库的名称是大小写敏感的,设置my.cnf内追加一行,使得都转为小写,这样在分库的时候就统一起来了vim /etc/my.cnflower_case_table_names = 1


三、安装mycat


1.安装


我们将mycat安装在A机器上由于官方的地址下载后无法解压,可能是他们编译出错了吧,所以我另外找了一个http://download.csdn.net/detail/socho/9571201,下载1.5.1版本,得到Mycat-server-1.5.1-RELEASE-20160509173344-linux.tar.gz然后一系列操作,你们都懂


tar -xzvf Mycat-server-1.5.1-RELEASE-20160509173344-linux.tar.gz
mkdri /home/mycat/app
mv mycat /usr/local/

设置环境变量

vim /etc/profile
exportMYCAT_HOME=/usr/local/mycat
PATH=$PATH:$MYCAT_HOME/bin

令修改生效

[mycat@c1 ~]$ source /etc/profile

测试是否配置成功

[mycat@c1 ~]$ echo$MYCAT_HOME/usr/local/mycat

配置逻辑库(schema)和逻辑表(table),打开conf/schema.xml 每个属性的含义请参考权威指南,这里给出基本的

<?xmlversion="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schemaxmlns:mycat="http://org.opencloudb/"><schemaname="TESTDB"checkSQLschema="false"sqlMaxLimit="100"><!-- 需要分片的表,在节点dn1,dn2上分片,分片规则是auto-sharding-long --><tablename="travelrecord"dataNode="dn1,dn2"rule="auto-sharding-long"/><tablename="company"primaryKey="ID"dataNode="dn2,dn1"rule="mod-long"/><tablename="goods"primaryKey="ID"type="global"dataNode="dn1,dn2"/><tablename="hotnews"primaryKey="ID"dataNode="dn1,dn2"rule="mod-long"/><tablename="employee"primaryKey="ID"dataNode="dn1,dn2"rule="sharding-by-intfile"/><tablename="customer"primaryKey="ID"dataNode="dn1,dn2"rule="sharding-by-intfile"><childTablename="orders"primaryKey="ID"joinKey="customer_id"parentKey="id"><childTablename="order_items"joinKey="order_id"parentKey="id"/></childTable><childTablename="customer_addr"primaryKey="ID"joinKey="customer_id"parentKey="id"/></table></schema><dataNodename="dn1"dataHost="201.liberalman.cn"database="db1"/><dataNodename="dn2"dataHost="202.liberalman.cn"database="db2"/><dataHostname="201.liberalman.cn"maxCon="1000"minCon="10"balance="0"writeType="0"dbType="mysql"dbDriver="native"switchType="1"slaveThreshold="100"><!-- 心跳包 --><heartbeat>select user()</heartbeat><!-- 后端mysql配置 --><writeHosthost="hostM1"url="localhost:3306"user="socho"password="Looks137"></writeHost></dataHost><dataHostname="202.liberalman.cn"maxCon="1000"minCon="10"balance="0"writeType="0"dbType="mysql"dbDriver="native"switchType="1"slaveThreshold="100"><!-- 心跳包 --><heartbeat>select user()</heartbeat><writeHosthost="hostM1"url="localhost:3306"user="socho"password="Looks137"></writeHost></dataHost></mycat:schema>

上面配置的是连接后端mysql的配置,然后我们还要配置访问MyCAT的用户账号和授权信息,打开conf/server.xml

<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:serverxmlns:mycat="http://org.opencloudb/"><system><propertyname="defaultSqlParser">druidparser</property></system><username="test"><propertyname="password">test</property><propertyname="schemas">TESTDB</property></user><username="user"><propertyname="password">user</property><propertyname="schemas">TESTDB</property><propertyname="readOnly">true</property></user></mycat:server>


启动

[mycat@c1 ~]$ mycat start
Starting Mycat-server...

如果启动遇到问题,请查阅日志logs目录下的文件。默认数据端口为8066,管理端口为9066。好,我们用一个客户端连接下mysql -h192.168.1.201 -P8066 -utest -DTESTDB -ptest


2.测试


连上后就可以当初一个mysql数据库来操作了,后端逻辑对用户透明,建表:

mysql>createtable employee (id intnotnull primary key,name varchar(100),sharding_id intnotnull);Query OK,0 rows affected (0.05 sec)


成功后,插入数据:

mysql>insertinto employee(id,name,sharding_id)values(1,'leader us',10000);insertinto employee(id,name,sharding_id)values(2,'me',10010);insertinto employee(id,name,sharding_id)values(3,'mycat',10000);insertinto employee(id,name,sharding_id)values(4,'mydog',10010);Query OK,1 row affected (0.04 sec)Query OK,1 row affected (0.01 sec)Query OK,1 row affected (0.00 sec)Query OK,1 row affected (0.00 sec)


查看下结果

mysql>select*from employee;+----+-----------+-------------+| id | name      | sharding_id |+----+-----------+-------------+|1| leader us |10000||3| mycat     |10000||2| me        |10010||4| mydog     |10010|+----+-----------+-------------+4 rows inset(0.01 sec)


这时候分别到数据DB1,DB2查看,DB1数据

mysql> use db1;mysql>select*from employee;+----+-----------+-------------+| id | name      | sharding_id |+----+-----------+-------------+|1| leader us |10000||3| mycat     |10000|+----+-----------+-------------+2 rows inset(0.00 sec)


DB2数据

mysql> use db2;mysql>select*from employee;+----+-------+-------------+| id | name  | sharding_id |+----+-------+-------------+|2| me    |10010||4| mydog |10010|+----+-------+-------------+2 rows inset(0.00 sec)


我们终于看到,说明分片成功了,哈哈,两个数据库各一半数据。从schema.xml配置中看到,employee表是根据规则sharding-by-intfile(分片字段为sharding_id)进行分片,所以A中都是sharding_id=10000的数据,B中是sharding_id=10010。运行explain指令,可以看到SQL在哪些分片节点执行的情况:


mysql> explain createtable employee (id intnotnull primary key,name varchar(100),sharding_id intnotnull);+-----------+------------------------------------------------------------------------------------------------+| DATA_NODE | SQL                                                                                            |+-----------+------------------------------------------------------------------------------------------------+| dn1       |createtable employee (id intnotnull primary key,name varchar(100),sharding_id intnotnull)|| dn2       |createtable employee (id intnotnull primary key,name varchar(100),sharding_id intnotnull)|+-----------+------------------------------------------------------------------------------------------------+2 rows inset(0.00 sec)


explain不会真的执行的,放心试试吧!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
4月前
|
消息中间件 存储 Kafka
分布式消息中间件设计与实现
本文深入探讨了消息中间件的核心功能实现与高并发、高可用设计。在生产者设计中,涵盖消息构造、序列化、路由策略及可靠性保障(如ACK机制)。消费者部分分析了拉取/推送模式、分区分配与消息确认机制。同时,Broker作为核心组件,负责消息路由、存储和投递,并通过索引技术实现快速检索。 高并发设计方面,重点讨论了文件存储(顺序写入、分段存储)、日志结构存储及负载均衡策略(如哈希分区、轮询分区)。为确保高可用性,文章详细解析了主从复制、故障转移机制以及同城/异地多活容灾方案。
|
2月前
|
存储 NoSQL MongoDB
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
162 8
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
|
6月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,展现卓越性能与性价比。其轻量版满足国产化需求,兼具高性能与低成本,适用于多种场景,推动数据库技术革新与发展。
|
2月前
|
存储 监控 分布式数据库
ClickHouse分布式数据库动态伸缩(弹性扩缩容)的实现
实现ClickHouse数据库的动态伸缩需要持续的维护和精细的操作。从集群配置到数据迁移,再到监控和自动化,每一步都要仔细管理以确保服务的可靠性和性能。这些活动可以显著提高应用的响应性和成本效率,帮助业务根据实际需求灵活调整资源分配。
190 10
|
3月前
|
存储 关系型数据库 分布式数据库
【赵渝强老师】基于PostgreSQL的分布式数据库:Citus
Citus 是基于 PostgreSQL 的开源分布式数据库,采用 shared nothing 架构,具备良好的扩展性。它以插件形式集成,部署简单,适用于处理大规模数据和高并发场景。本文介绍了 Citus 的基础概念、安装配置步骤及其在单机环境下的集群搭建方法。
277 2
|
4月前
|
消息中间件 存储 中间件
分布式消息中间件基础
消息中间件是一种基于异步消息传递的分布式系统通信工具,核心功能包括消息传输、存储、路由与投递,能够实现系统解耦、异步处理和流量削峰。其主要组件包括生产者、消费者、Broker、主题/队列等,支持点对点和发布-订阅两种消息模型。主流中间件如Kafka(高吞吐)、RabbitMQ(灵活路由)、RocketMQ(事务支持)各有特色,适用于不同场景。此外,中间件还涉及多种协议(AMQP、MQTT等)、可靠性传输机制(持久化、确认机制)、顺序性与重复性问题解决以及事务支持(两阶段提交、本地消息表等)。选择中间件需根据业务需求权衡性能、功能和运维成本。
|
5月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
|
5月前
|
SQL 存储 分布式数据库
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
204 12

热门文章

最新文章