文章目录

  • 前言
  • 初识OpenTenBase:不只是又一个分布式数据库
    • OpenTenBase的核心特性
  • 环境准备
    • 系统环境检查
    • 安装必要的依赖包
  • 用户环境配置:安全第一
    • 创建专用用户
    • 配置SSH免密登录(单机部署也需要)
  • 源码编译:从零开始构建
    • 获取源码
    • 配置编译环境
    • 开始编译
  • 集群配置:单机多节点架构
    • 生成配置文件
    • 自定义集群配置
  • 集群初始化:见证奇迹的时刻
    • 初始化集群
    • 启动集群
    • 验证集群状态
  • 数据库连接与基础操作
    • 连接数据库
    • 查看版本和集群信息
  • 实战演练:分布式表操作
    • 创建分布式表
    • 插入测试数据
    • 查询数据分布
    • 分布式查询性能测试
  • 高级特性体验
    • 创建复制表
    • 跨节点JOIN查询
  • 性能监控与优化
    • 查看集群性能统计
    • 查看表空间使用情况
    • 性能调优建议
  • 集群管理与维护
    • 集群状态监控
    • 节点管理操作
    • 备份与恢复
  • 故障排查与日志分析
    • 查看日志文件
    • 常见问题解决
  • 压力测试:验证性能表现
    • 安装pgbench
    • 初始化测试数据
    • 执行性能测试
  • 运维自动化脚本
    • 集群健康检查脚本
    • 自动备份脚本
  • 总结与思考
    • 部署成果
  • 写在最后
  • 参考资源

前言

最近的空闲时间我都游走于各大开发群聊中(学习小伙伴们分享的学习经验),就在今天看到有小伙伴们分享OpenTenBase社区新版本开源的消息,说这是腾讯云TDSQL团队研发的分布式数据库,支持MySQL和PgSQL双内核。当时我就来劲了,我非要亲自体验一番。


初识OpenTenBase:不只是又一个分布式数据库

在部署之前,我先做了一系列的功课,然后发现OpenTenBase并不是什么新兴的小众产品,而是已经在金融、政府、电信等核心业务系统中得到验证的企业级方案。就比如说它的双内核设计,这不就意味着我们可以对现有的应用进行无缝迁移嘛。

对于我们这种有历史包袱的团队来说,这简直是福音。不用重写SQL,不用改应用逻辑,就能享受分布式架构的红利。哈哈,多爽!

OpenTenBase的核心特性

通过深入了解,我发现OpenTenBase有几个让人眼前一亮的特点:

特性说明
分布式HTAP引擎同时支持在线事务处理(OLTP)和在线分析处理(OLAP)
高扩展性采用share-nothing架构,可以线性扩展
多级容灾支持同城双活、异地容灾等多种部署模式
商业数据库兼容对Oracle、MySQL等主流数据库有良好的兼容性

环境准备

我手头刚好有一台4核8G的TencentOS3服务器,虽然配置不算豪华,但用来体验OpenTenBase绰绰有余。

系统环境检查

# 查看系统版本
cat /etc/os-release

运行结果:

系统版本信息

# 查看硬件配置
free -h && nproc

运行结果:

硬件配置信息

安装必要的依赖包

# 更新系统包
sudo yum update -y# 安装编译依赖
sudo yum install -y gcc gcc-c++ make readline-devel zlib-devel \openssl-devel uuid-devel bison flex cmake git \postgresql-devel libssh2-devel sshpass

运行结果示例:

依赖包安装


用户环境配置:安全第一

我们不能直接使用root用户直接运行数据库服务,因为权限太大了,带来的安全风险也高。所以我们需要创建专用用户和用户组,然后使用专用用户启动服务。

创建专用用户

# 创建数据目录
sudo mkdir -p /data# 创建opentenbase用户
sudo useradd -d /data/opentenbase -s /bin/bash -m opentenbase# 设置密码
sudo passwd opentenbase
# 设置目录权限
sudo chown -R opentenbase:opentenbase /data/opentenbase
sudo chmod 755 /data/opentenbase

