中小型业务场景下的主备部署方案设计

news2024/11/27 21:04:29

之前的文章MongoDB主备副本集方案:两台服务器使用非对称部署的方式实现高可用与容灾备份中,简单讨论下了mongodb的数据同步,但往往并不只是数据库需要同步。在主备架构中,要求主服务器(包含业务程序和数据库)挂掉后,备用服务器能够自动接管请求,需要实现以下几个核心功能:

  1. 业务程序和数据库的部署:主备服务器上运行相同的业务程序和数据库实例。
  2. 实时数据同步:主服务器的数据库和必要数据需要实时或接近实时同步到备服务器。
  3. 自动切换:在主服务器不可用时,备用服务器能自动接管所有请求。
  4. 高可用管理:通过负载均衡器或虚拟 IP (VIP) 实现请求动态转发。

以下是完整的实现方案和步骤。

一、架构设计

整体架构

  1. 两台服务器:
    • 主服务器:运行业务程序和主数据库。
    • 备服务器:运行业务程序和备数据库。
  2. 数据同步:
    • 主数据库与备数据库之间通过文件同步工具或数据库复制实现实时同步。
  3. 高可用管理:
    • 配置负载均衡器(如 HAProxy)或虚拟 IP(如 Keepalived),确保主备服务器的自动切换。

二、详细实现步骤

1. 部署业务程序和数据库

在两台服务器上,部署相同的业务程序和数据库:

  • 业务程序:确保两台服务器运行相同版本的应用程序,并保持配置一致。
  • 数据库:使用 SQLite 或其他轻量级数据库(如 MySQL)。如果使用 SQLite,数据库文件需要同步;如果使用 MySQL,使用主从复制。

2. 数据库同步机制

(1) SQLite 文件同步

SQLite 数据库通过文件级别同步进行数据一致性维护:

  • 启用 WAL 模式
    SQLite 的 WAL 模式支持写日志,可以帮助在备库进行增量同步。

    PRAGMA journal_mode=WAL;
    
  • 使用 rsync
    配置主服务器定时将 SQLite 数据库文件同步到备服务器。脚本示例:

    rsync -avz /path/to/main.db backup-server:/path/to/main.db
    
  • 注意点

    • WAL 文件 (.db-wal) 和共享内存文件 (.db-shm) 需要同步。
    • 主服务器挂掉前,确保数据库已完成 WAL 日志合并。
(2) MySQL 主从复制

如果使用 MySQL,可以配置主从复制:

  • 主库配置
    在主库的 my.cnf 中启用二进制日志:
    [mysqld]
    log-bin=mysql-bin
    server-id=1
    
  • 从库配置
    在从库的 my.cnf 中配置从服务器 ID 和复制参数:
    [mysqld]
    server-id=2
    replicate-do-db=your_database
    
  • 启动复制
    执行以下命令将从库与主库同步:
    CHANGE MASTER TO
        MASTER_HOST='primary-server',
        MASTER_USER='replication-user',
        MASTER_PASSWORD='password',
        MASTER_LOG_FILE='mysql-bin.000001',
        MASTER_LOG_POS=4;
    START SLAVE;
    

3. 配置负载均衡与高可用切换

为了实现自动切换,可以使用以下两种方式:

(1) 使用 HAProxy

HAProxy 是一种强大的负载均衡工具,可以根据健康检查动态将流量切换到可用的服务器。

  • 安装 HAProxy
    在一台独立的服务器上安装 HAProxy,或者在主备服务器上同时运行 HAProxy。

  • 配置 HAProxy
    修改 /etc/haproxy/haproxy.cfg,添加主备服务器的后端配置。

    global
        log stdout format raw local0
        maxconn 4096
    
    defaults
        log global
        timeout connect 5s
        timeout client  10s
        timeout server  10s
    
    frontend http-in
        bind *:80
        default_backend app-backend
    
    backend app-backend
        option httpchk GET /
        server primary 192.168.1.1:80 check inter 2000 rise 2 fall 3
        server secondary 192.168.1.2:80 backup check inter 2000 rise 2 fall 3
    
    • **主服务器(192.168.1.1)**为默认主机。
    • **备服务器(192.168.1.2)**为备用,主服务器失效时接管流量。
  • 启动 HAProxy
    启动服务并测试访问:

    sudo systemctl start haproxy
    curl http://load-balancer-ip/
    
