天天看點

mycat之讀寫分離

主:10.10.10.100

從:10.10.10.200

1,先做好主從同步

2,mycat安裝配置:

[root@master ~]# tar xvf Mycat-server-1.6-release-linux.tar
[root@master ~]# mv mycat /usr/local/mycat
[root@master ~]# tar xvf jdk-7u79-linux-x64.tar.gz
[root@master ~]# mv jdk1.7.0_79 /usr/local/
[root@master conf]# cd /usr/local/mycat/conf
[root@master conf]# vi wrapper.conf               #修改java路徑
       wrapper.java.command=/usr/local/jdk1.7.0_79/bin/java
[root@master logs]# cat ~/.bash_profile  |grep mycat
PATH=$PATH:$HOME/bin:/usr/local/mycat/bin           

3,修改配置檔案如下:

[root@master conf]# cat schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="guo" />                                        //dn1和dn2這個名字可以随意,不用修改。這個表示,資料庫TESTDB中隻有一個執行個體guo,TESETDB2中有一個執行個體jia
<dataNode name="dn2" dataHost="localhost1" database="jia" />                                        //這種是适用于一個mysql中有多個實體資料庫都要進行讀寫分離的情況。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="master" url="10.10.10.100:3306" user="root" password="123456">                        
   <!-- can have multi read hosts -->
   <readHost host="slave" url="10.10.10.200:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>

guo:這個是在真實資料庫中的資料庫執行個體,如果有多個庫要實作讀寫分離,多配置幾行。dn1和dn2兩個名稱随意配置

balance=0 不開啟讀寫分離機制,所有讀操作都發送到目前可用的writehost
balance=1 全部的讀節點與備用的寫節點參與select語句的負載均衡
balance=2 所有讀操作都随機的在readhost和writehost上分發

writeType,負載均衡類型,目前的取值有3種:
writeType="0", 所有寫操作發送到配置的第一個writeHost。
writeType="1",所有寫操作都随機的發送到配置的writeHost,該參數1.5版本以後廢棄不用了。
writeType="2",不執行寫操作。

switchType=-1 表示主從不自動切換
switchType=1  預設值,自動切換
switchType=2  基于MySQL 主從同步的狀态決定是否切換,心跳語句為 show slave status
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時則表示主僅同步,可安全切換,否則不會切換。

writeHost host="hostM1":host和主機名一緻


修改server.xml配置檔案:
[root@master conf]# tail -12 server.xml
       </system>
       <user name="test">
               <property name="password">test</property>
               <property name="schemas">TESTDB,TESTDB2</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登入的使用者名密碼和mycat連接配接進去顯示的邏輯資料庫名
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P9066
           

4,啟動mycat後驗證讀寫分離:

[root@master bin]# ./mycat start
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P9066           
mycat之讀寫分離

RS_CODE 值為1表示正常情況

5,測試:

打開mycat的log4j.xml檔案,修改日志級别info為debug,重新開機mycat
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P8066
mysql> create table user(id int primary key, name varchar(20));
mysql> insert into user values(100000,test);                                
mysql>select * from user;           
mycat之讀寫分離

6,mycat管理:

目前mycat有兩個端口,8066資料端口,9066管理端口。
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P9066
msyql> show @@help;
msyql> show @@heartbeat;                //RS_CODE為1表示心跳正常
msyql> show @@cache;                //MAX為緩存的最大值(記錄個數),CUR為目前已經在緩存中的數量,ACESS為緩存讀次數,HIT為緩存命中次數,PUT                                         
                                               為寫緩存次數,LAST_XX為最後操作時間戳,比較重要的幾個參數:CUR:若CUR接近MAX,而PUT大于MAX很多,則表明MAX需要增大,HIT/ACCESS為緩存命中率,這個值越高越好。
msyql> show @@datasource;
mysql> show @@datanode;                 //包括每個資料節點目前活動連接配接數(active),空閑連接配接數(idle)以及最大連接配接數(maxCon) size,EXECUTE參數表示從該節點擷取連接配接的次數,次數越多,說明通路該節點越多。
mysql> show @@version;
mysql> show @@connection;
mysql> show @@backend;                //顯示mycat後端連接配接狀态
mysql> show @@threadpool;                //目前線程池的執行情況,是否有積壓(active_count)以及task_queue_size,後者為積壓的待處理的SQL,若積壓數目一直保值,則說明後端實體連接配接可能不夠或者SQL執行比較緩慢。
mysql> Kill @@connection                //殺掉用戶端的連接配接,參數為連接配接的ID值,通過show @@connection,可以展示目前連接配接到MyCAT的所有用戶端程序,若某個程序異常,則可以通過該指令殺掉連接配接,如KILL @@CONNECTION 1;
mysql> show @@processor;                      //顯示目前processors的處理情況,包括每個processor的IO吞吐量(NET_IN/NET_OUT)、IO隊列的積壓情況(R_QUEY/W_QUEUE),Socket Buffer Pool的使用情況 BU_PERCENT為已使用的百分比、BU_WARNS為Socket Buffer Pool不夠時,臨時建立的新的BUFFER的次數,若百分比經常超過90%并且BU_WARNS>0,則表明BUFFER不夠,需要增大,參見性能調優手冊。           

7,主從切換:

  • 如果隻有一個writeHost,主挂了,整個mysql就無法使用了,讀也不能用,mycat能夠進行自動主從切換的前提是必須要有2個writeHost。
    mycat之讀寫分離

8,主從切換驗證:

  • 停止主庫,然後mycat登入進去看看是否能夠進行讀寫操作。