qu'est-ce que le routeur MySQL
MySQL Router est un middleware léger officiellement fourni par MySQL et fait partie du cluster InnoDB. Il peut fournir un routage transparent entre les applications et les serveurs MySQL back-end, il est principalement utilisé pour résoudre la haute disponibilité des clusters maître-esclave MySQL. , équilibrage de charge, expansion facile et autres problèmes. Le routeur MySQL fournit une adresse IP virtuelle pour le cluster de base de données en tant que point de connexion unique pour l'application. Grâce à ce point de connexion unique, il peut réaliser l'équilibrage de charge, la séparation en lecture-écriture, le basculement et d'autres solutions de haute disponibilité de base de données.
L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.
1. Introduction
1.1 Introduction au routeur MySQL
MySQL Router est un middleware léger officiellement fourni par MySQL et fait partie du cluster InnoDB, qui assure la transparence entre les applications et les serveurs MySQL back-end. Il est principalement utilisé pour résoudre les problèmes de haute disponibilité, d'équilibrage de charge et d'expansion facile du cluster de bases de données maître-esclave MySQL. Le routeur sert de couche de transfert de trafic, située entre l'application et le serveur MySQL, et sa fonction est similaire à celle de LVS.
1.2 Pourquoi utiliser le routeur MySQL ?
Basé sur le mécanisme de réplication de groupe (MGR), lorsque le nœud maître tombe en panne et quitte le cluster, les nœuds restants éliront un nouveau nœud maître basé sur le protocole paxos. Il y a un problème ici. Si l'application est connectée au nœud maître et que le nœud maître plante et quitte le cluster, l'adresse IP de la base de données disponible change. À ce moment, l'application client essaiera toujours de se connecter au nœud défaillant. bien que le client puisse être modifié. Configuration de connexion de l'application finale, mais cette situation est fondamentalement irréaliste.
1.3 Diagramme de relation du routeur MySQL
La combinaison de la réplication de groupe MySQL et de MySQL Shel est la suivante :
La figure ci-dessus illustre pleinement le rôle du routeur MySQL dans le cluster InnoDB. Sa fonction principale est de. fournir un cluster de base de données L'adresse IP virtuelle sert de point de connexion unique pour les applications. Grâce à ce point de connexion unique, des solutions de haute disponibilité de base de données telles que l'équilibrage de charge, la séparation en lecture-écriture et le basculement peuvent être mises en œuvre.
Il est recommandé d'installer MySQL Router sur la machine sur laquelle se trouve l'application, pour les raisons suivantes :
- Connectez-vous via des sockets Unix locaux au lieu de TCP/IP, améliorant ainsi les performances
- Réduisez la latence du réseau
- Les instances MySQL ne le font pas nécessite des comptes supplémentaires, un seul routeur@198.51.100.45, au lieu de myapp@%
- Améliore l'évolutivité du serveur d'applications
1.4 Introduction au cluster MySQL
Cluster est un nœud virtuel dans cette solution haute disponibilité , Il créera une base de données nommée MySQL_innodb_cluster_metadata sur tous les membres de MGR pour stocker les informations de métadonnées du cluster, y compris les informations sur le cluster, les membres du cluster, les informations de réplication de groupe, le routeur MySQL connecté et d'autres informations pour fournir des requêtes de routeur MySQL. C'est l'équivalent d'une couche d'encapsulation logique des membres sur la réplication du groupe, affichée en mode cluster. L'état de chaque nœud est synchronisé en temps réel avec l'état des membres de l'instance correspondant dans la réplication du groupe, mais des nœuds de. le cluster et la réplication de groupe Les membres ne sont synchronisés que lorsque le cluster est créé. Les modifications des membres lors de la réplication de groupe ultérieure ne sont pas automatiquement synchronisées avec le cluster. Vous pouvez ajouter ou supprimer manuellement des nœuds dans le cluster. l'application se termine plus contrôlable et flexible.
2. Préparation de l'environnement
Nom d'hôte | Adresse IP | Rôle |
---|---|---|
oratest51 | 172.16.9.51 | primaire |
oratest52 | 172.16.9.52 | seconde |
test61 | 172.16.9.61 | seconde |
node4 | 172.16.8.68 | MySQL Router |
Système d'exploitation : CentOS Linux version 7.2.1511
Version MySQL : mysql-5.7.26-linux-glibc2.12-x86_64
Version du routeur MySQL : mysql-router-8.0.17-linux-glibc2.12-x86_64
Shell MySQL Version : mysql-shell-8.0.17-linux-glibc2.12-x86-64bit
3. Installez et configurez le routeur MySQL
Le routeur MySQL a deux modes de déploiement :
- mode bootstrap : prend en charge le basculement, requis lorsque utilisé conjointement avec InnoDB Cluster, le répertoire d'installation est automatiquement généré sous le chemin spécifié par
--directory
. Les ports dans le fichier de configuration sont 6446 et 6447.--directory
指定的路径下自动生成安装目录,配置文件里的端口为6446和6447。 - 简单模式:不支持failover,无需结合InnoDB Cluster使用,一般在主从复制或者主主复制等模式下使用,使用
/usr/local/mysqlrouter/share/doc/mysqlrouter/sample_mysqlrouter.conf
Mode simple : ne prend pas en charge le basculement et n'a pas besoin d'être utilisé avec InnoDB Cluster. Il est généralement utilisé dans les modes de réplication maître-esclave ou maître-maître. Utilisez
/usr/local/mysqlrouter/share/doc. /mysqlrouter/sample_mysqlrouter.confCe fichier de configuration est déployé. 3.1 Installation du routeur MySQL en mode bootstrap 1 Installez le routeur MySQL en utilisant yum source
# wget -P /software/ https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
# rpm -Uvh /software/mysql80-community-release-el7-3.noarch.rpm
# yum -y install mysql-router
Copier après la connexion
3.1.2 Afficher la configuration par défaut du routeur MySQL
# wget -P /software/ https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm # rpm -Uvh /software/mysql80-community-release-el7-3.noarch.rpm # yum -y install mysql-router
[root@node4 yum.repos.d]# mysqlrouter --help MySQL Router Ver 8.0.16 for Linux on x86_64 (MySQL Community - GPL) Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Configuration read from the following files in the given order (enclosed in parentheses means not available for reading): /etc/mysqlrouter/mysqlrouter.conf (/root/.mysqlrouter.conf) Plugins Path: /usr/lib64/mysqlrouter Default Log Directory: /var/log/mysqlrouter Default Persistent Data Directory: /var/lib/mysqlrouter Default Runtime State Directory: /run/mysqlrouter
/etc/mysqlrouter / mysqlrouter.conf- Chemin du plugin :
/usr/lib64/mysqlrouter- Chemin du journal : /var/log/mysqlrouter
-Chemin des données persistantes :
/var/lib/mysqlrouter- Chemin de l'état d'exécution :
/run/mysqlrouterSi vous utilisez l'option --config ou -c sur la ligne de commande mysqlrouter pour transmettre un fichier de configuration défini par l'utilisateur, le fichier de configuration par défaut ne sera pas chargé.
3.1.3 Initialisez le routeur MySQL, remplissez l'adresse du
[root@node4 tmp]# mysqlrouter --bootstrap root@172.16.9.51:3306 --directory /data/mysqlrouter --conf-use-sockets --user=root Please enter MySQL password for root: WARNING: The MySQL server does not have SSL configured and metadata used by the router may be transmitted unencrypted. # Bootstrapping MySQL Router instance at '/data/mysqlrouter'... - Checking for old Router accounts - No prior Router accounts found - Creating mysql account mysql_router1_zhi3m2uhudci@'%' for cluster management - Storing account in keyring - Adjusting permissions of generated files - Creating configuration /data/mysqlrouter/mysqlrouter.conf # MySQL Router configured for the InnoDB cluster 'st' #InnoDB集群名 After this MySQL Router has been started with the generated configuration $ mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf the cluster 'st' can be reached by connecting to: ## MySQL Classic protocol - Read/Write Connections: localhost:6446, /data/mysqlrouter/mysql.sock - Read/Only Connections: localhost:6447, /data/mysqlrouter/mysqlro.sock ## MySQL X protocol - Read/Write Connections: localhost:64460, /data/mysqlrouter/mysqlx.sock - Read/Only Connections: localhost:64470, /data/mysqlrouter/mysqlxro.sock
3.1.4 Modifiez le fichier de configuration. Généralement, il vous suffit de configurer la ligne bootstrap_server_addresses
# File automatically generated during MySQL Router bootstrap [DEFAULT] user=root logging_folder=/data/mysqlrouter/log runtime_folder=/data/mysqlrouter/run data_folder=/data/mysqlrouter/data keyring_path=/data/mysqlrouter/data/keyring master_key_path=/data/mysqlrouter/mysqlrouter.key connect_timeout=15 read_timeout=30 #dynamic_state=/data/mysqlrouter/data/state.json [logger] level = INFO [metadata_cache:st] router_id=14 bootstrap_server_addresses=mysql://oratest51:3306,mysql://oratest52:3306,mysql://test61:3306 user=mysql_router14_ebhje7bsnckc metadata_cluster=st ttl=300 use_gr_notifications=0 [routing:st_default_rw] bind_address=0.0.0.0 bind_port=6446 socket=/data/mysqlrouter/mysql.sock destinations=metadata-cache://st/default?role=PRIMARY routing_strategy=first-available protocol=classic [routing:st_default_ro] bind_address=0.0.0.0 bind_port=6447 socket=/data/mysqlrouter/mysqlro.sock destinations=metadata-cache://st/default?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=classic [routing:st_default_x_rw] bind_address=0.0.0.0 bind_port=64460 socket=/data/mysqlrouter/mysqlx.sock destinations=metadata-cache://st/default?role=PRIMARY routing_strategy=first-available protocol=x [routing:st_default_x_ro] bind_address=0.0.0.0 bind_port=64470 socket=/data/mysqlrouter/mysqlxro.sock destinations=metadata-cache://st/default?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=x
3.1.5 Démarrez le routeur MySQL[root@node2 mysqlrouter]# cd /data/mysqlrouter/
[root@node2 mysqlrouter]# sh start.sh
Copier après la connexion
Le processus de démarrage est lent et les informations de démarrage sont visibles dans le journal
[root@node2 mysqlrouter]# cd /data/mysqlrouter/ [root@node2 mysqlrouter]# sh start.sh
3.1 .6 Test de connexion au routeur MySQL
Par défaut, utilisez 6446 comme port RW et 6447 comme port RO
# mysql -uroot -p123456 -h172.16.8.68 -P6446
# mysql -uroot -p123456 -h172.16.8.68 -P6447
# netstat -ntlp |grep mysqlrouter
Copier après la connexion
3.2 Installez le routeur MySQL en mode simple
# mysql -uroot -p123456 -h172.16.8.68 -P6446 # mysql -uroot -p123456 -h172.16.8.68 -P6447 # netstat -ntlp |grep mysqlrouter
3.2.1 Téléchargez le package et téléchargez-le sur le serveur [root@node4 etc]# mkdir /software;cd /software
[root@node4 etc]# wget https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-8.0.17-linux-glibc2.12-x86_64.tar.xz
Copier après la connexion
[root@node4 etc]# mkdir /software;cd /software [root@node4 etc]# wget https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-8.0.17-linux-glibc2.12-x86_64.tar.xz
3.2.2 Décompressez dans le répertoire spécifié
[root@node4 etc]# tar -Jxvf /software/mysql-router-8.0.17-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
[root@node4 etc]# cd /usr/local
[root@node4 etc]# mv mysql-router-8.0.17-linux-glibc2.12-x86_64/ mysqlrouter
Copier après la connexion
3.2.3 Définir les variables d'environnement
[root@node4 etc]# tar -Jxvf /software/mysql-router-8.0.17-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ [root@node4 etc]# cd /usr/local [root@node4 etc]# mv mysql-router-8.0.17-linux-glibc2.12-x86_64/ mysqlrouter
[root@node4 etc]# echo 'export PATH=/usr/local/mysqlrouter/bin/:$PATH' >> /etc/profile
[root@node4 etc]# source /etc/profile
Copier après la connexion
3.2.4 Modifier le fichier de configuration
[root@node4 etc]# echo 'export PATH=/usr/local/mysqlrouter/bin/:$PATH' >> /etc/profile [root@node4 etc]# source /etc/profile
# mkdir -p /usr/local/mysqlrouter/etc
# cp /usr/local/mysqlrouter/share/doc/mysqlrouter/sample_mysqlrouter.conf /usr/local/mysqlrouter/etc
# mv /usr/local/mysqlrouter/etc/sample_mysqlrouter.conf /usr/local/mysqlrouter/etc/mysqlrouter.conf
# vim /usr/local/mysqlrouter/etc/mysqlrouter.conf
##部分省略
[DEFAULT]
logging_folder =/usr/local/mysqlrouter/log/
plugin_folder = /usr/local/mysqlrouter/lib/mysqlrouter/
config_folder = /usr/local/mysqlrouter/etc/
runtime_folder = /usr/local/mysqlrouter/run/
data_folder = /usr/local/mysqlrouter/data/
keyring_path = /var/lib/keyring-data
master_key_path = /var/lib/keyring-key
[logger]
level = INFO
[routing:masters]
bind_address = 172.16.8.68:7002
destinations = 172.16.9.61:3306
mode = read-write
connect_timeout = 2
[routing:slaves]
bind_address = 172.16.8.68:7001
destinations = 172.16.9.51:3306,172.16.9.52:3306
mode = read-only
connect_timeout = 1
##部分省略
Copier après la connexion
/usr/local/mysqlrouter /share/doc/mysqlrouter/sample_mysq lrouter .conf est le fichier de configuration de référence du routeur MySQL, copiez donc d'abord le modèle ici.
Le routeur MySQL recherchera par défaut "mysqlrouter.conf" dans le répertoire d'installation et ".mysqlrouter.conf" dans le répertoire personnel. Vous pouvez également utiliser "-c" ou "--config" sous la commande mysqlrouter du programme binaire pour spécifier manuellement le fichier de configuration. # mkdir -p /usr/local/mysqlrouter/etc # cp /usr/local/mysqlrouter/share/doc/mysqlrouter/sample_mysqlrouter.conf /usr/local/mysqlrouter/etc # mv /usr/local/mysqlrouter/etc/sample_mysqlrouter.conf /usr/local/mysqlrouter/etc/mysqlrouter.conf # vim /usr/local/mysqlrouter/etc/mysqlrouter.conf ##部分省略 [DEFAULT] logging_folder =/usr/local/mysqlrouter/log/ plugin_folder = /usr/local/mysqlrouter/lib/mysqlrouter/ config_folder = /usr/local/mysqlrouter/etc/ runtime_folder = /usr/local/mysqlrouter/run/ data_folder = /usr/local/mysqlrouter/data/ keyring_path = /var/lib/keyring-data master_key_path = /var/lib/keyring-key [logger] level = INFO [routing:masters] bind_address = 172.16.8.68:7002 destinations = 172.16.9.61:3306 mode = read-write connect_timeout = 2 [routing:slaves] bind_address = 172.16.8.68:7001 destinations = 172.16.9.51:3306,172.16.9.52:3306 mode = read-only connect_timeout = 1 ##部分省略
Le fichier de configuration du routeur MySQL est fragmenté. Il existe trois fragments couramment utilisés : [DEFAULT], [logger], [routing:NAME]. Les noms de fragments sont sensibles à la casse et ne prennent en charge qu'une seule ligne de "#" ou ";" Note.
bind_address : ajoutez l'adresse IP de la machine sur laquelle se trouve le routeur MySQL destinations : l'adresse IP + le port du serveur MySQL back-end
mode : propose deux modes, lecture seule et lecture-écriture, ainsi que le mode de planification de lecture-écriture est la première disponible. La méthode de planification en lecture seule est le round-robin
connect_timeout : délai d'expiration de la connexion
routing_strategy : stratégie de routage, y compris les stratégies de round-robin et de première disponibilité
- S'il est multi. -mode maître, le fichier de configuration est le suivant
[routing:mutili_rw] bind_address=172.16.8.68 bind_port=7003 destinations=172.16.9.51:3306,172.16.9.52:3306,172.16.9.61:3306 mode=read-write connect_timeout=2 protocol=classic
[root@node4 etc]# mkdir -p /usr/local/mysqlrouter/run/ [root@node4 etc]# mkdir -p /usr/local/lib/mysqlrouter [root@node4 etc]# mkdir -p /usr/local/mysqlrouter/etc/ [root@node4 etc]# mkdir -p /usr/local/mysqlrouter/run/ [root@node4 etc]# mkdir -p /usr/local/mysqlrouter/data/ [root@node4 etc]# mkdir -p /usr/local/mysqlrouter/log/
[root@node4 etc]# mysqlrouter --config /usr/local/mysqlrouter/etc/mysqlrouter.conf &
3.2.7 Vérifiez si L'écoute du port du routeur MySQL est activée
[root@node4 etc]# netstat -ntlp |grep mysqlrouter
tcp 0 0 172.16.8.68:7001 0.0.0.0:* LISTEN 9221/mysqlrouter
tcp 0 0 172.16.8.68:7002 0.0.0.0:* LISTEN 9221/mysqlrouter
Copier après la connexion
Le routeur MySQL n'a pas encore été arrêté. Arrêtez le script Si vous souhaitez arrêter, vous devez arrêter le processus avec kill -9
[root@node4 etc]# netstat -ntlp |grep mysqlrouter tcp 0 0 172.16.8.68:7001 0.0.0.0:* LISTEN 9221/mysqlrouter tcp 0 0 172.16.8.68:7002 0.0.0.0:* LISTEN 9221/mysqlrouter
Test fonctionnel
Ce qui suit. les tests sont tous sous InnoDB Cluster. Le mode d'installation du routeur MySQL est bootstrap.4.1路由验证
4.1.1测试通过MySQL Router连接6446 RW端口,查看连接的是否为primary
[root@node4 mysqlrouter]# for ((i=0;i<=5;i++));do mysql -h172.16.8.101 -uroot -p123456 -P6446 -e"select @@hostname;";done;
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| oratest51 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| oratest51 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| oratest51 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| oratest51 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| oratest51 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| oratest51 |
+------------+
Copier après la connexion
[root@node4 mysqlrouter]# for ((i=0;i<=5;i++));do mysql -h172.16.8.101 -uroot -p123456 -P6446 -e"select @@hostname;";done; mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+
测试结果: 使用6446 RW端口会访问到后端InnoDB Cluster的primary
4.1.2测试通过MySQL Router连接6447 RO端口,查看连接的是否为seconde节点,rr算法是否生效
[root@node4 mysqlrouter]# for ((i=0;i<=5;i++));do mysql -h172.16.8.101 -uroot -p123456 -P6447 -e"select @@hostname;";done; mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+
测试结果: 使用6447 RO端口会连接到后端InnoDB Cluster集群中所有的seconde节点,并且以rr(round-robin)的策略调度
4.2高可用测试
4.2.1模拟其中一台seconde节点宕机,查看MySQL Router是否会自动取消该节点的路由
(1) 停掉一台seconde节点
[root@oratest52 ~]# systemctl status mysql [root@oratest52 ~]# systemctl stop mysql [root@oratest52 ~]# systemctl status mysql
(2) 在InnoDB Cluster中查看集群状态,可以看到oratest52已经处于MISSING状态
MySQL 172.16.9.51:3306 JS > cluster.status() { "clusterName": "st", "defaultReplicaSet": { "name": "default", "primary": "oratest51:3306", "ssl": "DISABLED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures. 1 member is not active", "topology": { "oratest51:3306": { "address": "oratest61:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "oratest52:3306": { "address": "oratest52:3306", "mode": "n/a", "readReplicas": {}, "role": "HA", "shellConnectError": "MySQL Error 2003 (HY000): Can't connect to MySQL server on 'oratest52' (111)", "status": "(MISSING)" }, "test61:3306": { "address": "test51:3306", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "test61:3306" }
(3) 在MGR中查看GR状态,可以看到已经没有oratest52这台机器
mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 48cdca42-a386-11e9-95f1-0050569d2587 | test61 | 3306 | ONLINE | | group_replication_applier | e9ee5267-a386-11e9-ac35-0050569d9ef5 | oratest51 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+
(4) 测试通过6447 RO端口连接,查看是否会自动剔除宕机的oratest52节点
[root@node4 ~]# for ((i=0;i<=5;i++));do mysql -h172.16.8.101 -uroot -p123456 -P6447 -e"select @@hostname;";done; mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+
测试结果: MySQL Router会自动剔除宕机的oratest52节点,read请求只会转发到后端正常的MySQL实例,过程无需人工干预。
4.2.2启动上一步中停止的MySQL实例,确认MGR和InnoDB Cluster一切正常后,查看MySQL Router是否会自动加入这台已恢复的实例进行转发
(1) 启动oratest52的MySQL服务
[root@oratest52 ~]# systemctl start mysql
(2)启动MGR,并确认MGR状态正常
mysql> start group_replication; Query OK, 0 rows affected (2.92 sec) mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 48cdca42-a386-11e9-95f1-0050569d2587 | test61 | 3306 | ONLINE | | group_replication_applier | 50bc1160-a386-11e9-92c9-0050569dc0da | oratest52 | 3306 | ONLINE | | group_replication_applier | e9ee5267-a386-11e9-ac35-0050569d9ef5 | oratest51 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+
(3) 检查InnoDB Cluster是否正常
MySQL 172.16.9.51:3306 JS > cluster.status() { "clusterName": "st", "defaultReplicaSet": { "name": "default", "primary": "oratest51:3306", "ssl": "DISABLED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "oratest51:3306": { "address": "oratest61:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "oratest52:3306": { "address": "oratest52:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "test61:3306": { "address": "test51:3306", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "test61:3306" }
(4) 查看恢复正常的实例,能不能自动加入MySQL Router进行转发,可以看到oratest52可以被正常调度
[root@node4 mysqlrouter]# for ((i=0;i<=5;i++));do mysql -h172.16.8.101 -uroot -p123456 -P6447 -e"select @@hostname;";done; mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+
测试结果: 恢复正常的MySQL实例可以自动加入MySQL Router并进行转发,无需人工干预。
4.2.3模拟停掉primary节点,测试MySQL Router如何处理发送RW端口的请求,MySQL Router怎样获取新的primary节点
(1) 当前primary节点是oratest51,在primary节点上停止MySQL,确认停止成功
[root@oratest51 data]# systemctl status mysql [root@oratest51 data]# systemctl stop mysql [root@oratest51 data]# systemctl status mysql [root@oratest51 data]# ps -ef |grep mysql
(2) 查看InnoDB Cluster状态,可以看到oratest51已经处于MISSING状态,primary节点已经切换到了test61
MySQL 172.16.9.61:3306 JS > cluster.status(); { "clusterName": "st", "defaultReplicaSet": { "name": "default", "primary": "test61:3306", "ssl": "DISABLED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures. 1 member is not active", "topology": { "oratest51:3306": { "address": "oratest51:3306", "mode": "n/a", "readReplicas": {}, "role": "HA", "shellConnectError": "MySQL Error 2003 (HY000): Can't connect to MySQL server on 'oratest51' (111)", "status": "(MISSING)" }, "oratest52:3306": { "address": "oratest52:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "test61:3306": { "address": "test61:3306", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "test61:3306" }
(3) 测试连接到RW 6446端口,查看是否可以正常连接到新的primary节点test61,并且写入数据否正常
[root@node2 mysqlrouter]# for ((i=0;i<=5;i++));do mysql -h172.16.8.101 -uroot -p123456 -P6446 -e"select @@hostname;";done; mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+
测试结果: 当primary节点挂掉之后,MySQL Router会自动去连接新的primary节点
4.2.4启动上一步中停掉的oratest51,将状态恢复正常,测试MySQL Router能不能自动加入这台已恢复的节点并调度
(1) 启动oratest51,将状态恢复正常
[root@oratest51 ~]# systemctl start mysql [root@oratest51 ~]# systemctl status mysql [root@oratest51 ~]# mysql -uroot -p123456 mysql> start group_replication; mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID |MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+------------+-------------+--------------+ | group_replication_applier | 48cdca42-a386-11e9-95f1-0050569d2587 |test61 | 3306 | ONLINE | | group_replication_applier | 50bc1160-a386-11e9-92c9-0050569dc0da |oratest52 | 3306 | ONLINE | | group_replication_applier | e9ee5267-a386-11e9-ac35-0050569d9ef5 |oratest51 | 3306 | ONLINE | +---------------------------+--------------------------------------+------------+-------------+--------------+ 3 rows in set (0.00 sec) mysql> quit [root@oratest51 local]# mysqlsh MySQL JS > shell.connect('root@172.16.9.51:3306') MySQL 172.16.9.51:3306 JS > var cluster = dba.getCluster() MySQL 172.16.9.51:3306 JS > cluster.status(); { "clusterName": "st", "defaultReplicaSet": { "name": "default", "primary": "test61:3306", "ssl": "DISABLED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "oratest51:3306": { "address": "oratest51:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "oratest52:3306": { "address": "oratest52:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "test61:3306": { "address": "test61:3306", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "test61:3306" }
(2) 测试RO端口的Router调度
[root@node4 mysqlrouter]# for ((i=0;i<=5;i++));do mysql -h172.16.8.101 -uroot -p123456 -P6447 -e"select @@hostname;";done; mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest51 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | oratest52 | +------------+ mysql: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | test61 | +------------+
测试结果: 恢复正常的实例加入集群后,会自动加入到MySQL Router并进行调度
五、运维相关
5.1数据库节点变更
MySQL Router在初始化配置的时候是连接到集群节点读取集群的元数据的。如果在集群中新增或减少节点,需要同步更新MySQL Router的配置,否则无法生效
# mysqlrouter --bootstrap 172.16.9.51:3306 --directory /data/mysqlrouter --user=root --conf-use-sockets --force
更新了MySQL Router的配置的配置,需要重启MySQL Router:
#systemctl restart mysqlrouter #systemctl status mysqlrouter
六、问题汇总
6.1初始化MySQL Router前,需要停止group_replication
6.2使用--bootstrap初始化MySQL Router报错Unable to connect to the metadata server
报错如下
[root@oratest51 data]# mysqlrouter --bootstrap root@172.16.9.51:3310 --directory /data/mysqlrouter --conf-use-sockets --user=root Please enter MySQL password for root: Error: Unable to connect to the metadata server: Error connecting to MySQL server at 172.16.9.51:3310: Can't connect to MySQL server on '172.16.9.51' (111) (2003)
原因: 需要配置连接用户的权限
解决办法: 给连接用户配置所有权限,如下:
mysql> grant all privileges on *.* to root@'%' identified by "123456"; mysql> flush privileges;
6.3使用--bootstrap初始化MySQL Router报错缺少mysql_innodb_cluster_metadata.schema_version
表
[root@oratest51 data]# mysqlrouter --bootstrap root@172.16.9.51:3306 --directory /data/mysqlrouter --conf-use-sockets --user=root Please enter MySQL password for root: Error: Expected MySQL Server '172.16.9.51:3306' to contain the metadata of MySQL InnoDB Cluster, but the schema does not exist. Checking version of the metadata schema failed with: Error executing MySQL query: Table 'mysql_innodb_cluster_metadata.schema_version' doesn't exist (1146) See https://dev.mysql.com/doc/refman/en/mysql-innodb-cluster-creating.html for instructions on setting up a MySQL Server to act as an InnoDB Cluster Metadata server
原因: 没有创建InnoDB Cluster集群,创建InnoDB Cluster集群后会自动生成这张表。mysql_innodb_cluster_metadata.schema_version表的用途是MySQL Router在进行调度分配的时候,需要读取这张表的内容来做调度策略。
解决办法: 创建InnoDB Cluster集群
6.4启动MySQL Router hang住不动,查看日志报错Error: bootstrap_server_addresses is not allowed when dynamic state file is used
具体如下:
[root@node2 log]# tailf /root/mysqlrouter/log/mysqlrouter.log 2019-08-02 15:37:52 routing INFO [7f9721e2d700] [routing:st_default_ro] started: listening using /root/mysqlrouter/mysqlro.sock 2019-08-02 15:37:52 routing INFO [7f972162c700] [routing:st_default_rw] started: listening using /root/mysqlrouter/mysql.sock 2019-08-02 15:37:52 routing INFO [7f9720e2b700] [routing:st_default_x_ro] started: listening using /root/mysqlrouter/mysqlxro.sock 2019-08-02 15:37:52 routing INFO [7f9713fff700] [routing:st_default_x_rw] started: listening on 0.0.0.0:64460, routing strategy = first-available 2019-08-02 15:37:52 routing INFO [7f9713fff700] [routing:st_default_x_rw] started: listening using /root/mysqlrouter/mysqlx.sock 2019-08-02 15:37:52 routing INFO [7f9713fff700] [routing:st_default_x_rw] stopped 2019-08-02 15:37:52 routing INFO [7f9721e2d700] [routing:st_default_ro] stopped 2019-08-02 15:37:52 routing INFO [7f972162c700] [routing:st_default_rw] stopped 2019-08-02 15:37:52 routing INFO [7f9720e2b700] [routing:st_default_x_ro] stopped 2019-08-02 15:37:52 main ERROR [7f9726f1b880] Error: bootstrap_server_addresses is not allowed when dynamic state file is used
原因: 开启了dynamic_state
解决办法: 在配置文件中注释掉dynamic_state所在行,例如下列第11行
1 # File automatically generated during MySQL Router bootstrap 2 [DEFAULT] 3 user=root 4 logging_folder=/root/mysqlrouter/log 5 runtime_folder=/root/mysqlrouter/run 6 data_folder=/root/mysqlrouter/data 7 keyring_path=/root/mysqlrouter/data/keyring 8 master_key_path=/root/mysqlrouter/mysqlrouter.key 9 connect_timeout=15 10 read_timeout=30 11 #dynamic_state=/root/mysqlrouter/data/state.json
6.5启动MySQL Router hang住不动,查看日志报错Unable to fetch live group_replication member data from any server in replicaset 'default'
具体如下:
[root@node2 log]# tailf /root/mysqlrouter/log/mysqlrouter.log 2019-08-02 15:46:41 metadata_cache WARNING [7f3030405700] While updating metadata, could not establish a connection to replicaset 'default' through test61:3306 2019-08-02 15:46:51 metadata_cache WARNING [7f3030405700] While updating metadata, could not establish a connection to replicaset 'default' through oratest52:3306 2019-08-02 15:47:01 metadata_cache WARNING [7f3030405700] While updating metadata, could not establish a connection to replicaset 'default' through oratest51:3306 2019-08-02 15:47:01 metadata_cache ERROR [7f3030405700] Unable to fetch live group_replication member data from any server in replicaset 'default'
原因: MySQL Router所在节点没有配置本机DNS解析
解决办法: 在/etc/hosts中添加MGR实例的解析
七、个人总结
- MySQL Router有两种部署模式:
- bootstrap模式:支持failover,必须结合InnoDB Cluster使用,在
--directory
指定的路径下自动生成安装目录,配置文件里的端口为6446和6447。 - 简单模式:不支持failover,无需结合InnoDB Cluster使用,一般在主从复制或者主主复制等模式下使用,使用
/usr/local/mysqlrouter/share/doc/mysqlrouter/sample_mysqlrouter.conf
这个配置文件部署。
- bootstrap模式:支持failover,必须结合InnoDB Cluster使用,在
- MySQL Router使用的是一个IP地址(可以理解为VIP)加一个RW端口和一个RO端口实现读写分离,Router自身不能判断应用程序的请求是读还是写,因此做读写分离时,必须指定两个端口,如果应用程序不便指定两个端口,也可以全部指定RW端口,这样的话从节点就只作高可用,不做读写分离。
- MySQL Router自身存在单点故障隐患,官方推荐在每个应用程序所在机器上部署Router,本机器连接本机器的Router。也可以在Router的上层在搭建一个高可用服务,如果是自建机房可以选择Keepalived、pacemaker等方案;
- 通过bootstrap生成的配置文件,只需要在
bootstrap_server_addresses
这一栏里配置就可以了,格式如下:bootstrap_server_addresses=mysql://oratest51:3306,mysql://oratest52:3306,mysql://test61:3306
Copier après la connexion - MySQL Router的后端MySQL实例挂掉之后,无需人工干预,MySQL Router会自动剔除挂了的MySQL实例,当挂了的MySQL实例恢复后会自动加入MySQL Router的后端服务器,也无需人工干预。
- MGR架构可以实现高可用,但是要实现failover,则需要安装InnoDB Cluster了。MySQL Shell和MySQL Router是InnoDB Cluster集群的一部分
- MySQL Router非常轻量级,性能损耗小于1%,官方建议每台应用上部署一个mysqlrouter节点,优点是节省网络带宽。缺点是mysqlrouter太轻量级了,只能提供简单的基于端口的读写路由(Port based routing)和基于权重轮询的负载均衡(Weighted Balance),不支持基于SQL的读写分离(Query based routing)和空闲优先的负载均衡(Application Layer balancer)
【相关推荐:mysql视频教程】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

MySQL convient aux débutants car il est simple à installer, puissant et facile à gérer les données. 1. Installation et configuration simples, adaptées à une variété de systèmes d'exploitation. 2. Prise en charge des opérations de base telles que la création de bases de données et de tables, d'insertion, d'interrogation, de mise à jour et de suppression de données. 3. Fournir des fonctions avancées telles que les opérations de jointure et les sous-questionnaires. 4. Les performances peuvent être améliorées par l'indexation, l'optimisation des requêtes et le partitionnement de la table. 5. Prise en charge des mesures de sauvegarde, de récupération et de sécurité pour garantir la sécurité et la cohérence des données.

Navicat lui-même ne stocke pas le mot de passe de la base de données et ne peut récupérer que le mot de passe chiffré. Solution: 1. Vérifiez le gestionnaire de mots de passe; 2. Vérifiez la fonction "Remember Motway" de Navicat; 3. Réinitialisez le mot de passe de la base de données; 4. Contactez l'administrateur de la base de données.

Créez une base de données à l'aide de NAVICAT Premium: Connectez-vous au serveur de base de données et entrez les paramètres de connexion. Cliquez avec le bouton droit sur le serveur et sélectionnez Créer une base de données. Entrez le nom de la nouvelle base de données et le jeu de caractères spécifié et la collation. Connectez-vous à la nouvelle base de données et créez le tableau dans le navigateur d'objet. Cliquez avec le bouton droit sur le tableau et sélectionnez Insérer des données pour insérer les données.

MySQL est un système de gestion de base de données relationnel open source. 1) Créez une base de données et des tables: utilisez les commandes CreateDatabase et CreateTable. 2) Opérations de base: insérer, mettre à jour, supprimer et sélectionner. 3) Opérations avancées: jointure, sous-requête et traitement des transactions. 4) Compétences de débogage: vérifiez la syntaxe, le type de données et les autorisations. 5) Suggestions d'optimisation: utilisez des index, évitez de sélectionner * et utilisez les transactions.

NAVICAT pour MARIADB ne peut pas afficher directement le mot de passe de la base de données car le mot de passe est stocké sous forme cryptée. Pour garantir la sécurité de la base de données, il existe trois façons de réinitialiser votre mot de passe: réinitialisez votre mot de passe via Navicat et définissez un mot de passe complexe. Affichez le fichier de configuration (non recommandé, haut risque). Utilisez des outils de ligne de commande système (non recommandés, vous devez être compétent dans les outils de ligne de commande).

Étapes pour effectuer SQL dans NAVICAT: Connectez-vous à la base de données. Créez une fenêtre d'éditeur SQL. Écrivez des requêtes ou des scripts SQL. Cliquez sur le bouton Exécuter pour exécuter une requête ou un script. Affichez les résultats (si la requête est exécutée).

Vous pouvez créer une nouvelle connexion MySQL dans NAVICAT en suivant les étapes: ouvrez l'application et sélectionnez une nouvelle connexion (CTRL N). Sélectionnez "MySQL" comme type de connexion. Entrez l'adresse Hostname / IP, le port, le nom d'utilisateur et le mot de passe. (Facultatif) Configurer les options avancées. Enregistrez la connexion et entrez le nom de la connexion.

MySQL et SQL sont des compétences essentielles pour les développeurs. 1.MySQL est un système de gestion de base de données relationnel open source, et SQL est le langage standard utilisé pour gérer et exploiter des bases de données. 2.MySQL prend en charge plusieurs moteurs de stockage via des fonctions de stockage et de récupération de données efficaces, et SQL termine des opérations de données complexes via des instructions simples. 3. Les exemples d'utilisation comprennent les requêtes de base et les requêtes avancées, telles que le filtrage et le tri par condition. 4. Les erreurs courantes incluent les erreurs de syntaxe et les problèmes de performances, qui peuvent être optimisées en vérifiant les instructions SQL et en utilisant des commandes Explication. 5. Les techniques d'optimisation des performances incluent l'utilisation d'index, d'éviter la numérisation complète de la table, d'optimiser les opérations de jointure et d'améliorer la lisibilité du code.
