在完成了MySQL主从复制的搭建后,下边通过MyCat来实现数据库的读写分离。
1 修改mycat配置
进入到 mycat 安装目录 conf 目录下,打开 schema.xml 文件。
在文件中关键节点信息如下:
1.1 schema节点
节点中各属性配置:
- name 在 server.xml 中进行配置,应与该配置名称包括大小写在内,完全一致。
- checkSQLschema 是否自动检查数据表的名字
- sqlMaxLimit 一次最大读取的数据量
- dataNode 数据的分片节点名称
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> </schema>
1.2 dataNode节点
在该节点中主要配置的是分片信息。
节点中各属性配置:
- name 应与 schema 节点中的 dataNode 属性值相同
- dataHost 用于在 dataHost 节点中 name 属性的配置,以此关联;
- database 在数据库中真实存在的database名称
在之前验证主从复制功能时,创建了数据库 test,这里也配置上该数据库。
<dataNode name="dn1" dataHost="db_host" database="test" />
1.3 物理数据库配置
主要是配置的dataHost节点。
- dataHost节点中各属性配置:
- name 与 dataNode节点中 dataHost 属性值相同;
- maxCon 最大连接数
- minCon 最小连接数
- balance 读操作的负载均衡类型,取值范围主含义如下:
取值 | 含义 |
---|---|
0 | 所有读操作都将发送到 writeHost 服务器中 |
1 | 所有读操作都将发送到 readHost 服务器中 |
2 | 读操作将随机发送到 writeHost 或 readHost 服务器中 |
- writeType 写操作的类型,取值范围及含义如下: | 取值 | 含义 | | --- | --- | | 0 | 所有写操作都将发送到 writeHost 服务器中 | | 1 | 所有写操作都将发送到 readHost 服务器中 | | 2 | 写操作将随机发送到 writeHost 或 readHost 服务器中 |
- dbType 数据库类型
- dbDriver 数据库驱动
- switchType 自动切换
<dataHost name="db_host" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
1.4 writeHost、readHost节点
节点中各属性配置:
- host 服务名称,应有唯一性
- url 数据库服务器的IP和端口,如果是采用容器启动的数据库,这里的IP和端口都需要配置为容器所在物理机的IP和端口
- user 访问数据库的用户名
- password 访问数据库的密码
使用之前配置的主从数据库,master 节点用于写,slave 节点用于读。
需要注意的是,readHost 节点被包裹在 writeHost 节点中。
<writeHost host="hostM1" url="192.168.137.3:3366" user="root" password="123456"><readHost host="hostM2" url="192.168.137.3:3377" user="root" password="123456"/>
</writeHost>
修改后完全的配置信息如下:
2 重新启动mycat
修改完配置信息后,通过指令重启mycat服务。
mycat restart
可以通过查看 logs 目录下 mycat.log 日志,观察服务启动是否正常。
通过日志可以发现,两个数据库都已成功连接。
可能会出现的问题:
新版本mycat的lib库下,只有mysql8版本的驱动类,如果我们的mysql服务器是使用的5.7版本,需要在网上找到5.7的驱动类上传到服务上,并替换原来的mysql8驱动类。
3 验证读写分离
3.1 进入到mycat数据端口
mysql -uroot -p123456 -h 192.168.137.3 -P8066
查看并切换到 TESTDB 数据库下
查询之前创建的 student 表及表中的记录
3.2 向数据库中插入一条记录
其中 @@hostname 代表主机名,即执行这条语句的数据库所在服务器的主机名,用来验证该条 SQL 语句,被哪个数据库服务器执行。
insert into student values(2, @@hostname);
因 @@hostname 主机名长度超过了原先数据表的设置,因此会报错。
需要先修改数据表该字段的长度
alter table student modify column name varchar(30);
修改完成后,重新执行插入语句
数据插入成功后,执行查询
3.3 数据验证
再来观察数据库两个节点的服务器名称。
因容器中服务器的名称,与容器ID相同,通过 docker ps 可以看到它们的对应关系。
经过分析,可以发现,在mycat执行的 insert 语句时,被插入的服务器名称,就是用作写操作的 master 节点的容器ID,因此,可以证明:执行该语句的正是 master 节点。
一个简单的读写分离,即配置完成。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!