MySQL: 数据库水平分片技术实施指南之核心原理与OneProxy实践

Mybatis Plus 数据分片-水平分库分表策略 在实际应用中,需要根据业务需求和数据量的大小,选择合适的分片键和分片规则,以达到提高数据库性能和可扩展性的目的。在使用MyBatis Plus进行数据分片时,需要谨慎处理跨库跨表的查询,注意数据迁移和扩容的问题,以确保整个数据分片系统的稳定性和可维护性。数据分片是一种处理大量数据的有效策略,但在实施过程中需要注意一些关键的事项,以确保分片系统的性能、稳定性和可维护性。分片规则的设计直接关系到数据分片的正确性,以及每个分片的数据能否被正确路由到相应的库和表中。选择合适的分片键是数据分片中至关重要的一步。 阅读详情

数据库分片前的关键考量


  • 水平分片通过将单一数据库表拆分到不同物理节点解决性能瓶颈,通过对表进行横向拆分实现数据分布式存储
  • 与MySQL分区表(单节点)不同,分片后数据分布于独立服务器
  • 除非写入负载远超单节点上限(如日增百万级数据),否则应优先优化SQL、索引或架构设计
    分片显著增加运维复杂度,需作为终极扩容方案

实施前需重点评估以下问题:

1 ) 分片必要性评估

  • 水平分片通过将单个数据库表分布到不同物理节点解决性能瓶颈,与MySQL分区表本质区别在于:
    • 物理分布差异:分区表位于同一节点同数据库,分片后数据存在于不同物理节点
    • 实现复杂度:分片需解决跨节点查询、数据路由等分布式问题,复杂度显著高于分区表
  • 在数据库负载未达瓶颈时,应优先考虑性能调优与架构优化(如索引优化、查询重构)
  • 分片会显著增加系统复杂度与维护成本,仅当单节点无法支撑业务增长时采用
  • 何时分片:仅当满足以下条件且无法通过优化解决时:
    • 单表数据量 > 5000万行
    • 写QPS > 5000
    • 磁盘IO利用率持续 > 80%

2 ) 分区键(Sharding Key)设计原则

分区键直接决定查询效率与数据均衡性,需满足:

  • 避免跨片查询:
    • OLTP场景应确保90%以上查询含分区键
    • OLTP场景中跨片查询需合并多节点结果,性能通常低于未分片状态
    • 示例:博客系统按user_id分片可使用户数据集中存储,消除按article_id分片导致的跨片聚合问题
      -- 反例:按文章ID分片导致用户查询需扫描全部分片
      SELECT * FROM articles WHERE author_id=101; 
      
      -- 正例:按作者ID分片可定位单分片查询 
      SELECT * FROM articles WHERE author_id=101 AND shard_key=101; 
      
  • 数据均衡性
    • 采用哈希函数(如CRC32)确保数据均匀分布
    • 若按数值范围分片(如订单ID区间),需警惕热点数据倾斜问题
    • 如某课程题库80%访问集中在单个分片
    • 保障数据均匀分布:热点数据集中会导致分片负载失衡。推荐哈希分片优于范围分片:
      # 哈希分片算法示例
      shard_id = hash(shard_key) % total_shards  
      
  • 数据均衡策略:
    分片方式适用场景缺陷
    哈希取模离散型数据(用户ID)扩容需数据迁移
    范围分片连续数据(时间序列)易产生热点分片
    路由表映射需精准控制数据位置需维护元数据缓存
  • 关联表一致性
    • 分区键需在关联表间对齐
    • 订单表与订单商品表必须使用相同分区键(如order_id),否则关联查询将失效

3 ) 非分片表存储策略

策略类型适用场景优缺点
冗余存储字典表(如商品分类)
数据量小、更新频率低
✅ 关联查询高效
❌ 需多写同步与定期一致性校验
中央存储独立业务表(如用户信息)
高频更新表
✅ 无数据冗余
❌ 跨片关联需程序层合并结果

换个角度

策略适用场景一致性风险
分片冗余存储小型字典表(如商品分类)需多写同步,定期校验数据一致性
中央库集中存储低频更新的大表跨片关联查询性能较低

以及

方案一致性风险查询性能适用场景
分片冗余存储高高<100KB的字典表
中心化存储低中更新频繁的大表

