安裝與啓動
linux下能夠下載Mycat-server-xxxxx.linux.tar.gz 解壓在某個目錄下,建議放在usr/local/mycat目錄下,注意目錄不能有空格。下載後更名,解壓到/usr/server,工程名字mycat,配置環境變量,並使之生效:html
1) vi /etc/profile,在系統環境變量文件中增長 java
- export MYCAT_HOME=/usr/local/mycat
export MYCAT_HOME=/usr/local/mycat
2) 使環境變量生效mysql
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
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)鏈接mycatlinux
mycat默認的使用端口8066,管理端口9066
sql
- mysql -uroot -p123456 -P9066 -h127.0.0.1 -DTESTDB 用戶名密碼配置在server.xml,或者user/user
- mysql -uroot -p123456 -P8066 -h127.0.0.1
mysql -uroot -p123456 -P9066 -h127.0.0.1 -DTESTDB 用戶名密碼配置在server.xml,或者user/user
mysql -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. api
3) 日誌存放在logs/mycat.log 中,天天一個文件,日誌的配置是在conf/log4j.xml中,根據本身的須要,能夠調整輸出級別爲debug,debug級別下,會輸出更多的信息,方便排查問題.
4) 注意:Linux下部署安裝 MySQL,默認不忽略表名大小寫,須要手動到/etc/my.cnf 下配置 lower_case_table_names=1 使Linux環境下MySQL忽略表名大小寫,不然使用MyCAT的時候會提示找不到表的錯誤!服務器
mycat三個最重要配置文件
1、schema.xml
一、schema.xml做爲 MyCat中重要的配置文件之一,管理着 MyCat的邏輯庫、表、分片規則、DataNode以及DataSource。弄懂這些配置,是正確使用MyCat的前提。
schema 標籤用於定義MyCat實例中的邏輯庫,MyCat能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配置。邏輯庫的概念和 MYSQL數據庫中Database的概念相同
checkSQLschema 設置爲false,而且在提供SQL select * from TESTDB.travelrecord 語句的最好是不帶TESTDB這個字段。 sqlMaxLimit 設置該值的話,MyCat默認會把查詢到的信息所有都展現出來,形成過多的輸出。因此,在正常使用中,仍是建議加上一個值,用於減小過多的數據返回。
二、table 標籤定義了MyCat中的邏輯表,全部須要拆分的表都須要在這個標籤中定義。 同一個schema標籤中定義的name必須惟一。 database 屬性所指定的是真實的數據庫名稱,須要在後面添加一個primaryKey 該邏輯表對應真實表的主鍵。rule屬性用於指定邏輯表要使用的規則名字,規則名字在rule.xml中定義,必須與tableRule標籤中name屬性屬性值一一對應。 type屬性 該屬性定義了邏輯表的類型,目前邏輯表只有「全局表」和」普通表」兩種類型。對應的配置: 全局表:global ,普通表:不指定該值爲globla的全部表。有了全局表,這樣可使用join了,同時增長讀寫分離。
三、dataNode 標籤定義了 MyCat中的數據節點,也就是咱們一般說所的數據分片。一個dataNode 標籤就是一個獨立的數據分片。
- <dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
使用名字爲lch3307數據庫實例上的db1物理數據庫,這就組成一個數據分片,最後,咱們使用名字dn1標識這個分片。
dataHost 屬性用於定義該分片屬於哪一個數據庫實例的,屬性值是引用 dataHost標籤上定義的name屬性。
四、
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>
<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>
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>
2、server.xml
system 這個標籤內嵌套的全部property標籤都與系統配置有關其餘包括定義了用戶名密碼,指定訪問到分片等,修改root用戶屬性,增長mycat1這個庫。
- <user name="root">
- <property name="password">123456</property>
- <property name="schemas">TESTDB,mycat1</property>
- </user>
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB,mycat1</property>
</user>
從新啓動mycat
./mycat restart
3、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);
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 兩篇文章