mycat+percona+keepalived+haproxy

  Mycat+percona+keepalived+haproxy

作者:[email protected]

爲什麼Mycat難相信很多哥們做mycat不是不全就是這出錯那裏出錯最後崩潰的邊緣晃盪幾分鐘後不了了之,要麼公司的mycat是個這裏提供一個例子

至於mycat的介紹就是:www.baidu.com搜索框中輸入mycat

1.下載安裝mycatjava

https://github.com/MyCATApache/Mycat-download/blob/master/1.4-RELEASE/Mycat-server-1.4-RELEASE-20150901112004-linux.tar.gz

 


[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.22mysql 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 負載也高所以架構圖這裏劃一下手繪本事不大還望見諒啊

 

 

wKioL1Ycnh7DO92eAAJRVDT_dhs405.jpg 

配置文件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爲全部的readHoststandby writeHost參與select語句的負載均衡,比如我們配置了13從的MySQL主從環境,並把第一個

從節點MySQL配置爲dataHost中的第二個writeHost,以便主節點宕機後,Mycat自動切換到這個writeHost上來執行寫操作,

此時balance=1就意味着第一個writeHost不參與讀SQL的負載均衡,其他3個都參與;balance=2則表示所有的writeHost不參

與,此時,只有2readHost參與負載均衡。這裏有一個細節需要你知道,readHost是從屬於writeHost的,即意味着它從那個

writeHost獲取同步數據,因此,當它所屬的writeHost宕機了,則它也不會再參與到讀寫分離中來,即“不工作了”,這是因爲

此時,它的數據已經“不可靠”了。基於這個考慮,目前mycat 1.31.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客戶端連接到Mycat9066管理端口,執行show @@datanode ,也能看出負載均衡的情況,其中execute字段表明該分

片上執行過的SQL累計數:

![輸入圖片說明](http://static.oschina.net/uploads/img/201504/07212301_4ZPx.jpg "在這裏輸入圖片標題")

至於應用中的哪些數據查詢比較適合開啓讀寫分離,總結下來大概有以下幾種:

列表界面,通常是瀏覽查詢功能,這類的數據訪問頻繁但實時性要求比較低,有幾秒幾十秒的延遲,通常感覺不出來,淘

寶界面裏,已售出的商品個數往往比商家後臺看到的數據要延遲很大,也說明了它是一個快照數據

某個數據的詳細信息頁面,通常也訪問較爲頻繁,但事實性要求不高

歷史時刻的數據,比如昨天的數據,上個月的,這種數據即使有修改,也概率很低

Mycat的讀寫分離,默認是按照該SQL是否有事務包裹,由於一些高層框架如HibernateSpring等往往會自動追加事務控制語

句,將查詢語句變成事務內的語句,當你開啓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>

wKiom1YcoLegk7D_AALg-TcK91I467.jpg 

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)


-99999999null那麼證明你是通過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);

 這一條是定義TT2tt2表從0開始自增長每次增長數爲如果沒有這個就會報錯如下:

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);


 

wKioL1YcoYrAIhoEAAHWke7JlTI074.jpg 

去掉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 server28098端口作爲haproxy對外接口

 

Mycat 安裝

Mycat server1Mycat server2進行安裝Mycat

 

Linux(Unix)下,建議放在/usr/local/MyCAT目錄下,如下面類似的:

wKiom1YcoaDhzvftAABvms6D_vY484.jpg 

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 linuxrsyslogd服務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


wKiom1Ycoe6ip83oAACTBQSLnAU309.jpg

如上圖則端口的配置正確了

 

啓動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配置的)

wKioL1YcojfBMfKXAAbxip0CXyI880.jpg 

配置完成

 

4.percona集羣+mycat+haproxy+keepalived

看我的集羣比對然後加進來就行了

 

使用需謹慎 報錯無人理只能靠自己


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