两类存储策略对比:

-- 方案1:全分片冗余存储(字典表)
CREATE TABLE category_global (
  id INT PRIMARY KEY,
  name VARCHAR(50)
) ENGINE=InnoDB;
 
-- 需同步更新所有分片 
UPDATE shard_001.category SET name='电子产品' WHERE id=101;
UPDATE shard_002.category SET name='电子产品' WHERE id=101;
 
-- 方案2:中心化存储(关联查询示例)
SELECT o.order_id, c.name 
FROM orders o 
JOIN central_db.category c ON o.category_id = c.id;

4 )分片部署与命名规范

部署模式命名规则示例特点
单节点单库单分片orders(各分片同名)结构与原库一致,无需修改 SQL 表名
单库多分片表orders_0、orders_1表名添加分片后缀,需修改 SQL 查询语句
单节点多库db0_orders、db1_orders数据库名添加分片编号,支持多套分片表

注意事项:

  • 需严格防止数据写入错误分片(如 user_id=101 应写入 分片1,误写入 分片2)。

5 ) 分片部署拓扑

应用层
分片中间件/路由
节点1数据库
节点2数据库
分片表_order_01
全局表_category_global
分片表_order_02
全局表_category_global

分片部署模式

  • 物理节点级隔离:单节点部署单分片库(如 db_shard1)
  • 逻辑表级隔离:单库多表后缀区分(如 orders_01, orders_02)
    -- 节点1创建分片表 
    CREATE TABLE orders_01 (
      order_id INT PRIMARY KEY,  -- 禁用自增ID 
      amount DECIMAL(10,2),
      create_time DATETIME 
    );
    

6 ) 分片数据分配策略

策略实现方式优缺点
哈希取模HASH(shard_key) % N✅ 数据分布均匀
❌ 难以人工干预数据位置
范围分配shard_key BETWEEN 1-100 → 分片0✅ 数据位置可控
❌ 易导致数据/负载倾斜(如热点课程集中访问)
映射表配置查表获取分片位置✅ 灵活控制数据存储位置
❌ 映射表需缓存(如 Redis)防性能瓶颈

映射表示例:

CREATE TABLE shard_mapping (  
  user_id INT PRIMARY KEY,  
  shard_id INT NOT NULL   -- 分片编号  
);  
 
-- 查询 user_id=101 所在分片  
SELECT shard_id FROM shard_mapping WHERE user_id = 101;  

NestJS 中缓存映射表(Redis):

import { RedisService } from '@nestjs-modules/ioredis';  
 
@Injectable()  
export class ShardService {  
  constructor(private readonly redis: RedisService) {}  
 
  async getShardId(userId: number): Promise<number> {  
    const cachedShardId = await this.redis.get(`shard:${userId}`);  
    if (cachedShardId) return parseInt(cachedShardId);  
 
    const shardId = await this.db.query(`SELECT shard_id FROM shard_mapping WHERE user_id = ${userId}`);  
    await this.redis.set(`shard:${userId}`, shardId, 'EX', 3600); // 缓存1小时  
    return shardId;  
  }  
}  

7 ) 分布式ID生成方案

方案实现方式适用场景局限
步长偏移配置auto_increment_increment=分片数
auto_increment_offset=分片序号
单节点单分片表仅适用单分片单表场景
全局序列表中央节点维护ID生成表架构简单,存在性能瓶颈存在单点性能瓶颈
Redis原子操作INCR命令生成唯一ID高性能场景,需缓存集群需保证Redis高可用

单节点 AUTO_INCREMENT 在分片后会导致 ID 冲突,解决方案如下:

1 ) 调整自增参数:

  • 设置 auto_increment_increment = N(分片数)
  • 设置 auto_increment_offset = 1,2,...N(分片偏移量)
  • 限制:仅适用于单节点单套分片表,多套分片表仍会冲突。

2 ) 全局ID表:

-- 中心节点建表  
CREATE TABLE global_id (  
  id BIGINT AUTO_INCREMENT PRIMARY KEY  
);  

-- 应用获取ID  
INSERT INTO global_id VALUES ();  
SELECT LAST_INSERT_ID();  

缺点:中心节点易成性能瓶颈。

3 ) Redis 生成分布式ID:

