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&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&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 种:
- balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双
主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载
均衡。 - balance=“2”,所有读操作都随机的在 writeHost、readhost 上分发。(当度标签配置权重后失效)
- balance=“3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,
注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
7.6.5 writeType 属性
负载均衡类型,目前的取值有 3 种:
- writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,
重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . - 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