MyCat06——搭建读写分离

2023-11-23 20:26:17 浏览数 (2)

在完成了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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