// NestJS + Redis 实现  
@Injectable()  
export class IdService {  
  constructor(private readonly redis: RedisService) {}  

  async generateId(key: string): Promise<number> {  
    return this.redis.incr(`id:${key}`);  
  }  
}  

优势:利用 Redis 单线程原子性避免冲突,高性能。

基于OneProxy的分片实战演示(架构篇)


OneProxy安装与核心配置

安装步骤:

下载预编译包(非开源)
wget http://www.onexsoft.com/software/oneproxy-rhel6-latest.tar.gz

# 解压安装
tar -zxvf oneproxy-rhel5-latest.tar.gz  -C /usr/local/
cd /usr/local/oneproxy 
 
# 服务化启动
cp demo.sh  /etc/init.d/oneproxy
chkconfig --add oneproxy

实验环境拓扑

应用层 → OneProxy(192.168.1.102:3306) 
          ├─ 分片节点1 (192.168.1.100:3306) 
          └─ 分片节点2 (192.168.1.101:3306)
  • 中间件:OneProxy(非开源)提供分片路由、连接池管理,不支持分布式事务
  • 解决方案:基于:OneProxy + TCC + 消息队列的架构
    • OneProxy 仅承担数据路由,避免跨库事务
    • TCC 在应用层实现事务逻辑,通过消息队列保证最终一致性
    • 通过幂等设计、状态跟踪、强制主库路由解决一致性风险
    • 这里不进行展开,不是主线任务
  • 分片节点(2个物理节点):
    • 节点一:IP 192.168.1.100
      • 数据库:orders_01
      • 物理表:order_detail_01(订单表)、order_product_01(订单商品表)、category_global(分类表)
    • 节点二:IP 192.168.1.101
      • 数据库:orders_02
      • 物理表:order_detail_02、order_product_02、category_global
  • OneProxy中间件节点:IP 192.168.1.102
    • 代理端口:3306(模拟MySQL协议)
    • 管理端口:4041(配置加密/监控)
  • 关键设计:
    • 订单表与订单商品表按分片键orderID水平拆分
    • 分类表作为全局表(global table)全量复制到所有节点

1 ) 分片表结构设计

节点1:

-- 节点1:订单分片表 
CREATE DATABASE IF NOT EXISTS orders_01;
USE orders_01;

-- 节点1:订单表(分片表)
CREATE TABLE order_detail_01 (
  order_id INT PRIMARY KEY,  -- 禁用auto_increment 
  order_time DATETIME NOT NULL,
  amount DECIMAL(10,2) NOT NULL 
) ENGINE=InnoDB;

-- 节点1:订单商品表(分片表)
CREATE TABLE order_product_01 (
  order_id INT NOT NULL,       -- ️与订单表一致
  product_id INT NOT NULL,
  PRIMARY KEY (order_id, product_id)
) ENGINE=InnoDB;

-- 节点1:全局分类表
CREATE TABLE category_global (
  category_id INT PRIMARY KEY,
  category_name VARCHAR(50) NOT NULL 
) ENGINE=InnoDB;

节点2:(仅变更表后缀)

USE orders_02;
CREATE TABLE order_detail_02 (...);  -- 结构同orderdetail_01 
CREATE TABLE order_product_02 (...); -- 结构同orderproduct_01
CREATE TABLE category_global (...);        -- 结构同节点一 

2 ) OneProxy核心配置

# oneproxy.cnf 
[mysql-proxy]
daemon = true 
event-threads = 4 
log-file = /var/log/oneproxy.log 
log-level = debug    # 查看SQL改写日志
proxy-address = :3306
proxy-master-addresses = 192.168.1.100:3306@orders_01 
proxy-master-addresses = 192.168.1.101:3306@orders_02
# proxy-slave-addresses = 192.168.1.103:3306@slave01  # 新增从库 后续可能得增加
admin-address = 127.0.0.1:4041  # 启用管理接口
proxy-part-tables = /etc/oneproxy/conf/order_part.txt   # 建议绝对路径
proxy-user-list = test:0A8C9F3E5D:B3A9E8F7C5  # 加密密码通过管理端口生成 
charset = utf8mb4
proxy-check-interval = 2000      # 2秒健康检查

密码加密操作:

-- 连接OneProxy管理端 
mysql -h127.0.0.1 -P4041 -uadmin -poneproxy
 
