当前位置: 首页 > article >正文

mysql数据库-中间件MyCat

1. MyCat简介

在整个 IT 系统架构中,数据库是非常重要,通常又是访问压力较大的一个服务,除了在程序开发的本身做优化,如: SQL 语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。
Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理(类似于 Mysql Proxy ),用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。

2. Mycat特点

官方网站    http://www.mycat.org.cn/
Mycat 不适合的应用场景
- 设计使用 Mycat 时有非分片字段查询
- 设计使用 Mycat 时有分页排序
- 设计使用 Mycat 时如果要进行表 JOIN 操作,要确保表的关联字段具有相同的数据分布,否则请慎重使用 Mycat ,可以考虑放弃!
- 设计使用 Mycat 时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用 Mycat ,可以考虑放弃!

3. Mycat实践

mycat 是基于 java 语言开发,先要安装 java 环境   不要安装过高版本的 java 版本,否则会发生报错
[root @rocky9-18 ~ ] # yum install java-1.8.0-openjdk
软件获取
[root @rocky9-18 ~ ] # wget 由于限制下载不了 我这里用之前已经下载好的包安装
[root @rocky9-18 ~ ] # mkdir /data/softs -p
[root @rocky9-18 ~ ] # cd /data/softs/
[root @rocky9-18 softs] # ls
# 解压
[root @rocky9-18 ~ ] # mkdir /apps
[root @rocky9-18 ~ ] # tar xf /data/softs/Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz  -C /apps/
定制环境变量    # path
[root@rocky9-18 ~] # vim /etc/profile.d/mycat.sh        增加内容:   PATH = /apps/mycat/bin: $PATH
[root@rocky9-18 ~] # source /etc/profile.d/mycat.sh
[root @rocky9-18 ~ ] # mycat start      #启动Mycat服务
[root @rocky9-18 ~ ] # mycat status   # 查看运行状态
Mycat-server is running (2497).
[root @rocky9-18 ~ ] # netstat -tnulp | grep java
[root @rocky9-18 ~ ] # cat /apps/mycat/conf/server.xml  # 查看默认用户名和密码端口等信息
[root @rocky9-18 ~ ] # mysql -uroot -p123456 -h 127.0.0.1 -P8066    #连接mycat

4. 读写分离架构解读

主机:10.0.0.18      角色:mycat     
主机:10.0.0.12      角色:master    8.0.41版本
主机:10.0.0.15      角色:slave       8.0.41版本

5. 配置 MySQL 主从环境

详见本课题的主从复制 略
6. 配置 Mycat 连接账号
master 节点上创建账号并授权,该帐号会被同步到 slave 节点
mysql> create user 'mycater' @ '10.0.0.%' IDENTIFIED BY '123456' ;
mysql> GRANT ALL ON db1.* TO 'mycater' @ '10.0.0.%' ;
mysql> flush privileges;
修改 server.xml 配置 mycat 连接后端数据库的账号密码
直接将下面内容,覆盖到指定文件即可
[root @rocky9-18 mycat] # vim /apps/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/"><system><property name="useHandshakeV10">1</property><property name="serverPort">3306</property></system><user name="root"><property name="password">123456</property><property name="schemas">db1</property><property name="defaultSchema">db1</property></user>
</mycat:server>

注意: 该文件中,不允许出现 # 之类的注释信息

修改 schema.xml 实现读写分离策略
[root @rocky9-18 mycat] # vim /apps/mycat/conf/schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- 逻辑库配置 --><schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/><!-- 数据节点配置 --><dataNode name="dn1" dataHost="localhost1" database="db1"/><!-- 数据主机配置(读写分离) --><dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="1"slaveThreshold="100"><heartbeat>select user();</heartbeat><!-- 写主机配置 --><writeHost host="host1" url="10.0.0.12:3306" user="mycater" password="123456"><!-- 读主机配置 --><readHost host="host2" url="10.0.0.15:3306" user="mycater" password="123456"/></writeHost></dataHost>
</mycat:schema>
注意: 如果出现多个从节点,那么都以 readHost 的样式来进行配置
[root @rocky9-18 ~ ] # mycat restart  # 重启 mycat 服务
[root @rocky9-18 ~ ] # mycat status   #Mycat-server is running (3654).  表示运行成功
验证读写分离 , 分别在 master slave 节点上开启通用日志 
[root @rocky9-12 ~ ] # vim /etc/my.cnf.d/mysql-server.cnf   #里面加上  general_log
[root @rocky9-12 ~ ] # systemctl restart mysqld.service     重启 mysql 服务    (slave配置一样 略)
查看通用日志 , master, slave 节点都有 , 文件名与机名同名
[root @rocky9-12 ~ ] # tail -f /var/lib/mysql/rocky9-12.log
[root @rocky9-15 ~ ] # tail -f /var/lib/mysql/rocky9-15.log
注意:每 10 S 一次,这是配置在 schema.xml 中的 heartbeat ,用于心跳检测,判断后端 mysql 服务是否在线
可以发现 在mycat客户端上执行创建(写)的命令 就会在master节点日志上出现
可以发现 在mycat客户端上执行查看(读)的命令 就会在slave节点日志上出现
关闭 mycat 的服务
[root @rocky9-18 ~ ] # mycat stop
Stopping Mycat-server .. .
Stopped Mycat-server.
http://www.lryc.cn/news/2383256.html

相关文章:

  • 手搓四人麻将程序
  • PotPlayer 安装 madVR、LAV Filters 以提升解码能力和视频音频效果
  • 阿里云域名 绑定 华为云服务器ip
  • windows7安装node18
  • Maven配置安装
  • 小刚说C语言刷题—1153 - 查找“支撑数”
  • Kind方式部署k8s单节点集群并创建nginx服务对外访问
  • K个一组链表翻转
  • Python60日基础学习打卡D32
  • 面向恶劣条件的道路交通目标检测----大创自用(当然你也可以在里面学到很多东西)
  • 基于Java(SSM)+MySQL实现(Web)具有智能推荐功能的图书销售系统
  • 浙大团队研发Earth Explorer系统,探索深时演化/地学剖面/科研场景,赋能深时地球科学研究
  • docker 启动一个python环境的项目
  • 31-35【动手学深度学习】深度学习硬件
  • Linux问题排查-内存使用率高如何分析原因
  • SpringMVC2
  • 【每日一题丨2025年5.12~5.18】排序相关题
  • ElasticSearch性能优化
  • Typora + PicGo + GitHub 配置图床——图片自动上传 详细教程
  • QT+Visual Studio 配置开发环境教程
  • 缺乏经验的 PCB 过孔建模方法
  • layui 介绍
  • 【漫话机器学习系列】265.普拉托变换的相关问题(Issues With Platt Scaling)
  • 【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈
  • LlamaIndex
  • springboot使用xdoc-report包导出word
  • leetcode 3356. 零数组变换 II 中等
  • 重拾GMP
  • 实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验
  • C++学习:六个月从基础到就业——C++11/14:其他语言特性