1. 程式人生 > >Mycat 全域性系列號

Mycat 全域性系列號

概述  

本篇文章介紹mycat怎樣在分庫分表的情況下保證主鍵的全域性唯一方法,接下來就來分析三種方法各自的優缺點。

配置  

檔案方式獲取

1.修改server配置檔案

 vim server.xml

<system><property name="sequnceHandlerType">0</property></system>
注:sequnceHandlerType 配置為0表示使用本地檔案讀取。

2.配置sequence_conf.properties配置檔案

3.在mycat中執行語句測試(在邏輯庫中測試)

insert into company(id,name) values(next value for MYCATSEQ_GLOBAL,'test');

缺點:在 MyCAT 重啟後,配置檔案中癿 sequence 會恢復到初始值。
優點:本地載入,讀取速度較快。

資料庫方式獲取

1.修改server配置檔案

 vim server.xml

<system><property name="sequnceHandlerType">1</property></system>
注:sequnceHandlerType 配置為1表示從資料庫表中讀取。

2.配置讀取的節點,就是配置全域性表在哪個節點上面,我這裡配置在dn1節點上面。

vim sequence_db_conf.properties

 3.建立全域性表和函式

選擇mysql物理庫的dn1節點上執行下面語句,我配置的dn1即db1資料庫

