Docker は Mycat2 をデプロイして単一データベースのサブテーブルを実装します

参考資料

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运行状态,包含集群选举的主节点信息,配置时间戳

で:

  1. datasources/ prototypeDs.datasource.jsonは実際の物理データベースの接続構成情報です
  2. 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 は選択項目に存在するフィールドを参照する必要があります

おすすめ

転載: blog.csdn.net/weixin_53922163/article/details/132047639