环境:

JDK 1.8

MYSQL 5.7.2

服务器两台:主、从各一台

JDK 1.8

MYSQL 5.7.2

服务器两台:主、从各一台

  1. 下载地址:http://dl.mycat.io/6.6/

springboot druid读写分离 springboot mycat读写分离_springBoot

  1. 用Xftp上传压缩包到主数据库服务器
  2. 解压压缩包

[root@localhost software]# tar -zxvf Mycat-server-1.6.6.1-test-20180729105217-linux.tar.gz

 

springboot druid读写分离 springboot mycat读写分离_bc_02

  1. 开放8066端口(mycat的默认端口)

firewall-cmd --zone=public --query-port=8066/tcp

然后重启防火墙

firewall-cmd –reload

  1. 修改配置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

springboot druid读写分离 springboot mycat读写分离_mycat_03

重启msql 

[root@localhost mysql-5.7.27-linux-glibc2.12-x86_64]# service mysql restart

Shutting down MySQL.. SUCCESS!

Starting MySQL. SUCCESS!

springboot druid读写分离 springboot mycat读写分离_mycat_04

建立帐户并授权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;

springboot druid读写分离 springboot mycat读写分离_读写分离_05

记住这红框的两个

springboot druid读写分离 springboot mycat读写分离_bc_06

  1. Mysql从服务器配置

第一步:修改my.conf文件

[mysqld]

server-id=143

springboot druid读写分离 springboot mycat读写分离_读写分离_07

重启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; -- 上面红框的

springboot druid读写分离 springboot mycat读写分离_mycat_08

启动从服务器复制功能

start slave;

show slave status;

springboot druid读写分离 springboot mycat读写分离_bc_09

只需要查看下面圈起来的这个2个字段状态,同时为yes即标识你配置成功!

如果后续发现这两个值出现no,请查考文章:

 

7.测试:

在主库的表插入一条数据,从库相同的表名就会插入一条数据

PS:附带mycat常用命令

mycat目录/bin 下执行如下命令

 

启动MyCat: ./mycat start

查看启动状态:./mycat status

停止: ./mycat stop

重启: ./mycat restart

启动并控制台打印日志:./mycat console

8.mycat配置读写分离

schema.xml

springboot druid读写分离 springboot mycat读写分离_bc_10

<?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>

springboot druid读写分离 springboot mycat读写分离_读写分离_11

到时候用这个hostmaster账户和密码123456去用navicat连接

 

9.springboot+mybatis+mycat集成

application.properties配置:

springboot druid读写分离 springboot mycat读写分离_mycat_12

 

POM.XML我mysql用的版本

springboot druid读写分离 springboot mycat读写分离_mycat_13

代码就是很普通的增删查改,主要是连接数据库的配置,改为连接mycat

 

10.测试

用navicat连接mycat

springboot druid读写分离 springboot mycat读写分离_springBoot_14

 

连接两个mysql

 

springboot druid读写分离 springboot mycat读写分离_bc_15

springboot druid读写分离 springboot mycat读写分离_mycat_16

 

然后建表

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调用接口插入数据

springboot druid读写分离 springboot mycat读写分离_springBoot_17

主从两个库都会有数据

然后手动插入主库两条数据

主库数据为

springboot druid读写分离 springboot mycat读写分离_mycat_18

从库数据为

springboot druid读写分离 springboot mycat读写分离_bc_19

调用接口查询

springboot druid读写分离 springboot mycat读写分离_bc_20

查出了从库的数据,实现了读写分离!

 

PS:

springboot druid读写分离 springboot mycat读写分离_bc_20

在从库: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;看

springboot druid读写分离 springboot mycat读写分离_bc_22

然后重新start slave

再重新查看show slave status

springboot druid读写分离 springboot mycat读写分离_springBoot_23

OK了