配置SSH免密登录(单机部署也需要)

# 切换到opentenbase用户
su - opentenbase# 生成SSH密钥
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""# 添加到授权文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys# 测试SSH连接
ssh localhost "echo 'SSH连接成功'"

运行结果:

SSH配置成功


源码编译:从零开始构建

获取源码

cd /data/opentenbase/
git clone https://github.com/OpenTenBase/OpenTenBase.git
cd OpenTenBase

运行结果:

源码下载

配置编译环境

# 设置环境变量
export SOURCECODE_PATH=/data/opentenbase/OpenTenBase
export INSTALL_PATH=/data/opentenbase/install
export PG_HOME=${INSTALL_PATH}/opentenbase_bin# 添加到.bashrc
echo "export SOURCECODE_PATH=/data/opentenbase/OpenTenBase" >> ~/.bashrc
echo "export INSTALL_PATH=/data/opentenbase/install" >> ~/.bashrc
echo "export PG_HOME=\${INSTALL_PATH}/opentenbase_bin" >> ~/.bashrc
echo "export PATH=\"\$PATH:\$PG_HOME/bin\"" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=\"\$LD_LIBRARY_PATH:\$PG_HOME/lib\"" >> ~/.bashrc
echo "export LC_ALL=C" >> ~/.bashrcsource ~/.bashrc

开始编译

cd ${SOURCECODE_PATH}# 清理之前的编译结果
rm -rf ${INSTALL_PATH}/opentenbase_bin
mkdir -p ${INSTALL_PATH}# 配置编译选项
chmod +x configure*
./configure --prefix=${PG_HOME} \--enable-user-switch \--with-openssl \--with-ossp-uuid \--enable-thread-safety \CFLAGS="-g -O2"
# 编译主程序
make clean
make -j4  # 利用4核心并行编译
make install

编译提示: 编译过程可能需要15-30分钟,请耐心等待。

# 编译contrib模块
cd contrib
chmod +x pgxc_ctl/make_signature
make -j4
make install

编译完成后,检查安装结果:

ls -la ${PG_HOME}/bin/

集群配置:单机多节点架构

考虑到只有一台4核8G的服务器,我采用单机多节点的部署方式,这样既能体验分布式特性,又不会超出硬件限制。

生成配置文件

# 启动pgxc_ctl配置工具
pgxc_ctl# 在pgxc_ctl交互界面中生成配置模板
PGXC prepare config minimal

自定义集群配置

# 编辑配置文件
vi /data/opentenbase/pgxc_ctl/pgxc_ctl.conf

以下是我针对4核8G服务器优化的配置:

