Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理

news2025/7/15 3:02:33

Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理

本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第九篇文章,将重点探讨 高可用性(High Availability, HA)集群管理,包括数据库高可用方案、Sharding-JDBC 的故障切换机制、Sharding-Proxy 的集群部署,以及与 Apache ShardingSphere 生态的分布式治理功能(如 ZooKeeper 集成)。这些内容帮助开发者构建健壮的分布式数据库系统。需要图形化展示的部分将使用 Mermaid 语法绘制图表。


1. 高可用性概述

高可用性是指系统在面对故障(如数据库宕机、网络中断)时,能够快速恢复并继续提供服务。Sharding-JDBC 和 Sharding-Proxy 提供了多种机制支持高可用性,同时需要结合底层数据库的高可用方案(如 MySQL 主从复制、MHA)来实现。

1.1 高可用性目标

  • 最小化宕机时间:通过故障切换和冗余设计,降低服务中断时间。
  • 数据一致性:确保故障期间数据不丢失或不一致。
  • 自动恢复:自动检测故障并切换到备用节点。
  • 负载均衡:在高可用架构中优化资源利用。

1.2 高可用性组件

  • 数据库层:MySQL 主从复制、MHA(MySQL Master High Availability)、MySQL Cluster。
  • Sharding-JDBC:读写分离的从库切换、事务重试。
  • Sharding-Proxy:多实例部署、负载均衡。
  • 分布式治理:使用 ZooKeeper 或 etcd 实现配置同步和状态管理。

2. 数据库高可用方案

Sharding-JDBC 依赖底层数据库的高可用性,常见的 MySQL 高可用方案包括:

2.1 主从复制

  • 原理:主库处理写操作,从库通过复制主库的二进制日志(binlog)保持数据同步。
  • 配置:参考第四篇读写分离配置,主库 master_ds,从库 slave_ds_0slave_ds_1
  • 高可用实现
    • 配置多个从库,分担读压力。
    • 监控主从延迟,优化复制性能(如设置 sync_binlog=0)。
    • 从库故障时,Sharding-JDBC 自动切换到其他从库。

2.2 MHA(MySQL Master High Availability)

  • 原理:MHA 监控主库状态,主库故障时自动将从库提升为主库。
  • 部署
    1. 安装 MHA Manager 和 Node。
    2. 配置主从复制和 MHA 脚本。
    3. 设置 VIP(虚拟 IP)或 DNS 切换。
  • 与 Sharding-JDBC 集成
    • 更新 Sharding-JDBC 的数据源配置,指向新的主库。
    • 使用动态数据源(如 Spring 的 AbstractRoutingDataSource)实现无缝切换。

2.3 MySQL Cluster(NDB Cluster)

  • 原理:多主架构,数据同步存储在多个节点,支持自动故障转移。
  • 适用场景:对一致性和可用性要求极高的场景。
  • 与 Sharding-JDBC:配置多个 MySQL Cluster 节点作为数据源,Sharding-JDBC 负责分片路由。

3. Sharding-JDBC 高可用机制

Sharding-JDBC 提供了多种机制支持高可用性,特别是在读写分离和分布式事务场景中。

3.1 读写分离故障切换

  • 从库故障:Sharding-JDBC 检测从库不可用后,自动将读请求路由到其他从库或主库。
  • 配置
readwriteSplittingRule:
  dataSourceGroups:
    group0:
      writeDataSourceName: master_ds
      readDataSourceNames:
        - slave_ds_0
        - slave_ds_1
      loadBalancerName: roundRobin
  loadBalancers:
    roundRobin:
      type: ROUND_ROBIN
  • 优化
    • 配置健康检查,定期检测从库状态。
    • 使用权重负载均衡,优先选择高性能从库:
loadBalancers:
  weight:
    type: WEIGHT
    props:
      slave_ds_0: 0.7
      slave_ds_1: 0.3

3.2 分布式事务重试

  • XA 事务:事务管理器(如 Atomikos)支持故障重试,确保事务提交。
  • BASE 事务:Saga 模式通过补偿机制处理分片故障。
  • 配置
transactionRule:
  defaultType: XA
  providerType: Atomikos
  • 代码示例(重试逻辑):
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {
   
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional(rollbackOn = Exception.class)
    public void createOrder(Long orderId, Long userId) {
   
        try {
   
            jdbcTemplate.update(
                "INSERT INTO t_order (order_id, user_id, order_amount) VALUES (?, ?, ?)",
                orderId, userId, 99.99
            );
        } catch (SQLException e) {
   
            // 记录日志,触发重试或补偿
            throw new RuntimeException("Transaction failed", e);
        }
    }
}

3.3 动态数据源切换

  • 场景:主库故障后,MHA 切换到新主库,Sharding-JDBC 需要更新数据源。
  • 实现:使用 Spring 的动态数据源:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public c

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

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

相关文章

【Dify系列教程重置精品版】第1课 相关概念介绍

文章目录 一、Dify是什么二、Dify有什么用三、如何玩转Dify?从螺丝刀到机甲战士的进阶指南官方网站:https://dify.ai github地址:https://github.com/langgenius/dify 一、Dify是什么 Dify(D​​efine + ​​I​​mplement + ​​F​​or ​​Y​​ou)。这是一款开源的大…

leetcode0106. 从中序与后序遍历序列构造二叉树-medium

1 题目:从中序与后序遍历序列构造二叉树 官方标定难度:中 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入…

Spring Boot默认缓存管理