-- 生成加密密码 
ONEPROXY> password 123456;  
-- 返回:2B3C5D7E9A1F4C8D(替换配置文件中的明文)

3 )分片规则定义

# ===== 分片表配置(哈希分片)=====
order_part.txt
[order_detail]
sharding-key = order_id          # 分片键(整数类型)
sharding-type = int              # 键值类型     
sharding-method = hash           # 哈希算法
# 逻辑分片与物理节点映射(格式:逻辑库:物理表)
sharding-partitions = orders_01:order_detail_01, orders_02:order_detail_02 
# 物理节点定义(精简冗余参数)
shard-node-01 = 192.168.1.100:3306:orders_01:order_detail_01  
shard-node-02 = 192.168.1.101:3306:orders_02:order_detail_02  
 
[order_product]
sharding-key = order_id 
sharding-type = int 
sharding-method = hash 
sharding-partitions = orders_01:order_product_01, orders_02:order_product_02
shard-node-01 = 192.168.1.100:3306:orders_01:order_product_01  
shard-node-02 = 192.168.1.101:3306:orders_02:order_product_02  
 
# ===== 全局表配置(全节点同步)===== 
[category]
sharding-method = global  
# 统一全局表命名规范(添加 _global 后缀避免混淆)
shard-node-01 = 192.168.1.100:3306:orders_01:category_global     # 全节点同步
shard-node-02 = 192.168.1.101:3306:orders_02:category_global

或

shard_tables {{
  # 定义全局节点
  global_nodes = [
    "192.168.1.100:3306:orders_01",
    "192.168.1.101:3306:orders_02"
  ]

  # 分片表配置 - order_detail 
  order_detail {{
    partition_key = "order_id"
    partition_type = "int"
    partition_method = "hash"
    # 显式声明物理表名(避免拼接歧义)
    partition_sources = [
      {{ physical_table = "order_detail_01", group = "orders_01" }},
      {{ physical_table = "order_detail_02", group = "orders_02" }}
    ]
    # 补充物理节点定义
    nodes = global_nodes  // 引用全局节点
  }}

  # 分片表配置 - order_product 
  order_product {{ 
    partition_key = "order_id"
    partition_type = "int"
    partition_method = "hash"
    # 显式声明物理表名(避免拼接歧义)
    partition_sources = [
      {{ physical_table = "order_product_01", group = "orders_01" }},
      {{ physical_table = "order_product_02", group = "orders_02" }}
    ]
    # 补充物理节点定义
    nodes = global_nodes  // 引用全局节点
  }}

  # 全局表配置 - category
  category {{
    partition_method = "global"
    # 强制添加_global后缀并指定物理表
    physical_table = "category_global"
    # 显式定义广播节点
    replicate_nodes = global_nodes  // 引用全局节点
  }}
}}

OneProxy 通过动态路由机制处理逻辑对象映射,无需显式配置逻辑库名

OneProxy 设计精髓: 逻辑层(客户端查询)与物理层(配置规则)解耦,通过分片键实现自动化路由,而非依赖命名约定

分片键一致性:关联表必须使用相同分片键,避免跨节点JOIN(如订单表与订单商品表均用orderID)

脚本: INSERT INTO orders.order_detail
OneProxy 提取逻辑名
查询 order_part.txt 配置
匹配 order_detail 分片规则
计算 order_id hash 值
路由到物理表 order_detail_01@orders_01

分片操作验证与故障规避(实践篇)


1 )分片数据写入测试

#!/bin/bash 
test.sh 模拟分片写入 
order_id=1 
while true; do 
  mysql -utest -p123456 -h192.168.1.102 -e \
  "INSERT INTO orders.order_detail (order_id, order_time, amount) 
   VALUES ($order_id, NOW(), 100.00);
   
   INSERT INTO orders.order_product (order_id, product_id)
   VALUES ($order_id, $order_id*10);
   
   INSERT INTO orders.category (category_id, category_name)
   VALUES ($order_id, 'cat_$order_id');"
  ((order_id++))
done 

2 ) 数据分布验证

-- 通过OneProxy查询总量 
SELECT COUNT(*) FROM order_detail;  -- 返回188(自动聚合分片数据)
 