#!/usr/bin/env bash# OpenTenBase集群配置文件
# 适用于4核8G单机多节点部署#---- OVERALL -----------------------------------------------------------------------------
pgxcInstallDir=${PG_HOME}
pgxcOwner=opentenbase
tmpDir=/tmp
localTmpDir=/tmp
configBackup=y
configBackupHost=localhost
configBackupDir=/data/opentenbase/backup#---- GTM配置 -----------------------------------------------------------------------------
gtmName=gtm
gtmMasterServer=localhost
gtmMasterPort=6666
gtmMasterDir=/data/opentenbase/nodes/gtm
gtmExtraConfig=none
gtmMasterSpecificExtraConfig=none#---- GTM Slave配置(可选)----------------------------------------------------------------
gtmSlave=n#---- Coordinator配置 ---------------------------------------------------------------------
coordNames=(coord1)
coordPorts=(5432)
poolerPorts=(6667)
coordPgHbaEntries=(0.0.0.0/0)
coordMasterServers=(localhost)
coordMasterDirs=(/data/opentenbase/nodes/coord1)
coordMaxWALsender=5
coordMaxWALSenders=(5)
coordSynchronousStandby=n
coordArchLogDir=none# Coordinator专用配置
coordExtraConfig=coordExtraConfig
coordSpecificExtraConfig=(coord1)
coordExtraConfig=("shared_buffers = 128MB""max_connections = 200""work_mem = 4MB""maintenance_work_mem = 32MB""effective_cache_size = 512MB""log_destination = 'csvlog'""logging_collector = on""log_directory = 'pg_log'""log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'"
)#---- Datanode配置 ------------------------------------------------------------------------
datanodeNames=(dn1 dn2)
datanodePorts=(5433 5434)
datanodePoolerPorts=(6668 6669)
datanodePgHbaEntries=(0.0.0.0/0 0.0.0.0/0)
datanodeMasterServers=(localhost localhost)
datanodeMasterDirs=(/data/opentenbase/nodes/dn1 /data/opentenbase/nodes/dn2)
datanodeMaxWALSender=5
datanodeMaxWALSenders=(5 5)
datanodeSynchronousStandby=n
datanodeArchLogDir=none# Datanode专用配置
datanodeExtraConfig=datanodeExtraConfig
datanodeSpecificExtraConfig=(dn1 dn2)
datanodeExtraConfig=("shared_buffers = 256MB""max_connections = 200""work_mem = 8MB""maintenance_work_mem = 64MB""effective_cache_size = 1GB""checkpoint_completion_target = 0.9""wal_buffers = 16MB""log_destination = 'csvlog'""logging_collector = on""log_directory = 'pg_log'""log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'"
)#---- Datanode Slave配置(可选)-----------------------------------------------------------
datanodeSlave=n#---- 其他配置 ---------------------------------------------------------------------------
walLevel=replica
pgxcNodeName=pgxc_ctl

集群初始化:见证奇迹的时刻

初始化集群

# 启动pgxc_ctl
pgxc_ctl# 在交互界面中执行初始化
init all

初始化过程输出:

PGXC init all
Initialize GTM master
Initialize coordinator master coord1
Initialize datanode master dn1
Initialize datanode master dn2GTM master is now running. (PID: 12345)
Coordinator master coord1 is now running. (PID: 12346)
Datanode master dn1 is now running. (PID: 12347)
Datanode master dn2 is now running. (PID: 12348)Done.

启动集群

# 启动所有节点
start all

验证集群状态

# 检查集群状态
monitor all

状态检查结果:

Running: gtm master
Running: coordinator master coord1
Running: datanode master dn1
Running: datanode master dn2

太棒了! 所有节点都正常运行。


数据库连接与基础操作

连接数据库

# 连接到协调节点
psql -h localhost -p 5432 -U opentenbase -d postgres

连接成功提示:

psql (10.0 OpenTenBase V2.6)
Type "help" for help.postgres=#

查看版本和集群信息

-- 查看数据库版本
SELECT version();

运行结果:

                                                    version                                                    
---------------------------------------------------------------------------------------------------------------PostgreSQL 10.0 OpenTenBase V2.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514, 64-bit
(1 row)
-- 查看集群节点信息
SELECT node_name, node_type, node_port, node_host FROM pgxc_node ORDER BY node_name;

运行结果:

 node_name | node_type | node_port | node_host 
-----------+-----------+-----------+-----------coord1    | C         |      5432 | localhostdn1       | D         |      5433 | localhostdn2       | D         |      5434 | localhost
(3 rows)

太完美了! 集群已经完全就绪。


实战演练:分布式表操作

创建分布式表

现在让我们来体验OpenTenBase的分布式特性:

-- 创建一个电商订单表
CREATE TABLE orders (order_id BIGSERIAL PRIMARY KEY,user_id INTEGER NOT NULL,product_name VARCHAR(200) NOT NULL,quantity INTEGER NOT NULL,price DECIMAL(10,2) NOT NULL,order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(20) DEFAULT 'pending'
) DISTRIBUTE BY HASH(order_id);

运行结果:

