赞
踩
这次专门整理下多节点共享文件系统
背景
之前曾经安装过 Oracle RAC, 申请了多余的共享磁盘,配置了一下 OCFS2 系统, 挂载到所有节点,用于存放数据库备份, 这样的话, 备份的内容所有节点都可见。 当然了使用 Oracle ASM 的ACFS也行(以前做过,没记录,有空了再整理)。
这次呢,又一个新地方部署了同一个版本的RAC, 也想用相同方式,但在配置 OCFS2 的步骤 o2cb.init configure 步骤竟然报错,卡住了,时间比较紧, 最后,换 xfs 格式,只挂载在其中一个节点用于备份。
离开之后, 复盘了下原因, 是因为之前成功的 OCFS2 配置是在Oracle Linux 7 操作系统上,默认是 uek 内核启动, 默认是支持 OCFS2 文件系统的。 而我们这次呢,是 Redhat7 , 默认是不支持 OCFS2 文件系统的。
今天,主要分享共享储存的节点如何配置 OCFS2。 共享磁盘使用openfiler的iscsi服务提供,这个就不单独讲了,一共配置了4个lun。用于共享磁盘。
后面再讲vmware workstation共享磁盘和 DRBD 的方式实现共享磁盘。
日期: 2023-05-19
openfiler : 192.168.55.201 提供共享磁盘
oracle linux 7.9 (uek)测试组: 2台 使用 ocfs2 挂载共享磁盘
oracle linux 8.7 (uek)测试组: 2台 使用 ocfs2 挂载共享磁盘
oracle linux 9.2 (uek)测试组: 2台 使用 ocfs2 挂载共享磁盘
almaliux 9.2 + rockylinux 9.2 测试组: 2台, 操作系统 分别为 almaliux 9.2 和 rockylinux 9.2 使用 xfs 挂载共享磁盘
略
- hostnamectl set-hostname db01 #主机1执行,设置主机名称
- hostnamectl set-hostname db02 #主机2执行,设置主机名称
-
- #防火墙和selinux关闭
- systemctl disable firewalld --now
- sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config ; sed -i "s/SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
- setenforce 0
-
- #安装iscsi工具包
- yum -y install iscsi-initiator-utils
- iscsiadm -m discovery -t st -p 192.168.55.201
- iscsiadm -m node -T iqn.db -p 192.168.55.201 --login
- systemctl enable iscsi --now
- #再看看, 多了4个磁盘
- ls /dev/sd*
-
- #使用udev固定磁盘
- /usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb #查看设备id,其他类推
- cat >/etc/udev/rules.d/99-oracle-ocfs2.rules<<EOF
- KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name", RESULT=="14f504e46494c4552627138374e762d69364c532d6b305565", SYMLINK+="sharedisk/disks/data1", OWNER="root", GROUP="root", MODE="0660"
- KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name", RESULT=="14f504e46494c45523267733435572d4b68496b2d63745147", SYMLINK+="sharedisk/disks/data2", OWNER="root", GROUP="root", MODE="0660"
- KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name", RESULT=="14f504e46494c455261453050486e2d727567582d72525474", SYMLINK+="sharedisk/disks/data3", OWNER="root", GROUP="root", MODE="0660"
- KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name", RESULT=="14f504e46494c4552463164374d712d6857417a2d52473474", SYMLINK+="sharedisk/disks/data4", OWNER="root", GROUP="root", MODE="0660"
- EOF
-
- #linux7之前重启udev
- /usr/sbin/udevadm control --reload-rules
- systemctl restart systemd-udev-trigger.service ; systemctl status systemd-udev-trigger.service ; systemctl enable systemd-udev-trigger.service
- systemctl restart systemd-udevd.service ; systemctl status systemd-udevd.service ; systemctl enable systemd-udevd.service
-
-
- #linux7之后不能手动启停udev,而是采用重新加载的方式
- /sbin/udevadm control --reload-rules
- udevadm trigger --action=add
- /sbin/udevadm trigger --type=devices --action=change
- sleep 3
-
- #可以看到4个设备了
- ll /dev/sharedisk/disks/
注意 name 要和机器 hostname 一致, ip要和实际的ip一致, 我这边4个测试组, 我随机贴了一组。
- yum -y install ocfs2-tools
- yum -y install ocfs2-tools-devel #linux 7 only
- [ -d /etc/ocfs2 ] || mkdir -p /etc/ocfs2
- cat >/etc/ocfs2/cluster.conf <<EOF
- cluster:
- node_count = 2
- name = ocfs2
- node:
- ip_port = 7777
- ip_address = 192.168.55.180
- number = 0
- name = db01
- cluster = ocfs2
- node:
- ip_port = 7777
- ip_address = 192.168.55.181
- number = 1
- name = db02
- cluster = ocfs2
- EOF
- #初始化ocfs2配置 第一项选yes,第三项集群名称填上面配置文件里的,默认是ocfs2,其他默认, 配置结果存入配置文件 /etc/sysconfig/o2cb
- o2cb.init configure
- #确保o2cb ocfs2服务启动并设置为开机自启
- systemctl enable o2cb --now
- systemctl enable ocfs2 --now
- #任选一个主机 分区并格式化分区 注意:不同的测试组使用不同的设备
- parted /dev/sharedisk/disks/data1 mklabel gpt
- parted /dev/sharedisk/disks/data1 mkpart p1 ext4 1 100%
- mkfs.ocfs2 /dev/sharedisk/disks/data1
- #另一个主机 探测分区变化 注意:不同的测试组使用不同的设备
- partprobe /dev/sharedisk/disks/data1
- #所有主机 持久化磁盘挂载 注意:不同的测试组使用不同的设备
- [ -d /u02 ] || mkdir /u02 ; mount /dev/sharedisk/disks/data1 /u02
- echo 'sleep 10 ; partprobe /dev/sharedisk/disks/data1 ; sleep 10 ; mount /dev/sharedisk/disks/data1 /u02' >> /etc/rc.local
- #以下方法SAN共享磁盘测试可以,但iscsi共享磁盘开机没有自动挂载,应该是启动顺序原因,因此 iscsi 共享磁盘最好是手动挂载或延迟设置在 /etc/rc.local, 不要使用 /etc/fstab
- echo "#/dev/sharedisk/disks/data1 /u02 ocfs2 _netdev,defaults 0 0" >> /etc/fstab ; mount -a #_netdev: 表示当系统联网后再进行挂载操作,以免系统开机时间过长或开机失败
测试
- #在crontab job中添加如下内容
- * * * * * echo ${HOSTNAME} $(date) >> /u02/test.log
然后节点 查看 /u02/test.log 可以看到,各个节点都在往相同文件写入数据,并不会互相覆盖。
测试出现的问题
发布 reboot 命令后 7.9组 有时会启动失败,需vmware干预。
发布 poweroff 命令后会重启,但有时会启动失败。需vmware干预。( 7.9组 和 8.7组 发生过失败)
发布 poweroff -f 立刻关机 重启曾经有一台 8.7 已经识别分区,但没有自动挂载
8.7 组启动后发生过: 1 识别分区失败,无法挂载,需手动识别分区并挂载。2. 发生识别到分区,但无法挂载,需手动挂载
启动脚本中 刚开始设置 sleep 30 上面杰哥问题发生率较多, 设置为 sleep 10 后上面几个问题发生率较少。
结论
可以同时挂载,2节点都可以写入数据并互相可见.
iscsi 共享磁盘测试出的问题比较多, 生产环境不要使用 iscsi 共享磁盘。
前面发表了几篇 CentOS 的替代品 AlmaLinux 和 RockyLinux , 所以这边顺便测试了一下, 没有使用 OCFS2 文件系统。
这是 almaliux 9.2 + rockylinux 9.2 测试组
- #任选一个主机 使用格式化分区
- parted /dev/sharedisk/disks/data4 mklabel gpt
- parted /dev/sharedisk/disks/data4 mkpart p1 ext4 1 100%
- mkfs.xfs /dev/sharedisk/disks/data4
- #其余主机 探测分区变化
- partprobe /dev/sharedisk/disks/data2
- #只能一个主机 持久化磁盘挂载
- [ -d /u02 ] || mkdir /u02 ; mount /dev/sharedisk/disks/data4 /u02
测试结果
同一时刻, 2个节点虽然都可以挂载,但写入的内容互相看不见(即使其中一个以只读挂载,也看不到另一个节点写入的数据)。 全部卸载并重新挂载后,其中一个节点的写入数据丢失。
结论
必须保证同一时刻,只能有1个节点挂载
2023-05-20, 在自行编译支持 OCFS2 的linux内核后, 也测试了一下 Redhat 和 CentOS 的 OCFS 配置,跟 Oracle Linux 一样。故简述一下:
测试组
Redhat 7.9 + CentOS 7.9 测试组1: 自行编译内核
kernel-3.10.0-1160.90.1.el7.x86_64.rpm 并安装使用
Redhat 7.9 + CentOS 7.9 测试组2: 安装自行编译内核后复制出来的
kernel-3.10.0-1160.90.1.el7.x86_64.rpm
Redhat 7.9 + CentOS 7.9 测试组3: 安装 Orace Linux 中的包
linux-firmware-20200902-999.5.gitd5f9eea5.el7.noarch.rpm 和 kernel-uek-5.4.17-2011.6.2.el7uek.x86_64.rpm
以上三种重启后均支持 ocfs2 文件系统,再安装 Oracle Linux 安装介质中的
ocfs2-tools-1.8.6-14.el7.x86_64.rpm 和 ocfs2-tools-devel-1.8.6-14.el7.x86_64.rpm 即可以支持 ocfs2 共享文件系统
测试结果和 oracle linux 7.9 (uek)测试组 相同
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。