<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.1.108:3306" user="root"
password="123123">
<readHost host="hostS2" url="192.168.1.101:3306" user="root"
password="123"/>
</writeHost>
</dataHost>
writeType屬性
- writeType= "0" 默認從第一個writeHost寫數據。如果沒配置readHost 那麼讀也是從這讀
- writeType="1" 隨機發送寫操作。不推薦研究
balance 屬性
用0和3的爲主流
- balance=“0”, 不開啓讀寫分離,所有讀操作都加在writeHost 上。
- balance=“1”,全部writeHost和readHost都參與select。
- balance=“2”,所有讀操作都隨機在writeHost、readhost 上處理。
- balance=“3”,所有讀請求readhost 執行,writerHost 不讀只寫
mycat全局表
<table name="news_class" primaryKey="class_id" autoIncrement="true" type="global"
dataNode="dn1,dn2" />
type="global"
- 就是和具體物理表一一對應
- 多節點配置時出現新增、修改操作時,則mycat會對所有節點(dataNode),發送該操作。保證所有的節點裏面的
- 不經常產生修改的表,如配置表、類別表以及數據量不是很大的表纔會設置成全局表,因爲:
- 全局表修改時,會對所有節點進行同樣的修改,保證同步
- 讀取時,則隨意從一個節點讀取
全局表自我結論
全局表實際就是mycat保證數據庫節點的全局表的數據一致性,效果類似於主從同步
全局表如何保證主鍵的一致性
- 在生產環境中,很難保證兩個數據庫中主鍵的一致性
- 因爲可能存在刪除修等操作
配置文件獲取主鍵ID
- 打開server.xml 在 <system>節點下 配置 <property name="sequnceHandlerType">0</property>
- 修改sequence_conf.properties
#default global sequence GLOBAL.HISIDS= //無需配置
GLOBAL.MINID=10001 //最小值
GLOBAL.MAXID=20000 //最大值
GLOBAL.CURID=10000 //當前值
select next value for MYCATSEQ_GLOBAL; //使用這個select語句可以獲取到mycat指定的唯一主鍵
# self define sequence
CLASS.HISIDS=
CLASS.MINID=50
CLASS.MAXID=20000
CLASS.CURID=51
select next value for MYCATSEQ_CLASS; //使用這個select語句可以獲取到mycat指定的唯一主鍵
# self define sequence
AA.HISIDS=
AA.MINID=50
AA.MAXID=20000
AA.CURID=51
select next value for MYCATSEQ_AA; //使用這個select語句可以獲取到mycat指定的唯一主鍵
如何使用自增ID進行添加數據
insert inti news_main(news_id,news_title) values(next value for MYCATSEQ_AA,"mycat添加")
可以讓每個表使用不用的全局主鍵策略,保證自增ID的連續性
數據庫配置主鍵ID
需要在你指定的某個節點的數據庫中新建一個 MYCAT_SEQUENCE表 (直接執行即可)
name sequence名稱
current_value 當前value
Increment 每次增長值
#建表
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;
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 100000,
100);
#獲取當前 ID
DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER //
CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)
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;//
#設置
DROP FUNCTION IF EXISTS mycat_seq_setval;
DELIMITER//
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64)
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END;//
#獲取下一個(新的ID)
DROP FUNCTION IF EXISTS mycat_seq_nextval;
DELIMITER //
CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END;//
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 100000,
100);
表示name爲"GLOBAL" , 當前主鍵ID從100000開始,每100個跨度修改一次數據庫
可以自己添加自定義主鍵名稱
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GOD', 100,
100);
表示name爲"GOD" , 當前主鍵ID從100開始,每100個跨度修改一次數據庫
修改 sequence_db_conf.properties
vi sequence_db_conf.properties
#sequence stored in datanode
GLOBAL=dn1 #select next value for MYCATSEQ_GLOBAL;
GOD=dn1 #select next value for MYCATSEQ_GOD;
GOD=dn1表示當如果要使用MYCATSEQ_GOD主鍵時,這個數據庫主鍵配置在dn1節點上
insert into news_main(news_id,news_title) values(next value for MYCATSEQ_GOD, "測試")