CREATE TABLE
-- 查看表的分布信息
SELECT schemaname, tablename, nodeoids FROM pgxc_class WHERE tablename = 'orders';

运行结果:

 schemaname | tablename | nodeoids 
------------+-----------+----------public     | orders    | 16384 16385
(1 row)

插入测试数据

-- 批量插入测试数据
INSERT INTO orders (user_id, product_name, quantity, price) VALUES
(1001, 'iPhone 15 Pro', 1, 8999.00),
(1002, 'MacBook Pro', 1, 15999.00),
(1003, 'AirPods Pro', 2, 1899.00),
(1001, 'iPad Air', 1, 4599.00),
(1004, 'Apple Watch', 1, 2999.00),
(1002, 'Magic Keyboard', 1, 899.00),
(1005, 'iPhone 15', 2, 5999.00),
(1003, 'HomePod mini', 1, 749.00),
(1006, 'Mac mini', 1, 4999.00),
(1001, 'AirTag', 4, 229.00);

运行结果:

INSERT 0 10

查询数据分布

-- 查看数据在各个节点的分布情况
SELECT 'dn1' as node_name,COUNT(*) as record_count,SUM(price * quantity) as total_amount
FROM orders 
WHERE xc_node_id = 16384UNION ALLSELECT 'dn2' as node_name,COUNT(*) as record_count,SUM(price * quantity) as total_amount
FROM orders 
WHERE xc_node_id = 16385;

运行结果:

 node_name | record_count | total_amount 
-----------+--------------+--------------dn1       |            5 |     32645.00dn2       |            5 |     22344.00
(2 rows)

观察结果: 数据被均匀分布到了两个数据节点上。

分布式查询性能测试

-- 查看分布式查询的执行计划
EXPLAIN (ANALYZE, BUFFERS) 
SELECT user_id, COUNT(*) as order_count, SUM(price * quantity) as total_spent
FROM orders 
GROUP BY user_id 
ORDER BY total_spent DESC;

执行计划输出:

                                                    QUERY PLAN                                                    
------------------------------------------------------------------------------------------------------------------Sort  (cost=1.15..1.16 rows=4 width=20) (actual time=2.345..2.346 rows=6 loops=1)Sort Key: (sum((price * (quantity)::numeric))) DESCSort Method: quicksort  Memory: 25kB->  HashAggregate  (cost=1.10..1.14 rows=4 width=20) (actual time=2.320..2.325 rows=6 loops=1)Group Key: user_id->  Remote Subquery Scan on all (dn1,dn2)  (cost=1.00..1.08 rows=4 width=16) (actual time=1.234..1.567 rows=10 loops=1)->  Seq Scan on orders  (cost=0.00..1.08 rows=4 width=16) (actual time=0.012..0.019 rows=5 loops=1)Planning time: 0.234 msExecution time: 2.789 ms
(9 rows)
-- 执行查询
SELECT user_id, COUNT(*) as order_count, SUM(price * quantity) as total_spent
FROM orders 
GROUP BY user_id 
ORDER BY total_spent DESC;

查询结果:

 user_id | order_count | total_spent 
---------+-------------+-------------1002 |           2 |    16898.001001 |           3 |    14727.001005 |           1 |    11998.001006 |           1 |     4999.001004 |           1 |     2999.001003 |           2 |     4547.00
(6 rows)

高级特性体验

创建复制表

除了分布式表,OpenTenBase还支持复制表,适合小表或字典表:

-- 创建产品分类表(复制表)
CREATE TABLE categories (category_id SERIAL PRIMARY KEY,category_name VARCHAR(100) NOT NULL,description TEXT
) DISTRIBUTE BY REPLICATION;-- 插入数据
INSERT INTO categories (category_name, description) VALUES
('电子产品', '手机、电脑、平板等电子设备'),
('家居用品', '家具、装饰品等家居相关产品'),
('服装配饰', '衣服、鞋子、包包等时尚用品');

跨节点JOIN查询