-- 直连分片节点验证 
SELECT COUNT(*) FROM order_detail_01;  -- 节点1返回94 
SELECT COUNT(*) FROM order_detail_02;  -- 节点2返回94 

3 ) 全局表一致性风险

-- 节点1分类表 
SELECT MAX(category_id) FROM category_global;  -- 返回189 
 
-- 节点2分类表 
SELECT MAX(category_id) FROM category_global;  -- 返回188(因非事务更新导致不一致)

规避方案:通过定时任务校验修复

CREATE EVENT check_category 
ON SCHEDULE EVERY 1 HOUR 
DO 
  -- 数据修复逻辑 
  REPLACE INTO node2.category_global 
  SELECT * FROM node1.category_global 
  WHERE category_id NOT IN (SELECT category_id FROM node2.category_global);

上述 sql 只是一个 大概的意思, 就是将不同主机的两库通过定时任务同步, 也可以用程序来做, 例如:
额外开发双写校验工具,定期修复数据不一致问题

// NestJS全局表修复示例(TypeScript)
import { Injectable } from '@nestjs/common';
import { InjectDataSource } from '@nestjs/typeorm';
import { DataSource } from 'typeorm';

@Injectable()
export class ShardSyncService {
  constructor(
    @InjectDataSource('node1') private node1: DataSource,
    @InjectDataSource('node2') private node2: DataSource
  ) {}

  async fixCategoryTable(): Promise<void> {
    const [node1Data, node2Data] = await Promise.all([
      this.node1.query(`SELECT * FROM category_global`),
      this.node2.query(`SELECT * FROM category_global`)
    ]);

    const discrepancies = node1Data.filter(item => 
      !node2Data.some(x => x.cat_id === item.cat_id)
    );

    for (const record of discrepancies) {
      await this.node2.query(`
        REPLACE INTO category VALUES (?, ?)
      `, [record.cat_id, record.cat_name]);
    }
  }
}

或改用中央库存储策略,这里不展开

4 )三种ID生成策略对比:

// NestJS + Redis ID生成服务 
import { Injectable } from '@nestjs/common';
import Redis from 'ioredis';
 
@Injectable()
export class IdGeneratorService {
  private redis = new Redis({ host: 'redis-host' });
 
  async getNextId(key: string): Promise<number> {
    return this.redis.incr(`id_gen:${key}`);
  }
}
 
// 分片写入示例 
const shardId = orderId % SHARD_COUNT;
const shardTable = `order_${shardId}`;
方案吞吐量缺点
MySQL自增步长设置1k QPS节点数固定难扩容
独立ID生成表5k QPS单点瓶颈
Redis分布式ID50k QPS需缓存高可用

关键结论与最佳实践


1 ) 分片决策树

是
否
数据库负载>70%
是否可优化
索引/SQL/缓存优化
评估分片方案
选择分区键
设计ID生成
规划非分片表

或参考下面方案

是
无效
是
否
单表超5000万行?
优化索引/归档
评估分片键
是否高频跨片查询?
调整分片策略
实施分片
选择分片方案
哈希分片
范围分片
路由表分片

黄金准则:分片是最后的扩展手段,优先尝试:

  1. 读写分离架构
  2. 冷热数据分离
  3. 查询重写优化

2 ) 分片适用边界

仅当单节点写性能达到物理极限(如SSD IOPS饱和)、且纵向扩展无效时启用分片

3 ) 分片键设计铁律

  • 必须保证关联表分片键一致性
  • 优先选择高基数字段(如订单ID而非用户ID)
  • 关联表必须同分区键
  • 优先选哈希分片(如CRC32(shard_key)%1024)
  • OLAP类查询需走独立汇总库

4 ) 全局表同步风险

采用双写+校验修正机制:

// 全局表双写示例 
async updateCategory(catId: number, name: string) {
  await this.dbShard1.update(catId, {name});
  await this.dbShard2.update(catId, {name}); // 非事务操作 
  this.checkConsistency(catId); // 异步校验
}

5 )分片扩容瓶颈

初始分片数需预留2倍以上增长空间,避免重分片导致业务中断

哈希取模扩容问题:

原分片数:N 
扩容后分片数:M 
数据迁移量 ≈ 1 - N/M  (如10片扩20片需迁移50%数据)

