天天看點

故障分析 | 一個因 SSL 配置導緻的複制異常報錯

作者:愛可生

在建構 MySQL 複制過程中,IO 線程始終連接配接不上主庫,反複确認複制賬号的權限、賬号密碼都沒問題,最終定位為 SSL 配置的問題。

作者:木闆。某全國性股份制銀行 DBA。擅長 DB2,MySQL 和 Oracle 資料庫的運作維護和調優、排錯。

本文來源:原創投稿

  • 愛可生開源社群出品,原創内容未經授權不得随意使用,轉載請聯系小編并注明來源。

故障背景

在做 MySQL 同構的資料遷移過程中,我們通常隻需要按流程搭建主從保持資料同步即可。一般建構複制隻要網絡沒問題,基本都能順利建構成功。而這次踩了一個小坑,記錄一下。

同僚回報做完 change master 後,IO 線程始終顯示連接配接不上主庫,已經反複确認該複制賬号的權限、賬号密碼都沒問題,且也驗證了通過 MySQL 用戶端的指令行輸入相同的賬号密碼能正常連接配接到主庫,已經做了以下場景的排除工作:

  • 排除了賬号密碼錯誤的問題
  • 排除了賬号權限不足的問題
  • 排除了網絡不通的問題

故障分析

  • 通過源端主庫的錯誤日志也能持續觀測到該複制使用者頻繁的嘗試連接配接但都失敗,錯誤日志的報錯僅告知用了密碼但通路受限,比較正常的報錯資訊。
2021-06-07T16:56:54.812721+08:00 121 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master '[email protected]:3310' - retry-time: 60 retries: 1 message: Access denied for user 'repl'@'10.186.61.27' (using password: YES), Error_code: MY-001045

2021-06-07T16:57:54.817711+08:00 121 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master '[email protected]:3310' - retry-time: 60 retries: 2 message: Access denied for user 'repl'@'10.186.61.27' (using password: YES), Error_code: MY-001045           

通過 mysql.user 表觀測複制使用者的權限細節,觀測到該使用者有一個特殊的屬性設定,ssl_type=ANY 該設定引起了注意。基于官方文檔得知,該選項是用來控制使用者是否開啟 SSL 方式登入。如果為 ANY 則表示用該使用者連接配接時,必須使用 SSL 方式,否則無法登入。

MySQL 用戶端在 5.7 以後預設就開啟 SSL,是以正常情況下無需明确指定即是 SSL 方式。
10.186.61.27:3310  SQL > select user,host,ssl_type from mysql.user;
+------------------+-----------+----------+
| user             | host      | ssl_type |
+------------------+-----------+----------+
| repl             | %         | ANY      |
| root             | %         |          |
| zhenxing         | %         |          |
| sysbench         | 10.186.%  |          |
| mysql.infoschema | localhost |          |
| mysql.session    | localhost |          |
| mysql.sys        | localhost |          |
| root             | localhost |          |
+------------------+-----------+----------+


CHANGE MASTER TO
  MASTER_HOST='10.186.61.27',
  MASTER_USER='repl',
  MASTER_PASSWORD='xxxx',
  MASTER_PORT=3310,
  MASTER_AUTO_POSITION=1;
  
Last_IO_Errno: 1045
Last_IO_Error: error connecting to master '[email protected]:3310' - retry-time: 60 retries: 1 message: Access denied for user 'repl'@'10.186.61.27' (using password: YES)           

問題複現

嘗試複現驗證是否為該屬性導緻,在用 MySQL 登入資料庫時明确的關閉 SSL 嘗試 mysql --ssl-mode=disable,結果如預期的一樣,報錯無法連接配接,但并沒有報錯是因為 SSL 的原因。

[root@10-186-61-27 ~]# mysql -h10.186.61.27 -urepl -p -P3310
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29
Server version: 8.0.22-commercial MySQL Enterprise Server - Commercial
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
[email protected][(none)]>


-- --ssl-mode=disable
[root@10-186-61-27 ~]# mysql -h10.186.61.27 -urepl -p -P3310 --ssl-mode=disable
ERROR 1045 (28000): Access denied for user 'repl'@'10.186.61.27' (using password: YES)           

問題總結

  1. 預設情況下,複制建構是不使用 SSL 的,除非明确的指定 SSL 相關的參數。具體配置方式可參考官方文檔。
  2. 使用者連接配接異常的情況,不僅涉及權限、密碼等問題,對于使用者的連接配接控制屬性也需要進行觀測,如 mysql.user 表的以下字段 :

ssl_type

max_questions

max_updates

max_connections

max_user_connections

plugin

password_expired

password_lifetime

account_locked

  1. 1045 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 常見報錯場景:
  • 使用者名不正确
  • 資料庫使用者受到連接配接主機限制,目前主機不允許連接配接
  • 密碼填寫錯誤
  • 當密碼出現在 Shell 腳本中,并且包含特殊字元如 $,#,! 等時
  • 當密碼出現在配置檔案中,并且包含特殊字元 # 時,需要用雙引号将密碼括起來
  • 開啟了 SSL 連接配接屬性
  • DNS 伺服器解析主機名異常
  • 指定的資料庫 IP 錯誤
  • 使用了外部的認證方式,(如 AD、PAM、LDAP 等),但配置不正确

解決辦法

  1. 關閉該使用者強制需要 SSL 連接配接的屬性

alter user xxx REQUIRE NONE;

  1. change master 操作時,明确指定 MASTER_SSL 等 SSL 參數配置
CHANGE MASTER TO
  MASTER_HOST='10.186.61.27',
  MASTER_USER='repl',
  MASTER_PASSWORD='xxxx',
  MASTER_PORT=3310,
  MASTER_AUTO_POSITION=1,
  MASTER_SSL=1;           

關于 SQLE

愛可生開源社群的 SQLE 是一款面向資料庫使用者和管理者,支援多場景稽核,支援标準化上線流程,原生支援 MySQL 稽核且資料庫類型可擴充的 SQL 稽核工具。

繼續閱讀