参考資料
Mycat2 公式 Yuque ドキュメント: Mycat2 権威ガイド (yuque.com)
Mycat2 アノテーション構成:アノテーションによる構成 (yuque.com)
Mycat2 マッピング関係: mycat2 マッピング関係.pdf
イメージの作成
1. Mycat 関連のデータ ボリュームをマウントするフォルダーを作成します。
mkdir /home/docker/mycat2
cd /home/docker/mycat2
2.画像ファイルを作成する
/home/docker/mycat2 の下に次の内容のDockerfileを作成します。
FROM openjdk:8-jre
ENV AUTO_RUN_DIR ./mycat2
ENV DEPENDENCE_FILE mycat2-1.22-release-jar-with-dependencies.jar
ENV TEMPLATE_FILE mycat2-install-template-1.21.zip
RUN sed -i "s@http://.*archive.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN sed -i "s@http://.*security.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN buildDeps='procps wget unzip' \
&& apt-get update \
&& apt-get install -y $buildDeps
# 安装地址 http://dl.mycat.org.cn/2.0/
# http://dl.mycat.org.cn/2.0/1.22-release/
# http://dl.mycat.org.cn/2.0/install-template/
RUN wget -P $AUTO_RUN_DIR/ http://dl.mycat.org.cn/2.0/1.22-release/$DEPENDENCE_FILE \
&& wget -P $AUTO_RUN_DIR/ http://dl.mycat.org.cn/2.0/install-template/$TEMPLATE_FILE
RUN cd $AUTO_RUN_DIR/ \
&& unzip $TEMPLATE_FILE \
&& ls -al . \
&& mv $DEPENDENCE_FILE mycat/lib/ \
&& chmod +x mycat/bin/* \
&& chmod 755 mycat/lib/* \
&& mv mycat /usr/local
#copy mycat /usr/local/mycat/
VOLUME /usr/local/mycat/conf
VOLUME /usr/local/mycat/logs
EXPOSE 8066 1984
CMD ["/usr/local/mycat/bin/mycat", "console"]
3..イメージをコンパイルする
docker build -t mycat/mycat2:20230801 .
4.mysqlユーザーの作成
mysql で mycat ユーザー用に別のユーザーを作成し、権限を付与します。
CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
-- MySQL8.0版本必须要赋的权限
GRANT XA_RECOVER_ADMIN ON *.* TO 'root'@'%';
--- 视情况赋的权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;
ビルドイメージ
コンテナを起動して設定をコピーする
docker run -d --name=mycat2 -p 8066:8066 -p 1984:1984 mycat/mycat2:20230801
# 复制容器内配置
cd /home/docker/mycat2/
docker cp mycat2:/usr/local/mycat/conf .
docker cp mycat2:/usr/local/mycat/logs .
config ディレクトリは次のとおりです。
Mycat2を起動する
以前に実行していたコンテナを閉じて削除し、mycat2 を再実行して、ポートを開くことを忘れないでください。
docker run -d
--name=mycat2
-p 8066:8066 -p 1984:1984
-v $PWD/conf:/usr/local/mycat/conf
-v $PWD/logs:/usr/local/mycat/logs
4baac999529e(mycat2镜像ID)
Mycat2の設定
Mycat2 では何も設定を行っていないため、実行後にエラーが報告されます。ログは/home/docker/mycat2/logs/wrapper.logで確認できます。
Mycat2 の構成構造は次のとおりです。
mycat配置文件夹
+ clusters
- prototype.cluster.json //无集群的时候自动创建
- c0.cluster.json
- c1.cluster.json
+ datasources
- prototypeDs.datasource.json //无数据源的时候自动创建
- dr0.datasource.json
- dw0.datasource.json
+ schemas
- db1.schema.json
- mysql.schema.json
+ sequences
- db1_schema.sequence.json
-server.json //服务器配置
-state.json //mycat运行状态,包含集群选举的主节点信息,配置时间戳
で:
- datasources/ prototypeDs.datasource.jsonは実際の物理データベースの接続構成情報です
- schemas/ databaseName.schema.json は主に、論理テーブルと物理テーブルの関係と、データベースとテーブルのシャーディング ルールを構成します。
頻繁に変更する必要があるのは、上記の 2 つのファイルです。
1. 実際のデータソースを構成する
vi conf/datasourcesprototypeDs.datasource.json
これを独自の物理データベースの接続情報に変更することも、作成したばかりのユーザーに構成することもできます。
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE", // 当前库既是写库也是读库
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs", // 逻辑库名称,不需要修改
"password":"123456", // 数据库密码
"type":"JDBC",
"url":"jdbc:mysql://IP地址:3306/testdb?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"mycat", // 数据库用户名
"weight":0
}
2. Mycat ログイン ユーザー情報の表示または変更
vi /home/docker/mycat2/conf/users/root.user.json
{
"dialect":"mysql",
"ip":null, # 如果设置IP,则只能允许该IP使用该用户登录mycat
"password":"123456", // 密码
"transactionType":"proxy", //事务类型
"username":"root" // 用户名
}
このアカウントを使用して Mycat に直接ログインできます。
クロスデータベース トランザクションが関与していない場合は、トランザクション タイプ ( transactionType ) をプロキシに変更し、XA を使用しないでください。
3. Mycat にログインし、データベースを作成します
root.user.json のアカウントとパスワードを使用して、Mycat、ポート 8066にログインし、データベースを作成します。ここでの名前は、物理データベース名と一致します。
CREATE DATABASE testdb;
この時点で、/conf/schemas フォルダーに追加のファイル testdb.schema.json が存在します。内容は以下の通りです。
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"note",
"shardingTables":{},
"views":{}
}
4. テーブルのシャーディング ルールを構成する
testdb ライブラリ内のテーブルの後続のすべてのシャーディング ルールは、/conf/schemas/testdb.schema.json で直接構成することも、mycat2 構文で SQL テーブル作成ステートメントを使用してシャーディング キーとシャーディング フィルム ルールを指定することもできます。Mycat1.6より断然便利です。
シャーディング データベースとシャーディングの構文ドキュメント: DDL ステートメント (yuque.com)
Mycat クライアントの testdb ライブラリにシャーディングするテーブル (仮想テーブル) を作成し、シャーディング ルールを指定します。
CREATE TABLE `test_sharding` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`add_time` bigint(20) NOT NULL COMMENT '创建时间',
`text` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '测试文本',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 tbpartition by MOD_HASH(id) tbpartitions 3;
その中に: tbpartition by MOD_HASH(id) tbpartitions 3; は test_sharding を意味します。テーブルはid フィールドのハッシュ係数 (つまり、合計パーティション ポイントのパーティション値 %)に従ってパーティション化する必要があり、パーティション ポイントは 3 つあります。 test_sharding_0、test_sharding_1、および test_sharding_2. に対応するため、最初にこれら 3 つのテーブルが物理ライブラリに存在することを確認する必要があります。
同様に、データベースを分割する場合は、MOD_HASH(id) dbpartitions データベース番号によって dbpartition を追加できます。
仮想テーブルを作成した後、/conf/schemas/testdb.schema.json を確認すると、追加の構成情報が表示されます。次のように、いくつかの構成を追加する必要があります。
{
"customTables": { },
"globalTables": { },
"normalProcedures": { },
"normalTables": { },
"schemaName": "testdb", // 逻辑库名
"shardingTables": {
"test_sharding": {
<!-- 建表SQL -->
"createTableSQL": "CREATE TABLE `test_sharding` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`add_time` bigint(20) NOT NULL COMMENT '创建时间',
`text` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '测试文本',
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARSET = utf8mb4
TBPARTITION BY MOD_HASH(id) TBPARTITIONS 3",
"autoIncrement": false,
"function": {
"properties": {
"mappingFormat": "prototype/testdb/test_sharding_${tableIndex}",
"tableNum": "3", # 分区表的数量
"tableMethod": "MOD_HASH(id)", #使用哈希取模算法分区
"storeNum": 0,
"defaultNode": "0",
"type": "Integer"
},
"partition": {
"schemaNames": "testdb", #物理库
"tableNames": "test_sharding_$0-2", #物理表
"targetNames": "prototype" #数据源
}
},
"shardingIndexTables": { }
}
},
"targetName":"prototypeDs",
"views": { }
}
または
{
"customTables": { },
"globalTables": { },
"normalProcedures": { },
"normalTables": { },
"schemaName": "testdb", // 逻辑库名
"shardingTables": {
"test_sharding": {
<!-- 建表SQL -->
"createTableSQL": "CREATE TABLE `test_sharding` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`add_time` bigint(20) NOT NULL COMMENT '创建时间',
`text` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '测试文本',
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARSET = utf8mb4
TBPARTITION BY MOD_HASH(id) TBPARTITIONS 3",
"function": {
"properties": {
"mappingFormat": "prototype/testdb/test_sharding_${tableIndex}",
"tableNum": "3", # 分区表的数量
"tableMethod": "MOD_HASH(id)", #使用哈希取模算法分区
"storeNum": 0,
}
},
"shardingIndexTables": { }
}
},
"targetName":"prototypeDs",
"views": { }
}
このうち、分割アルゴリズムと構成例は、 Mycat 2 ルール範囲分割アルゴリズム (1.6 対応) (yuque.com)を参照してください。
知らせ:
論理ライブラリを物理ライブラリと混同すると、データが間違ったデータベースに挿入される原因になります。
データベースとテーブルに分割する必要のないテーブルを作成する必要がある場合は、Mycat クライアント上でテーブル作成ステートメントを直接実行することができ、対応する構成はnormalTables に同期されます。
テスト
アプリケーション層で MySql に接続するアドレスは、Mycat、ポート 8066に接続するように直接変更され、接続情報は conf/users/root.user.json にあります。
test_sharding テーブルにデータを継続的に挿入すると、データがさまざまなテーブルに分散されていることがわかります。
ここで、id は Mycat によって生成されたグローバルに一意な ID です。
また、Mycat で select * クエリを実行すると、物理データベース内の 3 つのテーブルのデータをまとめてクエリすることもできます。
知らせ
Mycat の原理で最も重要な動詞は「インターセプト」です。ユーザーが送信した SQL ステートメントをインターセプトします。まず、SQL ステートメントに対して特定の分析を実行します。たとえば、断片化分析、ルーティング分析、読み書き分離分析、キャッシュ分析、などを実行し、この SQL を実際のデータベースに送信し、返された結果を適切に処理して、最終的にユーザーに返します。
したがって、Mycat のライブラリとテーブルは「仮想ライブラリ」および「仮想テーブル」とも呼ばれます。「仮想テーブル」では、ビジュアル クライアント上でテーブル構造を変更することはできず、DDL ステートメントを介して手動でのみ変更できます。
補充する
Q: 既存の物理テーブルを mycat にロードするにはどうすればよいですか?
A: スキーマ構成で targetName を使用してターゲット データ ソースまたはクラスターを指し、スキーマ名がターゲット ライブラリと同じであることを確認して、ライブラリの既存の物理テーブルを自動的にロードします。
mycat を再起動するか、コメントを付けて Mycat 設定ファイルを再読み込みします。/*+mycat:loadConfigFromFile{} */ローカル設定をランタイムにロードします。
Group By を使用する場合は、 any_value を使用して、Group By に含まれず関数を持たないフィールドをクエリする必要があります。
order by は選択項目に存在するフィールドを参照する必要があります