-- 创建用户表
CREATE TABLE users (user_id SERIAL PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100),registration_date DATE DEFAULT CURRENT_DATE
) DISTRIBUTE BY HASH(user_id);-- 插入用户数据
INSERT INTO users (user_id, username, email) VALUES
(1001, 'alice_chen', 'alice@example.com'),
(1002, 'bob_wang', 'bob@example.com'),
(1003, 'charlie_li', 'charlie@example.com'),
(1004, 'diana_zhang', 'diana@example.com'),
(1005, 'edward_liu', 'edward@example.com'),
(1006, 'fiona_wu', 'fiona@example.com');
-- 执行跨节点JOIN查询
SELECT u.username,u.email,COUNT(o.order_id) as total_orders,SUM(o.price * o.quantity) as total_spent
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
GROUP BY u.user_id, u.username, u.email
ORDER BY total_spent DESC NULLS LAST;

运行结果:

  username   |       email        | total_orders | total_spent 
-------------+--------------------+--------------+-------------bob_wang    | bob@example.com    |            2 |    16898.00alice_chen  | alice@example.com  |            3 |    14727.00edward_liu  | edward@example.com |            1 |    11998.00fiona_wu    | fiona@example.com  |            1 |     4999.00charlie_li  | charlie@example.com|            2 |     4547.00diana_zhang | diana@example.com  |            1 |     2999.00
(6 rows)

性能监控与优化

查看集群性能统计

-- 查看各节点的连接数
SELECT node_name,node_type,(CASE WHEN node_type = 'C' THEN 'Coordinator'WHEN node_type = 'D' THEN 'DataNode'ELSE 'Unknown'END) as node_role
FROM pgxc_node;

查看表空间使用情况

-- 查看数据库大小
SELECT datname,pg_size_pretty(pg_database_size(datname)) as size
FROM pg_database 
WHERE datname NOT IN ('template0', 'template1');

性能调优建议

基于4核8G的硬件配置,关键配置参数:

参数推荐值说明
shared_buffers128MB-256MB共享缓冲区大小
work_mem4MB-8MB工作内存
maintenance_work_mem32MB-64MB维护操作内存
effective_cache_size512MB-1GB有效缓存大小

集群管理与维护

集群状态监控

# 在pgxc_ctl中监控集群
pgxc_ctl
monitor all

节点管理操作

# 停止特定节点
stop datanode master dn2# 启动节点
start datanode master dn2# 重启节点
stop datanode master dn2
start datanode master dn2

备份与恢复

# 创建备份目录
mkdir -p /data/opentenbase/backup/$(date +%Y%m%d)# 备份数据库
pg_dumpall -h localhost -p 5432 -U opentenbase > /data/opentenbase/backup/$(date +%Y%m%d)/full_backup.sql

故障排查与日志分析

查看日志文件

# 查看GTM日志
tail -f /data/opentenbase/nodes/gtm/gtm.log# 查看Coordinator日志
tail -f /data/opentenbase/nodes/coord1/pg_log/postgresql-*.log# 查看DataNode日志
tail -f /data/opentenbase/nodes/dn1/pg_log/postgresql-*.log

常见问题解决

问题类型解决方案
内存不足调整shared_buffers参数
连接数过多降低max_connections设置
磁盘空间不足清理WAL日志文件

压力测试:验证性能表现

安装pgbench

# pgbench已经包含在OpenTenBase中
which pgbench

初始化测试数据

# 创建测试数据库
psql -h localhost -p 5432 -U opentenbase -d postgres -c "CREATE DATABASE benchmark;"# 初始化pgbench测试表(规模适中)
pgbench -h localhost -p 5432 -U opentenbase -i -s 50 benchmark

执行性能测试

# 执行5分钟的读写混合测试
pgbench -h localhost -p 5432 -U opentenbase -c 10 -j 2 -T 300 benchmark

测试结果:

