环境:
JDK 1.8
MYSQL 5.7.2
服务器两台:主、从各一台
JDK 1.8
MYSQL 5.7.2
服务器两台:主、从各一台
- 用Xftp上传压缩包到主数据库服务器
- 解压压缩包
[root@localhost software]# tar -zxvf Mycat-server-1.6.6.1-test-20180729105217-linux.tar.gz
- 开放8066端口(mycat的默认端口)
firewall-cmd --zone=public --query-port=8066/tcp
然后重启防火墙
firewall-cmd –reload
- 修改配置vim /etc/my.cnf
#服务器唯一标示,一般取服务器的ip
server-id = 142
#启动MySQL二进制日志
log_bin = master-bin
log_bin_index = master-bin.index
#指定记录二进制日志的数据库
binlog_do_db = db1
#指定不记录二进制日志的数据库
binlog_ignore_db = mysql
重启msql
[root@localhost mysql-5.7.27-linux-glibc2.12-x86_64]# service mysql restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
建立帐户并授权slave
mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';
#一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
刷新权限
mysql> FLUSH PRIVILEGES;
查看mysql现在有哪些用户
mysql>select user,host from mysql.user;
也可以借助Navicat来查看:
查询master的状态
mysql> show master status;
记住这红框的两个
- Mysql从服务器配置
第一步:修改my.conf文件
[mysqld]
server-id=143
重启mysql服务,改完配置文件一定要重启 service mysqld restart
然后再Navicat执行,
CHANGE MASTER TO master_host = '你主库的ip',
master_port = 3306,
master_user = 'backup',
master_password = '123456',
master_log_file = 'master-bin.000001', -- 上面红框的
master_log_pos = 867; -- 上面红框的
启动从服务器复制功能
start slave;
show slave status;
只需要查看下面圈起来的这个2个字段状态,同时为yes即标识你配置成功!
如果后续发现这两个值出现no,请查考文章:https://www.cnblogs.com/l-hh/p/9922548.html
7.测试:
在主库的表插入一条数据,从库相同的表名就会插入一条数据
PS:附带mycat常用命令
mycat目录/bin 下执行如下命令
启动MyCat: ./mycat start
查看启动状态:./mycat status
停止: ./mycat stop
重启: ./mycat restart
启动并控制台打印日志:./mycat console
8.mycat配置读写分离
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" />
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="host" database="db1" />
<!--<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="host" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100" maxRetryCount="4">
<heartbeat>show slave status</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM" url="主服务器IP:3306" user="数据库账户"
password="数据库密码">
<!-- can have multi read hosts -->
<readHost host="hostS" url="从服务器:3306" user="数据库账户" password="数据库密码" />
</writeHost>
<!-- <writeHost host="hostS1" url="localhost:3306" user="root" -->
<!-- password="123" /> -->
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<!--
<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost>
</dataHost>
<dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost>
<dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>
<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> -->
<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
</dataHost> -->
</mycat:schema>
server.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>
<property name="managerPort">9066</property>
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">1</property>
<!--
单位为m
-->
<property name="memoryPageSize">64k</property>
<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</property>
<!--是否采用zookeeper协调切换 -->
<property name="useZKSwitch">false</property>
<!-- XA Recovery Log日志路径 -->
<!--<property name="XARecoveryLogBaseDir">./</property>-->
<!-- XA Recovery Log日志名称 -->
<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
<property name="strictTxIsolation">false</property>
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火墙设置 -->
<!--白名单可以使用通配符%或着*-->
<!--例如<host host="127.0.0.*" user="root"/>-->
<!--例如<host host="127.0.*" user="root"/>-->
<!--例如<host host="127.*" user="root"/>-->
<!--例如<host host="1*7.*" user="root"/>-->
<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
<!--
<firewall>
<whitehost>
<host host="1*7.0.0.*" user="root"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<user name="hostmaster" defaultAccount="true">
<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="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
到时候用这个hostmaster账户和密码123456去用navicat连接
9.springboot+mybatis+mycat集成
application.properties配置:
POM.XML我mysql用的版本
代码就是很普通的增删查改,主要是连接数据库的配置,改为连接mycat
10.测试
用navicat连接mycat
连接两个mysql
然后建表
CREATE TABLE `category_info` (
`category_id` varchar(255) NOT NULL COMMENT '主键',
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
`category_name` varchar(255) NOT NULL COMMENT '品类名称',
`status` int(2) NOT NULL COMMENT '0:启动 1:未启动',
`category_picture` varchar(255) NOT NULL COMMENT '分类图片',
`plate_id` varchar(255) NOT NULL COMMENT '板块ID',
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
用postman调用接口插入数据
主从两个库都会有数据
然后手动插入主库两条数据
主库数据为
从库数据为
调用接口查询
查出了从库的数据,实现了读写分离!
PS:
在从库:stop slave;
change master to master_host='主数据库ip',master_port=3306,master_user='主数据库账户',master_password='主数据库密码',master_log_file='master-bin.000002',master_log_pos=1571;
master_log_file和master_log_pos可以在主库用show master status;看
然后重新start slave
再重新查看show slave status
OK了