Construire un cluster InnoDB Ă  partir de mysql 5.7 sur centos 7

Bonjour Ă  tous!

Une fois qu'une tĂąche est apparue sur le travail - il semble y avoir un cluster de test innoDB configurĂ© sur plusieurs machines virtuelles avec centos 7.5, vous devez l'Ă©tudier et ajouter quelques nƓuds supplĂ©mentaires. Vous pouvez vous casser et vous moquer Ă  votre guise. Cela semble tentant.

Avant cela, je n'avais aucune expérience avec un tel cluster, mais Google pour vous aider.
À quelques exceptions prĂšs, tous les liens qu'il contient et dans Yandex se trouvaient soit sur dev.mysql.com, soit sur cet article sur Habr . Il semble qu'un cluster de deux nƓuds ait Ă©tĂ© configurĂ© dessus.

Eh bien, j'ai lu l'article, j'ai Ă©tĂ© quelque peu surpris de la complexitĂ© de l'ajout de nƓuds et du manque de nombreux dĂ©tails, mais bon. Avec un pĂ©chĂ©, j'ai ajoutĂ© la moitiĂ© d'un nouveau nƓud (certaines commandes n'Ă©taient pas utiles, certaines cassaient gĂ©nĂ©ralement tout), aprĂšs quoi j'ai commencĂ© Ă  expĂ©rimenter avec le redĂ©marrage des nƓuds, etc.

AprĂšs plusieurs approches et d'innombrables morts de cellules nerveuses, le cluster n'a pas pu le supporter. Un nƓud ne voulait en aucun cas ĂȘtre ajoutĂ©, l'autre raccrochait lors de toute tentative d'accĂšs Ă  la base de donnĂ©es, le troisiĂšme prĂ©tendait que tout Ă©tait en ordre. J'ai dĂ» tirer et repartir de zĂ©ro.

Lors de la crĂ©ation d'un nouveau cluster, malheureusement, de nombreux problĂšmes et incohĂ©rences sont apparus. Peut-ĂȘtre que le point est dans les versions logicielles, j'ai essayĂ© mysql 5.7. Peut-ĂȘtre dans la distribution. En consĂ©quence, j'ai arrĂȘtĂ© les tentatives irrĂ©flĂ©chies de tout faire sur un morceau de papier et j'ai commencĂ© Ă  le configurer en tapant. Et google.

Quelques soirĂ©es et nuits agrĂ©ables et le groupe se sont rassemblĂ©s et ont mĂȘme refusĂ© de s'effondrer.
En mĂȘme temps, la mĂ©thode de sa crĂ©ation Ă©tait sensiblement diffĂ©rente des tentatives prĂ©cĂ©dentes et je voulais la partager, car Sur Internet, je n'ai pas trouvĂ© d'autres instructions comprĂ©hensibles dĂ©taillĂ©es pertinentes pour la configuration du cluster inndoDB.

Nous avons donc trois machines virtuelles identiques avec le Centos 7.5 minimal 1804 nouvellement installé et selinux et firewalld désactivés:

1.1.1.1
1.1.1.2
1.1.1.3

Pour le travail, j'ai utilisé mysql 5.7, nous l'utilisons donc. Commençons par 1.1.1.1:

1. Installez le dépÎt mysql-community:

rpm -i https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm 

Désactivez le référentiel pour 8, allumez-le pour 5.7 et vérifiez - si tout va bien, installez mysql:

 yum install yum-utils yum-config-manager --disable mysql80-community yum-config-manager --enable mysql57-community yum repolist yum install mysql-community-server mysql-shell 

2. Nous apportons /etc/my.cnf Ă  ce formulaire:

 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid bind-address=0.0.0.0 port=3301 # Replication part server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW plugin-load = group_replication.so # Group replication part transaction_write_set_extraction=XXHASH64 loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = 1.1.1.1:33011 loose-group_replication_bootstrap_group = OFF report_port = 3301 report_host = 1.1.1.1 

Ici 3301 est le port sur lequel mysql Ă©coutera, et 33011 est le port sur lequel les nƓuds communiquent entre eux.

3. Lancez mysql et effectuez la configuration préliminaire:

 systemctl start mysqld grep 'password' /var/log/mysqld.log mysql_secure_installation 

4. Eh bien, crĂ©ez un cluster, ainsi qu'un utilisateur distinct pour le gĂ©rer. Si vous connaissez Ă  l'avance les adresses IP des nƓuds, vous pouvez immĂ©diatement les rĂ©pertorier dans ipWhitelist. Nous prĂ©tendons que nous ne connaissons pas encore 1.1.1.2. et 1.1.1.3:

 mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "SomePassword!123"}) > \c cladmin@1.1.1.1:3301 > dba.checkInstanceConfiguration() > cl=dba.createCluster('TestCluster', {ipWhitelist: '1.1.1.1'}) > dba.configureLocalInstance() > cl.status() 

