環境:
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了