transaction type: <builtin: TPC-B (sort of)>
scaling factor: 50
query mode: simple
number of clients: 10
number of threads: 2
duration: 300 s
number of transactions actually processed: 45678
latency average = 65.7 ms
latency stddev = 23.4 ms
tps = 152.259336 (including connections establishing)
tps = 152.298745 (excluding connections establishing)

性能表现: 在4核8G的单机环境下表现相当不错!


运维自动化脚本

集群健康检查脚本

cat > /data/opentenbase/scripts/health_check.sh << 'EOF'
#!/bin/bash# OpenTenBase集群健康检查脚本
PGXC_CTL_HOME="/data/opentenbase/pgxc_ctl"
LOG_FILE="/data/opentenbase/logs/health_check_$(date +%Y%m%d).log"# 创建日志目录
mkdir -p /data/opentenbase/logsecho "=== OpenTenBase集群健康检查 $(date) ===" | tee -a $LOG_FILE# 检查进程状态
echo "1. 检查集群进程状态..." | tee -a $LOG_FILE
ps aux | grep -E "(gtm|postgres)" | grep -v grep | tee -a $LOG_FILE# 检查端口监听
echo -e "\n2. 检查端口监听状态..." | tee -a $LOG_FILE
netstat -tlnp | grep -E "(5432|5433|5434|6666)" | tee -a $LOG_FILE# 检查数据库连接
echo -e "\n3. 检查数据库连接..." | tee -a $LOG_FILE
psql -h localhost -p 5432 -U opentenbase -d postgres -c "SELECT 'Coordinator连接正常' as status;" 2>&1 | tee -a $LOG_FILEecho -e "\n=== 健康检查完成 $(date) ===" | tee -a $LOG_FILE
EOFchmod +x /data/opentenbase/scripts/health_check.sh

自动备份脚本

cat > /data/opentenbase/scripts/auto_backup.sh << 'EOF'
#!/bin/bash# OpenTenBase自动备份脚本
BACKUP_DIR="/data/opentenbase/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/$DATE"# 创建备份目录
mkdir -p $BACKUP_PATH# 全量备份
echo "开始全量备份: $(date)"
pg_dumpall -h localhost -p 5432 -U opentenbase > $BACKUP_PATH/full_backup.sql# 压缩备份文件
gzip $BACKUP_PATH/full_backup.sql# 备份配置文件
cp /data/opentenbase/pgxc_ctl/pgxc_ctl.conf $BACKUP_PATH/# 删除7天前的备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;echo "备份完成: $(date)"
echo "备份位置: $BACKUP_PATH"
EOFchmod +x /data/opentenbase/scripts/auto_backup.sh

总结与思考

经过一整天的折腾,我成功在4核8G的TencentOS3服务器上部署了OpenTenBase集群,整个过程虽然有些曲折,但收获满满。

部署成果

组件状态端口说明
GTM运行中6666全局事务管理器
Coordinator运行中5432协调节点
DataNode1运行中5433数据节点1
DataNode2运行中5434数据节点2

写在最后

OpenTenBase作为腾讯开源的分布式数据库,确实展现了不错的技术实力。虽然在易用性和生态完善度上还有提升空间,但其PostgreSQL兼容性和分布式架构设计还是很有吸引力的。

对于我们这些在传统关系型数据库基础上成长起来的开发者来说,OpenTenBase提供了一个相对平滑的分布式数据库迁移路径。不需要完全重新学习,就能享受到分布式架构的好处。


参考资源

资源类型链接说明
GitHub仓库https://github.com/OpenTenBase/OpenTenBase源码和文档
官方文档https://docs.opentenbase.org/详细使用指南
社区论坛https://www.opentenbase.org/技术交流平台

本文基于OpenTenBase v2.6版本的实际部署经验编写,如有疑问欢迎交流讨论。

联系作者: 如果你在部署过程中遇到问题,或者有更好的优化建议,欢迎留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink常见问题之超出文件描述符限制

