Maison  >  Article  >  base de données  >  Apprenez à exécuter plusieurs services MySQL sur une seule machine

Apprenez à exécuter plusieurs services MySQL sur une seule machine

Y2J
Y2Joriginal
2017-05-23 14:48:021287parcourir

************************************************ ***** ***********

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

3.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn