springboot+mybatis+mysql+mycat實現主從複製+讀寫分離

環境:

JDK 1.8

MYSQL 5.7.2

服務器兩臺:主、從各一臺

JDK 1.8

MYSQL 5.7.2

服務器兩臺:主、從各一臺

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

  1. 用Xftp上傳壓縮包到主數據庫服務器
  2. 解壓壓縮包

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

 

  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

重啓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;

記住這紅框的兩個

  1. 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了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章