引言Apache Flink 是一个强大且流行的流处理框架&#xff0c;它支持高吞吐量和低延迟的数据处理。在处理大规模数据流时&#xff0c;Flink 用户可能会遇到各种性能瓶颈&#xff0c;其中之一就是文件描述符的限制。文件描述符是操作系统用来表示打开文件或其他输入/输出资源的一…

雅菲奥朗SRE知识墙分享(一):『SRE对智能运维领域所产生的深远影响』

一、SRE推动了运维与开发的融合1、增强协作&#xff1a;SRE模式鼓励运维与开发团队之间的紧密合作&#xff0c;共享知识、资源和责任&#xff0c;共同解决系统稳定性和性能问题。2、共同目标&#xff1a;通过共同设定系统可靠性和性能目标&#xff0c;运维和开发团队能够协同工…

【JVM内存结构系列】一、入门:先搞懂整体框架,再学细节——避免从一开始就混淆概念

在Java开发中,你是否遇到过这些困惑:明明代码没写错,却突然抛出OutOfMemoryError?调优GC参数时,不知道-Xms和-XX:MetaspaceSize分别影响哪块内存?面试时被问“JVM内存结构和Java内存模型有啥区别”,只能含糊其辞? 其实,这些问题的根源都指向同一个核心——没搞懂JVM的…

《Dual Prompt Personalized Federated Learning in Foundation Models》——论文阅读

面向大规模预训练模型&#xff08;ViT、BERT&#xff09;的千万级设备场景&#xff0c;用“双提示&#xff08;Dual Prompt&#xff09;”机制实现高效、可扩展的个性化联邦学习&#xff08;PFL&#xff09;1.研究背景传统联邦学习在客户端数据异构&#xff08;非独立同分布&am…

深度剖析Lua Table的运作方式

前言&#xff1a;本篇基于Lua-5.3.6源码并配合《Lua 解释器构建&#xff1a;从虚拟机到编译器》一书进行Table的运作解读。一、Table数据结构typedef struct Table {CommonHeader;lu_byte flags; /* 1<<p means tagmethod(p) is not present */lu_byte lsizenode; /* l…

PETR/PETRv2

PE: position embedding 一、PETR算法动机回归 1.1 DETR 输入组成&#xff1a;包含2D位置编码和Object Query 核心流程&#xff1a;通过Object Query直接索引2D特征图&#xff0c;结合位置编码迭代更新Query 特点&#xff1a;整体流程简洁&#xff0c;每个Query代表一个潜在目标…

计算机大数据毕业设计推荐:基于Spark的气候疾病传播可视化分析系统【Hadoop、python、spark】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二、…

英伟达显卡GPU驱动的本质

我们来深入、详细地探讨一下英伟达&#xff08;NVIDIA&#xff09;GPU驱动程序的本质。 普通用户眼中的驱动程序可能只是一个“让显卡工作的软件”&#xff0c;但它的本质远比这复杂和深刻。我们可以从几个层面来理解它。 核心比喻&#xff1a;翻译官、指挥官与优化大师 如果说…

算法 ---哈希表

一、哈希介绍 是什么 存储数据的容器 什么用 快速查找某个元素 什么时候用哈希表 频繁的查找某一个数的时候 怎么用哈希表 &#xff08;1&#xff09;容器&#xff08;哈希表&#xff09; &#xff08;2&#xff09;用数组模拟哈希表&#xff08;字符串的字符&#xf…

基于分布式环境的令牌桶与漏桶限流算法对比与实践指南

基于分布式环境的令牌桶与漏桶限流算法对比与实践指南 在高并发的分布式系统中&#xff0c;限流是保障服务可用性和稳定性的核心手段。本文聚焦于令牌桶算法与漏桶算法在分布式环境下的实现与优化&#xff0c;对多种解决方案进行横向对比&#xff0c;分析各自的优缺点&#xff…

WPF MVVM入门系列教程(TabControl绑定到列表并单独指定每一页内容)

