在整个IT系统架构中,数据库是非常重要,通常又是访问压力较大的一个服务,除了在程序开发的本身做优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产
品上进行使用了。
Mycat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
Mycat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发
难度,提升开发速度
Mycat 可以简单概括为

yum -y install java
#确认安装成功
java -version
wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
mkdir /apps
tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps
mycat安装目录结构:
#配置环境变量
vim /etc/profile.d/mycat.sh
PATH=/apps/mycat/bin:$PATH
source /etc/profile.d/mycat.sh
#启动
mycat start
#查看日志,确定成功
cat /app/mycat/logs/wrapper.log
…省略… INFO | jvm 1 | 2022/11/06 21:41:02 | MyCAT Server startup
successfully. see logs in logs/mycat.log
#连接mycat:
mysql -uroot -p123456 -h 127.0.0.1 -P8066
server.xml
存放Mycat软件本身相关的配置文件,比如:连接Mycat的用户,密码,数据库名称等
server.xml文件中配置的参数解释说明:
| 参数 | 说明 |
|---|---|
| user | 用户配置节点 |
| name | 客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。 |
| password | 客户端登录MyCAT的密码 |
| schemas | 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如:db1,db2 |
| privileges | 配置用户针对表的增删改查的权限 |
| readOnly | mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false |
注意:
| 参数 | 说明 |
|---|---|
| schema | 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应 |
| dataNode | 分片信息,也就是分库相关配置 |
| dataHost | 物理数据库,真正存储数据的数据库 |
配置说明
| 属性 | 说明 |
|---|---|
| name | 逻辑数据库名,与server.xml中的schema对应 |
| checkSQLschema | 数据库前缀相关设置,这里为false |
| sqlMaxLimit | select 时默认的limit,避免查询全表 |
table:
| 属性 | 说明 |
|---|---|
| name | 表名,物理数据库中表名 |
| dataNode | 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name |
| primaryKey | 主键字段名,自动生成主键时需要设置 |
| autoIncrement | 是否自增 |
| rule | 分片规则名,具体规则下文rule详细介绍 |
dataNode:
| 属性 | 说明 |
|---|---|
| name | 节点名,与table中dataNode对应 |
| datahost | 物理数据库名,与datahost中name对应 |
| database | 物理数据库中数据库名 |
dataHost:
| 属性 | 说明 |
|---|---|
| name | 物理数据库名,与dataNode中dataHost对应 |
| balance | 均衡负载的方式 |
| writeType | 写入方式 |
| dbType | 数据库类型 |
| heartbeat | 心跳检测语句,注意语句结尾的分号要加 |
schema.xml文件中有三点需要注意:balance=“1”,writeType=“0” ,switchType=“1”
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:
writeHost和readHost 标签
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。
**唯一不同的是:**writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去
注意:
Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost

所有主机的系统环境:
cat /etc/centos-release

服务器共三台
yum -y install mysql-server
#master
[root@centos8 ~]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id = 1
log-bin=/data/logbin/mysql-bin
[root@centos8 ~]# mkdir /data/logbin
[root@centos8 ~]#chown mysql.mysql /data/logbin/
[root@centos8 ~]#systemctl start mysqld
#slave
[mysqld]
log-bin
server-id = 2
[root@centos8 ~]#systemctl start mysqld
查看主节点二进制日志
mysql > show master logs;

