MyCAT全局序列號

来源:http://www.cnblogs.com/ivictor/archive/2016/03/12/5235147.html
-Advertisement-
Play Games

在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全局唯一。為此,MyCat 提供了全局sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。 本地文件方式 原理:此方式MyCAT將sequence配置到文件中,當使用到sequence中的配置後,MyCAT會更下conf中的s


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

本地文件方式

原理:此方式MyCAT將sequence配置到文件中,當使用到sequence中的配置後,MyCAT會更下conf中的sequence_conf.properties文件中sequence當前的值。

譬如:

#default global sequence
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000

其中HISIDS表示使用過的歷史分段(一般無特殊需要可不配置),MINID表示最小ID值,MAXID表示最大ID值,CURID表示當前ID值。

使用方式:

在server.xml中配置如下:

<system><property name="sequnceHandlerType">0</property></system> 

其中0,表示使用本地文件方式。

測試如下:

mysql> create table test(id int,name varchar(20));
Query OK, 0 rows affected (0.13 sec)

mysql> insert into test(id,name) values(next value for MYCATSEQ_GLOBAL,@@hostname);
Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> select * from test;
+-------+--------------+
| id    | name         |
+-------+--------------+
| 10001 | mysql-slave2 |
+-------+--------------+
1 row in set (0.02 sec)

此時,sequence_conf.properties中GLOBAL.CURID值為10001。當然,可以使用sequence_conf.properties中定義的任何規則,譬如:

# self define sequence
COMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000
mysql> insert into test(id,name) values(next value for MYCATSEQ_COMPANY,@@hostname);
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> select * from test;
+-------+--------------+
| id    | name         |
+-------+--------------+
| 10001 | mysql-slave1 |
|  1001 | mysql-slave1 |
+-------+--------------+
2 rows in set (0.10 sec)

這個可自定義。

 

資料庫方式

原理

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

Sequence獲取步驟:

1).第一次使用該sequence時,根據傳入的sequence名稱,從資料庫這張表中讀取current_value,和increment到MyCat中,並將資料庫中的current_value設置為原current_value值+increment值(實現方式是基於後續的存儲函數)

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

使用方式:

1. 配置server.xml文件

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

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

2. 配置資料庫

在其中一個分片點對應的資料庫中創建表和存儲過程

因我在schem.xml中datanode的配置信息如下:

<dataNode name="dn$1-3" dataHost="localhost1" database="db$1-3" />

譬如我在dn2中創建,對應的資料庫名為db2(為什麼這裡會涉及到datanode,因為後續的sequence_db_conf.properties文件會使用到),註意,是登錄到資料庫中創建,而不是在mycat中創建

1> 創建MYCAT_SEQUENCE表

mysql> DROP TABLE IF EXISTS MYCAT_SEQUENCE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> 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;
Query OK, 0 rows affected (0.07 sec)

其中: – name sequence名稱
         – current_value 當前value
         – increment 增長步長! 可理解為mycat在資料庫中一次讀取多少個sequence. 當這些用完後, 下次再從資料庫中讀取.

註意:MYCAT_SEQUENCE必須大寫。

2> 插入sequence記錄

mysql> INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('mycat', 1, 100);
Query OK, 1 row affected (0.01 sec)

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

3> 創建存儲函數。

註意:必須在同一個資料庫中創建,在本例中,是db2。一共要創建三個。

– 獲取當前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 ;

– 設置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 ;

– 獲取下一個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 ;

至此,資料庫方面的準備工作已結束完畢。

3. 在mycat conf目錄下的sequence_db_conf.properties文件中添加如下內容:

MYCAT=dn2

其中,dn2對應的是資料庫db2的datanode

註意:MYCAT必須為大寫,這個與表的數據是否大寫無關,事實上,MYCAT_SEQUENCE中name是否大小寫對結果沒有影響。

開始測試:

登錄mycat客戶端

# mysql -h127.0.0.1 -utest -ptest -P8066 -DTESTDB

創建測試表

mysql> create table test(id int,name varchar(10));
Query OK, 0 rows affected (0.22 sec)

插入數據

插入的格式如下:

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

mysql> mysql> insert into test(id,name) values(next value for MYCATSEQ_MYCAT,'test1');
ERROR 1003 (HY000): mycat sequnce err.org.opencloudb.config.util.ConfigException: can't find definition for sequence :MYCAT
mysql> insert into test(id,name) values(next value for MYCATSEQ_MYCAT,'test1');
Query OK, 1 row affected (0.11 sec)

mysql> select * from test;
+------+-------+
| id   | name  |
+------+-------+
|  101 | test1 |
+------+-------+
1 row in set (0.09 sec)

第一次會報如下錯誤:

ERROR 1003 (HY000): mycat sequnce err.org.opencloudb.config.util.ConfigException: can't find definition for sequence :MYCAT

因為對於sequence_db_conf.properties的修改當前的mycat並不知曉,這時候,可重啟mycat或者登錄9066管理埠進行 reload @@config;

至此,測試完畢,關鍵還是兩點:MYCAT_SEQUENCE必須大寫,sequence_db_conf.properties文件中MYCAT=dn2必須大寫。


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

-Advertisement-
Play Games
更多相關文章
  • 出處:http://www.cnblogs.com/lzrabbit/archive/2012/05/21/2499389.html 小小程式猿SQL Server認知的成長 1.沒畢業或工作沒多久,只知道有資料庫、SQL這麼個東東,渾然分不清SQL和Sql Server Oracle、MySql的
  • 在csdn上也看到一個帖子叫Oracle常用函數110.大概的看了一下,裡面數據計算的居多,協方差之類的.自己覺得用到的不多,今天看到的這個,不是很全,稍微增加了一下,等以後用到的時候可以查看.
  • 在保密你的伺服器和數據,防備當前複雜的攻擊,SQL Server有你需要的一切。但在你能有效使用這些安全功能前,你需要理解你面對的威脅和一些基本的安全概念。這篇文章提供了基礎,因此你可以對SQL Server里的安全功能充分利用,不用在面對特定威脅,不能保護你數據的功能上浪費時間。 身份驗證是驗證主
  • MySQL 目前的最新版本是 5.7.11,在 Linux 下提供特定發行版安裝包(如 .rpm)以及二進位通用版安裝包(.tar.gz)。一般情況下,很多項目都傾向於採用二進位通用安裝包形式來進行安裝配置,自定義非常方便。但在安裝過程中發現,其實官方提供的安裝說明文件太過簡單,而且裡面的參數還有問
  • Buffer cache hit ratio官方是這麼解釋的:“指示在緩衝區高速緩存中找到而不需要從磁碟中讀取的頁的百分比。”   Buffer cache hit ratio被很多人當做判斷記憶體的性能指標之一(我沒說僅僅只看這個計數器的值,實際上我現在都不看這個值了), 也有不少給給出了具體的參數
  • 我們究竟應該如何對MySQL資料庫進行優化?下麵我就從MySQL對硬體的選擇、MySQL的安裝、my.cnf的優化、MySQL如何進行架構設計及數據切分等方面來說明這個問題。 伺服器物理硬體的優化 在挑選硬體伺服器時,我們應該從下麵幾個方面著重對MySQL伺服器的硬體配置進行優化,也就是說將項目...
  • //mysql_select//gcc mysql_select.c -o test -I /usr/include/mysql -L /usr/lib -lmysqlclient #include <stdio.h>#include <string.h>#include <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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...