DROP TABLE IF EXISTS MYCAT_SEQUENCE;
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); DROP FUNCTION IF EXISTS `mycat_seq_currval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 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 ;; DELIMITER ; DROP FUNCTION IF EXISTS `mycat_seq_nextval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END ;; DELIMITER ; DROP FUNCTION IF EXISTS `mycat_seq_setval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = value WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END ;; DELIMITER ;

 4.測試插入資料,也是在mycat邏輯庫上執行

insert into user(id,name) values(next value for MYCATSEQ_GLOBAL,'中文');


優點:在 MyCAT 重啟後,sequence 值不會被初始化,比如當前MYCAT_SEQUENCE的初始值是100000,當mycat的重啟之後再執行插入資料後MYCAT_SEQUENCE的初始值就加100變成100100,新插入到表的值也是在加100的基礎上開始遞增,

缺點:當配置了主從複製時(A主B從),一開始主從上面的MYCAT_SEQUENCE表的current_value初始值是100000;當前配置的讀寫分離方案是A負責寫B負責讀當A宕機之後B負責寫A變成了讀,加入現在的全域性ID已經到了 100103,這個時候如果A宕機了,

mycat應該是存在快取current_value還是記錄的是A的值,不會立馬切換使用B上的current_value的值,如果這個時候mycat重啟了,這個時候全域性系列號就開始使用B中的current_value值由於B值也是從100100開始那麼這個時候插入全域性記錄到B中的表中就會和之前生成的100100到100103主鍵衝突了。不知道這算不算是一個BUG,所以當A宕機之後需要趕緊把A重啟好,這樣的話就算mycat重啟之後還是從A開始讀,這個時候全域性ID就從100200開始了。

還有一種方法是當A宕機之後由於mycat還沒有重啟全域性序列的ID還是快取之前A的,這個時候把B的current_value增加100,這個時候如果切換到了A由於B的值是從100100開始不會和之前的衝突,如果這個時候A修復啟動了這個時候也要把A的current_value增加200避免切換到A之後又和現在的值衝突。

本地時間戳方式獲取

1.修改server配置檔案

 vim server.xml

<system><property name="sequnceHandlerType">2</property></system>
注:sequnceHandlerType 配置為2表示時間戳方式。

2.測試插入資料,也是在mycat邏輯庫上執行,注意時間戳的長度有18位,保證表的欄位長度足夠

insert into user(id,name) values(next value for MYCATSEQ_GLOBAL,'中文');

優點:不存在上面兩種方案因為mycat的重啟導致id重複的現象

缺點:資料型別太長

總結

 三種方式各有優缺點,根據自己的需求選擇。

備註:

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

相關推薦

Mycat 全域性系列

概述   本篇文章介紹mycat怎樣在分庫分表的情況下保證主鍵的全域性唯一方法,接下來就來分析三種方法各自的優缺點。 配置   檔案方式獲取 1.修改server配置檔案  vim server.xml <system><property name="sequnceH

Mycat全域性序列失效的詭異事件

概述 某分庫表自增id出現異常,自增id用的物理庫自增方式,檢查了mycat配置檔案,是沒有配錯的,百思不得其姐 原因 如果分庫分表,使用mycat自增,資料庫表id寫了AUTO_INCREMENT,並且mybatis裡插入語句如下: insert into c_user

Mycat快速入門(三): 全域性序列

一: 簡介 在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全域性唯一。為此,MyCat 提供了全域性 sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。 二: sequnceHandlerType 序列號處理器型別,感覺“sequnce” 序列號

mycat 主鍵自增長 即全域性序列

server.xml<property name="sequnceHandlerType">0</property>採用本地檔案配置的方式1.6 官方文件 寫:缺點:在 MyCA

Mycat中介軟體的全域性序列

本篇文章介紹mycat怎樣在分庫分表的情況下保證主鍵的全域性唯一方法,接下來就來分析三種方法各自的優缺點。 檔案方式獲取 1.修改server配置檔案 server.xml <system><property name="seq

特殊密碼鎖,openjudge全域性8496,已AC

a:特殊密碼鎖 總時間限制: 1000ms 記憶體限制: 1024kB 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓

JS:獲取驅動器的型別及系列

親測必須將程式碼放在記事本中,改成html格式,在用IE執行(必須) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dt

OpenJudge簡單的整數劃分問題兩種方法(DFS)(動態規劃0ms),全域性7215,已AC

2:簡單的整數劃分問題 總時間限制: 100ms 記憶體限制: 65536kB描述 將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=n

Git 系列之tag的用法---為你的代碼標記版本

嘗試 自動生成 tag lib 去掉 現在 blank title checkout 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[-] 本地倉庫操作 遠程倉庫操作 其他 tag 操作 在做app開發的時候經常有版本的概念,比如v1

微信公眾開發系列-啟用開發模式

sum oca 使用 popu 接口交互 開發模式 signature 微信公眾 local 微信公眾平臺分為兩種模式:編輯模式與開發模式; 微信公眾帳號申請成功後,要想用程序接收處理用戶的請求,就必需要在“高級功能”裏進行配置。點擊“高級功能”。 從微信開發平臺開發人

多線程面試題系列(15):關鍵段,事件,互斥量,信量的“遺棄”問題

creating 不為 char toc 效果 創建 cti 不能 false 一.什麽是“遺棄”問題 在第七篇講到了互斥量能處理“遺棄”問題,下面引用原文: 互斥量常用於多進程之間的線程互斥,所以它比關鍵段還多一個很有用的特性——“遺棄”情況的處理。比如有一個占用互斥量的

Asp.net Core 微信公眾開發系列

net 配置 splay targe www -- c-s mage cnblogs 參考:http://www.cnblogs.com/zskbll/p/4074855.html 一、微信公眾平臺操作流程 1、先到微信公眾平臺註冊賬號 2、登錄成功後找到開發-->開

Mycat的使用 - 03.全局序列

全局序列號02配置篇說到tb1表按照主鍵id進行了分片, 實際工作中還會經常按業務字段分片, 這次有tb3表, 按user_id分片, 依上文思路, 先調整下涉及到的配置文件.1. 在schema.xml中, 添加tb3表的配置.<table name="tb3" dataNode=

thinkphp整合系列之微信公眾支付

const simple 商品 simplex 支付平臺 doc 外部 center vendor thinkphp整合系列之微信公眾號支付 白俊遙 2016-07-17 11:26:52 PHP thinkphp 公眾號支付是指在微信app中訪問的頁面

Autodesk2018 序列|Autodesk2018全系列註冊機下載(附autodesk201

Autodesk序列號Autodesk2018全系列註冊機點擊下載Autodesk2018全系列軟件註冊機(CAD全系列註冊機)是Autodesk 出品的軟件,Autodesk 2018全系列軟件註冊機(CAD全系列註冊機)可謂是全球最頂級的軟件,應該說是和 Adobe 公司是同一級別的大公司。Autodes

中間件系列ActiveMQ,Rocketmq,Rabbitmq,Kafka,Mycat讓你深入理解學習中間件

quest 協議 允許 開發環境 不同 ket 周期 數據傳遞 pro 以前的網絡主要是客戶端與服務器(C/S)結構或瀏覽器/服務器(B/S) 形式的兩層結構,隨著企業信息的不斷擴大,企業級應用不再滿足於簡單的兩層系統,而是向著三層和多層體系結構發展。中間件就是在其中加入

中介軟體系列ActiveMQ,Rocketmq,Rabbitmq,Kafka,Mycat讓你深入理解學習中介軟體

以前的網路主要是客戶端與伺服器(C/S)結構或瀏覽器/伺服器(B/S)  形式的兩層結構,隨著企業資訊的不斷擴大,企業級應用不再滿足於簡單的兩層系統,而是向著三層和多層體系結構發展。中介軟體就是在其中加入一箇中間層,以支援更多的功能和服務。  一、什麼是中介軟體 &n

中介軟體系列ActiveMQ,Rocketmq,Rabbitmq,Kafka,Mycat讓你深入理解學習中介軟體視訊教程網盤

中介軟體系列ActiveMQ,Rocketmq,Rabbitmq,Kafka,Mycat讓你深入理解學習中介軟體視訊教程網盤39套Java架構師,高併發,高效能,高可用,分散式,叢集,電商,快取,微服務,微信支付寶支付,公眾號開發,java8新特性,P2P金融專案,程式設計,功能設計,資料庫設計,第

C#微信公眾開發 -- (四)獲取API呼叫所需的全域性唯一票據access_token

access_token是公眾號的全域性唯一票據,公眾號呼叫各介面時都需使用access_token。開發者需要進行妥善儲存。access_token的儲存至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的access_token失效。 獲取

Python爬蟲系列之郵編區爬取

Python爬蟲之<—>全國郵編區號爬取 僅供交流探討 歡迎提出改進 程式碼部分 import re import requests import time import MySQLdb ''' @author:王磊 @time :201