introduction
Zabbix prend en charge plusieurs bases de données, mais seuls MySQL et PostgreSQL ont été considérés comme les plus adaptés à mon installation. PostgreSQL avec ses repomgr et pgbouncer ou certains stolons d'une part et MySQL Group Replication d'autre part. En raison de l'utilisation de MySQL dans la configuration actuelle et du désir d'équipement standard, le choix s'est porté sur la deuxième option.
Alors, quelle est exactement la réplication de groupe MySQL. Comme son nom l'indique, il s'agit d'un groupe de serveurs qui stocke le même ensemble de données. Le nombre maximum de nœuds dans un groupe est limité à 9. Peut fonctionner en mode mono-primaire ou multi-primaire. Mais le plus intéressant est que tout fonctionne automatiquement, que ce soit l'élection d'un nouveau serveur maître, la détection d'un nœud cassé, le Split-brain ou la récupération d'une base de données. Cette fonctionnalité est fournie sous forme de plugins group_replication et mysql_clone, la communication se fait via le protocole Group Communication System, basé sur l'algorithme Paxos. Ce type de réplication est pris en charge depuis les versions 5.7.17 et 8.0.1.
Mon installation actuelle fonctionne sur Zabbix 5.0 LTS et MySQL 5.7, la migration se fera en augmentant la version de MySQL à 8.0, donc c'est plus intéressant).
Surveillance de la réplication
Oui oui. C'est comme TDD, seulement dans l'administration, il faut d'abord préparer la surveillance pour que le nouveau cluster soit immédiatement sur les radars de notre système de surveillance et pas un seul problème n'échappe à son œil vif. Étant donné que vous n'avez pas encore de réplication de groupe (GR), la sortie des commandes ci-dessous sera vide, je donne donc un exemple de sortie d'un cluster en cours d'exécution.
La principale source d'informations sur l'état des nœuds est la commande:
SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 500049c2-99b7-11e9-8d36-e4434b5f9d0c | example1.com | 3306 | ONLINE | SECONDARY | 8.0.13 |
| group_replication_applier | 50024be2-9889-11eb-83da-e4434ba03de0 | example2.com | 3306 | ONLINE | PRIMARY | 8.0.13 |
| group_replication_applier | 500b2035-986e-11eb-a9f8-564d00018ad1 | example3.com | 3306 | ONLINE | SECONDARY | 8.0.13 |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
MEMBER_STATE . https://dev.mysql.com/doc/refman/8.0/en/group-replication-server-states.html. , , .
:
SELECT * FROM performance_schema.replication_group_member_stats\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
VIEW_ID: 16178860996821458:41
MEMBER_ID: 500049c2-99b7-11e9-8d36-e4434b5f9d0c
COUNT_TRANSACTIONS_IN_QUEUE: 0
COUNT_TRANSACTIONS_CHECKED: 75715997
COUNT_CONFLICTS_DETECTED: 0
COUNT_TRANSACTIONS_ROWS_VALIDATING: 1957048
TRANSACTIONS_COMMITTED_ALL_MEMBERS: 500049c2-99b7-11e9-8d36-e4434b5f9d0c:1-1821470279,
500293cf-594c-11ea-aafd-e4434ba03de0:1-622868371,
5000d25c-059e-11e8-822b-564d00018ad1:1-140221041,
c9aae4fb-97a6-11eb-89d1-e4434b5f9d0c:1-125382195
LAST_CONFLICT_FREE_TRANSACTION: c9aae4fb-97a6-11eb-89d1-e4434b5f9d0c:125471159
COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE: 0
COUNT_TRANSACTIONS_REMOTE_APPLIED: 5664
COUNT_TRANSACTIONS_LOCAL_PROPOSED: 75710337
COUNT_TRANSACTIONS_LOCAL_ROLLBACK: 0
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
VIEW_ID: 16178860996821458:41
MEMBER_ID: 50024be2-9889-11eb-83da-e4434ba03de0
COUNT_TRANSACTIONS_IN_QUEUE: 0
COUNT_TRANSACTIONS_CHECKED: 75720452
COUNT_CONFLICTS_DETECTED: 0
COUNT_TRANSACTIONS_ROWS_VALIDATING: 1955202
TRANSACTIONS_COMMITTED_ALL_MEMBERS: 500049c2-99b7-11e9-8d36-e4434b5f9d0c:1-1821470279,
500293cf-594c-11ea-aafd-e4434ba03de0:1-622868371,
5000d25c-059e-11e8-822b-564d00018ad1:1-140221041,
c9aae4fb-97a6-11eb-89d1-e4434b5f9d0c:1-125377993
LAST_CONFLICT_FREE_TRANSACTION: c9aae4fb-97a6-11eb-89d1-e4434b5f9d0c:125470919
COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE: 0
COUNT_TRANSACTIONS_REMOTE_APPLIED: 75711354
COUNT_TRANSACTIONS_LOCAL_PROPOSED: 9105
COUNT_TRANSACTIONS_LOCAL_ROLLBACK: 0
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
VIEW_ID: 16178860996821458:41
MEMBER_ID: 500b2035-986e-11eb-a9f8-564d00018ad1
COUNT_TRANSACTIONS_IN_QUEUE: 38727
COUNT_TRANSACTIONS_CHECKED: 49955241
COUNT_CONFLICTS_DETECTED: 0
COUNT_TRANSACTIONS_ROWS_VALIDATING: 1250063
TRANSACTIONS_COMMITTED_ALL_MEMBERS: 500049c2-99b7-11e9-8d36-e4434b5f9d0c:1-1821470279,
500293cf-594c-11ea-aafd-e4434ba03de0:1-622868371,
5000d25c-059e-11e8-822b-564d00018ad1:1-140221041,
c9aae4fb-97a6-11eb-89d1-e4434b5f9d0c:1-125382195
LAST_CONFLICT_FREE_TRANSACTION: c9aae4fb-97a6-11eb-89d1-e4434b5f9d0c:125430975
COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE: 47096
COUNT_TRANSACTIONS_REMOTE_APPLIED: 49908155
COUNT_TRANSACTIONS_LOCAL_PROPOSED: 0
COUNT_TRANSACTIONS_LOCAL_ROLLBACK: 0
3 rows in set (0.00 sec)
COUNT_TRANSACTIONS_IN_QUEUE, Seconds_Behind_Master . , .
, () . , , . , - , . , , , , .
, - . , . , .
:
( TCP 33061 ). ;
MySQL 8.0 (FreeBSD, Poudriere - );
, Zabbix ( );
, Secondary ( , - ). ;
MySQL 5.7 ;
( , );
;
MySQL 8.0 (mysql_upgrade , 8 );
, ( , , . . ). , ;
, , ( , );
( RESET SLAVE ALL;);
;
Zabbix Zabbix ;
( 4 8, 8 , . . );
;
Ansible Playbook' ;
;
HADNS;
;
:
MySQL ;
;
, MySQL ;
;
, .
9, 12 14 .
9:
SELECT tables.table_schema , tables.table_name , tables.engine
FROM information_schema.tables
LEFT JOIN (
SELECT table_schema , table_name
FROM information_schema.statistics
GROUP BY table_schema, table_name, index_name HAVING
SUM( case when non_unique = 0 and nullable != 'YES' then 1 else 0 end ) = count(*) ) puks
ON tables.table_schema = puks.table_schema and tables.table_name = puks.table_name
WHERE puks.table_name is null
AND tables.table_type = 'BASE TABLE' AND Engine="InnoDB";
Zabbix, . Zabbix, dbversion . .
ALTER TABLE history ADD COLUMN `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;
ALTER TABLE history_uint ADD COLUMN `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;
ALTER TABLE history_text ADD COLUMN `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;
ALTER TABLE history_str ADD COLUMN `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;
ALTER TABLE history_log ADD COLUMN `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;
ALTER TABLE dbversion ADD PRIMARY KEY (mandatory);
. , - Zabbix.
12:
, , .
server-id=[ ]
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
plugin_load_add='group_replication.so;mysql_clone.so'
ssl-ca=/usr/local/etc/ssl/mysql/ca.crt
ssl-cert=/usr/local/etc/ssl/mysql/server.crt
ssl-key=/usr/local/etc/ssl/mysql/server.key
group_replication_ssl_mode=VERIFY_IDENTITY
group_replication_group_name="[ , SELECT UUID();]"
group_replication_start_on_boot=off #
group_replication_local_address="[ ].com:33061"
group_replication_group_seeds="example1.com:33061,example2.com:33061,example3.com:33061"
group_replication_ip_allowlist="2.2.2.2/32,3.3.3.3/32,4.4.4.4/32"
group_replication_member_weight=50
group_replication_recovery_use_ssl=ON
group_replication_recovery_ssl_verify_server_cert=ON
group_replication_recovery_ssl_ca=/usr/local/etc/ssl/mysql/ca.crt
group_replication_recovery_ssl_cert=/usr/local/etc/ssl/mysql/server.crt
group_replication_recovery_ssl_key=/usr/local/etc/ssl/mysql/server.key
my.cnf, , , . , . group_replication_start_on_boot, , .
SHOW VARIABLES LIKE 'binlog_format'; SET GLOBAL binlog_format = RAW; , .
group_replication_ssl_mode group_replication_recovery_ssl_verify_server_cert , Subject Alternative Name (SAN) , group_replication_group_seeds.
group_replication_member_weight . , , , .
:
SET SQL_LOG_BIN=0;
CREATE USER 'replication'@'%' IDENTIFIED BY '[ ]' REQUIRE SSL;
GRANT replication slave ON *.* TO 'replication'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'replication'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
:
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SHOW PLUGINS;
, :
CHANGE REPLICATION SOURCE TO SOURCE_USER='replication', SOURCE_PASSWORD='[ ]' \\
FOR CHANNEL 'group_replication_recovery';
. group_replication_bootstrap_group , , :
SET GLOBAL group_replication_bootstrap_group=ON; #
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF; #
, :
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 |example1.com | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
MySQL .
14:
Zabbix , . MySQL , , .
12- , (server-id, group_replication_local_address). , group_replication_bootstrap_group .
Distributed Recovery mysql_clone . , , , .
, , .
, my.cnf group_replication_start_on_boot off on MySQL .
SELECT * FROM performance_schema.replication_group_members; - .
SELECT * FROM performance_schema.replication_group_member_stats\G - .
SELECT group_replication_set_as_primary('[uuid ]'); - .
Zabbix
Zabbix , , . . , Primary , , Zabbix , , . HADNS, Zabbix IP DNS .
Peut-être que tout n'est pas fait aussi élégamment que nous le souhaiterions. Vous voudrez peut-être utiliser mysql-shell, mysqlrouter et convertir la réplication de groupe en InnoDB Cluster, ou ajouter HAProxy, en particulier lorsque vous déployez Zabbix à partir de zéro. J'espère que cette histoire servira de bon point de départ et qu'elle sera utile. Merci pour l'attention!
documentation supplémentaire
https://dev.mysql.com/doc/refman/8.0/en/group-replication.html
https://blog.zabbix.com/scaling-zabbix-with-mysql-innodb-cluster/8472/
https://en.wikipedia.org/wiki/Paxos_(computer_science)