优化方案:

  • 一致性哈希:仅迁移 K/N 数据(K为节点数)
  • 虚拟桶映射:通过路由表解耦物理分片

6 ) OneProxy局限性

  • 全局表同步需自行实现
  • 分片路由规则不支持动态更新
  • 复杂查询需应用层结果聚合

7 ) 分片回退策略

在NestJS中实现分片降级机制:

// order.service.ts 
async createOrder(dto: CreateOrderDto) {
  try {
    // 分片写入 
    return await this.shardRepository.insert(dto);
  } catch (e) {
    if (e instanceof ShardTimeoutError) {
      // 降级至中央写入 
      return this.centralRepository.insert(dto);
    }
    throw e;
  }
}

8 )简单总结

  1. 分区键选择:以业务查询模式为核心,优先避免跨分片操作
    • 分片表需严格统一分片键,确保关联查询本地化
  2. 数据均匀性:通过哈希或映射表平衡分片负载,警惕范围分片的热点问题
  3. 全局表存在数据不一致风险,需配套校验机制
  4. 唯一ID生成:分布式场景推荐 Redis 原子计数 或 Snowflake 算法
  5. 分片部署一致性:明确命名规范,防止数据误路由
  6. 非分片表策略:小规模静态表冗余存储,大规模动态表公共节点存储
  7. OneProxy适用于简单分片场景,分布式事务需定制开发
  8. 分片是最终手段,优先考虑索引优化、归档冷数据等方案

注:数据库分片是扩展性优化的终极手段,需严格遵循“先优化,再分库,最后分片” 的实施路径
任何分片方案必须包含数据一致性保障与故障回退机制

核心原则:分片是最后手段,优先优化索引、缓存与架构设计。
若必须分片,需严格验证分区键选择与数据分布策略,并通过压测模拟真实负载

最后强调:分片是牺牲运维便捷性换取扩展性的妥协方案。在SSD/NVMe普及的当下,单机MySQL可支撑数万TPS,应优先探索内存计算、列式存储或TiDB等NewSQL方案

中间件oneproxy安装部署及实现分表 准备: 中间件:192.168.1.98 ——-&gt;oneproxy mysql主:192.168.1.51 ——-&gt;master mysql从:192.168.1.121 ——-&gt;slave 为方便实验,三台机都关闭 防火墙和selinux 开始之前,需要将master和slave之间主从配置好,这不是本文的重... 阅读详情

相关推荐

模块 stm32_基于STM32设计的RFID读卡模块电路方案(原理图+程序)

