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.