GFS2 单写入器多读取器设置

GFS2 单写入器多读取器设置

我希望您能就我正在实施的设置提供建议,以便允许多台主机在共享 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"

相关内容