Docker déploie Mycat2 pour implémenter une sous-table de base de données unique

Documentation de référence

Document officiel Mycat2 de Yuque : guide faisant autorité pour Mycat2 (yuque.com)

Configuration des annotations Mycat2 : configuration via les annotations (yuque.com) 

Relation de mappage Mycat2 : relation de mappage mycat2.pdf

Créer une image

1. Créez un dossier pour monter les volumes de données liés à Mycat

mkdir /home/docker/mycat2
cd /home/docker/mycat2

2. Créez un fichier image

Créez un Dockerfile         sous /home/docker/mycat2 avec le contenu suivant :

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..Compilez l'image

docker build -t mycat/mycat2:20230801 .

4.création d'utilisateur mysql

        Créez un utilisateur distinct dans MySQL pour l'utilisateur mycat et accordez des autorisations

CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
-- MySQL8.0版本必须要赋的权限
GRANT XA_RECOVER_ADMIN ON *.* TO 'root'@'%';
--- 视情况赋的权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;

Construire une image

Démarrez le conteneur et copiez la configuration

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 .

        Le répertoire de configuration est le suivant :

Démarrer Mycat2

        Fermez et supprimez le conteneur précédemment en cours d'exécution, relancez un mycat2, pensez à ouvrir le port !

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)

Configuration de Mycat2

        Une erreur sera certainement signalée après l'exécution, car nous n'avons effectué aucune configuration sur Mycat2. Le journal peut être consulté dans /home/docker/mycat2/logs/wrapper.log .

        La structure de configuration de Mycat2 est la suivante :

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

dans:

  1. datasources/ prototypeDs.datasource.json est les informations de configuration de connexion de la base de données physique réelle
  2. schemas/ databaseName.schema.json configure principalement la relation entre les tables logiques et les tables physiques ainsi que les règles de partitionnement des bases de données et des tables.

Ce que nous devons modifier fréquemment, ce sont les deux fichiers ci-dessus.

1. Configurez la vraie source de données

vi conf/datasourcesprototypeDs.datasource.json 

       Remplacez-le par les informations de connexion de votre propre base de données physique, ou vous pouvez le configurer pour l'utilisateur que vous venez de créer.

{
    "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. Afficher ou modifier les informations utilisateur de connexion à Mycat

vi /home/docker/mycat2/conf/users/root.user.json
{
	"dialect":"mysql",
	"ip":null,    # 如果设置IP,则只能允许该IP使用该用户登录mycat
	"password":"123456",    // 密码
	"transactionType":"proxy",    //事务类型
	"username":"root"    // 用户名
}

Vous pouvez vous connecter à Mycat directement avec ce compte.

Si les transactions entre bases de données ne sont pas impliquées, veuillez modifier le type de transaction ( transactionType ) en proxy et n'utilisez pas XA.

3. Connectez-vous à Mycat et créez une base de données 

Utilisez le compte et le mot de passe dans root.user.json pour vous connecter à Mycat, port 8066 et créer une base de données. Le nom ici est cohérent avec le nom physique de la base de données.

CREATE DATABASE testdb;

À ce stade, il y aura un fichier supplémentaire testdb.schema.json dans le dossier /conf/schemas. Le contenu est le suivant :

{
	"customTables":{},
	"globalTables":{},
	"normalProcedures":{},
	"normalTables":{},
	"schemaName":"note",
	"shardingTables":{},
	"views":{}
}

4. Configurer les règles de partitionnement des tables

Toutes les règles de partitionnement ultérieures pour les tables de la bibliothèque testdb peuvent être configurées directement dans /conf/schemas/testdb.schema.json, ou vous pouvez utiliser l'instruction de création de table SQL avec la syntaxe mycat2 pour spécifier la clé de partitionnement et les règles de partitionnement du film. C'est beaucoup plus pratique que Mycat1.6.

Document de syntaxe pour la base de données de partitionnement et le partitionnement : instruction DDL (yuque.com)

Créez la table (table virtuelle) à partitionner dans la bibliothèque testdb du client Mycat et spécifiez les règles de partitionnement :

 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;

Parmi eux : tbpartition by MOD_HASH(id) tbpartitions 3 ;  signifie test_sharding. La table doit être partitionnée en fonction du module de hachage du champ id (c'est-à-dire la valeur de partition % du total des points de partition) , et il y a trois points de partition, correspondant à test_sharding_0, test_sharding_1 et test_sharding_2. , vous devez donc d'abord vous assurer que ces trois tables existent dans la bibliothèque physique.

De même, si vous souhaitez diviser la base de données, vous pouvez ajouter dbpartition par MOD_HASH(id) numéro de base de données dbpartitions ; 

Après avoir créé la table virtuelle, vérifiez /conf/schemas/testdb.schema.json et vous verrez des informations de configuration supplémentaires. Certaines configurations doivent être ajoutées, comme suit :

{
    "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": { }
}

ou 

{
    "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": { }
}

Parmi eux, l'algorithme de partitionnement et les exemples de configuration peuvent être référencés à : Algorithme de fragmentation de plage de règles Mycat 2 (correspondant à 1.6) (yuque.com)

Avis: 

 Si la bibliothèque logique est confondue avec la bibliothèque physique, les données seront insérées dans la mauvaise base de données.

Si vous devez créer une table qui n'a pas besoin d'être divisée en bases de données et en tables, vous pouvez exécuter directement l'instruction de création de table sur le client Mycat et la configuration correspondante sera synchronisée avec normalTables .

test

L'adresse de connexion à MySql au niveau de la couche application est directement modifiée pour se connecter à Mycat, port 8066 , et les informations de connexion se trouvent dans conf/users/root.user.json.

En insérant continuellement des données dans la table test_sharding, vous pouvez voir que les données sont distribuées dans différentes tables :

 Où id est l'identifiant unique au monde généré par Mycat.

Et effectuer une requête select * dans Mycat peut également interroger ensemble les données des trois tables de la base de données physique.

Avis

Le verbe le plus important dans le principe de Mycat est "intercepter". Il intercepte l'instruction SQL envoyée par l'utilisateur. Il effectue d'abord une analyse spécifique sur l'instruction SQL : comme l'analyse de fragmentation, l'analyse de routage, l'analyse de séparation en lecture-écriture, l'analyse de cache, etc., puis envoyez ce SQL à la base de données réelle, traitez les résultats renvoyés de manière appropriée et enfin renvoyez-les à l'utilisateur.

Par conséquent, les bibliothèques et les tables de Mycat sont également appelées « bibliothèques virtuelles » et « tables virtuelles », et les « tables virtuelles » ne permettent pas de modifier leurs structures de table sur le client visuel et ne peuvent être modifiées que manuellement via des instructions DDL .

Remplir

Q : Comment charger une table physique existante dans mycat ?

R : Utilisez targetName dans la configuration du schéma pour pointer vers la source de données ou le cluster cible, et assurez-vous que le nom du schéma est le même que celui de la bibliothèque cible pour charger automatiquement les tables physiques existantes de la bibliothèque.

Redémarrez mycat ou relisez le fichier de configuration Mycat avec les commentaires./*+mycat:loadConfigFromFile{} */Chargez la configuration locale dans le runtime

Lorsque vous utilisez Group By, vous devez utiliser any_value pour interroger les champs qui ne sont pas dans Group By et n'ont aucune fonction.

trier par doit faire référence aux champs qui existent dans l'élément sélectionné

Je suppose que tu aimes

Origine blog.csdn.net/weixin_53922163/article/details/132047639
conseillé
Classement