Master HA

本文深入解析Spark集群中MasterHA的工作原理及配置方式,包括ZooKeeper、FILESYSTEM、CUSTOM和NONE四种模式,并详细阐述了Master故障转移过程及其对运行中的应用的影响。

一:Master HA解析

1, 生产环境下一般采用ZooKeeper做HA,且建议为3台Master,ZooKeeper会自动化管理Masters的切换;

2, 采用ZooKeeper做HA的时候,ZooKeeper会负责保存整个Spark集群运行时候的元数据:Workers、Drivers、Applications、Executors;

3, ZooKeeper遇到当前Active级别的Master出现故障的时候会从Standby Masters中选取出一台作为Active Master,但是要注意,被选举后到成为真正的Active Master之间需要从ZooKeeper中获取集群当前运行状态的元数据信息并进行恢复;

4, 在Master切换的过程中,所有的已经在运行的程序皆正常运行!因为Spark Application在运行前就已经通过Cluster Manager获得了计算资源,所以在运行时Job本身的调度和处理和Master是没有任何关系的!

5, 在Master的切换过程中唯一的影响是不能提交新的Job:一方面不能够提交新的应用程序给集群,因为只有Active Master才能接受新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为Action操作触发新的Job的提交请求;

二:Master HA的四大方式

1, Master HA的四大方式风别是:ZOOKEEPER、FILESYSTEM、CUSTOM、NONE;

2, 需要说明的是:

a) ZOOKEEPER是自动管理Master;

b) FILESYSTEM的方式在Master出现故障后需要手动重新启动机器,机器启动后会立即成为Active级别的Master来对外提供服务(接受应用程序提交的请求、接受新的Job运行的请求)

c) CUSTOM的方式允许用户自定义Master HA的实现,这对于高级用户特别有用;

d) NONE,这是默认情况,当我们下载安装了Spark集群中就是采用这种方式,该方式不会持久化集群的数据,Master启动后立即管理集群;
3.

val serializer = new JavaSerializer(conf)
val (persistenceEngine_, leaderElectionAgent_) = RECOVERY_MODE match {
  case "ZOOKEEPER" =>
    logInfo("Persisting recovery state to ZooKeeper")
    val zkFactory =
      new ZooKeeperRecoveryModeFactory(conf, serializer)
    (zkFactory.createPersistenceEngine(), zkFactory.createLeaderElectionAgent(this))
  case "FILESYSTEM" =>
    val fsFactory =
      new FileSystemRecoveryModeFactory(conf, serializer)
    (fsFactory.createPersistenceEngine(), fsFactory.createLeaderElectionAgent(this))
  case "CUSTOM" =>
    val clazz = Utils.classForName(conf.get("spark.deploy.recoveryMode.factory"))
    val factory = clazz.getConstructor(classOf[SparkConf], classOf[Serializer])
      .newInstance(conf, serializer)
      .asInstanceOf[StandaloneRecoveryModeFactory]
    (factory.createPersistenceEngine(), factory.createLeaderElectionAgent(this))
  case _ =>
    (new BlackHolePersistenceEngine(), new MonarchyLeaderAgent(this))
}

4,PersistenceEngine中有一个至关重要的方法persist来实现数据持久化,readPersistedData来恢复集群中的元数据;

/**
 * Defines how the object is serialized and persisted. Implementation will
 * depend on the store used.
 */
def persist(name: String, obj: Object)
/**
 * Returns the persisted data sorted by their respective ids (which implies that they're
 * sorted by time of creation).
 */
final def readPersistedData(
    rpcEnv: RpcEnv): (Seq[ApplicationInfo], Seq[DriverInfo], Seq[WorkerInfo]) = {
  rpcEnv.deserialize { () =>
    (read[ApplicationInfo]("app_"), read[DriverInfo]("driver_"), read[WorkerInfo]("worker_"))
  }
}

5,FILESYSTEM和NONE的方式均是采用MonarchyElectionAgent的方式来完成Leader选举,其实际实现是直接将传入的Master设置为Leader;
这里写图片描述

