MHA 切换的2个异常(masterha_master_switch line 53)

MHA故障转移与在线切换IP地址问题解决
本文详细阐述了MHA在测试手动故障转移和在线切换过程中遇到的两个诡异问题,即使用IP地址调用时均无法测试成功,并提供了对应的解决方案。通过将IP地址替换为主机名,问题得以解决。同时强调了在配置文件中参数的正确使用,避免使用IP地址作为死主节点标识。

        MHA 在测试手动故障转移和在线切换的过程中,碰到了2个比较诡异的问题,在使用IP地址调用的时候均无法测试成功,出现了Detected dead master xxx does not match with specified dead master以及xxx is not alive。下面是这2个错误问题的描述及解决方案。

 

1、MHA配置文件
[root@vdbsrv4 ~]# more /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log

user=mha
password=xxx
ssh_user=root
repl_user=repl  
repl_password=repl  
ping_interval=1
shutdown_script=""
master_ip_online_change_script=""
report_script=""
#master_ip_failover_script=/usr/bin/master_ip_failover
master_ip_failover_script=/tmp/master_ip_failover
 
[server1]
hostname=vdbsrv1
master_binlog_dir=/data/mysqldata

[server2]
hostname=vdbsrv2
master_binlog_dir=/data/mysqldata

[server3]
hostname=vdbsrv3
master_binlog_dir=/data/mysqldata/
#candidate_master=1

 

