Mycat+percona+keepalived+haproxy
爲什麼Mycat難相信很多哥們做mycat不是不全就是這出錯那裏出錯最後崩潰的邊緣晃盪幾分鐘後不了了之,要麼公司的mycat是個這裏提供一個例子
至於mycat的介紹就是:www.baidu.com搜索框中輸入mycat
1.下載安裝mycat,java
[root@node24 src]#tar -xf Mycat-server-1.4-RELEASE-20150901112004-linux.tar.gz [root@node24 src]#mv mycat/ /usr/local/ [root@node24 src]#useradd mycat [root@node24 local]#chown mycat:root mycat/ -R [root@node24 src]#rpm -ivh jre-8u51-linux-x64.rpm Preparing... ########################################### [100%] 1:jre1.8.0_51 ########################################### [100%] Unpacking JAR files... rt.jar... jsse.jar... charsets.jar... localedata.jar... jfxrt.jar... plugin.jar... javaws.jar... Deploy.jar... [root@node24 src]#java -version java version "1.8.0_51" Java(TM) SE Runtime Environment (build 1.8.0_51-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
此處注意java版本不得低於1.6
至此Mycat安裝就算完成了
2.mysql環境以及Mycat配置
我的環境如下
10.1.166.22:mysql dn1
10.1.166.23 mysql dn2
10.1.166.24 mysql dn3
10.1.166.25 mysql dn4
10.1.166.26 mysql dn5
配置hosts文件
[root@node22 src]#cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.1.166.22 node22 10.1.166.22 dn1 10.1.166.23 dn2 10.1.166.24 dn3 10.1.166.25 dn4 10.1.166.26 dn5
傳到各個機器
for i in 10.1.166.22 10.1.166.23 10.1.166.24 10.1.166.25 10.1.166.26;do scp /etc/hosts $i:/etc;done
爲你的mycat用戶設置個密碼
[root@node24 src]#passwd mycat Changing password for user mycat. New password: BAD PASSWORD: it is WAY too short BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully.
原始mycat測試配置
[root@node24 conf]#>../logs/wrapper.log [root@node24 conf]# [root@node24 conf]#pwd /usr/local/mycat/conf [root@node24 conf]#../bin/mycat start Starting Mycat-server...
報錯處理方案
[root@node24 conf]#cat ../logs/wrapper.log STATUS | wrapper | 2015/09/18 01:27:36 | --> Wrapper Started as Daemon STATUS | wrapper | 2015/09/18 01:27:36 | Launching a JVM... INFO | jvm 1 | 2015/09/18 01:27:36 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 ERROR | wrapper | 2015/09/18 01:27:36 | JVM exited while loading the application. INFO | jvm 1 | 2015/09/18 01:27:36 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: node24: node24: unknown error STATUS | wrapper | 2015/09/18 01:27:41 | Launching a JVM... INFO | jvm 2 | 2015/09/18 01:27:41 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 INFO | jvm 2 | 2015/09/18 01:27:41 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: node24: node24: unknown error ERROR | wrapper | 2015/09/18 01:27:41 | JVM exited while loading the application. STATUS | wrapper | 2015/09/18 01:27:45 | Launching a JVM... INFO | jvm 3 | 2015/09/18 01:27:45 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 ERROR | wrapper | 2015/09/18 01:27:45 | JVM exited while loading the application. INFO | jvm 3 | 2015/09/18 01:27:45 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: node24: node24: unknown error STATUS | wrapper | 2015/09/18 01:27:50 | Launching a JVM... INFO | jvm 4 | 2015/09/18 01:27:50 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 INFO | jvm 4 | 2015/09/18 01:27:50 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: node24: node24: unknown error ERROR | wrapper | 2015/09/18 01:27:50 | JVM exited while loading the application. STATUS | wrapper | 2015/09/18 01:27:54 | Launching a JVM... INFO | jvm 5 | 2015/09/18 01:27:54 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 ERROR | wrapper | 2015/09/18 01:27:54 | JVM exited while loading the application. INFO | jvm 5 | 2015/09/18 01:27:54 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: node24: node24: unknown error FATAL | wrapper | 2015/09/18 01:27:54 | There were 5 failed launches in a row, each lasting less than 300 seconds. Giving up. FATAL | wrapper | 2015/09/18 01:27:54 | There may be a configuration problem: please check the logs. STATUS | wrapper | 2015/09/18 01:27:55 | <-- Wrapper Stopped
發現有報錯 所以要先啓動一下原始的連原始的都報錯那還配置沒有意義
ERROR | wrapper | 2015/09/18 01:27:36 | JVM exited while loading the application.
INFO | jvm 1 | 2015/09/18 01:27:36 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: node24: node24: unknown error
看到了是域名的報錯可能是剛剛我修改hosts文件的時候沒有寫本機名
[root@node24 conf]#cat /etc/hosts 127.0.0.1 localhost localhost1 localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.1.166.22 node22 10.1.166.22 dn1 10.1.166.23 dn2 10.1.166.24 dn3 10.1.166.25 dn4 10.1.166.26 dn5 [root@node24 conf]#hostname node24 [root@node24 conf]#cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=node24
所以需要改變的是
Hosts文件中需要定義node24
改爲
[root@node24 conf]#cat /etc/hosts 127.0.0.1 node24 localhost localhost1 localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.1.166.22 dn1 10.1.166.23 dn2 10.1.166.24 dn3 node24 10.1.166.25 dn4 10.1.166.26 dn5 [root@node24 conf]#../bin/mycat restart Stopping Mycat-server... Stopped Mycat-server. Starting Mycat-server...
[root@node24 conf]#cat ../logs/wrapper.log STATUS | wrapper | 2015/09/18 02:17:28 | TERM trapped. Shutting down. STATUS | wrapper | 2015/09/18 02:17:29 | <-- Wrapper Stopped STATUS | wrapper | 2015/09/18 02:17:30 | --> Wrapper Started as Daemon STATUS | wrapper | 2015/09/18 02:17:30 | Launching a JVM... INFO | jvm 1 | 2015/09/18 02:17:30 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 INFO | jvm 1 | 2015/09/18 02:17:31 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org INFO | jvm 1 | 2015/09/18 02:17:31 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. INFO | jvm 1 | 2015/09/18 02:17:31 | INFO | jvm 1 | 2015/09/18 02:17:31 | log4j 2015-09-18 02:17:31 [./conf/log4j.xml] load completed. INFO | jvm 1 | 2015/09/18 02:17:32 | MyCAT Server startup successfully. see logs in logs/mycat.log
基於案例配置
我有一張線上日誌表數據海量
CREATE TABLE `zuolog` ( `id` bigint(15) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增日誌id', `code` varchar(30) NOT NULL , `con` decimal(2,0) NOT NULL , `cons` decimal(11,1) NOT NULL , `mon` tinyint(2) NOT NULL , `chargedtype` tinyint(2) NOT NULL , `targetid` decimal(11,0) NOT NULL , `consume` datetime NOT NULL DEFAULT '1753-01-01 12:00:00' COMMENT 'yyyy-dd-MM hh:mm:ss(消費時間)', `userid` bigint(20) NOT NULL , `content` varchar(300) DEFAULT NULL, `note1` varchar(2) DEFAULT NULL, `note2` varchar(2) DEFAULT NULL, `mon` tinyint(1) NOT NULL DEFAULT '1' , `stauts` tinyint(1) NOT NULL DEFAULT '0' , PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1564262 DEFAULT CHARSET=utf8 COMMENT='消費日誌';
現在數據以及好幾千了 所以需要mycat 負載也高所以架構圖這裏劃一下手繪本事不大還望見諒啊
配置文件schema.xml配置
[root@node24 conf]#cat schema.xml <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> <schema name="yungui" checkSQLschema="false" sqlMaxLimit="100"> <!-- <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> --> <!-- <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> --> <!-- <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> --> <!-- random sharding using mod sharind rule --> <!-- <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long" /> --> <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global" needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3" rule="mod-long" /> --> <table name="employee" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2" rule="sharding-by-intfile" /> <table name="elog" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4,dn5" rule="mod-long" /> <table name="tt2" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4,dn5" rule="mod-long" /> <table name="MYCAT_SEQUENCE" primaryKey="name" dataNode="dn1" /> <!-- <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> --> <!-- <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> --> <!-- <childTable name="order_items" joinKey="order_id" parentKey="id" /> </childTable> --> <!-- <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /> </table> --> <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" /> --> </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="10.1.166.22" database="db1" /> <dataNode name="dn2" dataHost="10.1.166.23" database="db2" /> <dataNode name="dn3" dataHost="10.1.166.24" database="db3" /> <dataNode name="dn4" dataHost="10.1.166.25" database="db4" /> <dataNode name="dn5" dataHost="10.1.166.26" database="db5" /> <!--<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="10.1.166.22" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="10.1.166.22:3306" user="root" password="123456"> <!-- can have multi read hosts --> </writeHost> <writeHost host="hostS1" url="10.1.166.22:3306" user="root" password="123456" /> <!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> --> </dataHost> <dataHost name="10.1.166.23" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="10.1.166.23:3306" user="root" password="123456"> <!-- can have multi read hosts --> </writeHost> <writeHost host="hostS1" url="10.1.166.23:3306" user="root" password="123456" /> <!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> --> </dataHost> <dataHost name="10.1.166.24" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="10.1.166.24:3306" user="root" password="123456"> <!-- can have multi read hosts --> </writeHost> <writeHost host="hostS1" url="10.1.166.24:3306" user="root" password="123456" /> <!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> --> </dataHost> <dataHost name="10.1.166.25" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="10.1.166.25:3306" user="root" password="123456"> <!-- can have multi read hosts --> </writeHost> <writeHost host="hostS1" url="10.1.166.25:3306" user="root" password="123456" /> <!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> --> </dataHost> <dataHost name="10.1.166.26" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="10.1.166.26:3306" user="root" password="123456"> <!-- can have multi read hosts --> </writeHost> <writeHost host="hostS1" url="10.1.166.26:3306" user="root" password="123456" /> <!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> --> </dataHost> <!-- <dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc"> artbeat> </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> 該配置文件是出錯容易最多的地方需特別注意<!-- 之間的內容表示註釋 --> <dataNode name="dn1" dataHost="10.1.166.22" database="db1" /> <dataNode name="dn2" dataHost="10.1.166.23" database="db2" /> <dataNode name="dn3" dataHost="10.1.166.24" database="db3" /> <dataNode name="dn4" dataHost="10.1.166.25" database="db4" /> <dataNode name="dn5" dataHost="10.1.166.26" database="db5" /> dataNode name 表示節點名稱 dataHost表示你數據庫的名稱 database表示你路由的數據庫的名稱 <schema name="yungui" checkSQLschema="false" sqlMaxLimit="100"> schema name 表示你mycat連接後端的db1 db2 db3 db4 db5在前端顯示的庫名字叫yungui ,sqlMaxLimit表示顯示多少 <dataHost name="10.1.166.23" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="10.1.166.23:3306" user="root" password="123456"> <!-- can have multi read hosts --> </writeHost> <writeHost host="hostS1" url="10.1.166.23:3306" user="root" password="123456" /> <!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> --> </dataHost>
爲一個數據庫實例的配置
balance="0"
參數balance決定了哪些MySQL服務器參與到讀SQL的負
載均衡中,0爲不開啓讀寫分離,
1爲全部的readHost與standby writeHost參與select語句的負載均衡,比如我們配置了1主3從的MySQL主從環境,並把第一個
從節點MySQL配置爲dataHost中的第二個writeHost,以便主節點宕機後,Mycat自動切換到這個writeHost上來執行寫操作,
此時balance=1就意味着第一個writeHost不參與讀SQL的負載均衡,其他3個都參與;balance=2則表示所有的writeHost不參
與,此時,只有2個readHost參與負載均衡。這裏有一個細節需要你知道,readHost是從屬於writeHost的,即意味着它從那個
writeHost獲取同步數據,因此,當它所屬的writeHost宕機了,則它也不會再參與到讀寫分離中來,即“不工作了”,這是因爲
此時,它的數據已經“不可靠”了。基於這個考慮,目前mycat 1.3和1.4版本中,若想支持MySQL一主一從的標準配置,並且在
主節點宕機的情況下,從節點還能讀取數據,則需要在Mycat裏配置爲兩個writeHost並設置banlance=1。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS1" url="localhost2:3306" user="root" password="123456" /> </writeHost> </dataHost>
writeType=1僅僅對於galera for mysql集羣這種多主多節點都能寫入的集羣起效,此時Mycat會隨機選擇一個writeHost並寫
入數據,對於非galera for mysql集羣,請不要配置writeType=1,會導致數據庫不一致的嚴重問題。
Mycat目前支持自動方式、編程指定的兩種讀寫分離方式:
自動方式,即一個查詢SQL是自動提交模式,對應於connection.setAutocommit(true) 或者 set autocommit=1
編程指定方式,即一個查詢SQL語句以/*balance*/註解來確定其是走讀節點還是寫節點。在1.3版本里,若事務內的的查詢語
句增加此註解,則強制其走讀節點,而1.4版本里繼續強化,可以在非事務內的查詢語句前增加此註解,強制走寫節點,這個
增強是爲了避免主從不同步的情況下要求查詢到剛寫入的數據而做的增強。
另外 1.4開始支持MySQL主從複製狀態綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:
MyCAT心跳檢查語句配置爲 show slave status ,dataHost 上定義兩個新屬性: switchType="2" 與
slaveThreshold="100",此時意味着開啓MySQL主從複製狀態綁定的讀寫分離與切換機制,Mycat心跳機制通過檢測 show
slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三個字段來確定當前主從同步
的狀態以及Seconds_Behind_Master主從複製時延,
當Seconds_Behind_Master>slaveThreshold時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數據,而當主
節點宕機後,切換邏輯會檢查Slave上的Seconds_Behind_Master是否爲0,爲0時則表示主從同步,可以安全切換,否則不會
切換。
switchType 目前有三種選擇:
- -1 表示不自動切換
- 1 默認值,自動切換
- 2 基於MySQL主從同步的狀態決定是否切換
下面爲參考配置:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> <heartbeat>show slave status </heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> </writeHost> <writeHost host="hostS1" url="localhost:3316" user="root" password="123456" /> 《/ddataHost>
conf/log4j.xml中配置日誌輸出級別爲debug時,當選擇節點的時候,會輸出如下日誌:
16:37:21.660 DEBUG [Processor0-E3] (PhysicalDBPool.java:333) -select read source hostM1 for dataHost:localhost1 16:37:21.662 DEBUG [Processor0-E3] (PhysicalDBPool.java:333) -select read source hostM1 for dataHost:localhost1
根據這個信息,可以確定某個SQL發往了哪個讀(寫)節點,據此可以分析判斷是否發生了讀寫分離。
用MySQL客戶端連接到Mycat的9066管理端口,執行show @@datanode ,也能看出負載均衡的情況,其中execute字段表明該分
片上執行過的SQL累計數:
![輸入圖片說明](http://static.oschina.net/uploads/img/201504/07212301_4ZPx.jpg "在這裏輸入圖片標題")
至於應用中的哪些數據查詢比較適合開啓讀寫分離,總結下來大概有以下幾種:
- 列表界面,通常是瀏覽查詢功能,這類的數據訪問頻繁但實時性要求比較低,有幾秒幾十秒的延遲,通常感覺不出來,淘
寶界面裏,已售出的商品個數往往比商家後臺看到的數據要延遲很大,也說明了它是一個快照數據
- 某個數據的詳細信息頁面,通常也訪問較爲頻繁,但事實性要求不高
- 歷史時刻的數據,比如昨天的數據,上個月的,這種數據即使有修改,也概率很低
Mycat的讀寫分離,默認是按照該SQL是否有事務包裹,由於一些高層框架如Hibernate、Spring等往往會自動追加事務控制語
句,將查詢語句變成事務內的語句,當你開啓Mycat Debug日誌級別後,就可能很清楚的看到這一點,日誌中會出現如下的序
列,此時不會走讀寫分離,因此建議程序設計的時候,手工控制事務,讓這些查詢語句自動提交,這個做法也有利於加快
MySQL的執行過程
set autocomomit=0
…
select *
commit
```
因爲我是percona集羣無需配置讀寫分離什麼的了
Mysql授權以及配置文件
配置文件加入如下兩句
log_bin_trust_function_creators=1 lower_case_table_names = 1
在每一臺schema.xml配置文件定義過得mysql上授權如下
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.1.166.%' IDENTIFIED BY '123456' WITH GRANT OPTION ; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION ; flush privileges;
這裏的密碼與上面配置文件的密碼相對應
如果授權錯誤則會報錯
配置數據名密碼
[root@node24 conf]#vi 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 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://org.opencloudb/"> <system> <property name="defaultSqlParser">druidparser</property> <!-- <property name="useCompression">1</property>--> <!--1爲開啓mysql壓縮協議--> <!-- <property name="processorBufferChunk">40960</property> --> <!-- <property name="processors">1</property> <property name="processorExecutor">32</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="mutiNodeLimitType">1</property> 0:開啓小數量級(默認) ;1:開啓億級數據排序 <property name="mutiNodePatchSize">100</property> 億級數量排序批量 <property name="processors">32</property> <property name="processorExecutor">32</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> --> </system> <user name="adminz"> <property name="password">xinchengyungui</property> <property name="schemas">yungui</property> </user> <user name="adminz"> <property name="password">xinchengyungui</property> <property name="schemas">yungui</property> <property name="readOnly">true</property> </user> <!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property> <property name="weight">1</property> </node> </cluster> --> <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property> </host> </quarantine> --> </mycat:server>
配置節點數
[root@node22 conf]#vi 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>id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <tableRule name="rule2"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <tableRule name="sharding-by-intfile"> <rule> <columns>sharding_id</columns> /5 </rule> </tableRule> <tableRule name="jch"> <rule> <columns>id</columns> <algorithm>jump-consistent-hash</algorithm> </rule> </tableRule> <function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash"> <property name="seed">0</property><!-- 默認是0 --> <property name="count">5</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 --> <property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射爲這麼多虛擬節點,默> 認是160倍,也就是虛擬節點數是物理節點數的160倍 --> <!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以 properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引爲key,以節點權重值爲值。所有權重值必須是正整數,否> 則以1代替 --> <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用於測試時觀察各物理節點與虛擬節點的分佈情況,如果指定了這個屬性,會把虛擬節點的murmur hash值> 與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 --> </function> <function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> </function> <function name="rang-long" [root@node22 conf]#vi 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>id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <tableRule name="rule2"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <tableRule name="sharding-by-intfile"> <rule> <columns>sharding_id</columns> <algorithm>hash-int</algorithm> </rule> </tableRule> <tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule> <tableRule name="mod-long"> <rule> <columns>id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <tableRule name="sharding-by-murmur"> <rule> <columns>id</columns> <algorithm>murmur</algorithm> </rule> </tableRule> <tableRule name="sharding-by-month"> <rule> <columns>create_date</columns> <columns>calldate</columns> </tableRule> <tableRule name="auto-sharding-rang-mod"> <rule> <columns>id</columns> <algorithm>rang-mod</algorithm> </rule> </tableRule> <tableRule name="jch"> <rule> <columns>id</columns> <algorithm>jump-consistent-hash</algorithm> </rule> </tableRule> <function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash"> <property name="seed">0</property><!-- 默認是0 --> <property name="count">5</property><!-- 這一行改成你實際分片的節點數 要分片的數據庫節點數量,必須指定,否則沒法分片 --> <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> </function> <function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> </function> <function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function> <function name="mod-long" class="org.opencloudb.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">5</property> </function> <function name="func1" class="org.opencloudb.route.function.PartitionByLong"> <property name="partitionCount">8</property> <property name="partitionLength">128</property> </function> <function name="latestMonth" class="org.opencloudb.route.function.LatestMonthPartion"> <property name="splitOneDay">24</property> </function> <function name="partbymonth" class="org.opencloudb.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2015-01-01</property> </function> <function name="rang-mod" class="org.opencloudb.route.function.PartitionByRangeMod"> <property name="mapFile">partition-range-mod.txt</property> </function> <function name="jump-consistent-hash" class="org.opencloudb.route.function.PartitionByJumpConsistentHash"> <property name="totalBuckets">3</property> </function> </mycat:rule>
啓動測試
[root@node24 conf]#rm -rf dnindex.properties 刪除掉之前原始測試啓動後生成的文件裏面記錄了節點信息 [root@node24 conf]#cat ../logs/wrapper.log STATUS | wrapper | 2015/09/18 02:17:28 | TERM trapped. Shutting down. STATUS | wrapper | 2015/09/18 02:17:29 | <-- Wrapper Stopped STATUS | wrapper | 2015/09/18 02:17:30 | --> Wrapper Started as Daemon STATUS | wrapper | 2015/09/18 02:17:30 | Launching a JVM... INFO | jvm 1 | 2015/09/18 02:17:30 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 INFO | jvm 1 | 2015/09/18 02:17:31 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org INFO | jvm 1 | 2015/09/18 02:17:31 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. INFO | jvm 1 | 2015/09/18 02:17:31 | INFO | jvm 1 | 2015/09/18 02:17:31 | log4j 2015-09-18 02:17:31 [./conf/log4j.xml] load completed. INFO | jvm 1 | 2015/09/18 02:17:32 | MyCAT Server startup successfully. see logs in logs/mycat.log STATUS | wrapper | 2015/09/18 03:39:27 | TERM trapped. Shutting down. STATUS | wrapper | 2015/09/18 03:39:28 | <-- Wrapper Stopped STATUS | wrapper | 2015/09/18 03:39:29 | --> Wrapper Started as Daemon STATUS | wrapper | 2015/09/18 03:39:29 | Launching a JVM... INFO | jvm 1 | 2015/09/18 03:39:29 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 INFO | jvm 1 | 2015/09/18 03:39:30 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org INFO | jvm 1 | 2015/09/18 03:39:30 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. INFO | jvm 1 | 2015/09/18 03:39:30 | INFO | jvm 1 | 2015/09/18 03:39:30 | INFO | jvm 1 | 2015/09/18 03:39:30 | WrapperSimpleApp: Encountered an error running main: java.lang.ExceptionInInitializerError INFO | jvm 1 | 2015/09/18 03:39:30 | java.lang.ExceptionInInitializerError INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.MycatStartup.main(MycatStartup.java:46) INFO | jvm 1 | 2015/09/18 03:39:30 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) INFO | jvm 1 | 2015/09/18 03:39:30 | at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) INFO | jvm 1 | 2015/09/18 03:39:30 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) INFO | jvm 1 | 2015/09/18 03:39:30 | at java.lang.reflect.Method.invoke(Unknown Source) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:240) INFO | jvm 1 | 2015/09/18 03:39:30 | at java.lang.Thread.run(Unknown Source) INFO | jvm 1 | 2015/09/18 03:39:30 | Caused by: org.opencloudb.config.util.ConfigException: user adminz duplicated! INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.config.loader.xml.XMLServerLoader.loadUsers(XMLServerLoader.java:168) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.config.loader.xml.XMLServerLoader.load(XMLServerLoader.java:88) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.config.loader.xml.XMLServerLoader.<init>(XMLServerLoader.java:61) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.config.loader.xml.XMLConfigLoader.<init>(XMLConfigLoader.java:60) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.ConfigInitializer.<init>(ConfigInitializer.java:64) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.MycatConfig.<init>(MycatConfig.java:69) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.MycatServer.<init>(MycatServer.java:103) INFO | jvm 1 | 2015/09/18 03:39:30 | at org.opencloudb.MycatServer.<clinit>(MycatServer.java:72) INFO | jvm 1 | 2015/09/18 03:39:30 | ... 7 more STATUS | wrapper | 2015/09/18 03:39:32 | <-- Wrapper Stopped
[root@node24 conf]#cat ../logs/mycat.log
看到如上的報錯
at java.lang.Thread.run(Unknown Source) 是第二個這個不能改 <user name="user"> <property name="password">user</property> <property name="schemas">yungui</property> <property name="readOnly">true</property>
[root@node24 conf]#cat 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://org.opencloudb/"> <system> <property name="defaultSqlParser">druidparser</property> <!-- <property name="useCompression">1</property>--> <!--1爲開啓mysql壓縮協議--> <!-- <property name="processorBufferChunk">40960</property> --> <!-- <property name="processors">1</property> <property name="processorExecutor">32</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="mutiNodeLimitType">1</property> 0:開啓小數量級(默認) ;1:開啓億級數據排序 <property name="mutiNodePatchSize">100</property> 億級數量排序批量 <property name="processors">32</property> <property name="processorExecutor">32</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> --> </system> <user name="adminz"> <property name="password">xinchengyungui</property> <property name="schemas">yungui</property> </user>
<user name="user">
<property name="password">user</property>
<property name="schemas">yungui</property>
<property name="readOnly">true</property>
</user>
<!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property> <property name="weight">1</property> </node> </cluster> --> <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property> </host> </quarantine> --> </mycat:server>
再起啓動成功。
[root@node24 conf]#cat dnindex.properties #update #Fri Sep 18 03:58:06 CST 2015 10.1.166.26=0 10.1.166.25=0 10.1.166.24=0 10.1.166.23=0 10.1.166.22=0
生成新的這個文件
創建表
mysql -uadminz -pzuo123 -h127.0.0.1 -P8066 -Dyungui mysql> show databases; +----------+ | DATABASE | +----------+ | yungui | +----------+ 1 row in set (0.00 sec) explain create table employee (id int not null primary key,name varchar(100),sharding_id int not null); create table employee (id int not null primary key,name varchar(100),sharding_id int not null); insert into employee(id,name,sharding_id) values(1,'leader us',10000); insert into employee(id,name,sharding_id) values(2, 'me',10010); insert into employee(id,name,sharding_id) values(3, 'mycat',10000); insert into employee(id,name,sharding_id) values(4, 'mydog',10010);
發現在db1 db2中果然有數據了 說明沒問題
CREATE TABLE `zuolog` ( `id` bigint(15) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增日誌id', `code` varchar(30) NOT NULL , `con` decimal(2,0) NOT NULL , `cons` decimal(11,1) NOT NULL , `mon` tinyint(2) NOT NULL , `chargedtype` tinyint(2) NOT NULL , `targetid` decimal(11,0) NOT NULL , `consume` datetime NOT NULL DEFAULT '1753-01-01 12:00:00' COMMENT 'yyyy-dd-MM hh:mm:ss(消費時間)', `userid` bigint(20) NOT NULL , `content` varchar(300) DEFAULT NULL, `note1` varchar(2) DEFAULT NULL, `note2` varchar(2) DEFAULT NULL, `mon` tinyint(1) NOT NULL DEFAULT '1' , `stauts` tinyint(1) NOT NULL DEFAULT '0' , PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1564262 DEFAULT CHARSET=utf8 COMMENT='消費日誌';
mysql> INSERT INTO `elog` (`id`, `code`, `con`, `cons`, `mon`, `chargedtype`, `targetid`, `consume`, `userid`, `content`, `note1`, `note2`, `mon`, `stauts`) VALUES ('1945', '118271404223146566920190', '0', '-0.5', '0', '0', '10214131', '2014-07-03 09:43:13', '347', NULL, NULL, NULL, '1', '0'); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO `elog` (`id`, `code`, `con`, `cons`, `mon`, `chargedtype`, `targetid`, `consume`, `userid`, `content`, `note1`, `note2`, `mon`, `stauts`) VALUES ('1945', '118271404223146566920190', '0', '-0.5', '0', '0', '10214131', '2014-07-03 09:43:13', '347', NULL, NULL, NULL, '1', '0'); ERROR 1003 (HY000): mycat sequnce err.java.lang.NumberFormatException: null mysql>
上面是什麼問題呢?去除id列插入就報錯了 這說明了 自增主鍵不能自增
自增主鍵
1. 配置server.xml 開啓數據庫層面設計的自增主鍵 還有基於本地的和catle的 但是我這裏用基於數據庫的也是mycat作者推薦的方式
<property name="sequnceHandlerType">1</property>
2. 配置sequence_db_conf.properties
[root@node24 conf]#vi sequence_db_conf.properties #sequence stored in datanode GLOBAL=dn1 COMPANY=dn1 CUSTOMER=dn1 ORDERS=dn1 tt2=dn1 TT2=dn1 elog=dn1 ELOG=dn1
~
重啓mycat
tail -f /usr/local/mycat/logs/mycat.log 09/18 06:38:49.139 INFO [Timer1] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostS1 of schema db5 09/18 06:38:49.140 INFO [Timer1] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostS1 of schema db4 09/18 06:38:49.149 INFO [Timer1] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostS1 of schema db3 09/18 06:38:49.150 INFO [Timer1] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostS1 of schema db2 09/18 06:38:49.152 INFO [Timer1] (PhysicalDatasource.java:373) -not ilde connection in pool,create new connection for hostS1 of schema db1
通過本地方式連接
[root@node24 conf]#mysql -p123456 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 135 Server version: 5.6.22-log MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 下面的操作需在每一臺數據庫實例上做 mysql> DROP TABLE IF EXISTS MYCAT_SEQUENCE; DROP FUNCTION IF EXISTS `mycat_seq_nextval`; DROP FUNCTION IF EXISTS `mycat_seq_setval`; DROP FUNCTION IF EXISTS `mycat_seq_setval`; CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY (name) ) ENGINE=InnoDB; -- ---------------------------- -- Function structure for `mycat_seq_currval` -- ---------------------------- DROP FUNCTION IF EXISTS `mycat_seq_currval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-999999999,null"; SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name; RETURN retval ; END ;; DELIMITER ; -- ---------------------------- -- Function structure for `mycat_seq_nextval` -- ---------------------------- DROP FUNCTION IF EXISTS `mycat_seq_nextval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END ;; DELIMITER ; -- ---------------------------- -- Function structure for `mycat_seq_setval` -- ---------------------------- DROP FUNCTION IF EXISTS `mycat_seq_setval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = value WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END ;; DELIMITER ;
如果你登錄Mycat查出來是這樣的強調是登錄mycat
SELECT MYCAT_SEQ_SETVAL('GLOBAL', 1); SELECT MYCAT_SEQ_CURRVAL('GLOBAL'); SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); +-----------------------------+ | MYCAT_SEQ_NEXTVAL('GLOBAL') | +-----------------------------+ | -999999999,null | +-----------------------------+ 1 row in set (0.00 sec) mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); +-----------------------------+ | MYCAT_SEQ_NEXTVAL('GLOBAL') | +-----------------------------+ | 100,100 | +-----------------------------+ 1 row in set (0.00 sec)
有-99999999,null那麼證明你是通過mycat登錄上去做了以上操作的或者沒有在每一臺上做操作代表失敗了
你最好通過本地登錄在所有mycat配置文件配置的數據庫實例也是就10.1.166.22 10.1.166.23 10.1.166.24 10.1.166.25上都做這樣的操作
那麼最後顯示應該是這樣的
[root@node24 conf]#mysql -uadminz -pxinchengyungui -h127.0.0.1 -P8066 -Dyungui Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.5.8-mycat-1.4-RELEASE-20150901112004 MyCat Server (OpenCloundDB) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); +-----------------------------+ | MYCAT_SEQ_NEXTVAL('GLOBAL') | +-----------------------------+ | 201,100 | +-----------------------------+ 1 row in set (0.00 sec) mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); +-----------------------------+ | MYCAT_SEQ_NEXTVAL('GLOBAL') | +-----------------------------+ | 201,100 | +-----------------------------+ 1 row in set (0.00 sec) mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); +-----------------------------+ | MYCAT_SEQ_NEXTVAL('GLOBAL') | +-----------------------------+ | 301,100 | +-----------------------------+ 1 row in set (0.00 sec) mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL'); +-----------------------------+ | MYCAT_SEQ_NEXTVAL('GLOBAL') | +-----------------------------+ | 201,100 | +-----------------------------+
這就正常了
我裏面配置文件翻翻上面我設置了一個測試表tt2
這裏我登上mycat
插入一條
mysql> insert into mycat_sequence values('TT2',0,1);
這一條是定義TT2爲tt2表從0開始自增長每次增長數爲1 如果沒有這個就會報錯如下:
mysql> delete from mycat_sequence; mysql> insert into tt2(name) values('df') ; ERROR 1003 (HY000): mycat sequnce err.java.lang.RuntimeException: sequnce not found in db table mysql> create table tt2(id int auto_increment primary key,name varchar(10)); Query OK, 0 rows affected (0.02 sec) mysql> insert into mycat_sequence values('TT2',0,1);
此處建議重啓一下mycat 如果報錯的話 不報錯就不需要重啓了
mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> insert into tt2(name) values('123'); Query OK, 1 row affected (0.11 sec) mysql> select * from tt2 order by id asc; +----+------+ | id | name | +----+------+ | 1 | 123 | | 2 | 123 | | 3 | 123 | | 4 | 123 | | 5 | 123 | | 6 | 123 | | 7 | 123 | | 8 | 123 | | 9 | 123 | | 10 | 123 | | 11 | 123 | | 12 | 123 | | 13 | 123 | +----+------+ 13 rows in set (0.03 sec)
看到了這就是自增長了
現在我們把這一切做到我的業務表elog裏面
mysql> insert into mycat_sequence values('ELOG',0,1);
去掉id列證明下自增長是否成功
[root@node24 conf]#mysql -uadminz -pxinchengyungui -h127.0.0.1 -P8066 -Dyungui < /usr/local/src/elog.sql
開啓另一個窗口
[root@node24 ~]#mysql -uadminz -pxinchengyungui -h127.0.0.1 -P8066 -Dyungui
mysql> select * from elog order by id asc ;
| 110 | 274171404230318720996402 | 0 | -0.5 | 1 | 0 | 10212023 | 2014-07-02 10:52:22 | 412 | NULL | NULL | NULL | 1 | 0 |
| 111 | 954081404227374398993546 | 0 | -0.5 | 1 | 0 | 10212027 | 2014-07-02 10:52:37 | 64 | NULL | NULL | NULL | 1 | 0 |
+-----+--------------------------+-------------+--------------+-----------+-------------+----------+---------------------+----------+---------+-------+-------+-------------+---------------+
100 rows in set (0.01 sec)
發現不管你執行多少次都是100行
咋回事這是因爲你之前配置文件配置顯示100行
要想看的多
mysql> select * from elog order by id asc limit 1000000;
| 2724 | 176681404225891950114977 | 0 | -0.5 | 0 | 0 | 10219178 | 2014-07-04 14:48:41 | 1166 | NULL | NULL | NULL | 1 | 0 |
| 2725 | 519571404226693213346300 | 0 | -0.5 | 0 | 0 | 10219179 | 2014-07-04 14:48:46 | 948 | NULL | NULL | NULL | 1 | 0 |
| 2726 | 142391404222641663128165 | 0 | -0.5 | 0 | 0 | 10219180 | 2014-07-04 14:48:51 | 498 | NULL | NULL | NULL | 1 | 0 |
| 2727 | 519571404226693213346300 | 0 | -0.5 | 0 | 0 | 10219181 | 2014-07-04 14:49:13 | 948 | NULL | NULL | NULL | 1 | 0 |
+------+--------------------------+-------------+--------------+-----------+-------------+----------+---------------------+----------+---------+-------+-------+-------------+---------------+
2716 rows in set (0.03 sec)
這樣就行烙
3.haproxy+mycat
再安裝一個mycat配置的一樣一樣的
環境描述
mysql5 OS: Oracle Linux Server release 6.3 Mycat server1:10.0.30.134:8806 Mycat server2:10.0.30.139:8806 Haproxy server:10.0.30.139: 8098
前期未啓用VIP,所以先用Mycat server2的8098端口作爲haproxy的對外接口
Mycat 安裝
在Mycat server1及Mycat server2上進行安裝Mycat
Linux(Unix)下,建議放在/usr/local/MyCAT目錄下,如下面類似的:
useradd mycat chown –R mycat.mycat /usr/local/mycat 啓動mycat /usr/local/mycat/bin/mycat start
Haproxy 的安裝
useradd haproxy
#wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.25.tar.gz
# tar zcvf haproxy-1.3.20.tar.gz
# cd haproxy-1.3.20
# make TARGET=linux26 PREFIX=/usr/local/haprpxy ARCH=x86_64
# make install
安裝完畢後,進入安裝目錄創建配置文件
# cd /usr/local/haproxy
#chown –R haproxy.haproxy *
# vi haproxy.cfg
global log 127.0.0.1 local0 ##記日誌的功能 maxconn 4096 chroot /usr/local/haproxy user haproxy group haproxy daemon defaults logglobal optiondontlognull retries3 option redispatch maxconn2000 contimeout5000 clitimeout50000 srvtimeout50000 listen admin_stats 10.0.30.139:48800 ##由於沒有啓用VIP,暫時用其中一臺的IP和新端口 stats uri /admin-status ##統計頁面 stats auth admin:admin mode http option httplog listenallmycat 10.0.30.139:8098 mode tcp option tcplog option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www balanceroundrobin server mycat_134 10.0.30.134:8066 check port 48700 inter 5s rise 2 fall 3 server mycat_139 10.0.30.139:8066 check port 48700 inter 5s rise 2 fall 3 srvtimeout 20000
默認haproxy是不記錄日誌的,爲了記錄日誌還需要配置syslog模塊,在oracle linux下是rsyslogd服務,yum –y install rsyslog 先安裝rsyslog,然後
# vi /etc/rsyslog.d/haproxy.conf
加入以下內容
$ModLoad imudp $UDPServerRun 514 local0.* /var/log/haproxy.log ##對應haproxy.cfg 的日誌記錄選項
保存,重啓
service rsyslog restart
現在你就可以看到日誌了
在Mycat server1 Mycat server2上都需要添加檢測端口48700的腳本,爲此需要用到xinetd
首先在xinetd目錄下面增加腳本與端口的映射配置文件
#vim /etc/xinetd.d/mycat_status service mycat_status { flags = REUSE socket_type = stream port = 48700 wait = no user = nobody server = /usr/local/bin/mycat_status log_on_failure += USERID disable = no }
再增加/usr/local/bin/mycat_status用於檢測mycat是否運行的腳本
#vim /usr/local/bin/mycat_status #!/bin/bash #/usr/local/bin/mycat_status.sh # This script checks if a mycat server is healthy running on localhost. It will # return: # # "HTTP/1.x 200 OK\r" (if mycat is running smoothly) # # "HTTP/1.x 503 Internal Server Error\r" (else) mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l` if [ "$mycat" = "0" ]; then /bin/echo -e "HTTP/1.1 200 OK\r\n" else /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n" fi
我是根據mycat status 返回的狀態來判定mycat是否在運行的,也可以直接通過mysql –P8806 –e”select user()” 等直接執行sql的形式來檢測
重啓xinetd服務
#service xinetd restart
查看48700端口是否監聽了
#netstat -antup|grep 48700
如上圖則端口的配置正確了
啓動haproxy
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
爲了使用方便可以增加一個啓動,停止haproxy的腳本
啓動腳本starthap內容如下
#!/bin/sh /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg &
停止腳本stophap內容如下
#!/bin/sh ps -ef | grep sbin/haproxy | grep -v grep |awk '{print $2}'|xargs kill -s 9
分別賦予啓動權限
chmod +x starthap chmod +x stophap
啓動後可以通過http://10.0.30.139:48800/admin-status (用戶名密碼都是admin haproxy.cnfg配置的)
配置完成
4.percona集羣+mycat+haproxy+keepalived
看我的集羣比對然後加進來就行了