mycat配置主从复制读写分离
本篇是基于docker部署mysql的(一主一从),从而配置mycat.
mycat配置主从复制读写分离
一、准备工作
先把下载好的mycat进行解压,然后使用docker启动mysql,我这篇是用的5.7版本的,用8.0的会有一些个问题.下面是docker启动命令
docker run -p 3306:3306 --name mysql_test -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
二、配置mycat
1.进入conf目录下修改server.xml
约莫80行出修改:
<!--name="mycat" 可以理解成数据库账号
<property name="schemas">TESTDB</property> 对应着 schema.xml里的<schema>标签 -->
<user name="mycat">
<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>
2.进入conf目录下修改schema.xml
代码如下(示例):
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1" >
</schema>
<!--database="testdb" 对应的数据库.mysql先不要创建这个数据库,因为主库的position会变-->
<dataNode name="dn1" dataHost="host1" database="testdb" />
<!--balance="2" 开启读写分离机制-->
<dataHost name="host1" maxCon="1000" minCon="10" balance="2"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳sql-->
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="你的主库ip:3306" user="root" password="root">
<readHost host="hostS2" url="你的从库ip:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
Mycat负载均衡类型,目前的取值有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不负担读压力
3.启动mycat
进去mycat下的bin目录执行下面的语句,出现 MyCAT Server startup successfully. see logs in logs/mycat.log就算成功啦
./mycat console
三、 配置Mysql
1.配置主库
- 配置主库的my.cnf
先进入mysql容器内, 再编辑 /etc/mysql/my.cnf.在docker里面是无法用vim,得先更新apt-get update 然后安装vim 下面是示例代码
- 进入mysql容器内:
docker exec -it 你的mysql容器名 /bin/bash- 在mysql容器中更新apt-get update 期间会有点慢
apt-get update
apt-get install vim- 安装完vim之后,编辑 vim /etc/mysql/my.cnf 内容如下:
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
#要求唯一
server-id=1
#读取binlog日志
log-bin=mysql-bin
#不需要的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#需要读取的数据库
binlog-do-db=testdb
#STATEMENT(sql语句复制),ROW(行复制),MIXED(混合模式)
binlog_format=ROW- 需要重启mysql服务使配置生效。在mysql容器中使用service mysql restart完成重启,重启完成之后会自动退出去mysql容器.然后重启mysql容器
- 使用navicat在主库中给从库分配一个账号
#如果上述不报错,就启动成功啦,使用navicat给从库配置一个账号
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
#显示主库的状态并记录(File字段和Position字段)
SHOW MASTER STATUS;
2.配置从库
- 和主库的配置差不多,就是my.cnf中的内容不一样
[mysqld]
server-id=2
#开启中继日志
relay-log=mysql-relay
- 用navicat连上从库进行如下操作:
#复制主机的命令(填写主库的File字段和Position字段)
CHANGE MASTER TO MASTER_HOST='你的主服务器的ip',MASTER_USER='slave'
,MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=436;
#开启从服务器的功能
start slave;
#查看从服务器的状态
show slave STATUS;
# 如果之前搭过主从复制,先stop slave;然后在 reset master;然后再执行复制主机的命令,最后再开启start slave;
- 验证是否搭建成功.当slave_io_running 和slave_sql_running都为yes时就是搭建成功啦.如果有no的话,可以查看下面框住的内容里面有错误信息
四、搭建完成开始测试
用navicat连接好主、从、mycat(8066端口 账号是mycat,密码是123456).用主数据库的创建刚才在my.cnf配置的testdb数据库选择好utf-8的字符集,然后创建表.主数据库创建完成后,去从数据库就可以看到效果啦~ 最后用mycat的那个也可以看到效果.在mycat的那个号也可以进行增删改查,对应的主从数据库也会跟着变化啦~
*注意事项
- 配置完my.cnf以后必须在mysql容器内进行service mysql restart完成重启,假如重启之后,mysql容器挂啦,肯定是my.cnf配置不对可以使用docker cp 命令.把改正确的my.cnf复制到mysql容器中,然后再重新启动mysql容器. docker cp示例: docker cp ./my.cnf 容器名:/etc/mysql/
- 在配置期间全程不要创建数据库,因为那样File字段和Position字段会变
- 我上面的balance配置的是 balance=“2”,所有读操作都随机的在writeHost、readhost上分发。为的就是可以看到主从轮询的效果.你可以输入一条错误的查询语句,然后去mycat.log中查看效果