Gluster复制卷同步问题求助:SQLite文件更新后无法同步
问题:Gluster复制卷用于SQLite存储时文件更新无法同步,gluster volume heal无效
我想把Gluster复制卷用于SQLite数据库存储,但.db文件更新后,Linux系统检测不到变化,导致Brick之间无法同步。试过gluster volume heal命令也没用,有没有强制同步的方法?
Gluster卷状态
[root@be-k8s-worker-1 common]# gluster volume create sync_test replica 2 transport tcp 10.XX.XX.X1:/home/common/sync_test 10.XX.XX.X2:/home/common/sync_test Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/. Do you still want to continue? (y/n) y volume create: sync_test: success: please start the volume to access data [root@be-k8s-worker-1 common]# gluster volume start sync_test volume start: sync_test: success [root@be-k8s-worker-1 sync_test]# gluster volume status sync_test Status of volume: sync_test Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick 10.XX.XX.X1:/home/common/sync_test 49155 0 Y 1142 Brick 10.XX.XX.X2:/home/common/sync_test 49155 0 Y 2134 Self-heal Daemon on localhost N/A N/A Y 2612 Self-heal Daemon on 10.XX.XX.X1 N/A N/A Y 4257 Task Status of Volume sync_test ------------------------------------------------------------------------------ There are no active volume tasks
问题案例
[root@be-k8s-worker-1 sync_test]# ls -al ## client 1 total 20 drwxrwxrwx. 4 root root 122 Oct 17 10:51 . drwx------. 8 sbyun domain users 4096 Oct 17 10:50 .. -rw-r--r--. 1 root root 0 Oct 17 10:35 test -rwxr--r--. 1 sbyun domain users 16384 Oct 17 10:52 test.db [root@be-k8s-worker-1 sync_test2]# ls -al ## client2 total 20 drwxrwxrwx. 4 root root 122 Oct 17 10:51 . drwx------. 8 sbyun domain users 4096 Oct 17 10:50 .. -rw-r--r--. 1 root root 0 Oct 17 10:35 test -rwxr--r--. 1 sbyun domain users 16384 Oct 17 10:52 test.db ## diff -> No result [root@be-k8s-worker-1 user]# diff sync_test/test.db sync_test2/test.db
在Windows系统中对比这两个文件,能发现内容差异。
解决方案建议
1. 强制SQLite实时落盘
SQLite默认用内存页缓存+延迟写入,不会立即把修改同步到磁盘,导致Gluster检测不到变化。可以在打开数据库时设置同步参数:
sqlite3 test.db "PRAGMA synchronous=FULL;"
或者在应用连接SQLite时指定synchronous=FULL,确保修改实时写入磁盘。
2. 触发Gluster主动同步
如果文件已修改但Gluster未同步,尝试以下命令强制修复:
- 全量触发自我修复:
gluster volume heal sync_test full
- 针对单个文件修复:
gluster volume heal sync_test /test.db
- 查看待修复文件列表:
gluster volume heal sync_test info
3. 调整Gluster文件检测机制
Gluster依赖inotify事件触发同步,若inotify失效:
- 检查并调高
inotify监听上限:
# 查看当前值 sysctl fs.inotify.max_user_watches # 临时调高 sysctl -w fs.inotify.max_user_watches=1048576 # 永久生效 echo "fs.inotify.max_user_watches=1048576" >> /etc/sysctl.conf
- 禁用Gluster缓存(性能会下降,按需使用):
gluster volume set sync_test performance.cache-size 0 gluster volume set sync_test performance.stat-prefetch off
4. 解决Replica 2的脑裂风险
你的卷是Replica 2配置,本身存在脑裂隐患,这会导致同步异常。建议升级为Replica 3或添加Arbiter节点:
# 添加Arbiter节点示例 gluster volume add-brick sync_test arbiter 10.XX.XX.X3:/home/common/sync_test_arbiter
5. 验证同步结果
执行以下命令确认文件是否同步完成:
# 查看已修复文件 gluster volume heal sync_test info healed # 对比两个Brick上文件的哈希值 md5sum 10.XX.XX.X1:/home/common/sync_test/test.db md5sum 10.XX.XX.X2:/home/common/sync_test/test.db
内容的提问来源于stack exchange,提问作者Subin
相关产品推荐
相关产品推荐

