Maison >base de données >tutoriel mysql >Apprenez à exécuter plusieurs services MySQL sur une seule machine
************************************************ ***** ***********
Première partie, création de plusieurs services MySQL sur un seul serveur
************. ***** *****************************************
1. Introduction
Il existe une commande mysqld_multi dans Mysql, qui peut être utilisée pour exécuter plusieurs services Mysql sur un serveur physique. Aujourd'hui, j'ai fait référence à certains documents, je l'ai testé moi-même et je l'ai réussi. Je suis vraiment content. Maintenant, je vais partager le processus de fonctionnement avec vous tout le monde !
Système d'exploitation : Linux 2.6.13 (Slackware), les autres versions de Linux devraient être similaires. Installation du programme source Mysql 4.0.17 (je crois que la dernière version 5.1.* est également disponible) Presque, réessayez dans quelques jours)
Planification : Exécutez 4 services mysql :
Assumez le nom du serveur : db-app (IP est 192.168.0.100),
Supposons que le nom du serveur : db-app2 (IP est 192.168.0.101),
Ce qui suit jusqu'à la deuxième partie concerne MySQL dans db-app,
Deuxièmement, préparation
Installation à l'aide du programme source MySQL, supposons que l'option configura soit utilisée lors de l'installation
./configure - -prefix=/usr/local/mysql --datadir=/usr /local/mysql/data1 --sysconfdir=/etc
Remarque : --prefix installera MYSQL sur /usr/local/mysql,
--datadir générera la base de données dans /usr/local /mysql/data1
sysconfdir spécifie le chemin de recherche du fichier de configuration my.cnf utilisé par mysql comme /etc
Les autres procédures d'installation de MySQL sont omises.
Selon cela est mentionné dans le manuel de gestion de Mysql : Chaque service Mysql peut être indépendant, donc tout appelle une option de démarrage différente dans my.cnf - qui est la valeur GNR mentionnée ci-dessous, utilise différents ports et génère Les fichiers de socket et les bases de données de service respectifs sont indépendants (pour plus d'informations, veuillez vous référer au manuel de gestion en anglais sur le site officiel de mysql
mysqld_multi). est un processus de service qui gère plusieurs mysqld. Ces programmes de processus de service. Différentes sockets Unix peuvent écouter sur différents ports. Il peut démarrer, arrêter et surveiller l'état actuel du service.
----Le programme recherche la section [mysqld#] dans my.cnf (ou le fichier de configuration personnalisé dans --config-file), "#" peut être n'importe quel entier positif. Cet entier positif est la séquence de segments mentionnée ci-dessous, c'est-à-dire GNR. Le numéro de série du segment est utilisé comme paramètre de mysqld_multi pour distinguer différents segments, afin que vous puissiez contrôler le démarrage et l'arrêt d'un processus mysqld spécifique ou obtenir ses informations de rapport. Les paramètres de ces groupes sont identiques aux paramètres des groupes requis pour démarrer un mysqld. Cependant, si vous utilisez plusieurs services, vous devez spécifier un socket ou un port Unix pour chaque service (extrait de http://mifor.4dian.org Utilisation du programme mysqld_multi pour gérer plusieurs services MySQL).
Comme vous pouvez le voir dans le texte ci-dessus, le plus important des multiples services Mysql est le fichier de configuration my.cnf
Maintenant, je publie mon fichier my.cnf.-. -- --------------------
[mysqld_multi]
mysqld = /usr/local/mysql/bin /mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql (Utilisez un compte pour démarrer tous les serveurs mysql, car le même compte est utilisé. Qu'est-ce que ce compte ? Il doit s'agir d'un compte utilisé par chaque service MySQL, de préférence un compte de gestion. Le mot de passe ci-dessous est le même que)
password = mypaswd
[mysqld1]
port = 3306
socket = /tmp/mysql.sock1
pid-file=/usr/local/mysql/data1/db-app1.pid
log =/usr/local/mysql/data1/db-app.log
datadir = /usr/local/mysql/data
user = mysql
[ mysqld2]
port = 3307
socket = /tmp/mysql.sock2
pid-file = /usr/local/mysql/data2/db-app2.pid
datadir = /usr/local/mysql/data2
log=/usr/local/mysql/data2/db-app.log
user = mysql
[mysqld3]
port = 3308
socket = /tmp/mysql.sock3
pid-file = /usr/local/mysql/data3/ db-app3.pid3
datadir = /usr/local/mysql/data3
log=/usr/local/mysql/data3/db-app.log
utilisateur = mysql
[mysqld4]
port = 3309
socket = /tmp/mysql.sock4
pid-file = /usr/ local/mysql/data3/db-app4.pid
datadir = /usr/local/mysql/data4
log=/usr/local/mysql/data4/db-app.log
user = mysql
[mysqldump]
rapide
max_allowed_packet = 16M
[mysql]
pas de répétition automatique
[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_b buffer = 2M
[mysqlhotcopy]
interactive-timeout
Il y a mysqld1, mysqld2, mysqld3, mysqld4 dans mon fichier de configuration. C'est-à-dire que je vais démarrer 4 services MySQL sur différents ports du même serveur - 3306-3309. Le chemin du fichier de base de données spécifié par chaque répertoire de données est différent et chacun a son propre fichier journal. Certains autres paramètres peuvent utiliser le contenu original de my.cnf
ok, l'important my.cnf a été modifié, créez maintenant des dossiers séparés et des bases de données initiales pour différents services MySQL dans la configuration
[mysqld1] est celui par défaut, il était déjà là lorsque nous avons installé mysql, alors ne vous inquiétez pas
[mysqld2], créez simplement un répertoire pour celui-ci en fonction. le chemin configuré. OK Le répertoire sera remplacé par les droits de gestion mysql
db-app:/ # mkdir /usr/local/mysql/data2
Construire un. base de données, nous pouvons copier la base de données mysql par défaut pour utiliser d'autres comptes mysql et créer d'autres bases de données en fonction de l'application
db-app:/ # cp /usr/local/mysql/data1/mysql. /usr /local/mysql/data2 -R
db-app:/ # chmod mysql.mysql /usr/local/mysql/data2 -R
[mysqld3],[ mysqld4] , pareil.
Nous pouvons voir si ces répertoires existent
db-app:/ # ls -l /usr/local/mysql/
drwxr-xr-x 6 mysql mysql 4096 9 avril 17:54 data4
drwxr-x--- 2 mysql mysql 4096 9 avril 17:14 data1
drwxr-xr - x 3 mysql mysql 4096 9 avril 17:54 data2
drwxr-xr-x 3 mysql mysql 4096 9 avril 17:54 data3
Maintenant, il peut être démarré via mysqld_multi.
Trois, commande mysqld_multi
Utilisez les paramètres suivants pour démarrer mysqld_multi : (Remarque : cette commande se trouve dans le répertoire bin de mysql, comme mentionné ci-dessus./configure --prefix =/usr/local/mysql, donc le fichier doit être dans /usr/local/mysq/bin, qui dépend du chemin que vous avez spécifié lors de l'installation)
db-app:/ # mysqld_multi [options] { start|stop|report} [GNR[,GNR]...]
start, stop et report font référence aux opérations que vous souhaitez effectuer. Vous pouvez spécifier une opération sur un seul service ou sur plusieurs services, à la différence de la liste GNR suivant les options. Si aucune liste GNR n'est spécifiée, mysqld_multi fonctionnera selon le fichier d'options dans tous les services.
La valeur de chaque GNR est le numéro de séquence du groupe ou la plage de numéros de séquence d'un groupe. La valeur de cet élément doit être le dernier numéro du nom du groupe. Par exemple, si le nom du groupe est mysqld17, alors la valeur de cet élément est 17. Si vous spécifiez une plage, utilisez "-" (tiret) pour connecter le deux nombres. Si la valeur de GNR est 10-13, elle fait référence au groupe mysqld10 au groupe mysqld13. Plusieurs groupes ou plages de groupes peuvent être spécifiés sur la ligne de commande, séparés par "," (virgule). Il ne peut pas y avoir de caractères d'espacement (tels que des espaces ou des tabulations). Les paramètres suivant les caractères d'espacement seront ignorés. (Remarque : la valeur GNR est la valeur dans mysqld# que nous avons définie dans my.cnf. Je n'en ai que 1 à 4 ici
db-app:/ # /usr/local). /mysq /bin/mysqld_multi --config-file=/etc/my.cnf start 1 démarre uniquement le premier service mysql, et les fichiers associés sont définis par mysql1 dans my.cnf
db. -app: / # /usr/local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf stop 1 Démarrez et arrêtez le premier service mysql
db-app:/ # /usr /local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf start 1-4, démarrez le 1er au 4ème service mysql, qui est en fait tout ce que j'ai ici
.
db- app:/ # /usr/local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf report 1-4
Afficher le démarrage :
db-app:/ # ps aux
root 10467 0.0 0.2 2712 1300 pts/0 S 18:59 0:00 /bin/sh /usr/local/mysql/ bin/mysqld_safe -- port=3306 --socket=/tmp/mysql.sock1
root 10475 0.0 0.2 2712 1300 pts/0 S 18:59 0:00 /bin/sh /usr/local/mysql /bin/mysqld_safe - -port=3307 --socket=/tmp/mysql.sock2
root 10482 0.0 0.2 2716 1300 pts/0 S 18:59 0:00 /bin/sh /usr/local/ mysql/bin/mysqld_safe --port=3308 --socket=/tmp/mysql.sock3
racine 10487 0.0 0.2 2716 1300 pts/0 S 18:59 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3309 --socket=/tmp/mysql.sock4
.................................................................
Quatre accès client
Tout accès client doit spécifier le port d'accès pour accéder au service de base de données spécifié, sinon, le MYSQL servi par le port par défaut de Mysql (3306) sera. utilisé.
********************************************* **** ****************
Partie 2, Créez plusieurs services principaux MySQL sur un seul serveur
******. **** **********************************************
Astuce : Créez un compte spécifiquement pour la réplication maître-esclave suivante. Le compte repl utilisé dans cet exemple a le mot de passe : '1234567890', ce qui lui permet d'avoir select_priv, reload_priv, process_priv, grant_priv. , super_priv, repl_slave_priv, repl_client_priv et est accessible via n'importe quel client, c'est-à-dire que le client d'accès est « % ».
L'objectif principal est de modifier le contenu de mon.cnf, afin que chaque mysql puisse générer son propre fichier bin-log et son propre environnement d'exploitation. Collez maintenant tout le contenu de mon my.cnf. vers mysql pour les paramètres associés.
#[client]
#password = your_password
#port = 3306
#socket. = /tmp/mysql .sock
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/ mysql/bin/mysqladmin
utilisateur = mysql
mot de passe = mon mot de passe
[mysqld1]
port = 3306
socket = / tmp/mysql.sock1
skip-locking
pid-file=/usr/local/mysql/data/net-app1a.pid
datadir = /usr/local /mysql/data
log=/usr/local/mysql/data/net-app1.log
user = mysql
log-slow-queries=/usr/ local/mysql/data /slowquery.log
long_query_time = 2
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M 2
max_connections=500
log-bin
log-bin=/usr/local/mysql/data /app-net1_1-bin
id-serveur = 1
[mysqld2]
port = 3307
socket = /tmp/mysql .sock2
pid-file = /usr/local/mysql/data2 /net-app1b.pid
datadir = /usr/local/mysql/data2
log= /usr/local/mysql/data2/net-app1.log
utilisateur = mysql
log-slow-queries=/usr/local/mysql/data2/slowquery.log
long_query_time = 10
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 1M
read_buffer_size = 1M
myisam_sort_buffer_size = 32M
thread_cache = 32
query_cache_size = 16M
thread_concurrency = 2
max_connections=300
log-bin
log-bin=/usr/local/ mysql/data2/app-net1_2-bin
server-id = 1
[ mysqld3]
port = 3308
socket = /tmp/mysql.sock3
saut de verrouillage
pid-file = /usr/local/mysql /data3/net-app1c.pid
datadir = /usr/local /mysql/data3
log=/usr/local/mysql/data3/net-app1.log
user = mysql
log-bin
log-bin=/usr/local/mysql/data3/app-net1_3-bin
server-id = 1
[mysqld4]
port = 3309
socket = /tmp/mysql.sock4
saut de verrouillage
pid -file = /usr/local/mysql/data1/app-net1d.pid
datadir = /usr/local/mysql/data1
log=/usr/local/mysql/data1/ net-app1.log
user = mysql
log-bin
log-bin=/usr/local/mysql/data1/app-net1_4-bin
id-serveur = 1
[mysqldump]
rapide
max_allowed_packet = 16M
[mysql]
pas de répétition automatique
#Supprimez le caractère de commentaire suivant si vous n'êtes pas familier avec SQL
#safe-updates
[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 128M
sort_b buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
délai d'attente interactif
* *********************
Le démarrage de plusieurs services MySQL est le même,
db-app :/ # /usr/local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf start 1-4
***************** ***** *******************************************
Troisième partie, créez plusieurs services esclaves MySQL sur un seul serveur
******************************. **** ****************************
Préparation de la présélection pour construire le serveur esclave : Elle est recommandée pour utiliser mysqld_multi pour arrêter tous les mysql sur le serveur maître. Supprimez tous les fichiers du répertoire de données à l'exception du répertoire de base de données (il y a 4 répertoires de données dans cet article, datadir = data1 -- data1 dans /usr/local/mysql/). Le maître et les esclaves utilisent le même chemin de répertoire de données.
Utilisez la commande Tar pour encapsuler chaque base de données et placez-la/récupérez-la sur le serveur esclave (db-app1 192.168.0.101) via la commande sftp
Les opérations suivantes sont destinées. référence :
Opérations sur l'hôte db-app
db-app:/ # tar -cf data1.tar /usr/local/mysql/data1
db-app :/ # tar -cf data2.tar /usr/local/mysql/data2
db-app:/ # tar -cf data3.tar /usr/local/mysql/data3
db -app: / # tar -cf data4.tar /usr/local/mysql/data4
Opération sur l'hôte db-app1
db-app1:/ # tar xvf data1.tar
db-app1:/ # tar xvf data2.tar
db-app1:/ # tar xvf data3.tar
db-app1:/ # tar xvf data4.tar
En même temps, veuillez confirmer si le compte système mysql dispose des autorisations d'exploitation sur le répertoire de données mysql dans le serveur maître/esclave. Si vous ne pouvez pas confirmer, vous pouvez directement modifier. la propriété de ces répertoires.
Opérations sur l'hôte db-app
db-app:/ # chown mysql.mysql /usr/local/mysql/data1 -R
db-app: / # chown mysql.mysql /usr/local/mysql/data2 -R
db-app:/ # chown mysql.mysql /usr/local/mysql/data3 -R
db-app :/ # chown mysql.mysql /usr/local/mysql/data4 -R
Opération sur l'hôte db-app1
db-app1:/ # chown mysql /usr. /local/mysql/data1 -R
db-app2:/ # chown mysql.mysql /usr/local/mysql/data2 -R
db-app3:/ # chown mysql.mysql /usr/local/mysql/data3 -R
db-app4:/ # chown mysql.mysql /usr/local/mysql/data4 -R
Ce qui suit est du tout le contenu de /etc/my.cnf sur le serveur
Astuce : Il y aura un compte mentionné dans my.cnf ci-dessous : repl, le mot de passe est : '1234567890', ce compte est spécialement créé ci-dessus.
En fait, ils sont tous pareils. L'essentiel est de modifier le contenu de my.cnf, afin que chaque mysql esclave puisse obtenir son propre bin-log via différents ports du mysql principal pour mettre à jour le contenu de base de données auto-généré. Collez maintenant tout le contenu de mon my.cnf (à partir du serveur). Veuillez vous référer au manuel officiel de mysql pour les paramètres associés
#[client]
#password = your_password.
#port = 3306
#socket = /tmp/mysql.sock
[mysqld_multi]
mysqld = /usr/local/ mysql/ bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql
mot de passe = netmoniit
[mysqld1]
port = 3306
socket = /tmp/mysql.sock1
saut de verrouillage
pid-file=/usr/local/mysql/data /net -app1a.pid
datadir = /usr/local/mysql/data
log=/usr/local/mysql/data/net-app1.log
user = mysql
log-slow-queries=/usr/local/mysql/data/slowquery.log
long_query_time = 2
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
myisam_sort_buffer_size = 64M
thread_cache = 32
query_ cache_size = 32 M
thread_concurrency = 2
max_connections=500
server-id = 2
master-host = 192.168.0.100
master-user = 'repl'
master-password = '1234567890'
master-port = 3309
report-host = net-app1
master-connect- réessayer = 30
log-bin
log-slave-updates
[mysqld2]
port = 3307
socket = /tmp/mysql.sock2
pid-file = /usr/local/mysql/data2/net-app1b.pid
datadir = /usr/local/mysql/ data2
log=/usr/local/mysql/data2/net-app1.log
user = mysql
log-slow-queries=/usr/local/mysql /data2/slowquery.log
long_query_time = 10
key_buffer = 128m
max_allowed_packet = 1m
table_cache = 512
sort_buffer_size = 1M
read_buffer_size = 1M
myisam_sort_buffer_size = 32M
thread_cache = 32
query_cache_size = 16 M
thread_concurrency = 2
max_connections=300
server-id = 2
master-host = 192.168.0.100
master-user = 'repl'
master- mot de passe = '1234567890'
master-port = 3309
report-host = net-app1
master-connect-retry = 30
log- bin
log-slave-updates
[mysqld3]
port = 3308
socket = /tmp/mysql.sock3
pid-file = /usr/local/mysql/data3/net-app1c.pid
datadir = /usr/local/mysql/data3
log=/usr /local/mysql/data3/net-app1.log
user = mysql
log-slow-queries=/usr/local/mysql/data3/slowquery.log
long_query_time = 10
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 1M
read_buffer_size = 1M
myisam_sort_buffer_size = 32M
thread_cache = 32
query_cache_size = 16M
thread_concurrency = 2
max_connections=300
server-id = 2
master-host = 192.168.0.100
master-user = 'repl'
master-password = ''1234567890'
master-port = 3309
report-host = net-app1
master-connect-retry = 30
log-bin
log-slave- mises à jour
[mysqld3]
port = 3308
socket = /tmp/mysql.sock4
pid-file = /usr/local /mysql/data4/net-app1d.pid
datadir = /usr/local/mysql/data4
log=/usr/local/mysql/data4/net-app1.log
user = mysql
log-slow-queries=/usr/local/mysql/data4/slowquery.log
long_query_time = 10
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 1M
read_buffer_size = 1M
myisam_sort_buffer_size = 32M
thread_cache = 32
query_cache_size = 16M
thread_concurrency = 2
max_connections=300
server-id = 2
maître-hôte = 192.168.0.100
utilisateur-maître = 'repl'
mot de passe maître = '1234567890'
port-maître = 3309
hôte-rapport = net-app1
master-connect-retry = 30
log-bin
log-slave-updates
[ mysqldump]
rapide
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Supprimez le caractère de commentaire suivant si vous n'êtes pas familier avec SQL
#safe-updates
[isamchk]
key_buffer = 128M 🎜> key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
inter actif - timeout
******************************** **********
Maintenant que vous avez terminé, démarrez les multiples services MySQL sur les deux hôtes respectivement. De cette façon, chaque modification apportée à MySQL de chaque service maître sera automatiquement copiée/. mis à jour dans la base de données correspondante du serveur esclave.
db-app:/ # /usr/local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf start 1-4
db-app1 :/ # /usr/local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf start 1-4
************ ********
Cinq, tests futurs,
Ensuite, je veux créer une solution de réplication de serveur Mysql multi-maître et un esclave ! quelques conseils ? Des avis ! La structure est la suivante.
Il existe des serveurs maîtres, le serveur A, le serveur B et des serveurs esclaves, le serveur C. A et B exécutent des applications de base de données différentes, en supposant que les noms de bases de données sont différents. Le serveur C (en supposant qu'un seul service MySQL s'exécute sur ces trois PC) inclut tous les utilisateurs Mysql des serveurs A et B et les mêmes droits d'accès, et est intégré dans un service Mysql C copie A via la méthode maître/esclave et ceux de B. base de données.
C'est presque comme fusionner le mysql de deux serveurs maîtres en un seul serveur esclave.
[Recommandations associées]
1
Tutoriel vidéo gratuit MySQL
2.
Vous apprendre à démarrer et arrêter le Service Mysql 2
Vous apprendre à démarrer et arrêter l'un des services Mysql
4. Un exemple de tutoriel sur le traitement du SQL spécial. instructions dans mysql
5. Explication détaillée de la façon d'écrire des instructions SQL pour supprimer des tables dans différentes bases de données
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!