### MHA `masterha_manager` 启动后立即退出问题排查 当 `masterha_manager` 启动后立即退出,并且 `nohup.out` 没有日志输出时,可能的原因包括配置文件问题、权限问题、依赖缺失或程序异常退出。以下是对该问题的详细排查步骤: #### 1. **检查配置文件路径及内容** 确保 `/etc/mha/app1.cnf` 文件存在,并且配置正确。MHA 在启动时会读取该配置文件,若文件缺失或配置错误,可能导致程序直接退出。检查配置文件中的关键参数,如 `manager_workdir`、`manager_log`、`ssh_user`、`repl_user`、`repl_password` 等是否正确设置。例如: ```ini [server default] manager_workdir=/var/log/mha/app1 manager_log=/var/log/mha/app1/manager.log ssh_user=root repl_user=repl repl_password=Strong@123 ``` 如果配置文件中存在语法错误或参数缺失,MHA 会因无法解析配置而退出[^1]。 #### 2. **手动运行 `masterha_manager` 以获取错误信息** 为了获取更详细的错误信息,可以手动运行 `masterha_manager` 并将输出重定向到日志文件。使用以下命令: ```bash masterha_manager --conf=/etc/mha/app1.cnf --verbose ``` 这样可以查看实时输出,判断程序是否在启动过程中因某些错误而退出。如果仍然没有输出,尝试将标准输出和标准错误重定向到一个文件中: ```bash masterha_manager --conf=/etc/mha/app1.cnf --verbose > /tmp/mha.log 2>&1 ``` 检查 `/tmp/mha.log` 文件,查看是否有任何错误提示。 #### 3. **检查日志文件路径及权限** MHA 会将运行日志写入 `manager_log` 指定的路径。确保 `/var/log/mha/app1/manager.log` 文件存在,并且 `mha` 用户或运行 `masterha_manager` 的用户具有写入权限。如果目录或文件权限不正确,MHA 无法写入日志,可能导致程序退出。 #### 4. **检查 MHA 安装及依赖** 确保 MHA 已正确安装,并且所有依赖项都已安装完整。MHA 依赖 Perl 模块如 `DBD::mysql`、`Config::Tiny`、`Log::Dispatch` 等。可以使用以下命令检查相关模块是否安装: ```bash perl -e "use DBD::mysql; use Config::Tiny; use Log::Dispatch" ``` 如果缺少某些模块,需要安装相应的 Perl 包。 #### 5. **检查 SSH 连接及 MySQL 复制状态** MHA 依赖 SSH 连接和 MySQL 复制状态。如果 `masterha_check_ssh` 或 `masterha_check_repl` 检查失败,MHA 可能无法正常启动。手动执行以下命令检查: ```bash masterha_check_ssh --conf=/etc/mha/app1.cnf masterha_check_repl --conf=/etc/mha/app1.cnf ``` 如果检查失败,需要修复 SSH 连接问题或 MySQL 复制问题。 #### 6. **使用 `strace` 跟踪系统调用** 如果上述方法仍无法定位问题,可以使用 `strace` 跟踪 `masterha_manager` 的系统调用,查看程序在启动过程中是否因某些系统调用失败而退出: ```bash strace -f -o /tmp/mha_strace.log masterha_manager --conf=/etc/mha/app1.cnf ``` 检查 `/tmp/mha_strace.log` 文件,查找可能导致程序退出的系统调用错误。 #### 7. **检查 MHA 管理进程是否被其他进程终止** 使用以下命令检查 `masterha_manager` 是否被其他进程(如 `pkill` 或系统监控工具)终止: ```bash ps -ef | grep masterha_manager journalctl -u mha-manager.service ``` 如果发现进程被意外终止,需检查系统日志以确定终止原因。 #### 示例命令 - **检查 MHA 状态** ```bash masterha_check_status --conf=/etc/mha/app1.cnf ``` - **查看 MHA 日志** ```bash tail -f /var/log/mha/app1/manager.log ``` - **手动运行 MHA 并重定向日志** ```bash masterha_manager --conf=/etc/mha/app1.cnf --verbose > /tmp/mha.log 2>&1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值