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カスタム関数機能がオンになっているかどうかを確認する を変更する sequenceテーブル を作成する作成関数 function現在のid を取得する. functionは、次のid を取得する.関数が正常に作成されたかどうかを確認します. 削除: 表示: 表示: 修正: sequenceテーブルsessionテーブルを追加するなど、テーブルの初期値とステップ長を追加します.初期値は1000、ステップ長は2 に設定します. nextval関数を使用してセッションテーブル挿入文を実行します.例えば、 です.
終わりの言葉
sequenceをmysqlとしてidを成長させる唯一の面倒な点はidセグメントを制御することであり、idセグメントの区分が小さすぎるとid競合が発生しやすく、区分が大きすぎると新規領域id不足の問題が発生しやすいため、トラフィックを評価する必要がある.もちろんidが秩序正しくあるかどうかを気にしないで、snowflakeでuuidを生成させるのも良い選択だ.
転載先:https://juejin.im/post/5c627b776fb9a04a0441808c
ビジネス量の増加と国際化の需要に伴い、マルチゾーン導入は日常茶飯事であり、各ゾーンデータが相互接続する必要がある場合、データベースidはグローバルで一意であり、自己構築sequenceはmysqlマルチゾーン導入idの衝突問題を解決するために自己増加idとして機能する.
優劣
メリット
欠点
分割の原則
具体的な操作
show variables like '%log_bin_trust_function_creators%'
実行がオンになっているかどうかを確認するawsがデフォルトでオンになっていない場合はデータベース構成を変更する必要があり、SET GLOBAL log_bin_trust_function_creators=1;
実行はこの機能をオンにし、権限の問題に遭遇して元の構成-- 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;
-- 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 ;
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
insert into `sequence`(`name`,`current_value`,`increment`) values('session',1000,2)
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