Вопрос или проблема
Я пытаюсь настроить репликацию между двумя серверами MySQL 5.7. Я могу подключиться к источнику с реплики, но когда я пытаюсь запустить репликацию, реплика не удается подключиться к источнику. Что может вызвать это?
Это успешно открывает клиент MySQL, подключённый к источнику:
# На реплике
$ mysql -u [my_user] -p -h [source_host] \
--ssl-mode=REQUIRED \
--ssl-ca=/etc/[source_host].cabundle
Статус источника:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.002513 | 45687316 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
На реплике:
mysql> CHANGE MASTER TO
-> MASTER_HOST='[source_host]',
-> MASTER_USER='[my_user]',
-> MASTER_PASSWORD='[my_password]',
-> MASTER_LOG_FILE='mysql-bin.002495',
-> MASTER_LOG_POS=154,
-> MASTER_SSL=1,
-> MASTER_SSL_VERIFY_SERVER_CERT=0,
-> MASTER_SSL_CA='/etc/ssl/[source_host].cabundle'
-> ;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
Статус реплики:
mysql> show slave stauts \G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: [source_host]
Master_User: [my_user]
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.002495
Read_Master_Log_Pos: 154
Relay_Log_File: [hostname]-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.002495
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /etc/ssl/[source_host].cabundle
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 2026
Last_IO_Error: error connecting to master '[my_user]@[source_host]:3306' - retry-time: 60 retries: 4
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: [mysql_dir]/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 250115 03:03:38
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Журнал ошибок MySQL на реплике:
[Note] 'CHANGE MASTER TO FOR CHANNEL '' executed'. Previous state master_host="[source_host]", master_port= 3306, master_log_file="", master_log_pos= 4, master_bind=''. New state master_host="[source_host]", master_port= 3306, master_log_file="mysql-bin.002495", master_log_pos= 154, master_bind=''.
[Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
[Warning] Slave SQL for channel '': If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0
[Note] Slave SQL thread for channel '' initialized, starting replication in log 'mysql-bin.002495' at position 154, relay log './analysis-relay-bin.000001' position: 4
[ERROR] Slave I/O for channel '': error connecting to master '[my_user]@[source_host]:3306' - retry-time: 60 retries: 1, Error_code: 2026
Журнал ошибок MySQL на источнике:
[Note] Bad handshake
-
То, что вы показали здесь, не похоже на вывод
show slave status
(show slave status \G
легче читать). -
Когда вы подключаетесь через командную строку, вы явно указываете клиенту, где найти CA-сертификат – вы НЕ сделали этого при создании канала репликации (MASTER_SSL_CAPATH=…)
-
Ошибка 2026 — это ошибка в процессе согласования TLS-соединения
Попробуйте указать путь к CA в команде start slave.
Ответ или решение
У вас возникает проблема с подключением реплики к источнику в MySQL 5.7, несмотря на успешное соединение с источником через MySQL-клиент. Рассмотрим причины и возможные решения этой проблемы.
Теория
Основная причина, по которой реплика может подключаться к источнику через клиент, но не через механизм репликации, может заключаться в неправильной конфигурации SSL или в проблемах с аутентификацией. Ошибка 2026 указывает на проблему при согласовании TLS-соединения между репликой и источником, а сообщение "Bad handshake" на источнике подтверждает это.
Пример
В вашей настройке MySQL-клиент на реплике явно указывает, что необходимо использовать SSL и предоставляет расположение CA-сертификата через флаг --ssl-ca
. Однако в команде CHANGE MASTER TO
отсутствует эквивалентный параметр, что может стать проблемой. Например, отсутствует использование MASTER_SSL_CAPATH
.
Применение
-
Проверка и уточнение параметров SSL:
- Вкоманде
CHANGE MASTER TO
убедитесь, что вы используетеMASTER_SSL_CA
иMASTER_SSL_CAPATH
. ЕслиMASTER_SSL_CAPATH
не указан, попробуйте добавить его, указав путь к CA-сертификату. - Убедитесь, что сертификаты действительны и находятся в правильных местах на обеих машинах.
- Вкоманде
-
Проверка аутентификации:
- Убедитесь, что пользователь имеет правильные права доступа и используется корректный набор данных для аутентификации.
-
Консистентность и синхронизация:
- Проверьте и исправьте начальные параметры, такие как
MASTER_LOG_FILE
иMASTER_LOG_POS
, чтобы они соответствовали действительному состоянию источника.
- Проверьте и исправьте начальные параметры, такие как
-
Логи и ошибки:
- Следите за
error.log
как на реплике, так и на источнике, чтобы выявлять и исправлять ориентированные на сертификаты или сетевые ошибки связи.
- Следите за
Следуя вышеизложенным рекомендациям, вы сможете устранить проблему согласования TLS и обеспечите корректную настройку репликации MySQL.