mycat二 (簡單配置與全局表)

<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, "測試")

 

 

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