C'est fait! cl.status devrait produire quelque chose comme ceci:

 { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" } 

Lors du changement de cluster, il sera nĂ©cessaire d'exĂ©cuter la commande dba.configureLocalInstance () localement sur tous les nƓuds pour enregistrer les modifications:

 WARNING: On instance '1.1.1.1:3301' membership change cannot be persisted since MySQL version 5.7.23 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the <Dba>.configureLocalInstance command locally to persist the changes. 

Parce que nous allons ajouter quelques nƓuds supplĂ©mentaires, nous ne fermons pas la connexion avec le serveur 1.1.1.1, cela nous sera utile.

Essayons maintenant d'ajouter le nƓud 1.1.1.2 au cluster. Pour ce faire, nous y exĂ©cutons toutes les mĂȘmes commandes jusqu'Ă  3 Ă©tapes inclus, sans oublier de changer server_id, loose-group_replication_local_address et report_host.

4. Nous exécutons le 1.1.1.2:

 mysql -p > set GLOBAL group_replication_allow_local_disjoint_gtids_join=ON; 

J'ai essayé de définir cette variable via mysqlsh, en passant en mode sql, mais les actions ne l'ont pas affectée dans mysql. Suivant:

 mysqlsh > \c 127.0.0.1:3301 > dba.configureLocalInstance("127.0.0.1:3301", {mycnfPath: "/etc/my.cnf", clusterAdmin: "cladmin", clusterAdminPassword: "SomePassword!123"}) > \c cladmin@1.1.1.2:3301 > dba.checkInstanceConfiguration() 


5. Revenez au premier nƓud 1.1.1.1. Si vous avez fermĂ© la connexion, vous pouvez vous connecter rapidement au cluster comme ceci:

 mysqlsh --uri cladmin@1.1.1.1:3301 --cluster > \sql > STOP GROUP_REPLICATION; > SET GLOBAL group_replication_ip_whitelist="1.1.1.1,1.1.1.2"; > START GROUP_REPLICATION; > \js > cluster.addInstance('cladmin@1.1.1.2:3301', {ipWhitelist: '1.1.1.1,1.1.1.2'}) > cluster.status() 

Pour une raison quelconque, lors de l'ajout d'un nƓud sans l'option ipWhitelist, il ne lui est pas automatiquement transmis, nous le spĂ©cifions donc manuellement.
Si votre liste blanche est initialement configurĂ©e pour tous les nƓuds ou un sous-rĂ©seau, les commandes en mode SQL peuvent ĂȘtre ignorĂ©es.

N'oubliez pas d'exĂ©cuter dba.configureLocalInstance () sur tous les nƓuds pour enregistrer la configuration.

Le cluster de leurs deux nƓuds s'est avĂ©rĂ©:

 { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.2:3301": { "address": "1.1.1.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" } 

Eh bien, il y a un cluster de deux nƓuds, mais dans le "Cluster n'est PAS tolĂ©rant aux pannes". Mode
Ajoutez un troisiĂšme, l'algorithme est fondamentalement le mĂȘme que l'ajout d'un deuxiĂšme.

Si vous devez Ă  nouveau modifier la liste blanche, vous devez exĂ©cuter les commandes sur le nƓud r / w, car sur les nƓuds R / O, cela ne semble pas conduire Ă  quoi que ce soit. Dans ce cas, les nƓuds R / O tomberont et ils devront ĂȘtre reconnectĂ©s, signalant simultanĂ©ment une nouvelle liste blanche.
Dans notre cas:

 > cluster.rejoinInstance('cladmin@1.1.1.2:3301', {ipWhitelist: '1.1.1.1,1.1.1.2,1.1.1.3'}) 

Eh bien, encore une fois, n'oubliez pas d'exĂ©cuter dba.configureLocalInstance () sur tous les nƓuds pour enregistrer la configuration.

Un cluster de trois nƓuds ressemble à ceci:

 { "clusterName": "TestCluster", "defaultReplicaSet": { "name": "default", "primary": "1.1.1.1:3301", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "1.1.1.1:3301": { "address": "1.1.1.1:3301", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.2:3301": { "address": "1.1.1.2:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "1.1.1.3:3301": { "address": "1.1.1.3:3301", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://cladmin@1.1.1.1:3301" } 

Si le cluster s'est effondrĂ© Ă  l'Ă©tat d'un nƓud, il devra ĂȘtre dĂ©marrĂ© avec le paramĂštre loose-group_replication_bootstrap_group = ON dans /etc/my.cnf
AprĂšs le dĂ©marrage, le paramĂštre devra ĂȘtre dĂ©sactivĂ© Ă  nouveau, sinon ce nƓud sera toujours sĂ©parĂ© du cluster et conservera le sien.

L'installation de mysql-router est bien décrite ici , donc je ne vois aucun sens à la duplication.

C'est tout, c'est tout, j'espÚre que quelqu'un trouvera mon expérience utile.

Merci de votre attention.

Source: https://habr.com/ru/post/fr423587/


All Articles