2、手动故障转移时的错误提示
[root@vdbsrv4 ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=192.168.1.6 \
> --dead_master_port=3306 --new_master_host=192.168.1.8 --new_master_port=3306 --ignore_last_failover
--dead_master_ip=<dead_master_ip> is not set. Using 192.168.1.6.
Wed Apr 21 09:08:30 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Apr 21 09:08:30 2015 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Wed Apr 21 09:08:30 2015 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Wed Apr 21 09:08:30 2015 - [info] MHA::MasterFailover version 0.56.
Wed Apr 21 09:08:30 2015 - [info] Starting master failover.
Wed Apr 21 09:08:30 2015 - [info]
Wed Apr 21 09:08:30 2015 - [info] * Phase 1: Configuration Check Phase..
Wed Apr 21 09:08:30 2015 - [info]
Wed Apr 21 09:08:31 2015 - [info] GTID failover mode = 0
Wed Apr 21 09:08:31 2015 - [error][/usr/lib/perl5/site_perl/5.8.8/MHA/MasterFailover.pm, ln2083] Detected dead master vdbsrv1(192.168.1.6:3306)
   does not match with specified dead master 192.168.1.6(192.168.1.6:3306)!
Wed Apr 21 09:08:31 2015 - [error][/usr/lib/perl5/site_perl/5.8.8/MHA/MasterFailover.pm, ln2151]
   Got ERROR:  at /usr/bin/masterha_master_switch line 53

 

3、在线切换时的错误提示
[root@vdbsrv4 ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.1.8 \
> --orig_master_is_new_slave --running_updates_limit=10000
Tue Apr 21 11:50:14 2015 - [info] MHA::MasterRotate version 0.56.
Tue Apr 21 11:50:14 2015 - [info] Starting online master switch..
Tue Apr 21 11:50:14 2015 - [info]
Tue Apr 21 11:50:14 2015 - [info] * Phase 1: Configuration Check Phase..
Tue Apr 21 11:50:14 2015 - [info]
Tue Apr 21 11:50:14 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Apr 21 11:50:14 2015 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Tue Apr 21 11:50:14 2015 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Tue Apr 21 11:50:14 2015 - [info] GTID failover mode = 0
Tue Apr 21 11:50:14 2015 - [info] Current Alive Master: vdbsrv1(192.168.1.6:3306)
Tue Apr 21 11:50:14 2015 - [info] Alive Slaves:
Tue Apr 21 11:50:14 2015 - [info]   vdbsrv2(192.168.1.7:3306)  Version=5.6.22-log (oldest major version between slaves) log-bin:enabled
Tue Apr 21 11:50:14 2015 - [info]     Replicating from 192.168.1.6(192.168.1.6:3306)
Tue Apr 21 11:50:14 2015 - [info]   vdbsrv3(192.168.1.8:3306)  Version=5.6.22-log (oldest major version between slaves) log-bin:enabled
Tue Apr 21 11:50:14 2015 - [info]     Replicating from 192.168.1.6(192.168.1.6:3306)

It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on vdbsrv1(192.168.1.6:3306)? (YES/no): yes
Tue Apr 21 11:50:41 2015 - [info] Executing FLUSH NO_WRITE_TO_BINLOG TABLES. This may take long time..
Tue Apr 21 11:50:41 2015 - [info]  ok.
Tue Apr 21 11:50:41 2015 - [info] Checking MHA is not monitoring or doing failover..
Tue Apr 21 11:50:41 2015 - [info] Checking replication health on vdbsrv2..
Tue Apr 21 11:50:41 2015 - [info]  ok.
Tue Apr 21 11:50:41 2015 - [info] Checking replication health on vdbsrv3..
Tue Apr 21 11:50:41 2015 - [info]  ok.
Tue Apr 21 11:50:41 2015 - [error][/usr/lib/perl5/site_perl/5.8.8/MHA/MasterRotate.pm, ln228] 192.168.1.8 is not alive!
Tue Apr 21 11:50:41 2015 - [error][/usr/lib/perl5/site_perl/5.8.8/MHA/MasterRotate.pm, ln613] Failed to get new master!
Tue Apr 21 11:50:41 2015 - [error][/usr/lib/perl5/site_perl/5.8.8/MHA/MasterRotate.pm, ln652] Got ERROR:  at /usr/bin/masterha_master_switch line 53

 

4、解决方案
      直接将IP地址替换为主机名后问题解决,不再演示。

       按官方文档描述,参数--dead_master_host=(hostname),而不是可以用IP地址。

       If these parameters are not set, --dead_master_ip will be the result of gethostbyname(dead_master_host), and --dead_master_port will be 3306.

       补充: 如果配置文件里hostname=IP地址,则在切换的时候使用IP地址也是可行的。 @20150522


<think>我们正在讨论MaxScale的两个关键点:`master_accept_reads`参数的作用,以及MaxScale与MariaDB的连接原理。根据引用内容,我们可以整合相关信息。首先,关于`master_accept_reads`参数:引用[4]提到了maxscalerouter之readwritesplit的参数,其中虽然没有直接提到`master_accept_reads`,但我们可以根据经验推断,这个参数通常出现在读写分离的路由配置中。它的作用一般是控制是否允许将读请求(SELECT)发送到主节点(master)。默认情况下,读写分离会将读请求发送到从节点,写请求发送到主节点。但在某些情况下,比如从节点延迟较大或者没有从节点可用时,我们可能希望将读请求也发送到主节点,以避免读不到最新数据或者没有节点可用的情况。因此,`master_accept_reads`参数的作用是:-当设置为`true`(默认值可能是`false`)时,允许将读请求发送到主节点。-当设置为`false`时,读请求只能发送到从节点,即使主节点是唯一可用的节点,读请求也不会发送到主节点(这可能导致读请求失败)。注意:该参数的具体默认值和可用性可能因版本而异,需要查看对应版本的官方文档。其次,关于MaxScale与MariaDB的连接原理:引用[2]和[3]提到MaxScale是一个中间件,实现MySQL读写分离与负载均衡。应用连接MaxScale,MaxScale再连接后端的MariaDB服务器。引用[1]给出了MaxScale服务的配置,包括启动用户、配置文件路径等。引用[5]提到下载和安装MaxScale。连接原理可以概括为:1.应用服务使用MySQL协议连接到MaxScale监听的端口(如4006)。2.MaxScale根据配置的路由规则(如readwritesplit)对SQL语句进行解析,决定将请求发送到哪个后端数据库服务器。3.MaxScale与后端MariaDB服务器建立连接,并转发请求。4.MaxScale将数据库返回的结果转发给应用。在连接过程中,MaxScale会维护一个到后端数据库的连接池,以复用连接,提高性能。下面详细说明:###1.`master_accept_reads`参数详解该参数通常出现在读写分离路由器(readwritesplit)的配置中。例如:```ini[Read-Write-Service]type=servicerouter=readwritesplitservers=server1,server2master_accept_reads=true#允许读操作发送到主节点```**作用**:-`true`:当从节点不可用或延迟过大时,允许将读操作发送到主节点,确保读操作可以执行。-`false`:读操作只能发送到从节点。如果所有从节点都不可用,读操作将失败(即使主节点可用)。**使用场景**:-在从节点延迟较大但主节点负载不高的情况下,可以临时允许读主,减轻从节点压力并保证读取最新数据。-在只有主节点的情况下(例如没有配置从节点),必须设置为`true`才能执行读操作。**注意**:该参数可能会影响读写分离的效果(增加主节点负担),需根据实际情况调整。###2.MaxScale与MariaDB连接原理MaxScale作为中间件,连接原理分为两个层面:**a.应用服务与MaxScale的连接**-应用使用标准MySQL客户端协议连接MaxScale(如通过JDBC、mysql命令行等)。-MaxScale监听一个或多个端口(如4006),接收客户端连接。-认证:MaxScale可以配置为使用后端数据库的认证(直通模式)或本地认证。**b.MaxScale与MariaDB的连接**-**连接池**:MaxScale为每个后端数据库服务器维护一个连接池。当应用发送请求时,MaxScale从连接池中获取一个空闲连接(或建立新连接)来执行查询。-**路由决策**:根据路由模块(如readwritesplit)决定将请求发送到哪个服务器。例如:-写请求(INSERT/UPDATE/DELETE等)发送到主节点。-读请求(SELECT)根据负载均衡策略(如LEAST_CURRENT_OPERATIONS)发送到从节点。-**结果返回**:MaxScale接收到MariaDB的响应后,将结果返回给应用,并释放连接回连接池(如果连接可复用)。**连接池配置示例**(在MaxScale配置文件中):```ini[server1]type=serveraddress=192.168.1.10port=3306protocol=MySQLBackendconnection_timeout=10s```**连接复用优势**:-减少与后端数据库建立连接的开销(TCP三次握手、认证等)。-有效管理数据库连接数,避免数据库因连接过多而崩溃。**监控与故障转移**:-MaxScale通过监控模块(如`mariadbmon`)定期检查后端数据库状态。-当主节点故障时,监控模块触发故障转移,将写请求路由到新的主节点(需配合GaleraCluster或MHA等)。引用[4]中提到的连接选择策略(如`LEAST_CURRENT_OPERATIONS`)也是MaxScale连接管理的一部分,用于优化读请求的分发。###总结1.**`master_accept_reads`**:控制读请求是否可发送到主节点,用于增强系统在从节点不可用时的可用性。2.**连接原理**:-应用连接MaxScale(模拟MySQL服务器)-MaxScale通过连接池连接后端MariaDB,并根据路由规则转发请求-连接池复用连接,提高性能配置示例(读写分离服务启用`master_accept_reads`):```ini[ReadWrite-Split]type=servicerouter=readwritesplitservers=master,slave1,slave2user=maxscalepassword=********master_accept_reads=true#允许读主max_slave_connections=100%#允许使用所有从节点```注意:实际使用时需结合监控模块和负载均衡策略进行调优。如果遇到从节点延迟大或不可用的情况,设置`master_accept_reads=true`可提高读操作可用性,但会增加主节点负担,需权衡使用。以上内容参考了提供的引用并结合了MaxScale的常规知识。下面生成相关问题:</think>### MaxScale `master_accept_reads` 参数详解及连接原理 #### 一、`master_accept_reads` 参数作用 `master_accept_reads` 是 MaxScale 读写分离路由(`readwritesplit`)的关键参数,主要控制**主节点(Master)是否接受读请求**: ```ini [Read-Write-Service] type=service router=readwritesplit servers=master,slave1,slave2 master_accept_reads=true # 核心参数 ``` | 参数值 | 行为 | 适用场景 | |--------|------|----------| | `true` (默认) | 允许读请求发送到主节点 | 从节点延迟较高时保证读取最新数据 | | `false` | 强制所有读请求仅发送到从节点 | 严格读写分离,减轻主节点压力 | **工作原理**: 1. 当 SQL 为 `SELECT` 时: - `master_accept_reads=true`:优先发送到从节点,但当: - 所有从节点不可用 - 从节点延迟超过 `max_slave_replication_lag` - 事务内查询(需读最新数据) 会**自动降级到主节点** - `master_accept_reads=false`:即使主节点是唯一可用节点,也**拒绝读请求** 2. 典型配置示例: ```ini [readwritesplit] master_accept_reads=true max_slave_replication_lag=5 # 从库最大允许延迟() slave_selection_criteria=LEAST_CURRENT_OPERATIONS # 选择活动连接最少的从节点[^4] ``` #### 二、MaxScale 与 MariaDB 连接原理 ##### 核心架构 ```mermaid graph LR A[应用服务] -->|MySQL协议| B(MaxScale) B --> C{路由决策} C -->|写操作| D[Master] C -->|读操作| E[Slave1] C -->|读操作| F[Slave2] ``` ##### 关键连接机制 1. **协议层转换** - MaxScale 同时实现 **MySQL客户端协议** (前端)和 **MySQL服务端协议** (后端) - 应用连接 MaxScale 时: ```bash mysql -h MaxScale_IP -P 4006 -u user -p # 连接示例[^2] ``` - MaxScale 解析协议后,转换为后端 MariaDB 协议 2. **连接池管理** - 维护到每个后端节点的 **复用连接池** - 配置参数: ```ini [server1] type=server address=192.168.1.10 port=3306 connection_timeout=10s max_connections=1000 # 最大连接数[^1] ``` 3. **路由决策流程** 1. 接收 SQL 请求 2. 解析 SQL 类型: - `INSERT/UPDATE/DELETE` → 路由到主节点 - `SELECT` → 根据 `master_accept_reads` 和从节点状态路由 3. 从连接池获取物理连接 4. 转发 SQL 并返回结果 4. **故障转移机制** - 监控模块(如 `mariadbmon`)每秒检测: ```sql SHOW GLOBAL STATUS LIKE 'wsrep_ready'; # Galera集群检测[^3] ``` - 主节点故障时: - 自动切换到新主节点 - 更新路由表 - 客户端连接保持有效(需 `retry_on_failure=true`) #### 三、配置实践建议 **读写分离优化配置**: ```ini [ReadWrite-Service] router=readwritesplit servers=master,slave1,slave2 master_accept_reads=true # 允许主节点处理读请求 max_slave_connections=70% # 从节点最大连接占比 connection_keepalive=300s # 连接保活时间[^1] ``` **连接池监控命令**: ```bash maxctrl list servers --tsv | awk '{print $1, "连接数:" $6}' ``` #### 四、典型问题处理 1. **主节点过载** - 现象:主节点 CPU 利用率高 - 解决方案:设置 `master_accept_reads=false` 强制读请求到从节点 2. **读取过时数据** - 现象:从节点延迟导致读取旧数据 - 解决方案: ```ini master_accept_reads=true # 允许降级到主节点 max_slave_replication_lag=3 # 设置严格延迟阈值 ``` 3. **连接泄露** - 排查方法: ```bash maxctrl show sessions | grep 'Duration' ``` - 修复:调整 `connection_keepalive` 和 `connection_timeout`[^1] > **最佳实践**:在 Galera 集群中,建议设置 `master_accept_reads=false` 以充分利用多主写入能力,避免单点过载。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值