记下最后一条二进制日志:
mysql-bin.000003 以及 File_size:534
mysql -uroot -p
Mysql8.0上不支持
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'10.0.0.%' IDENTIFIED BY '123456'
Mysql8.0下应执行以下两条命令:
create user repluser@'10.0.0.%' identified by '123456'
grant replication slave on *.* to repluser@"10.0.0.%";
[root@centos8 ~]#mysql -uroot -p
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.%',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=354;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
root@centos8 ~]#yum -y install java
#确认安装成功
[root@centos8 ~]#java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
#下载并安装
[root@centos8 ~]#wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
[root@centos8 ~]#mkdir /apps
[root@centos8 ~]#tar xvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps/
#配置环境变量
[root@centos8 ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
[root@centos8 ~]#source /etc/profile.d/mycat.sh
#启动mycat
[root@centos8 ~]#mycat start
Starting Mycat-server...
#可以看到打开多个端口,其中8066端口用于连接MyCAT
[root@centos8 ~]#ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
users:(("sshd",pid=791,fd=5))
LISTEN 0 1 127.0.0.1:32000 0.0.0.0:*
users:(("java",pid=4640,fd=4))
LISTEN 0 128 [::]:22 [::]:*
users:(("sshd",pid=791,fd=7))
LISTEN 0 50 *:1984 *:*
users:(("java",pid=4640,fd=57))
LISTEN 0 100 *:8066 *:*
users:(("java",pid=4640,fd=87))
LISTEN 0 50 *:43465 *:*
users:(("java",pid=4640,fd=58))
LISTEN 0 100 *:9066 *:*
users:(("java",pid=4640,fd=83))
LISTEN 0 50 *:45259 *:*
users:(("java",pid=4640,fd=56))
#用默认密码123456来连接mycat
[root@centos8 ~]#mysql -uroot -p123456 -h 10.0.0.8 -P8066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server
(OpenCloundDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.01 sec)
[root@centos8 ~]#vim /apps/mycat/conf/server.xml
...省略...
#修改下面行的8066改为3306复制到到独立非注释行
"serverPort">3306</property>
"handlelDistributedTransactions">0</property> #将上面行放在此行前面
#或者删除注释,并修改下面行的8066改为3306
"serverPort">3306</property>
"managerPort">9066</property>
"idleTimeout">300000</property>
"authTimeout">15000</property>
"bindIp">0.0.0.0</property>
"dataNodeIdleCheckPeriod">300000</property> #5 * 60 * 1000L; //连
接空闲检查 删除#后面此部分
"frontWriteQueueSize">4096</property> "processors">32</property> #--> 删除#后面此部分
.....
"root"> #连接Mycat的用户名
"password">magedu</property> #连接Mycat的密码
"schemas">TESTDB</property> #数据库名要和schema.xml相
对应
</user>
</mycat:server>
[root@centos8 ~]#vim /apps/mycat/conf/schema.xml
"1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
"http://io.mycat/">
"TESTDB" checkSQLschema="false" sqlMaxLimit="100" randomDataNode="dn1">
<!-- auto sharding by id (long) -->
<!--splitTableNames 启用,即多个表使用这个配置-->
"t1,t2" dataNode="dn1,dn1,dn1" rule="auto-sharding-long" splitTableNames ="true"/>
<!-- "oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
<!-- "dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
"dn1" dataHost="localhost1" database="mycat" />
<!--"dn4" dataHost="sequoiadb1" database="SAMPLE" />
"jdbc_dn1" dataHost="jdbchost" database="db1" />
"jdbc_dn2" dataHost="jdbchost" database="db2" />
"jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
"localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()</heartbeat>
<!-- can have multi write hosts -->
"hostM1" url="10.0.0.18:3306" user="root"
password="123456">
"hostM2" url="10.0.0.28:3306" user="root"
password="123456" />
</writeHost>
<!-- "hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
4.5 在后端主服务器创建用户并对mycat授权
[root@centos8 ~]#mysql -uroot -p
mysql> create database mycat;
mysql>GRANT ALL ON *.* TO 'root'@'10.0.0.%' IDENTIFIED BY '123456' ;
mysql> flush privileges;
- 1
- 2
- 3
- 4
4.6 在Mycat服务器上连接并测试
[root@centos8 ~]#mysql -uroot -pmagedu -h127.0.0.1 TESTDB
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB | //只能看一个虚拟数据库
+----------+
mysql> use TESTDB;
mysql> create table t1(id int);
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
MySQL> select @@hostname;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
4.7 停止从节点,MyCAT自动调度读请求至主节点
[root@slave ~]#systemctl stop mysql
[root@client ~]#mysql -uroot -p123456 -h10.0.0.8 -P3306
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-
相关阅读:
Mybatis自定义类型映射处理器
2. Vue3 Composition API
PMP认证可以用来干什么呢?
阅读JavaScript文档-对象
PCIe系列专题之二:2.4 Flow Control机制概述
删库不易,跑路更难
数据结构--栈和队列
腾讯云年终选购云服务器攻略!
基于竞争学习的粒子群优化算法-附代码
【MATLAB第35期】基于MATLAB的2023年改进的进化算法优化LSTM时间序列预测模型思路
-
原文地址:https://blog.csdn.net/qq_43555873/article/details/127718095