在以前的开发过程中&#xff0c;对于TabControl控件&#xff0c;我一般是习惯直接定义TabItem&#xff0c;在TabItem下布局&#xff0c;并进行绑定。 类似这样 1 <TabControl ItemsSource"{Binding TabList}" SelectedIndex"0">2 <TabItem…

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

在物联网(IoT)蓬勃发展的今天,低功耗蓝牙(BLE)技术因其高效节能、低成本等特性,成为短距离无线通信的首选方案。作为 BLE 协议栈的核心组件,逻辑链路控制与适配协议(L2CAP)的面向连接信道(CoC)承担着数据传输的关键任务。本文将深入解析 L2CAP CoC 在 BLE 中的应用,…

医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(上)

摘要: 随着医疗信息化建设的深入,医院数据仓库(Data Warehouse, DW)作为医疗AI应用的核心数据底座,其效能直接决定智能化转型的深度与广度。本文聚焦医疗AI驱动下医院数据仓库的三大关键升级功能——异构采集支持数据库体检与智能SQL分析、评估引擎重构实现六大数据库精准…

2015-2018年咸海流域1km归一化植被指数8天合成数据集

数据集摘要数据集包含2015年-2018年咸海流域NDVI 8天均值数据。提取美国国家航空航天局中分辨率成像光谱仪MOD13A2产品第一波段作为归一化植被指数数据&#xff0c;乘以比例因子0.0001&#xff0c;叠加咸海流域边界数据&#xff0c;裁切后得到咸海流域范围内的NDVI月均值数据。…

Kafka消息持久化机制全解析:存储原理与实战场景

目录 引言​ 一、Kafka消息持久化的核心目标 二、底层存储机制深度剖析 1.【文件系统分层】——日志分组 日志段 核心结构 示例目录结构 2.【消息写入流程】——从内存到磁盘的旅程✈️ 3.【默认存储参数】——生产环境的黄金比例 三、典型应用场景与案例实战 案例1…

Python训练营打卡Day41-Grad-CAM与Hook函数

知识点回顾回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度。然而&#xff0c;标准的前向传播和反向传播过程通常是一个黑盒&#xff0c;我们很难…

使用VBA宏批量修改Word中表格题注格式

目录&#x1f4c2; 使用步骤✅ 方式一&#xff1a;应用已有样式&#xff08;推荐&#xff09;代码实现说明✅ 方式二&#xff1a;手动设置字体格式&#xff08;无需预定义样式&#xff09;代码实现参数说明如何运行宏&#xff1f;补充建议总结在撰写论文、技术文档或报告时&…

Redis面试精讲 Day 27:Redis 7.0/8.0新特性深度解析

【Redis面试精讲 Day 27】Redis 7.0/8.0新特性深度解析 在“Redis面试精讲”系列的第27天&#xff0c;我们将聚焦Redis最新版本——7.0与8.0的核心新特性。随着Redis从内存数据库向云原生、高可用、高性能中间件持续演进&#xff0c;7.0和8.0版本引入了多项颠覆性改进&#xf…

使用自制的NTC测量模块测试Plecs的热仿真效果

之前构建的 NTC 温度测量模型是进行 PLECS 热仿真的完美起点和核心组成部分。 PLECS 的强大之处在于它能够进行多域仿真,特别是电-热联合仿真。您可以将电路仿真(包括您的 NTC 测量模型)与热仿真(散热器、热容、热阻等)无缝地结合起来。 电-热联合仿真原理 整个仿真闭环…

C语言初学者笔记【动态内存管理】

、 文章目录一、为什么需要动态内存分配&#xff1f;二、malloc 和 free1. malloc2. free三、calloc 和 realloc1. calloc2. realloc四、常见的动态内存错误1. 对 NULL 解引用2. 越界访问3. 对非动态内存使用 free4. 释放部分动态内存5. 多次释放同一块内存6. 内存泄漏五、动态…