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.