Spring框架支持透明地向应用程序添加缓存,以及对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能&#xff…

XYNU2024信安杯-REVERSE(复现)

前言 记录记录 1.Can_you_find_me? 签到题,秒了 2.ea_re 快速定位 int __cdecl main_0(int argc, const char **argv, const char **envp) {int v4; // [esp0h] [ebp-1A0h]const char **v5; // [esp4h] [ebp-19Ch]const char **v6; // [esp8h] [ebp-198h]char v7;…

MySQL的MVCC【学习笔记】

MVCC 事务的隔离级别分为四种,其中Read Committed和Repeatable Read隔离级别,部分实现就是通过MVCC(Multi-Version Concurrency Control,多版本并发控制) 版本链 版本链是通过undo日志实现的, 事务每次修改…

达梦数据库压力测试报错超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE解决

1.名词解释:达梦数据库中的HJ_BUF_GLOBAL_SIZE是所有哈希连接操作可用的最大哈希缓冲区大小,单位为兆字节(MB) 2.达梦压测报错: 3.找到达梦数据库安装文件 4.压力测试脚本 import http.client import multiprocessi…

Oracle--SQL性能优化与提升策略

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、导致性能问题的内在原因 系统性能问题的底层原因主要有三个方面: CPU占用率过高导致资源争用和等待内存使用率过高导致内存不足并需…

六个能够白嫖学习资料的网站

一、咖喱君的资源库 地址:https://flowus.cn/galijun/share/de0f6d2f-df17-4075-86ed-ebead0394a77 这是一个学习资料/学习网站分享平台,包含了英语、法语、德语、韩语、日语、泰语等几十种外国语言的学习资料及平台,这个网站的优势就是外语…

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤

以下是在 IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤: 步骤 1:创建 Maven Web 项目 新建项目 File -> New -> Project → 选择 Maven → 勾选 Create from archetype → 选择 maven-archetype-webapp。输入 GroupId(如 com.examp…

手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段

手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段 --本地AI电话机器人 前言 书接上一篇,《手机打电话通话时如何向对方播放录制的IVR引导词声音》中介绍了【蓝牙电话SDK示例App】可以实现手机app在电话通话过程中插播预先录制的开场白等语音片段的功能。…

SpringCloud——负载均衡

一.负载均衡 1.问题提出 上一篇文章写了服务注册和服务发现的相关内容。这里再提出一个新问题,如果我给一个服务开了多个端口,这几个端口都可以访问服务。 例如,在上一篇文章的基础上,我又新开了9091和9092端口,现在…

string的基本使用

string的模拟实现 string的基本用法string的遍历(三种方式):关于auto(自动推导):范围for: 迭代器普通迭代器(可读可改)const迭代器(可读不可改) string细小知识点string的常见接口引…

深入解析Mlivus Cloud核心架构:rootcoord组件的最佳实践与调优指南

作为大禹智库的向量数据库高级研究员,同时也是《向量数据库指南》的作者,我在过去30年的向量数据库和AI应用实战中见证了这项技术的演进与革新。今天,我将以专业视角为您深入剖析Mlivus Cloud的核心组件之一——rootcoord,这个组件在系统架构中扮演着至关重要的角色。如果您…

Python常用的第三方模块之【pymysql库】操作数据库

pymysql是在Python3.x版本中用于连接MySQL服务器的一个实现库,Python2中则是使用musqldb。 PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,它允许我们直接在 Python 中执行 SQL 语句并与 MySQL 数据库进行交互。下面我们将详细介绍如何使用 PyMySQL 进…

【Python数据分析】Pandas模块之pd.concat 函数

💭 写在前面:合并多个数据框,收集各种数据,并将其合并为一个数据框进行分析。本章我们介绍 Pandas 库中数据框合并的函数 —— concat。 0x00 引入:数据框的合并操作 合并多个数据框:收集各种数据,并将其合并为一个数据框进行分析。 下面介绍一些常用的 Pandas 库中数…

C# 综合示例 库存管理系统7 主界面(FormMain)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 图99A-22 主界面窗口设计 主界面是多文档界面容器,需要将窗体属性IsMdiContainer设置为True。关于多文档界面编程请参看教程第7.12节《多文档界面》。 主界面并不提…

系统思考:看清问题背后的结构

组织的挑战,往往不是因为不努力,而是“看不清” 结束了为期两天系统思考课程的第一天,被学员的全情投入深深打动。我们用系统结构图,一步步揭示那些表面看起来“习以为常”的问题: 什么原因跨部门协作总是磕磕绊绊&am…

Langchain_Agent+数据库

本处使用Agent数据库,可以直接执行SQL语句。可以多次循环查询问题 前文通过chain去联系数据库并进行操作; 通过链的不断内嵌组合,生成SQL在执行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…

QT6 源(45):分隔条 QSplitter 允许程序的用户修改布局,程序员使用 IDE时,就是分隔条的用户,以及其 QSplitter 源代码

(1) (2)本类的继承关系如下,所以说分隔条属于容器: (3)本类的属性: (4) 这是一份 QSplitter 的举例代码,注意其构造函数时候的传参&am…

Huffman(哈夫曼)解/压缩算法实现

一、文件压缩 哈夫曼压缩算法需要对输入的文件&#xff0c;逐字节扫描&#xff0c;统计出不同字节出现的数量&#xff08;频率&#xff09;&#xff0c;根据的得到的频率生成一组叶子节点&#xff0c;这些节点存储着<字节信息>和<频率>,通常需要按频率排序后存储在…