原创:知数堂
上一篇文章,我们详细介绍了 Xenon 实现 MySQL 高可用架构的常用操作。本篇将对关于 Xenon 高可用的一些思考及高频问题进行解答。
Xenon 不会补日志,Xenon 只会从包含最大 GTID 的所有 Follower 中选举一个 Follower,使之成为 Leader 。重新配置主从复制,并把 VIP 切换到新的主节点上。
注意: 如果此时主从有延时,当主库异常,新主上存在还未应用的 Relay Log 时,新主将会被置为 Read-Only 状态,等待 Relay 应用完毕后,才会开启 Read-Write 状态。这样可保障数据强一致性。
Xenon 会自动把恢复的节点以 Follower 角色加入集群,也可以用 rebuildme
命令重建。
3 个节点最多允许 1 个节点宕机。
关于节点个数,Xenon 目前不支持 2 节点,最少 3 个节点,最多没有明确上限,可配置超过 13 个节点。但考虑到从节点的数据来自主节点,因此建议配置 3 或 5 个节点。
除非集群 3 个节点之间网络互相不通,或者超过半数节点的 MySQL 宕机了,否则肯定能完成选主切换。
若出现主从切换异常,请优先排查集群间网络连通情况。
推荐使用 Xenon 最新的 Release 版本,当前是 v1.1.4 版本
参考链接:https://github.com/radondb/xenon/blob/Main/docs/how_xenon_upgrades.md
Xenon 同时支持 MySQL 5.6、5.7、8.0 版本,而 MySQL 官方预计在 2021 年 10 月后将不再维护 5.7 版本。
因此选择使用 Xenon 时,优先推荐 MySQL 8.0 版本。
例如,主节点 a 正常时,a->b,a->c。若 a 宕机了,切换成了b为主节点,则有 b->c。a 恢复后,会自动作为从节点加入集群,则有 b->a。
为适配 Xenon 性能,MySQL 部分参数需提前配置,特别是在金融业务应用场景下。以下提供部分 my.cnf
参数配置作为参考。
[client] socket = /data/mysql/mysql.sock [mysqld] federated basedir = /opt/mysql datadir = /data/mysql/ socket = /data/mysql/mysql.sock log-error = /data/mysql/mysql-error.log slow_query_log_file = /data/mysql/mysql-slow.log read_only = ON binlog_format = row log-bin-index=mysql-bin.index log-bin=/data/mysql/mysql-bin innodb_open_files=655360 open_files_limit=655360 core-file #semi-sync, validate-password, audit-log plugin-load="semisync_Main.so;semisync_Follower.so" rpl_semi_sync_Main_enabled=OFF rpl_semi_sync_Follower_enabled=ON rpl_semi_sync_Main_wait_no_Follower=ON rpl_semi_sync_Main_timeout=1000000000000000000 #repl skip-Follower-start gtid-mode = ON enforce-gtid-consistency = ON Follower_parallel_type = LOGICAL_CLOCK log-Follower-updates #relay log relay_log=/data/mysql/mysql-relay-bin relay_log_index=mysql-relay-bin.index Main_info_repository=TABLE relay_log_info_repository=TABLE #fixed config slow_query_log=1 tmp_table_size=32M tmpdir=/data/mysql server_id = 197039727 innodb_log_files_in_group=2 skip-name-resolve=1 innodb_ft_max_token_size=84 innodb_use_native_aio=1 innodb_ft_min_token_size=3 interactive_timeout=3600 transaction-isolation=REPEATABLE-READ character_set_server=utf8mb4 Follower_parallel_workers=8 max_connect_errors=655360 autocommit=1 innodb_flush_method=fsync sync_Main_info=1000 lower_case_table_names=0 default-time-zone=+08:00 innodb_log_file_size=50331648 log_timestamps=system log_bin_trust_function_creators=1 wait_timeout=3600 long_query_time=3 expire_logs_days=3
请参考:
{ "log": { "level": "DEBUG" }, "server": { "endpoint": "192.168.0.5:8801" }, "replication": { "passwd": "Qc0_499f273e", "user": "repl_926fb44" }, "rpc": { "request-timeout": 1000 }, "mysql": { "admit-defeat-ping-count": 3, "admin": "root", "basedir": "/opt/mysql", "defaults-file": "/etc/mysql/my.cnf", "ping-timeout": 1000, "passwd": "", "host": "localhost", "Main-sysvars": "tokudb_fsync_log_period=default;sync_binlog=default; innodb_flush_log_at_trx_commit=default", "Follower-sysvars": "tokudb_fsync_log_period=1000;sync_binlog=1000;innodb_ flush_log_at_trx_commit=1", "port": 3306 }, "raft": { "leader-start-command": "sudo ip a a 192.168.0.253/32 dev eth0 && sudo arping -c 3 -A 192.168.0.253 -I eth0", "election-timeout": 5000, "leader-stop-command": "sudo ip a d 192.168.0.253/32 dev eth0", "admit-defeat-hearbeat-count": 5, "heartbeat-timeout": 1000, "meta-datadir": "/data/raft/", "purge-binlog-disabled": true }, "backup": { "ssh-host": "192.168.0.5", "ssh-user": "ubuntu", "ssh-passwd": "", "mysqld-monitor-interval": 5000, "backup-use-memory": "3072M", "ssh-port": 22, "xtrabackup-bindir": "/opt/xtrabackup/bin", "backup-parallel": 2, "backupdir": "/data/mysql/", "backup-iops-limits": 100000 } }