(2) 使用 Keepalived 实现 VIP 漂移

Keepalived 通过虚拟 IP(VIP)切换实现高可用:

  • 安装 Keepalived
    在两台服务器上安装 Keepalived。

  • 主服务器配置
    主服务器的配置文件 /etc/keepalived/keepalived.conf

    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        virtual_ipaddress {
            192.168.1.100
        }
    
        track_script {
            chk_service
        }
    }
    
    vrrp_script chk_service {
        script "/path/to/health-check.sh"
        interval 2
    }
    
  • 备服务器配置
    备服务器的配置类似,只需将 state 修改为 BACKUPpriority 设置为 50。

  • 健康检查脚本
    检查服务是否可用,例如:

    # /path/to/health-check.sh
    # 检查业务程序是否运行
    if ! systemctl is-active --quiet my-app; then
        exit 1
    fi
    # 检查数据库是否可用
    if ! sqlite3 /path/to/main.db "SELECT 1;" > /dev/null 2>&1; then
        exit 1
    fi
    exit 0
    
  • 启动 Keepalived
    启动 Keepalived 服务,VIP 会自动漂移到健康的服务器上。

4. 流量切换与恢复

(1) 主服务器挂掉时的行为
  • HAProxy 自动检测主服务器的不可用状态,将流量切换到备服务器。
  • 或者 Keepalived 使 VIP 漂移到备服务器,用户的请求透明地转发到备服务器。
(2) 主服务器恢复后的处理
  • 重新启动主服务器的业务程序和数据库同步。
  • 等待数据库与备库完成数据同步。
  • 恢复主服务器为流量主节点。

三、完整架构流程图

          ┌───────────────┐          ┌───────────────┐
          │ 主服务器     │          │ 备服务器     │
          │ (业务+数据库)│          │ (业务+数据库)│
          └──────┬────────┘          └──────┬────────┘
                 │                          │
      数据库同步│        rsync 或主从复制 │
                 └────────┬─────────────────┘
                          ▼
                  ┌─────────────┐
                  │ 负载均衡器  │ (HAProxy 或 Keepalived)
                  └─────────────┘
                          │
                          ▼
                    用户请求入口

四、总结

通过以上步骤,可以构建一个包含业务程序和数据库的主备高可用系统:

  1. 主备服务器部署:主备服务器均运行业务程序和数据库实例。
  2. 数据实时同步:使用 SQLite 文件同步或 MySQL 主从复制保持数据一致。
  3. 高可用切换:利用 HAProxy 或 Keepalived 实现主备服务器的自动切换。

此架构适合中小型应用,能够显著提高系统的容灾能力。如果需求更复杂(如高并发、高吞吐量),可以结合分布式数据库和更高级的负载均衡方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路由器的工作原理

网络拓扑结构 主机A: IP地址:10.1.0.1/16 MAC地址:MACA 主机B: IP地址:10.2.0.1/16 MAC地址:MACB 网关G0/0/0: IP地址:10.1.0.2/16 MAC地址:MACC 网关G0/0/1&#…

【深度学习|特征增强模块】FFN(前馈神经网络)和E_FFN(增强型前馈神经网络)是transformer特征增强的重要组成部分!

【深度学习|特征增强模块】FFN(前馈神经网络)和E_FFN(增强型前馈神经网络)是transformer特征增强的重要组成部分! 【深度学习|特征增强模块】FFN(前馈神经网络)和E_FFN(增强型前馈神…

51单片机从入门到精通:理论与实践指南(一)

单片机在智能控制领域的应用已非常普遍,发展也很迅猛,学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出,但51单片机价格低廉、易学易用、性能成熟,在家电和工业控制中有一定的应用,而且学好了51单片机&…

java写一个石头剪刀布小游戏

石头剪刀布是一款经典的手势游戏,通常由两人参与,玩法简单且充满趣味。玩家通过出示手势代表“石头”、“剪刀”或“布”,并根据规则比较手势决定胜负。它广泛用于休闲娱乐、决策或解压活动。 一、功能简介 用户与计算机对战。 用户输入选择:石头、剪刀或布。 计算机随机生…

MATLAB深度学习(六)——LSTM长短期神经网络原理与应用

LSTM的应用可以参见一个相当好的视频:小车倒立摆最优控制教程 - Part1 Simulink Simscape Multibody仿真建模_哔哩哔哩_bilibili 6.1 序列建模——循环神经网络 循环神经网络RNN是一类专门用于处理序列性数据x,,xn的神经网络结构&#xff0c…

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术,广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性,通过对当前数据的预测和实际值与预测值之间的差值进行编码,从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…

第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2024)

