什麼是讀寫分離mysql
在數據庫集羣架構中,讓主庫負責處理事務性查詢,而從庫只負責處理select查詢,讓二者分工明確達到提升數據庫總體讀寫性能。固然,主數據庫另一個功能就是負責將事務性查詢致使的數據變動同步到從庫中,也就是寫操做。sql
讀寫分離的好處數據庫
1:分攤服務器壓力,提升機器的系統處理效率express
2:增長冗餘,提升服務可用性,當一臺數據庫服務器宕機後能夠調整另一臺從庫以最快速度恢復服務apache
這裏就推薦使用MyCat中間件來讀寫分離服務器
是一個開源的分佈式數據庫系統,可是由於數據庫通常都有本身的數據庫引擎,而Mycat並無屬於本身的獨有數據庫引擎,全部嚴格意義上說並不能算是一個完整的數據庫系統,只能說是一個在應用和數據庫之間起橋樑做用的中間件。架構
在Mycat中間件出現以前,MySQL主從複製集羣,若是要實現讀寫分離,通常是在程序段實現,這樣就帶來了一個問題,即數據段和程序的耦合度過高,若是數據庫的地址發生了改變,那麼個人程序也要進行相應的修改,若是數據庫不當心掛掉了,則同時也意味着程序的不可用,而對於不少應用來講,並不能接受;
app
引入Mycat中間件能很好地對程序和數據庫進行解耦,這樣,程序只需關注數據庫中間件的地址,而無需知曉底層數據庫是如何提供服務的,大量的通用數據聚合、事務、數據源切換等工做都由中間件來處理;less
Mycat中間件的原理是對數據進行分片處理,從原有的一個庫,被切分爲多個分片數據庫,全部的分片數據庫集羣構成完成的數據庫存儲,有點相似磁盤陣列中的RAID0.分佈式
Mycat實現思路
經過外網地址鏈接上Mycat,而後根據讀寫轉發給主從,
MyCat下載地址
連接:https://pan.baidu.com/s/1ggE8A6f 密碼:ejr3
我使用的MyCat是Windows版本的
1:建立表結構
CREATE DATABASE IF NOT EXISTS `weibo_simple`; use weibo_simple; go -- ------------------------------------ -- Table structure for `t_users` 用戶表 -- ------------------------------------ DROP TABLE IF EXISTS `t_users`; CREATE TABLE `t_users` ( `user_id` varchar(64) NOT NULL COMMENT '註冊用戶ID', `user_email` varchar(64) NOT NULL COMMENT '註冊用戶郵箱', `user_password` varchar(64) NOT NULL COMMENT '註冊用戶密碼', `user_nikename` varchar(64) NOT NULL COMMENT '註冊用戶暱稱', `user_creatime` datetime NOT NULL COMMENT '註冊時間', `user_status` tinyint(1) NOT NULL COMMENT '驗證狀態 1:已驗證 0:未驗證', `user_deleteflag` tinyint(1) NOT NULL COMMENT '刪除標記 1:已刪除 0:未刪除', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ------------------------------------- -- Table structure for `t_message`微博表 -- ------------------------------------- DROP TABLE IF EXISTS `t_message`; CREATE TABLE `t_message` ( `messages_id` varchar(64) NOT NULL COMMENT '微博ID', `user_id` varchar(64) NOT NULL COMMENT '發表用戶', `messages_info` varchar(255) DEFAULT NULL COMMENT '微博內容', `messages_time` datetime DEFAULT NULL COMMENT '發佈時間', `messages_commentnum` int(12) DEFAULT NULL COMMENT '評論次數', `message_deleteflag` tinyint(1) NOT NULL COMMENT '刪除標記 1:已刪除 0:未刪除', `message_viewnum` int(12) DEFAULT NULL COMMENT '被瀏覽量', PRIMARY KEY (`messages_id`), KEY `user_id` (`user_id`), CONSTRAINT `t_message_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2:解壓Mycat,進入conf文件,配置server.xml
<!-- 添加user有讀寫權限 --> <user name="mycat"> <property name="password">mycat</property> <property name="schemas">mycat</property> </user> <!-- 添加user只有讀的權限 --> <user name="mycat_red"> <property name="password">mycat_red</property> <property name="schemas">mycat</property> <property name="readOnly">true</property> </user>
3:配置schema.xml 爲防止細節致使的錯誤,大家直接替換schema.xml就能夠了
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> <!-- 與server.xml中user的schemas名一致 --> <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100"> <table name="t_users" primaryKey="user_id" dataNode="dn1" rule="rule1"/> <table name="t_message" type="global" primaryKey="messages_id" dataNode="dn1" /> </schema> <!-- database="weibo_simple" 這個是配置數據庫的 --> <dataNode name="dn1" dataHost="jdbchost" database="weibo_simple" /> <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- 配置主機信息 --> <writeHost host="hostMaster" url="192.168.121.131:3306" user="root" password="root"> </writeHost> <!-- 配置從機信息 --> <writeHost host="hostSlave" url="192.168.121.133:3306" user="root" password="root"/> </dataHost> </mycat:schema>
4:配置rule.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:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://org.opencloudb/"> <tableRule name="rule1"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <function name="func1" class="org.opencloudb.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function> </mycat:rule>
5:配置log4j.xml 爲了更好地定位錯誤
<root> <level value="debug" /> <appender-ref ref="FILE" /> <!--<appender-ref ref="FILE" />--> </root>
這樣就成功啦!!!
這是配置成功的
運行
1:進入bin文件打開startup_nowrap.bat
下面是MYSQL鏈接的
這樣就能夠了