采用stm32F030F4,用PWM产生125KHZ的方波,经过推挽电路进行功率放大,高频电流进入LC串联谐振电路,345uH和4.7NF的谐振频率正好是125KHZ,这时电容两端电压会到十几伏。当有卡接近线圈时,线圈两端会有曼彻斯特编码的调幅波。通过二极管以及电容的检波和滤波,产生的小信号送入LM358进行放大和整形,变成单片机可以读取的曼彻斯特编码信号。• IO 分配(采用内部晶...

weixin_28686771的博客 3818

平民软件OneProxy的强大

简介 使用MySQL时,随着时间、业务的需求、用户量以及数据量的逐渐增加,相对的,数据库的的操作更是剧增,最终将会使MySQL达到某个瓶颈,那么MySQL的性能将会大大降低,更严重的话将会影响整个系统架构的正常运行,相信看过《太空旅客》这部电影的小伙伴们都知道,飞船的系统有一处瘫痪了,其他的系统想帮忙减轻负重,但是这个工作量太大了分担不过来,接着其他的系...

weixin_33850015的博客 498

博途AI助手演示,完成简单且重复的梯形图代码,并导入到博途

自写个博途AI助手,下面演示AI帮我生成完善多个模拟量输入转换的代码,

gsjkwg的博客 1529

数据库分片

数据分片指按照某个维度将存放在单一数据库中的数据分散的存放在多个数据库或表中以达到提升性能瓶颈以及可用性的效果。数据分片的拆分方式又分为垂直分片和水平分片。

qq_38515961的博客 3938

Qt图表库三选一:Qwt、QChart、QCustomPlot实战性能对比与避坑指南

本文深入对比了Qt开发中三大主流图表库Qwt、QChart和QCustomPlot的性能与适用场景。通过实测数据展示各库在渲染效率、内存占用和功能特性上的差异,并提供针对不同项目需求的选型建议和集成避坑指南,帮助开发者高效选择最适合的Qt图表解决方案。

weixin_33691700的博客 450

图像去雾新思路:手把手教你复现DEA-Net中的“细节增强卷积”与PyTorch实现

本文详细解析了DEA-Net中的'细节增强卷积'(DEConv)与PyTorch实现,通过多分支差分卷积和重参数化技术,显著提升单图像去雾效果。文章从数学原理到代码实现,手把手指导复现这一创新架构,帮助开发者在保持轻量化的同时实现41dB以上的PSNR指标,适用于自动驾驶、遥感监测等关键领域。

weixin_30323631的博客 506

OneProxy简明使用手册

一、背景说明 随着业务的不断发展,原来3台MySQL做主从提供多个库(>5个库)并通过jdbc实现简单读写分离的结构已不足以支撑公司的业务发展,需要对原有的十几个库进行分类,分为核心应用1(包含1个库),核心应用2(包含2个库)以及非核心应用(包含多个库),并且使用数据库中间件对各个应用进行分组读写分离。 经过筛选,候选的中间件有360的Atlas、Kingshard以及OneProxy

h331895809的博客 8315

Apollo Planning决策规划算法代码详细解析 (1):Scenario选择

本文重点讲解Apollo代码中怎样配置Scenario以及选择当前Scenario,Scenario决策是Apollo规划算法的第一步,本文会对代码进行详细解析,也会梳理整个决策流程,码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: 规划器planer的种类; 规划器planer的主要函数及逻辑; 场景管理类ScenarioManager的运行机制; 场景注册方法; 场景决策流程,如何选择当前场景 详细的apollo决策规划代码分析 代码具体过程如下: 1、Scenar

自动驾驶Player的博客 1万+

oneproxy安装部署及简单使用

1、oneproxy简介 按照官方介绍:OneProxy 中间件是具备透明读写分离、分库分表功能的数据库中间件,轻松构建分布式数据库集群,支持Oracle/MySQL等多种数据库! 本次安装OneProxy FOR MySQL。 官方地址:http://www.onexsoft.com/proxy.html 2、oneproxy下载地址 http://www.onexsoft.co...

river106的博客 2593

封装POD与PinMap文件总结学习-20250516

芯片封装外形图(POD)和PinMap是芯片设计和制造中的关键文档。POD详细描述了芯片的物理尺寸、引脚布局和封装类型,而PinMap则提供了芯片封装上各个引脚的位置、名称和功能的详细信息。这些文档在芯片设计、制造和应用过程中起到“地图”的作用,帮助设计人员理解芯片的物理和电气特性。在PCB设计中,POD用于确定socket的footprint和pogo的选型,而PinMap则用于器件的合理布局和布线。这些信息对于确保芯片的正确安装和功能至关重要。

歌颂苦难的行为是无耻的; 2378

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 506

OneProxy使用手册--致力于打造透明的数据层

介绍 平民软件官网上线(http://www.onexsoft.com)   OneProxy是由原支付宝首席架构师楼方鑫开发,目前由楼方鑫创立的杭州平民软件公司(@平民架构)提供技术支持。目前已有多家公司在生成环境中使用,其中包括了支付、电商等行业。 OneProxy的主要功能有: 1. 垂直分库 2. 水平分表 3. Proxy集群 4. 读高...

ateu52935的博客 538

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

分库分表数据库中间件对比

http://www.cnblogs.com/taoxinrui/p/6782791.html http://www.tuicool.com/articles/A77R3m 功能 Cobar Cobar-client TDDL Sharding-JDBC 分库 有 有 未开源 有

tianjinsong的专栏 8590

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

可扩展分布式数据库集群的搭建,OneProxy分库分区设计

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。下面有部分截图希望能对大家有所帮助。

q16974058的博客 1104

探索OneProxy-Monitor:智能代理监控系统的技术深度与应用价值

探索OneProxy-Monitor:智能代理监控系统的技术深度与应用价值 项目简介 是一个强大的、开源的代理服务器监控系统,由OnexSoft开发并维护。它旨在帮助网络管理员和开发者实时监控和管理他们的代理服务器,确保服务的稳定性和性能。 技术分析 架构设计 该项目基于微服务架构,采用Go语言进行后端开发,提供高效且可扩展的服务。前端部分则利用React框架构建,保证了用户界面的响应速度和交互体...

gitblog_00060的博客 466

oneproxy检测主从复制同步延迟

Q:为什么要实现读写分离延迟检测?A:就好比你在ATM机存钱,你老婆收到短信后乐呵呵的拿网银APP查看,结果钱没过来。其实钱已经到账了,只是查询的ATM机节点钱还没过来。所以我们dba要监控数据,一旦发现钱没有复制到另一ATM机节点,会强制你从存钱的那个ATM机节点去查看。读写分离可以通过php yii框架、java mybatis框架实现,但主从复制的延迟检测一直是重难点,OneProxy内部支...

weixin_34127717的博客 145

ShardingSphere-Proxy实现MySQL水平分片

可以通过这种方式查看服务器中输出的SQL语句。

学亮编程手记 352

安装oneproxy实现数据库的读写分离

领导就给了两台数据库,做主从,在从上搭建oneproxy插件,实现读写分离,一直就听说oneproxy,今天打算用一下 先下载最新的版本wget http://www.onexsoft.cn/software/oneproxy-rhel6-linux64-v5.8.2-ga.tar.gz 网上找篇文档照着改,其中遇到了许多小问题,幸亏楼方鑫给与技术支持,在这里感谢楼总的大力帮助。 先是搭建主...

weixin_33898876的博客 119

mysql 水平分片_使用MYCAT轻松实现MYSQL水平分片

完整文章下载地址:http://download.youkuaiyun.com/detail/dreamcode/9383516 简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行切分到其他的数据库中,其中选择合适的切分规则至关重要,因为它决定了后续数据聚合的难易程度。 有几种典型的分片规则包括: (1)按照用户主键ID求模,将数据分散到不同的...

weixin_28712661的博客 487

分布式数据库的分片方法

一、分片的定义和作用 定义:分布式数据库中数据的存储单位成为片段。对全局数据库的划分叫做分片。划分的结果就是片段。每个片段可以保存在一个以上的场地(服务器)。 作用: 1、减少网络传输量 对数据进行复制存储,目的是可以就近访问所需数据副本,减少网络上的数据传输量。 2、增大事务处理的局部性 3、提高数据的可用性和查询效率。 4、负载均衡。 二、分片设计过程 分片过程是将全局数据进

晨曦的专栏 1万+

OneProxy构建

OneProxy的主要功能有:1. 垂直分库 2. 水平分表 3. Proxy集群 4. 读高可用 5. 读写分离(master不参与读) 6. 读写分离(master参与读) 7. 写高可用 8. 读写随机 一、重要概念 Server Group 在OneProxy中,一组主从复制的MySQL集群被称为Server Group。如图. 所示,有Server...

weixin_30469895的博客 154

分布式系统如何保证数据一致性,幂等性

强一致性:适用于对一致性要求非常高的场景,通常使用分布式事务或共识算法来保证一致性。最终一致性:适用于对一致性要求不高的场景,允许短暂的不一致,但最终数据会达到一致。分布式事务:如 2PC、TCC、Saga 等用于确保跨多个节点的事务一致性。

weixin_39304656的博客 2172

ShardingSphere-mysql水平分片

当单表记录达到500万条或磁盘空间占用达2GB时需要考虑水平分表。水平分表是按行切分为多个表,若放在同一个服务器里能够满足性能要求就不用分库。若不能满足要求就要分库了,将表放在不同的服务器上。

qq_39093474的博客 465

Mycat水平分片策略(水平分表拆分)

一、分片枚举算法 可以实现按照地区进行分表 根据不同的枚举(常量)进行分表存储 1.mysql中建立3个数据库分别为user_db1 user_db2 user_db3 2.在3个数据库中建立3个一样的数据表 order_info order_info表中有字段name 3.配置mycat环境 schema.xml <?xml version="1.0"?> ...

踟蹰千年的博客 3545

linux mycat mysql 水平拆分——分表

linux mycat mysql 水平拆分——分表

weixin_44285972的博客 615
上一篇: MySQL: 数据库分库分表架构演进之从读写分离到水平拆分的实战解析
下一篇: MySQL: 数据库监控核心要素与实施策略
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值