sequenceをマルチゾーンとして配備するid

3156 ワード

序文
ビジネス量の増加と国際化の需要に伴い、マルチゾーン導入は日常茶飯事であり、各ゾーンデータが相互接続する必要がある場合、データベースidはグローバルで一意であり、自己構築sequenceはmysqlマルチゾーン導入idの衝突問題を解決するために自己増加idとして機能する.
優劣
メリット
  • はuuidと比較して、sequence構成はデータベース内でマシン環境に依存せず、秩序ある
  • である.
  • とmysql自己増加idを比較すると、idセグメントを分割し、いつでも制御可能な
  • のマルチゾーン配置に適しています.
    欠点
  • は、業務評価idセグメントに基づいて、後期の必要に応じて
  • を調整する必要がある.
  • 単領域idの成長が速すぎると、idの割り当てが平均する、割り当てられたidセグメントが使用できないと、idが
  • 浪費される.
    分割の原則
  • bigintの使用を推奨し、bigint unsignedを使用しないでください.bigint unsignedはlongとint 64の範囲を超えているため、多くのパッケージが
  • とエラーを報告します.
  • bigintの最大値は922337203685475807で、id区分を拡張しやすいように一度にすべて割り当てないでください.例えば、中国0-10 e、米国10 e-20 e、ヨーロッパ20 e-30 eで、新規地域またはある地域のidセグメントが使用済みになったときにidセグメントを追加します.例えば、米国がsequenceを変更してから30 e
  • になります.
    具体的な操作
  • mysqlカスタム関数機能がオンになっているかどうかを確認するshow variables like '%log_bin_trust_function_creators%'実行がオンになっているかどうかを確認するawsがデフォルトでオンになっていない場合はデータベース構成を変更する必要があり、SET GLOBAL log_bin_trust_function_creators=1;実行はこの機能をオンにし、権限の問題に遭遇して元の構成
  • を変更する
  • sequenceテーブル
    -- sequence 
    DROP TABLE IF EXISTS sequence;
    --  sequence ,  seq     ,   :0(default) 9223372036854775807(0 2^63–1)。
    CREATE TABLE sequence (
    name            VARCHAR(50) NOT NULL,      --   
    current_value   BIGINT NOT NULL DEFAULT 0, --    
    increment       INT NOT NULL DEFAULT 1,    --   
    PRIMARY KEY (name)  --      seq   
    ) ENGINE=InnoDB;
    
  • を作成する
  • 作成関数
  • function現在のid
    -- DELIMITER         ,                    
    DELIMITER /
    DROP FUNCTION IF EXISTS currval /
    CREATE FUNCTION currval(seq_name VARCHAR(50))
    RETURNS BIGINT
    BEGIN
        DECLARE value BIGINT;
        SELECT current_value INTO value
        FROM sequence
        WHERE upper(name) = upper(seq_name); --       .
        RETURN value;
    END;
    /
    DELIMITER ;
    
  • を取得する.
  • functionは、次のid
    DELIMITER /
    DROP FUNCTION IF EXISTS nextval /
    CREATE FUNCTION nextval (seq_name VARCHAR(50))
    RETURNS BIGINT
    BEGIN
        DECLARE value BIGINT;
        UPDATE sequence
        SET current_value = current_value + increment
        WHERE upper(name) = upper(seq_name);
        RETURN currval(seq_name);
    END;
    /
    DELIMITER ;
    
  • を取得する.
  • 関数が正常に作成されたかどうかを確認します.
  • 削除:drop function
  • 表示:show create function
  • 表示:show function status
  • 修正:alert function
  • sequenceテーブルsessionテーブルを追加するなど、テーブルの初期値とステップ長を追加します.初期値は1000、ステップ長は2 insert into `sequence`(`name`,`current_value`,`increment`) values('session',1000,2)
  • に設定します.
  • nextval関数を使用してセッションテーブル挿入文を実行します.例えば、INSERT INTO `session`(`id`, `uid`, `sig`, `expired`) VALUES (nextval('session'),123,'1231',now())はnextvalが関数として実行されるため、sqlの実行が成功するかどうかにかかわらず、sequenceは増加します.これはmysql自己増加id自体と同じ
  • です.
    終わりの言葉
    sequenceをmysqlとしてidを成長させる唯一の面倒な点はidセグメントを制御することであり、idセグメントの区分が小さすぎるとid競合が発生しやすく、区分が大きすぎると新規領域id不足の問題が発生しやすいため、トラフィックを評価する必要がある.もちろんidが秩序正しくあるかどうかを気にしないで、snowflakeでuuidを生成させるのも良い選択だ.
    転載先:https://juejin.im/post/5c627b776fb9a04a0441808c