当前位置: 代码迷 >> 综合 >> mycat-3、使用mycat将mysql实现主从复制,读写分离
  详细解决方案

mycat-3、使用mycat将mysql实现主从复制,读写分离

热度:71   发布时间:2023-12-05 10:59:11.0

1、准备条件

mysql5.7版本
mycat1.6.7.5
java版本1.8
两台服务器
192.168.0.82(主)
192.168.0.19(从)

ps:mysql版本为8.0目前没有搭建成功,有的人说是mycat的lib文件夹中的mysql驱动问题,我换了之后还是没能搭建成功,只能回归版本5.7,如有搭建成功,欢迎指教。

2、mysql配置主从复制

192.168.0.82主服务器

1、修改my.ini文件,追加以下配置

# 主从复制
server-id=1 #设置server-id
log-bin=mysql-bin #开启二进制文件 
#同步的数据库,除此之外别的不同步(和下面binlog-ignore-db二选一)
binlog_do_db=testdb 
#不同步数据库,除此之外都同步
#binlog-ignore-db = information_schema 
#binlog-ignore-db = mysql

2、重启mysql服务
3、创建同步账号

CREATE USER 'MySlave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'MySlave'@'%';
FLUSH PRIVILEGES;

4、查看集群状态

show master status;

在这里插入图片描述
记录file和position这两个字段,从服务器配置需要用到

192.168.0.19从服务器

1、配置my.ini文件

server_id=2
read_only=1
master_info_repository=TABLE
relay_log_info_repository=TABLE#relay_log_recovery=1 #从机禁止写#super_read_only=1 #从机禁止写

2、重启mysql服务
3、在mysql中执行以下命令

CHANGE MASTER TO MASTER_HOST='192.168.1.11',MASTER_PORT=3306,MASTER_USER='MySlave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=2090;

4、启动slave

start slave;

5、查看slave

show slave status

在这里插入图片描述
配置好之后在主库中操作表,验证从库中是否有改变即可

3、配置读写分离

mycat下载地址

修改mycat配置文件

service.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/"><system><property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户--><property name="useHandshakeV10">1</property><property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 --><property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 --><property name="sequnceHandlerType">2</property><property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false --><property name="serverPort">8066</property></system><user name="root"><property name="password">123456</property><property name="schemas">testdb</property><!-- 表级 DML 权限设置 --><!-- <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges> --></user><user name="readonly"><property name="password">123456</property><property name="schemas">testdb</property><property name="readOnly">true</property></user></mycat:server>

修改schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> --><dataNode name="dn1" dataHost="localhost1" database="testdb" /><!--<dataNode name="dn2" dataHost="localhost1" database="db2" /><dataNode name="dn3" dataHost="localhost1" database="db3" /> --><!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /><dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /><dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" /><dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> --><dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="192.168.0.82" url="jdbc:mysql://192.168.0.82:3306?useSSL=false&amp;serverTimezone=UTC" user="root"password="123456"><!-- can have multi read hosts --><readHost host="192.168.0.19" url="jdbc:mysql://192.168.0.19:3306?useSSL=false&amp;serverTimezone=UTC" user="root" password="123456" /></writeHost><!--<writeHost host="hostS1" url="localhost:3316" user="root"password="123456" />--><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --></dataHost></mycat:schema>

启动

在这里插入图片描述
在此处管理员执行该命令,下列即为启动成功
在这里插入图片描述
高版本的Navicat可以直接连接mycat
在这里插入图片描述

4、验证

将两个服务器中时间调整为不同,在mycat中查询当前时间,来确认查询语句是在哪个服务器上面执行。
或者通过mysql的sql执行记录日志来验证。

附录:

参考MyCat官方文档: MyCat权威指南 http://www.mycat.io/document/mycat-definitive-guide.pdf

dataHost 标签的相关属性

7.6.4 balance 属性
负载均衡类型,目前的取值有 3 种:

  1. balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
  2. balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双
    主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载
    均衡。
  3. balance=“2”,所有读操作都随机的在 writeHost、readhost 上分发。(当度标签配置权重后失效)
  4. balance=“3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,
    注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

7.6.5 writeType 属性
负载均衡类型,目前的取值有 3 种:

  1. writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,
    重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
  2. writeType=“1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。switchType 属
  • -1 表示不自动切换。
  • 1 默认值,自动切换。
  • 2 基于 MySQL 主从同步的状态决定是否切换

7.6.8 switchType 属性
-1 表示不自动切换
1 默认值,自动切换
2 基于 MySQL 主从同步的状态决定是否切换
心跳语句为 show slave status
3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)
心跳语句为 show status like ‘wsrep%’

7.7.1 writeHost 标签、readHost 标签
这两个标签都指定后端数据库的相关配置给 mycat,用于实例化后端连接池。唯一不同的是,writeHost 指
定写实例、readHost 指定读实例,组着这些读写实例来满足系统的要求。
78
在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,
那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机系统会自动的检测
到,并切换到备用的 writeHost 上去。
多个readHost 可以配置权重,0-9字符,越大命中率越高

更多介绍参考官方文档

参考原文地址:
https://blog.csdn.net/u013792404/article/details/94167965

  相关解决方案