重要信息 会议官网:itca2024.iaecst.org 会议时间:2024年12月06-08日 会议地点:中国-广州(越秀国际会议中心) 会议简介 第六届信息技术与计算机应用学术会议(ITCA 2024) 依旧作为第六届国际科技创新学术交流大会…

Leetcode 将有序数组转换为二叉搜索树

算法思想及代码解析: 这段代码的目的是将一个有序数组转换为 高度平衡的二叉搜索树(Balanced Binary Search Tree, BST)。以下是算法的详细解释: 1. 什么是高度平衡的二叉搜索树? 二叉搜索树:对于树中的每…

15 go语言(golang) - 并发编程goroutine原理及数据安全

底层原理 Go 的 goroutine 是一种轻量级的线程实现,允许我们在程序中并发地执行函数。与传统的操作系统线程相比,goroutine 更加高效和易于使用。 轻量级调度 用户态调度:Go 运行时提供了自己的调度器,这意味着 goroutine 的创建…

ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘

概述 在这个充满挑战与机遇的数字化时代,键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中,机械键盘,以其独特的触感、清脆的敲击音和经久耐用的特性,已经成为众多游戏玩家和电子工程师的首选。本文将为…

PyTorch基础05_模型的保存和加载

目录 一、模型定义组件——重构线性回归 二、模型的加载和保存 2、序列化保存对象和加载 3、保存模型参数 一、模型定义组件——重构线性回归 回顾之前的手动构建线性回归案例: 1.构建数据集;2.加载数据集(数据集转换为迭代器);3.参数初…

《Python基础》之函数的用法

一、简介 在 Python 中,函数是一段可重用的代码块,用于执行特定的任务。函数可以帮助你将代码模块化,提高代码的可读性和可维护性。 函数的用途 代码重用:通过函数,你可以将常用的代码块封装起来,避免重复…

java:aqs实现自定义锁

aqs采用模板方式设计模式,需要重写方法 package com.company.aqs;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;…

【小白学机器学习34】基础统计2种方法:用numpy的方法np().mean()等进行统计,pd.DataFrame.groupby() 分组统计

目录 1 用 numpy 快速求数组的各种统计量:mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容,显示效果 2 为了验证公式的背后的理解,下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差…

vue2 中使用 Ag-grid-enterprise 企业版

文章目录 问题Vue2 引入企业版不生效npm run dev 时卡住了94% after seal 卡在这里了测试打包源 git 解决方案记录 问题 我想用企业版的树状表格 Vue2 引入企业版不生效 编译引入 // vue.config.js module.exports {transpileDependencies: ["ag-grid-enterprise"…

RESTful快速开发

(3)RESTful快速开发 (2)中的控制器仍然存在大量的冗余代码 问题1: 每个方法的RequestMapping注解中都定义了访问路径/users,重复性太高 问题2:每个方法的RequestMapping注解中都要使用method属…

万能门店小程序管理系统 doPageGetFormList SQL注入漏洞复现

0x01 产品简介 万能门店小程序管理系统是一款功能强大的工具,旨在为各行业商家提供线上线下融合的全方位解决方案。是一个集成了会员管理和会员营销两大核心功能的综合性平台。它支持多行业使用,通过后台一键切换版本,满足不同行业商家的个性化需求。该系统采用轻量后台,搭…

【作业九】RNN-SRN-Seq2Seq

点击查看作业内容 目录 1 实现SRN (1)使用numpy实现 (2)在(1)的基础上,增加激活函数tanh (3)使用nn.RNNCell实现 (4)使用nn.RNN实现 2 使用R…

Emgu (OpenCV)

Emgu Github Emgu 环境: Emgu CV 4.9.0 netframework 4.8 1、下载 libemgucv-windesktop-4.9.0.5494.exe 安装后,找到安装路径下的runtime文件夹复制到c#项目Debug目录下 安装目录 c# Debug目录

YOLOv8模型pytorch格式转为onnx格式

一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…