安裝與啟動
linux下可以下載Mycat-server-xxxxx.linux.tar.gz 解壓在某個目錄下,建議放在usr/local/mycat目錄下,注意目錄不能有空格。下載後改名,解壓到/usr/server,工程名字mycat,配置環境變數,並使之生效:
1) vi /etc/profile,在系統內容變數檔案中增加
export MYCAT_HOME=/usr/local/mycat
2) 使環境變數生效
source /etc/profile
[注]如果是在多台Linux系統中組建的 MyCAT叢集,那需要在MyCAT Server所在的伺服器上配置對其他ip和主機名稱的映射,配置方式如下: vi /etc/hosts
例如:我有4 台機器,配置如下:
IP 主機名稱:
192.168.0.1 server_1 192.168.0.2 server_2 192.168.0.3 server_3 192.168.0.4 server_4
3)啟動mycat
./mycat start
4)串連mycat
mycat預設的使用連接埠8066,管理連接埠9066
mysql -uroot -p123456 -P9066 -h127.0.0.1 -DTESTDB 使用者名稱密碼配置在server.xml,或者user/usermysql -uroot -p123456 -P8066 -h127.0.0.1
其中-u,-p,-h分別是使用者名稱,密碼和主機,-D是串連的邏輯庫。
mycat目錄介紹
1) bin目錄: Linux下運行:./mycat console,首先要chmod +x *
註:mycat支援的命令{ console | start | stop | restart | status | dump }
2) conf目錄下存放設定檔,server.xml是mycat伺服器參數調整和使用者授權的設定檔,schema.xml是邏輯庫定義和表以及分區定義的設定檔,rule.xml是分區規則的設定檔,分區規則的具體一些參數資訊單獨存放為檔案,也在這個目錄下,設定檔修改,需要重啟 mycat或者通過9066 連接埠reload. 3) 日誌存放在logs/mycat.log 中,每天一個檔案,日誌的配置是在conf/log4j.xml中,根據自己的需要,可以調整輸出層級為debug,debug層級下,會輸出更多的資訊,方便排查問題.
4) 注意:Linux下部署安裝 MySQL,預設不忽略表名大小寫,需要手動到/etc/my.cnf 下配置 lower_case_table_names=1 使Linux環境下MySQL忽略表名大小寫,否則使用MyCAT的時候會提示找不到表的錯誤。 mycat三個最重要設定檔
一、schema.xml
1、schema.xml作為 MyCat中重要的設定檔之一,管理著 MyCat的邏輯庫、表、分區規則、DataNode以及DataSource。弄懂這些配置,是正確使用MyCat的前提。
schema 標籤用於定義MyCat執行個體中的邏輯庫,MyCat可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。邏輯庫的概念和 MYSQL資料庫中Database的概念相同
checkSQLschema 設定為false,並且在提供SQL select * from TESTDB.travelrecord 語句的最好是不帶TESTDB這個欄位。 sqlMaxLimit 設定該值的話,MyCat預設會把查詢到的資訊全部都展示出來,造成過多的輸出。所以,在正常使用中,還是建議加上一個值,用於減少過多的資料返回。
2、table 標籤定義了MyCat中的邏輯表,所有需要拆分的表都需要在這個標籤中定義。 同一個schema標籤中定義的name必須唯一。 database 屬性所指定的是真實的資料庫名稱,需要在後面添加一個primaryKey 該邏輯表對應真實表的主鍵。rule屬性用於指定邏輯表要使用的規則名字,規則名字在rule.xml中定義,必須與tableRule標籤中name屬性屬性值一一對應。 type屬性 該屬性定義了邏輯表的類型,目前邏輯表只有“全域表”和”普通表”兩種類型。對應的配置: 全域表:global ,普通表:不指定該值為globla的所有表。有了全域表,這樣可以使用join了,同時增加讀寫分離。
3、dataNode 標籤定義了 MyCat中的資料節點,也就是我們通常說所的資料分區。一個dataNode 標籤就是一個獨立的資料分區。
<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
使用名字為lch3307資料庫執行個體上的db1物理資料庫,這就組成一個資料分區,最後,我們使用名字dn1標識這個分區。
dataHost 屬性用於定義該分區屬於哪個資料庫執行個體的,屬性值是引用 dataHost標籤上定義的name屬性。
4、 dataHost屬性 作為schema.xml中最後的一個標籤,該標籤在mycat邏輯庫中也是作為最底層的標籤存在,直接定義了具體的資料庫執行個體、讀寫分離配置和心跳語句。
1) maxCon與minCon 指定每個讀寫執行個體串連池的最大最小串連。
2) balance 負載平衡類型,目前的取值有 3種: balance="1", 開啟讀寫分離機制
3) writeType 負載平衡類型,目前的取值有 3種:
1. writeType="0", 所有寫操作發送到配置的第一個writeHost,第一個掛了切到還生存的第二個
4) writeHost,重新啟動後以切換後的為準,切換記錄在設定檔中:dnindex.properties . 其餘不推薦
5) heartbeat 這個標籤內指明用於和後端資料庫進行心跳檢查的語句。
6) writeHost 標籤、readHost 標籤 複雜看文檔
在一個dataHost內可以定義多個writeHost和readHost。但是,如果writeHost指定的後端資料庫宕機,那麼這個writeHost綁定的所有readHost都將不可用。另一方面,由於這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去。
因此,該設定檔中的balance="1"意味著作為stand by writeHost的hostS1和hostS2將參與select語句的負載平衡,這就實現了主從的讀寫分離,switchType='-1'意味著當主掛掉的時候,不進行自動切換,即hostS1和hostS2並不會被提升為主,仍只提供讀的功能。這就避免了將資料寫進slave的可能性,畢竟,單純的MySQL主從叢集並不允許將資料讀進slave中,除非配置的是雙master。
添加mycat1這個庫
<schema name="mycat1" checkSQLschema="false" sqlMaxLimit="100"><!-- auto sharding by id (long) --><table name="food" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema>
database要與實際的資料庫執行個體對應:<dataNode name="dn1" dataHost="localhost1" database="zy_mycat1" /><dataNode name="dn2" dataHost="localhost1" database="zy_mycat2" /><dataNode name="dn3" dataHost="localhost1" database="zy_mycat3" />dataHost是關鍵,使用者名稱密碼要與實際的資料庫對應,不然mycat是啟動不來的。這裡我只配置了一個master,沒有slave<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="172.23.29.111:3306" user="root" password="123456" /><writeHost host="hostS2" url="172.23.29.112:3306" user="changhf" password="123456"/> --></dataHost>
二、server.xml
system 這個標籤內嵌套的所有property標籤都與系統配置有關其他包括定義了使用者名稱密碼,指定訪問到分區等,修改root使用者屬性,增加mycat1這個庫。
<user name="root"><property name="password">123456</property><property name="schemas">TESTDB,mycat1</property></user>
重新啟動mycat
./mycat restart
三、rule.xml
rule.xml裡面就定義了我們對錶進行拆分所涉及到的規則定義。。這個檔案裡面主要有 tableRule 和function這兩個標籤。 驗證讀寫分離
create table food (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);insert into food (id,user_id,traveldate,fee,days) values(1,@@hostname,20160101,100,10),(5000001,@@hostname,20160102,100,10),(10000001,@@hostname,20160103,100,10);
關閉172.23.29.111的mysql服務,發現插入資料時提示串連失敗,而查詢並沒有影響。
參考:http://www.cnblogs.com/ivictor/p/5111495.html 兩篇文章