双机热备如何在pc上实现

目前开发了一个运用ocr模型的文字提取程序,实现对大量图片的批量提取并存储所获的文字信息。
因批量提取的过程耗时较长,需要设计双机热备份系统。该系统需要做到在主机故障时自动切换到从机上按原进度继续提取进程。
该程序目前仅在pc上运行,暂不考虑大型服务器与磁盘阵列等设备。
请问,设计该功能的大概思路是什么。市面上的双机热备份软件是否可以在两个pc端上实现该功能。

windows server就支持群集(cluster),包括了故障转移群集。就可以实现你的要求。
另外就是,可以借助虚拟化的方案,把整个内存都dump过去,然后实现虚拟机无缝迁移。那么可以实现不停机的让你的程序在不同物理主机上移动。

windows故障集群支持三种模式,具体你可以翻阅我们官网,我们现在成熟的方案是把备份数据留存在本地磁盘,在azure上搭建一个一样的共享磁盘(存放文字信息),有需要可以点开官网商务合作

设计双机热备份系统的主要思路是确保两台机器的工作状态保持同步。以下是一个简单的方案:

主机和从机都需要运行同样的OCR文字提取程序,而且程序需要在两台机器上都能正常工作。
当主机开始执行任务时,从机处于待命状态,等待主机的状态更新。
主机在提取文字的过程中,需要定时(例如每分钟)将当前的进度信息(例如已经处理的图片数量,当前处理的图片等)写入一个共享存储区。这个存储区可以是一个网络共享文件夹,或者是一个数据库。
如果主机出现故障,从机应该能够检测到(例如通过检查共享存储区的最后一次更新时间),然后从机开始接管任务,从共享的存储区中读取主机的最新进度,然后按原进度继续提取进程。
如果主机恢复正常,那么主机将自动变为从机,并从新的主机(原来的从机)那里同步进度,然后按照新的进度继续执行任务。
关于市面上的双机热备份软件,这些软件一般是为企业级应用设计的,可以在大型服务器和磁盘阵列等设备上运行,但是不一定适合在两个PC端上实现该功能。你需要查看这些软件的说明,看看它们是否支持在两个PC端上运行,并且是否支持你的OCR文字提取程序。如果找不到合适的软件,你可能需要自己编写一个双机热备份的系统,或者修改你的OCR文字提取程序,使其支持双机热备份。

设计双机热备份系统的基本思路是保证在主服务器故障时,备份服务器能够无缝接管主服务器的任务并继续执行。对于你的OCR文字提取程序,可以考虑以下步骤:

  1. 开发双机热备份功能:你需要开发出一种能够在两台PC之间同步数据和状态的功能。这个功能需要在两台机器之间建立通信,当一台机器故障时,另一台机器能够接管并继续执行任务。

a. 状态监测:在两台PC上都需要安装一个程序,用来监测主机的状态。如果主机出现故障(例如,宕机或网络连接中断),备份PC需要能够检测到这个状态。

b. 状态转移:一旦检测到主机故障,备份PC需要接管主机的任务。这可能涉及到转移未完成的任务、接管数据库连接、更新程序状态等。

c. 数据同步:你需要确保两台PC上的数据是同步的。这可能涉及到定期将数据从主机复制到备份PC,或者使用某种形式的分布式文件系统。

  1. 选择合适的双机热备份软件:市面上有一些双机热备份软件,如Symantec Norton Rose、Acronis等,这些软件可以帮助你实现这个功能。你需要选择一个适合你的需求的软件,例如,需要考虑软件的以下方面:

a. 支持多平台:你的双机热备份软件需要在两台PC上都能运行。

b. 支持多种备份类型:软件需要支持多种备份类型,例如,完全备份、增量备份、差异备份等,以便于你在不同情况下使用。

c. 恢复策略:软件需要提供完善的恢复策略,以便在主机故障时能够快速恢复到正常状态。

  1. 测试和验证:开发完成后,你需要进行严格的测试和验证,以确保双机热备份系统能够在主PC故障时正常工作。

