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, PRIMARYKEY (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