MyCAT全局序列號-資料庫方式

来源:https://www.cnblogs.com/heyangyi/archive/2018/07/23/9343145.html
-Advertisement-
Play Games

在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全局唯一。為此,MyCat 提供了全局 sequence,並且提供了包含本地配置和資料庫配置等多種實現方式, ...


1.MyCat中的全局序列號介紹

在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全局唯一。為此,MyCat 提供了全局 sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。

2.資料庫方式

原理:在資料庫中建立一張表,存放 sequence 名稱(name),sequence 當前值(current_value),步長(increment int 類型每次讀取多少個 sequence,假設為 K)等信息;

獲取步驟:

當初次使用該 sequence 時,根據傳入的 sequence 名稱,從資料庫這張表中讀取 current_value,和 increment 到 MyCat 中,並將資料庫中的 current_value 設置為原 current_value 值+increment 值; .

MyCat 將讀取到 current_value+increment 作為本次要使用的 sequence 值,下次使用時,自動加 1,當 使用 increment 次後,執行步驟 1)相同的操作. MyCat 負責維護這張表,用到哪些 sequence,只需要在這張表中插入一條記錄即可。若某次讀取的 sequence 沒有用完,系統就停掉了,則這次讀取的 sequence 剩餘值不會再使用。

3.配置資料庫方式

<3.1> 修改Mycat配置文件server.xml

<property name="sequnceHandlerType">1</property>

1代表使用資料庫方式生成sequence

<3.2> 修改Mycat配置文件schema.xml

<table name="test" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long"/>
<table name="mycat_sequence" primaryKey="name" dataNode="dn2"/>

<3.3> 修改Mycat 配置文件 sequence_db_conf.properties,添加MYCAT=dn2

#sequence stored in datanode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1
MYCAT=dn2

<3.4> 在dn2節點的 db2 資料庫中添加 MYCAT_SEQUENCE表

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;

<3.5> 在dn2節點的 db2 資料庫中的 MYCAT_SEQUENCE 表插入sequence初始記錄

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('mycat', -99, 100);

代表插入了一個名為mycat的sequence,當前值為-99,步長為100。

<3.6> 在dn2節點的 db2 資料庫中創建存儲過程

(3.6.1) 獲取當前sequence的值:

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 ;

  (3.6.2) 設置sequence值:

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 ;

  (3.6.3) 獲取下一個sequence值:

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 ;

獲取全局id的配置已經準備完畢。

4.測試獲取全局自增ID

(4.1) 向dn1,dn2,dn3 中的db1,db2,db3 分別添加測試表 test

create table test(id int,name varchar(10));

(4.2) 重啟mycat ,使用WorkBench鏈接mycat

SELECT * FROM db2.mycat_sequence;

這是Mycat重啟之前的的 mycat_sequence初始化數據

這室mycat 重啟之後的  mycat_sequence 數據

(4.3) 向test表中添加測試數據,多次執行以下語句,這裡我執行了9次添加數據

insert into test(id,name) values(next value for MYCATSEQ_MYCAT,(select database()));

(4.4) 查詢添加的數據

SELECT * FROM test order by id asc;

全局自增id生成成功,同時數據被水平切分到 3個分片上

(4.5) 再次重啟mycat,執行(4.3)步驟,添加多次數據,之後查看 mycat_sequence 數據

發現在上次的基礎上增加了100

重啟後的id重101開始計數

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 數據頁是包含已添加到資料庫表中的用戶數據的結構。 如前所述, 數據頁有三種, 每個都以不同的格式存儲數據。 SQL server 有行內數據頁、行溢出數據頁和 LOB 數據頁。 與 SQL server 中的所有其他類型的頁一樣, 數據頁的大小固定為 8 KB 或8192位元組。 它們由三主要組件組成 ...
  • 學習SqlServer到現在快兩年了吧,分頁查詢總是忘了看筆記,看了又忘。之前用的分頁都是row_number函數的方式,背不住。。。直到今天,看到別人寫的另一種分頁寫法,看似比row_number簡單。好記。。。 分頁原理:越過多少條,取多少條 以前用的row_number函數的方式也記錄一下吧 ...
  • 一.概述 在資料庫中,數據是屬於共用資源,為了保證併發訪問的一致性,有效性,產生了鎖。接下來重點討論mysql鎖機制的特點,常見的鎖問題,以及解決mysql鎖問題的一些方法或建議。 相比其他資料庫,mysql 鎖機制比較簡單,顯著的特點是 不同的存儲引擎支持不同的鎖機制。在innodb中支持行鎖和表 ...
  • 上一篇文章寫過centos 7下clickhouse rpm包安裝和基本的目錄結構,這裡主要介紹clickhouse高可用集群的部署方案,因為對於預設的分散式表的配置,每個分片只有一份,這樣如果掛掉一個節點,則查詢分散式表的時候直接會報錯,這個是基於clickhouse自己實現的多分片單副本集群,配 ...
  • 寫sql時我們經常會遇到需要把從多張表查詢的集果集進行合併。這時就用到了union。使用union或union all 時一定要保證查詢的列的一致性 。不然sql會報錯。欄位不一致的話可以用單引號來占位。 例: 下麵就來說明union和union all的區別 準備一張測試數據表。註意mysql中的 ...
  • 一:安裝Oracle 資料庫軟體 1.先去官網下載所需文件:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.選中兩個壓縮包同時解壓到一個文件 3.解壓文件後運行文件進行安裝 4. ...
  • 配置Mysql Group Replication遇到的一些問題的記錄 ...
  • 重裝了一下系統,裝了centos7,但是centos7下預設沒有安裝mysql,有MariaDB資料庫,網上的解釋是: “MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL授權許可。開發這個分支的原因之一是:甲骨文公司收購了MySQL後,有將MySQL閉源的潛在風險 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...