尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何启用 Turso 的 multiprocess_wal 让多个进程读写同一数据库文件?

如何启用 Turso 的 multiprocess_wal 让多个进程读写同一数据库文件? 如何启用 Turso 的 multiprocess_wal 让多个进程读写同一数据库文件【免费下载链接】tursoA SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.项目地址: https://gitcode.com/GitHub_Trending/tu/tursoTurso 默认规定一个数据库文件只能被单个 OS 进程打开同一进程内的多个线程和连接可以安全共享数据库但从第二个进程打开同一文件时会收到 locking error。如果你的部署形态是多个独立进程读写同一份.db文件而不经过 server 层worker sidecar、CLI 与嵌入式应用共用数据库、新旧进程短暂重叠的零停机发布、按连接拆进程部署就需要启用实验特性multiprocess_wal。启用后多个进程可以同时打开同一个.db文件通过一个共享内存文件协调 WAL 读写与 checkpoint。注意multiprocess access 是experimental状态磁盘协调格式和公开 API 可能在版本之间变化文档明确提示不要依赖该格式跨版本做长期存储见 docs/sql-reference/multiprocess-access.mdx。启用前核对适用条件以下条件全部满足时 multiprocess WAL 才可用任何一条不满足都应先处理再启用平台64 位类 Unix 系统Linux、macOS、Android 等。在 Windows、WASM 和 32 位目标上multiprocess_wal标志会被接受但没有效果数据库按单进程模式打开。这里两份文档的说法需要留意SQL 参考文档 multiprocess-access.mdx 称 Windows 上标志无效而 CLI 手册 docs/manual.md 中--experimental-multiprocess-wal一条的说明是支持 64 位 Unix以及配合--vfs experimental_win_iocp使用时支持 64 位 Windows。两处对 Windows 的支持口径不一致涉及 Windows 部署时建议以当前版本的实际行为和发布说明为准。IO 后端当前 IO 后端必须实现共享 WAL 协调。默认的文件后端支持纯内存后端和部分自定义 VFS 不支持。文件系统数据库必须位于正确实现 POSIX byte-range lock 和 mmap 的本地文件系统。以下文件系统会被明确拒绝返回InvalidArgument因为共享 mmap 协调在它们上面不安全NFS、CIFS/SMB2、CephFS、GFS2、Lustre、OCFS2以及 AFS、CODA、NCP、9P (v9fs)。非内存库:memory:和file::memory:路径会被拒绝共享协调需要落盘文件。第一步为每个打开该库的进程传递 multiprocess_wal最短主路径是 CLI。tursodb通过--experimental-multiprocess-wal标志开启该标志同时列在 docs/sql-reference/cli/command-line-options.mdx 的 Experimental Feature Flags 表中tursodb --experimental-multiprocess-wal mydb.db关键约束同一时刻打开mydb.db的每一个tursodb或 SDK进程都必须传该标志混用模式会被拒绝下文验证一节给出具体报错。如果你用 SDK 而不是 CLI各语言对应写法如下取自 docs/sql-reference/multiprocess-access.mdxRustuse turso::Builder; let db Builder::new_local(mydb.db) .experimental_multiprocess_wal(true) .build()?;JavaScript / Node.jsimport { Database } from tursodatabase/libsql; const db new Database(file:mydb.db, { experimental: [multiprocess_wal], });Pythonimport turso conn turso.connect( mydb.db, experimental_featuresmultiprocess_wal, )Go配置结构或 DSN 二选一db, err : turso.NewDatabase(turso.TursoDatabaseConfig{ Path: mydb.db, ExperimentalFeatures: multiprocess_wal, })db, err : sql.Open(turso, mydb.db?experimentalmultiprocess_wal)multiprocess_wal是实验特性清单中的正式条目完整清单见 docs/sql-reference/experimental-features.mdx。理解 .tshm 侧车文件多进程如何协调启用后Turso 会在数据库旁边多创建一个同级文件各进程共同 mmap 它来协调文件用途mydb.db数据库文件不变。mydb.db-wal预写日志不变。mydb.db-tshmTurso 共享内存。内存映射的协调器跟踪 WAL 状态、当前 writer、当前 checkpointer、reader slot 和共享的 page-to-frame 索引。协调机制的要点单 writer 槽位任意时刻至多一个进程持有 writer 锁其余进程的写者阻塞等待。单 checkpointer 槽位checkpoint 跨进程串行化。有界 reader 槽位每个活动读事务 pin 住一个 WAL frame防止它被并发写者覆盖或被 checkpointer 回收。共享 frame 索引任意进程中的读者都能把页号解析到最新 WAL frame不必从头扫 WAL。跨进程的.tshm字节范围锁Linux 上用 OFD 锁macOS 上用fcntl控制所有权切换mmap 区域提供元数据查询的快路径。并发语义保持与单进程 WAL 一致读者永不阻塞写者快照稳定并发进程提交新 frame 不影响已开始的读事务一个进程做的 DDL 变更通过既有的 schema 刷新路径被其他进程在下一条语句时发现兄弟进程中的 prepared statement 可能收到SchemaUpdated并重新 prepare——这与单进程内跨连接的行为相同。验证确认多进程模式真正生效文档给出的判断方式有以下几种.tshm侧车文件出现。启用后打开数据库数据库目录中会多出mydb.db-tshm。这是 multiprocess 模式实际启用的直接产物。混用模式会快速失败报错文本可区分两种方向。数据库不能一边以单进程模式、另一边以多进程模式同时打开打开路径会探测不兼容的现存 opener 并立即报错引自 docs/sql-reference/multiprocess-access.mdx 的Mixing Modes一节不带multiprocess_wal打开而另一进程持有存活的.tshm权限Database is already open with experimental multiprocess WAL in another process带multiprocess_wal打开而另一进程持有旧式独占 DB 文件锁Database is already open without experimental multiprocess WAL in another process这两条报错可以作为检查手段如果漏给某个进程传了标志打开会直接失败并命中其中一条而不是静默降级只读打开除外见下。切换模式的正确操作关闭到该库的所有现有连接再用目标配置重新打开。.tshm文件可以留在原地——Turso 在下一次 multiprocess 打开时复用它必要时从 WAL 重建状态。另有一个只读回退行为对只读打开请求multiprocess_wal但.tshm不存在时Turso 回退到旧式只读 WAL 路径而不是失败这让只读工具可以安全地读一个被单进程写者干净关闭的库。正确性压测可选路径仓库中的确定性并发模拟器支持 multiprocess 模式见 testing/concurrent-simulator/README.md。该命令在testing/concurrent-simulator内收集覆盖并运行多进程场景副作用是写入.coverage/whopper/下的报告文件需要本地具备 Rust 工具链make whopper-coverage WHOPPER_RUNS10 \ WHOPPER_ARGS--mode fast --max-steps 10000 --multiprocess --processes 2 --connections-per-process 2报告输出到.coverage/whopper/report.txt与.coverage/whopper/html/index.html。文档说明 multiprocess 的 concurrent-simulator 与 stress 测试只在 64 位 Unix 目标上运行。限制与边界不与 MVCC 同用该特性尚不支持 MVCCBEGIN CONCURRENT。单进程内用 MVCC或多进程 WAL 默认隔离模型二选一不能同时。.tshm格式带版本号不迁移格式升级会使已有.tshm失效Turso 在打开时重建不做跨版本迁移。ATTACH 继承主连接设置通过ATTACH DATABASE附加的数据库继承主连接的 multiprocess 设置。生产警示docs/manual.md 对该 CLI 标志的说明中标注该特性未生产就绪当前不要用于关键数据。完成上述步骤后判断标准是数据库目录出现mydb.db-tshm、所有参与进程都带了标志、漏传标志的进程会收到上面两条报错之一而不是锁定错误即说明多进程读写路径已经建立。【免费下载链接】tursoA SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.项目地址: https://gitcode.com/GitHub_Trending/tu/turso创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表