需要注意的是,双机热备份系统设计需要考虑很多细节,例如网络延迟、数据一致性、故障恢复时间等。因此,你可能需要深入学习相关知识并仔细设计你的系统。

结合GPT给出回答如下请题主参考
在PC上实现双机热备可以通过使用主从模式来实现。以下是一些实现双机热备的代码案例:

  1. 使用Python实现主从模式

主机:

import socket

HOST = 'localhost'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

从机:

import socket

HOST = 'localhost'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))

在以上的代码中,主机监听端口并等待从机的连接。从机连接时,主机通过accept()接受连接,然后通过recv()sendall()来发送和接受数据。从机启动后,连接到主机并通过sendall()发送数据。主机通过recv()接收数据,然后通过sendall()将数据发送回从机。

  1. 使用Java实现主从模式

主机:

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Server {

  public static final int PORT_NUMBER = 5000;

  public static void main(String[] args) {
    try (ServerSocket serverSocket = new ServerSocket(PORT_NUMBER)) {
      System.out.println("Waiting for client...");
      Socket socket = serverSocket.accept();
      System.out.println("Client connected");

      InputStream in = socket.getInputStream();
      OutputStream out = socket.getOutputStream();

      byte[] buffer = new byte[1024];
      int length;
      while ((length = in.read(buffer)) != -1) {
        out.write(buffer, 0, length);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

从机:

import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Client {

  public static final String HOST = "localhost";
  public static final int PORT_NUMBER = 5000;

  public static void main(String[] args) {
    try (Socket socket = new Socket(HOST, PORT_NUMBER)) {
      System.out.println("Connected to server");

      InputStream in = socket.getInputStream();
      OutputStream out = socket.getOutputStream();

      out.write("Hello, world".getBytes());

      byte[] buffer = new byte[1024];
      int length = in.read(buffer);
      System.out.println(new String(buffer, 0, length));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

在以上的代码中,主机使用ServerSocket监听端口并等待从机的连接。从机连接时,主机通过accept()接受连接,然后通过输入和输出流来接收和发送数据。从机启动后,连接到主机并通过输出流发送数据。主机通过输入流接收数据,然后通过输出流将数据发送回从机。

在实际双机热备系统中,可以使用以上的主从模式来实现主从备份。当主机出现故障时,从机可以自动切换并按照原来的进度继续提取数据。需要注意的是,双机热备系统需要考虑到数据同步的问题,以保证主从备份数据的一致性。

引用 皆我百晓生 小程序回复内容作答:
要在PC上实现双机热备份系统,可以考虑以下思路:

  1. 主机和从机之间的数据同步:确保主机和从机之间的数据保持一致,可以使用文件同步工具或者网络传输协议来实现数据的定期同步或实时同步。这样,在主机故障时,从机上的数据能够与主机上的数据保持同步。

  2. 心跳机制和故障检测:使用心跳机制和定期的故障检测来监控主机的状态。主机和从机之间可以定期发送心跳信号,以确保主机正常运行。如果从机在一段时间内没有收到主机的心跳信号,就可以判定主机发生故障,并触发自动切换到从机。

  3. 故障切换和进程恢复:当检测到主机故障后,从机可以自动接管主机的任务。此时,需要保证从机能够继续之前的提取进程,并且可以按照原进度继续执行。可以使用进程恢复的方式,保存提取进程的状态和进度信息,并在从机上恢复该进程,继续执行。

市面上存在一些双机热备份软件,但大多数是针对服务器和磁盘阵列等大型设备的。在两台PC上实现双机热备份系统可能需要自己开发或使用一些开源工具进行实现。可以尝试使用心跳检查、数据同步和进程恢复等技术来搭建自己的双机热备份系统。具体选择哪种工具或方法,可以根据自身需求和资源情况进行评估和选择。


import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Server {
  public static final int PORT_NUMBER = 5000;
  public static void main(String[] args) {
    try (ServerSocket serverSocket = new ServerSocket(PORT_NUMBER)) {
      System.out.println("Waiting for client...");
      Socket socket = serverSocket.accept();
      System.out.println("Client connected");
      InputStream in = socket.getInputStream();
      OutputStream out = socket.getOutputStream();
      byte[] buffer = new byte[1024];
      int length;
      while ((length = in.read(buffer)) != -1) {
        out.write(buffer, 0, length);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

用一些反向代理来实现双机热备。或者直接买企业服务。

你需要两台PC,一台作为主机,另一台作为从机。这两台PC应该具备相似的硬件和软件配置,以确保平滑的切换。确保主机和从机之间的数据同步。这包括图片数据和已经提取的文字信息。设计一个监控程序,用于监视主机上的文字提取进程。这个监控程序需要能够检测主机上的进程是否运行正常,如果主机上的文字提取进程失败或崩溃,监控程序应该能够触发从机上的相同进程。制定切换策略,包括何时触发切换以及如何在从机上启动文字提取进程。这可能需要一些自动化脚本或程序来实现。在主机和从机之间设置心跳检测机制,以检测主机的健康状态。

双机热备实现方式
可以参考下

结合GPT给出回答如下请题主参考
首先,实现双机热备需要使用到一些平台相关的技术,例如Windows Server Failover Cluster或者Linux高可用方案(如Pacemaker和Corosync)。这些技术可以帮助你在多台机器之间进行自动故障转移和资源管理。

在你的具体情况下,你需要确保OCR程序可以运行在主机和从机之间,并且可以共享存储。这可以通过网络共享文件夹或者网络存储实现。

以下是在Windows Server Failover Cluster上实现基于共享存储的双机热备的代码示例:

  1. 配置共享存储:在所有机器上创建一个共享文件夹来存储OCR程序和提取的文本信息。

  2. 安装Windows Server Failover Cluster:详见https://docs.microsoft.com/en-us/windows-server/failover-clustering/failover-clustering-overview

  3. 在其中一台机器上安装OCR程序并将其存储在共享存储中。

  4. 配置OCR程序,使其可以在主机和从机之间运行。为此,您可以使用如下代码:

import os

if os.path.exists("\\\\共享存储\\OCR程序"):
    OCR_PROGRAM = "\\\\共享存储\\OCR程序"
else:
    OCR_PROGRAM = "C:\\OCR程序"

def extract_text(image):
    # code to extract text from image
    return text

# 主机和从机都会运行以下代码
while True:
    images = get_batch_of_images()
    for image in images:
        text = extract_text(image)
        save_text(text)

在上面的代码中,我们首先检查共享存储是否可用。如果是,我们将OCR程序的路径设置为共享存储的路径。否则,我们将路径设置为本地路径。然后,在主机和从机上运行类似的循环来提取文本,并将其保存到共享存储中。

  1. 配置Windows Server Failover Cluster来管理OCR程序的资源。您可以使用如下代码:
import wmi
import win32com

def create_ocr_resource():
    wmi = win32com.client.GetObject("winmgmts:\\\\.\\root\\MicrosoftFailoverClusters")
    cluster = wmi.ExecQuery("SELECT * FROM MSCluster_Cluster")
    group = cluster[0].CreateClusterGroup("OCR Group")
    resource = group.CreateClusterResource("OCR Resource", "Generic Service", "OCR Program", 1)
    return resource

# 运行以下代码以在主机上启动OCR程序
def start_ocr_program():
    resource = create_ocr_resource()
    resource.StartService("OCR Program")

# 运行以下代码以在主机上停止OCR程序
def stop_ocr_program():
    resource = create_ocr_resource()
    resource.StopService("OCR Program")

在上面的代码中,我们使用WMI API来创建一个OCR资源,并将其添加到一个名为“OCR Group”的组中。然后,我们可以使用该资源来启动和停止OCR程序。在故障转移时,Windows Server Failover Cluster将自动将OCR程序资源从主机转移到从机,以确保OCR程序的持续运行。

希望这个代码示例可以帮助你开始实现双机热备。请注意,这只是一个示例,并且具体实现可能因您的环境和要求而有所不同。

该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


设计该双机热备份系统的大概思路如下:

  1. 主机和从机都需要拥有相同的配置和软件环境,以确保在切换时程序可正常运行。
  2. 利用网络编程技术实现主机和从机之间的实时数据同步,包括正在处理的图片、已经处理的图片数量、存储的文本信息等。
  3. 主机和从机需要同时监控程序的运行状态,一旦发现主机故障,从机需要自动接管已经处理过的任务继续在原进度上进行。
  4. 主机和从机之间需要保持心跳连接,以确保双机热备份系统的实时性和稳定性。

市面上的双机热备份软件主要针对服务器等大型设备,功能较为复杂,不太适用于个人电脑的需求。因此,我们建议采用自行设计的方案来实现该功能。


双机热备 - 知乎 双机热备的概念包括广义和狭义两层含义。 从广义上讲,两台服务器用于备份和执行重要服务的相同服务。当一台服务器出现故障时,另一台服务器可以承担服务任务,从而系统可以自动保证连续服务,无需人工干预。备用… https://zhuanlan.zhihu.com/p/579602322

选择适合的备份策略:备份策略应该考虑到如何避免数据的冲突和丢失。一种常见的策略是主从备份(Master-Slave),其中一台机器(主机)负责处理任务,另一台机器(从机)则作为备份。主机出现故障时,从机可以接管任务。
任务分发与同步:你需要一个方法来分发任务到两个机器,并确保它们在处理任务时的进度是同步的。这可以通过某种形式的分布式锁或者消息队列来实现。当一台机器完成任务后,它需要将结果通知给另一台机器,以便保持两者之间的同步。
故障检测与恢复:你需要一个方法来检测主机是否出现故障。这可以通过定期发送心跳信号(Heartbeat)来实现,如果从机在一段时间内没有收到主机的心跳信号,它就认为主机已经故障。此时,从机可以接管任务并继续处理。
数据存储:在两个机器之间共享数据的一种常见方法是使用某种形式的共享存储,如网络文件系统(NFS)或者分布式文件系统(例如HDFS)。这样,无论哪个机器在处理任务,它们都可以访问相同的共享数据。
监控与日志:为了确保系统的正常运行,你需要监控系统的状态并记录日志。这可以帮助你及时发现并解决问题。

参考gpt
要在两台PC上实现双机热备份系统,可以考虑以下步骤和思路:

  1. 确定主机和从机:选择两台性能相近的PC,其中一台作为主机,另一台作为从机。

  2. 安装必要的软件和工具:在主机和从机上安装所需的OCR程序、数据库或文件系统等必要的软件和工具。确保两台机器的环境一致。

  3. 数据同步:设置主机和从机之间的数据同步机制,以确保数据在两台机器之间的实时同步。可以使用文件同步工具、数据库复制或网络共享等方式来实现数据同步。

  4. 进程监控:设计一个监控程序,用于监控主机上的OCR进程。如果主机故障或进程终止,监控程序会自动将任务切换到从机上,并按原进度继续进行OCR提取。

  5. 心跳检测:实现主机和从机之间的心跳检测机制,以确保双机之间的连接正常。如果主机无法响应心跳检测,从机会自动接管任务。

  6. 备份策略:制定合适的备份策略,定期备份主机上的数据到从机,以防止数据丢失。

市面上有一些双机热备份软件可以在两台PC上实现该功能,例如Windows Server的Failover Clustering和Linux的Pacemaker/Corosync等。这些软件可以提供高可用性和故障切换的功能,但需要注意它们可能需要特定的操作系统和硬件支持。

如果您不考虑使用这些专门的双机热备份软件,您也可以使用自己编写的脚本和程序来实现上述步骤中的功能。这需要一定的编程和系统管理知识,但可以更加灵活地满足您的需求。

配置双机热备份软件的监控机制,以实时监测主机的状态