我希望您能就我正在实施的设置提供建议,以便允许多台主机在共享 iSCSI 存储上共享偶尔变化的数据。我使用 GFS2 来共享对 iSCSI 上的 LVM2 逻辑卷的访问权限,并且我宁愿避免使用 CoroSync 等设置集群的复杂性。
我已将文件系统格式化,并将锁定设置为锁定_无锁定和单个日志。单个节点将负责执行定期更新,这通常包括将新文件复制到卷中,但不更改现有文件,而所有其他节点将把它挂载为观众,ro根据手册页,这将:
使用特殊形式的只读挂载来挂载此文件系统。挂载不会使用文件系统的日志之一。该节点无法恢复其他节点的日志。
我是否可以合理地期望此设置稳定且高效?我应该注意什么问题?
我是否可以假设,由于文件系统只有一个日志,尝试从多个主机挂载 R/W 将会失败?
答案1
我已经实现了上述设置,它运行良好,但有一个主要限制:挂载 R/O 的主机无法知道共享卷已更改。从具有写权限的主机执行更新后,我需要手动同步文件系统,然后使用类似 的命令强制读取客户端刷新其 inode 缓冲区echo -n 2 | sudo -n /bin/dd of=/proc/sys/vm/drop_caches
。请注意,如果文件内容可能发生变化,您需要写入 3 而不是 2,以刷新文件。
我有时遇到的另一个问题是,R/O 客户端可能无法挂载共享存储,并显示“权限被拒绝”。要解决此问题,我需要从 R/W 节点卸载卷,挂载到遇到此问题的任何 R/O 节点,然后再次挂载到 R/W 节点。
以下是实现此目的的 Ansible 角色:
---
- name: Determine the canonical path of the shared-data directory
set_fact:
shared_dir_real_path: "{{ shared_dir_path | realpath }}"
- debug:
msg: "Manually forcing flushing and re-read of directories on volume at {{ shared_dir_path }} (real path: {{ shared_dir_real_path }})."
verbosity: 1
- name: Determine shared-dir mount point
command: "/usr/bin/env stat -c '%m' {{ shared_dir_real_path }}"
register: shared_dir_mount_point
changed_when: False
- name: Determine the mount point's filesystem type and mount options
set_fact:
"shared_dir_mount_{{ item }}": "{{ ansible_mounts | selectattr('mount', 'equalto', shared_dir_mount_point.stdout) | map(attribute = item) | join(',') }}"
with_items:
- fstype
- options
- name: Verify the shared-dir is mounted GFS2
assert:
that: "'{{ shared_dir_mount_fstype }}' == 'gfs2'"
- name: Determine the access to the shared-data directory
set_fact:
shared_dir_access_flags: "{{ ['ro', 'rw'] | intersect( shared_dir_mount_options.split(',') )}}"
- name: Verify Access mode sanity
assert:
that: shared_dir_access_flags | length == 1
- name: Sync the shared filesystem
command: "sudo -n /bin/sync -f {{ shared_dir_real_path }}"
args:
warn: false # Silence warning about the use of sude instead of 'become', which is here deliberate
when: "'rw' in shared_dir_access_flags"
- name: Force re-load of directory inodes
shell: "echo -n 2 | sudo -n /bin/dd of=/proc/sys/vm/drop_caches"
when: "'ro' in shared_dir_access_flags"