欢迎各位兄弟 发布技术文章
这里的技术是共享的
在内核当中所实现的机制,它不会永久有效,要借助于用户空间的文件,,,,永久有效
我们要借助于客户端,需要首先去发现target,然后将发现的结果保存至文件系统的某个路径当中,下一次借助于某个服务(比如客户端的iscsi服务) iscsi, iscsid(iscsi会调用iscsid),iscsi服务脚本启动的时候,就会将保存至某个文件系统上的已经发现的设备将它们重新应用起来,将此前发现的设备重新在内核中建立起来关联关系,并跟target端建立会话的,,,,,,,,,,,,,,服务器端也依然在内核空间中提供此功能,在实现解析报文封装的时候,依然遵循同样的规范,iscsi的服务器端,必须随时接受客户端请求,所以它应该处于监听(服务)状态,监听在某个套接字上,随时接受客户端的访问,,,,监听(即服务),,服务通常是工作在用户空间的服务,所以当一个用户的请求,到达我们本机所监听的某个套接字的时候,首先到达我们本机的网卡,由我们的TCP/IP协议栈解码处理以后,发现是对3260套接字的请求,然后转交请求到TCP/IP的3260上监听的进程,这个进程最终发现用户请求的是iscsi的请求,然后转交给iscsi,由iscsi本身完成拆掉iscsi的首部封装,然后看到里面的iscsi的指令(是scsi指令?),最终将用户的请求的读取或写入数据在本机存储完成
图一
图二
同一个target,同一个iscsi服务器可以同时接受多个客户端请求的,,,,,,,,,,iscsi需要用户随时读写数据的,由此客户端和服务器端应该建立持久的会话连接,客户端和服务器端随时连接,建立传输,会话是持久存在的,可以理解成TCP/IP的隧道,
在隧道内可以不停地发送iscsi报文,
服务器端也需要启动一个服务,iscsi的服务器端也依然在内核空间的,所以不会永久有效,所以必须要保证开机以后将此前曾经建立过的iscsi设备,通过3260端口,向外进行输出,,,,,,,,,tgtadm可以用来实现手动在命令行下创建target,也可以使用tdt-admin结合主配置文件 /etc/tgt/targets.conf 来实现对各target的管理;;;;;;;;;要确保服务 tgtd 服务开机启动起来(手动启动起来也行)
客户端:
iscsi-initiator-utils , 为何叫utils(工具)?因为iscsi本身是内核中的功能,所以它只需要提供一个管理界面iscsi-initiator-utils
服务端:
scsi-target-utils , 为什么不是iscsi,因为服务器端提供的是scsi服务,,,,,虽然叫iscsi服务,但是最终要还原成scsi功能的,它模拟的是scsi的设备,
gfs2文件系统
在iscsi设备上来创建gfs2文件系统,全局文件系统,只是一种集群文件系统 还有一种ocfs2
gfs2文件系统在实现接受每个客户端,每个节点挂载的时候,必须要为每个节点提供日志,所以创建 gfs2文件系统时,要指定日志个数, -j 指定,
集群文件系统要加锁,并通知其它节点,由此我们必须要指定锁类型,因为gfs2文件系统支持单机或集群环境
gfs2文件系统 -p 指定锁协议
在集群环境下时锁协议 lock_dlm
在单机环境下锁协议 lock_nolock (事实上单机时没必要使用集群文件系统,因为集群开销大)
使用 mkfs.gfs2 创建集群文件系统时 还应该指定锁表 -t 指定
clustername:tablelockname
clustername 集群名称一定是当前集群文件系统所在集群的集群名,这是rhcs的机制
tablelockname 只需唯一,就可以了
挂载 mount -t gfs2 (不指文件系统类型也可以,因为自动识别,)
如何实现去创建iscsi的服务器端,,,,,,并且能够让客户端发现服务器端,
使用硬盘设备(不是分区)来模拟一个target
在 target 192.168.0.100 上
[root@steppingstone ~]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 2610 20860402+ 8e Linux LVM
Disk /dev/sdb: 107.3 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb4 1 13054 104856223+ 5 Extended
/dev/sdb5 1 6080 48837537 83 Linux
/dev/sdb6 6081 8513 19543041 83 Linux
Disk /dev/sdc: 137.4 GB, 137438953472 bytes
255 heads, 63 sectors/track, 16709 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
[root@steppingstone ~]#
1) (我已经安装了)安装 scsi-target-utils
不使用 tgtadm 吧;;;;tgtadm 是模式化的命令
iscsiadm 也是模式化的命令
2)
[root@steppingstone ~]# vim /etc/tgt/targets.conf #把原来的关于target的删除,替换成如下
...........................................................................................................................
<target iqn.2013-05.com.magedu:tsan.disk1>
<backing-store /dev/sdc>
vendor_id MageEdu
lun 1
</backing-store>
initiator-address 192.168.0.0/24
incominguser sanuser sanpass
</target>
...........................................................................................................................
在 target 192.18.0.100 上
[root@steppingstone ~]# service tgtd start #启动tgtd
Starting SCSI target daemon: [确定]
[root@steppingstone ~]#
[root@steppingstone ~]# service tgtd restart
Stopping SCSI target daemon: Stopping target framework daemon
Some initiators are still connected - could not stop tgtd #为什么不能停止,需要所有的 initiator 登出吗? ( 在三个 initiator上执行 # iscsiadm -m node -T iqn.2013-05.com.magedu:teststore.disk1 -p 192.168.0.100 -u 进行登出 )
[root@steppingstone ~]#
在 target 192.18.0.100 上
[root@steppingstone ~]# tgtadm --lld iscsi -m target --op show
Target 1: iqn.2013-05.com.magedu:tsan.disk1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1 #有个 LUN 1 了
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 137439 MB, Block size: 512
Online: Yes
Removable media: No
Readonly: No
Backing store type: rdwr
Backing store path: /dev/sdc
Backing store flags:
Account information:
sanuser #绑定的用户名
ACL information:
192.168.0.0/24 #授权的IP网络地址
[root@steppingstone ~]#
[root@steppingstone ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 3919/./hpiod
tcp 0 0 0.0.0.0:736 0.0.0.0:* LISTEN 3522/rpc.statd
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:41704 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:810 0.0.0.0:* LISTEN 4022/rpc.rquotad
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3472/portmap
tcp 0 0 0.0.0.0:851 0.0.0.0:* LISTEN 4064/rpc.mountd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3942/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 3956/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 4167/sendmail
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 5521/tgtd # 3260 打开了
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 3924/python
tcp 0 0 :::22 :::* LISTEN 3942/sshd
tcp 0 0 :::3260 :::* LISTEN 5521/tgtd
[root@steppingstone ~]#
[root@steppingstone ~]# iptables -L -n #防火墙 没屏蔽 地址及端口
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (0 references)
target prot opt source destination
[root@steppingstone ~]#
[root@steppingstone ~]# chkconfig tgtd on # 开机自动启动
[root@steppingstone ~]# chkconfig --list tgtd
tgtd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@steppingstone ~]#
在第一个initiator节点 192.168.0.45 上
[root@node1 iscsi]# iscsi-iname -p iqn.2013-05.com.magedu #自动生成一个initiator的名称
iqn.2013-05.com.magedu:c3cecf23a7c
[root@node1 iscsi]#
在target 192.168.0.100 上 (跳转机)
[root@steppingstone ~]# alias ha='for I in {1..3}; do'
[root@steppingstone ~]#
[root@steppingstone ~]# ha ssh node$I 'echo "InitiatorName=`iscsi-iname -p iqn.2013-05.com.magedu`" > /etc/iscsi/initiatorname.iscsi'; done #自动生成一个initiator的名称,把这个名称保存至配置文件
[root@steppingstone ~]#
在第一个initiator节点 192.168.0.45 上
[root@node1 iscsi]# cat /etc/iscsi/initiatorname.iscsi #验证一下是否正确
InitiatorName=iqn.2013-05.com.magedu:d5fc3cf98c
[root@node1 iscsi]#
在target 192.168.0.100 上 (跳板机)
[root@steppingstone ~]# ha ssh node$I 'sed -i "s@#node.session.auth.authmethod = CHAP@node.session.auth.authmethod = CHAP@" /etc/iscsi/iscsid.conf';done
[root@steppingstone ~]#
在第一个initiator节点 192.168.0.45 上
看 /etc/iscsi/iscsid.conf 里面的 #node.session.auth.authmethod 有没有作相应的修改
在target 192.168.0.100 上 (跳转机)
[root@steppingstone ~]# vim iscsi.sed #可能替换的内容有问题 ,但是这里不管了,只要知道 sed -i -f 的用法就可以了
s@node.session.auth.username = iscsiuser@node.session.auth.username = sanuser@
s@node.session.auth.password = iscsiuser@node.session.auth.password = sanpass@
[root@steppingstone ~]# sed -i -f iscsi.sed iscsid.conf
[root@steppingstone ~]#
把 iscsi.sed 脚本复制到 每一个initiator上执行一遍就可以了 (本质上是这样,,可能 iscsi.sed 脚本 里替换的内容有问题)
[root@steppingstone ~]# alias ha='for I in {1..3}; do'
再执行 # ha scp iscsi.sed node$I:/tmp/; ssh node$I 'sed -i -f /tmp/iscsi.sed /etc/iscsi/iscsid.conf' ; done
我还是自己手动通过另一种方法来执行吧
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# sed -i -e 's@node.session.auth.username = iscsiuser@node.session.auth.username = sanuser@' -e 's@node.session.auth.password = iscsiuser@node.session.auth.password = sanpass@' /etc/iscsi/iscsid.conf
# 温习了 sed -f 和 -e 的用法
[root@node1 ~]# less /etc/iscsi/iscsid.conf #最后保证如下的结果,就是对的了
............................................................................................................
node.session.auth.authmethod = CHAP
# To set a CHAP username and password for initiator
# authentication by the target(s), uncomment the following lines:
node.session.auth.username = sanuser
node.session.auth.password = sanpass
............................................................................................................
保证 在第二个initiator节点 192.168.0.55 上 在第三个initiator节点 192.168.0.65 上
# less /etc/iscsi/iscsid.conf 的结果 与 在第一个initiator节点 192.168.0.45 上 是一样的
确保 三个initiator上 清除以前的三步骤 1) 到以前的target都登出了,,,, 2) service iscsi status 为停止,,,, 3) 删除了以前的登录信息 rm -Rf /var/lib/iscsi/send_targets/192.168.0.100,3260/
在target 192.168.0.100 上 (跳转机)
[root@steppingstone ~]# ha ssh node$I 'service iscsi start;chkconfig iscsi on ' ; done #像马哥一样批量执行,为什么报错 (但马哥执行的没报错)
iscsid 已停
[确定]ng iSCSI daemon: [确定]
[确定]
设置 iSCSI 目标:iscsiadm: Could not login to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260].
iscsiadm: initiator reported error (19 - encountered non-retryable iSCSI login failure)
iscsiadm: Could not log into all portals
Logging in to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260] (multiple)
[确定]
iscsid 已停
[确定]ng iSCSI daemon: [确定]
[确定]
设置 iSCSI 目标:iscsiadm: Could not login to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260].
iscsiadm: initiator reported error (19 - encountered non-retryable iSCSI login failure)
iscsiadm: Could not log into all portals
Logging in to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260] (multiple)
[确定]
iscsid 已停
[确定]ng iSCSI daemon: [确定]
[确定]
设置 iSCSI 目标:Logging in to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260].
iscsiadm: initiator reported error (19 - encountered non-retryable iSCSI login failure)
iscsiadm: Could not log into all portals
[确定]
You have new mail in /var/spool/mail/root
[root@steppingstone ~]#
我在每个 initiator 上执行, 清除以前的三步骤 然后 发现 ,然后启动 iscsi 就可以了
# iscsiadm -m discovery -t st -p 192.168.0.100 #这两步顺序颠倒下应该也可以?
# service iscsi start
就可以了
马哥的发现 和 登录 依然是批量执行
我已经单个执行发现了, 我批量执行 登录吧
在target 192.168.0.100 上 (跳转机)
[root@steppingstone ~]# ha ssh node$I 'iscsiadm -m node -T iqn.2013-05.com.magedu:tsan.disk1 -p 192.168.0.100 -l '; done #是不是上面# service iscsi start 启动时已经登录了,所以这里没有信息显示了
[root@steppingstone ~]#
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 2610 20860402+ 8e Linux LVM
Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2610 20964793+ 5 Extended
/dev/sdb5 1 200 1606437 8e Linux LVM
/dev/sdb6 201 323 987966 83 Linux
Disk /dev/sdc: 137.4 GB, 137438953472 bytes #硬盘显示出来了
255 heads, 63 sectors/track, 16709 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
[root@node1 ~]#
三个initiator 安装,配置集群,使用集群逻辑卷
安装 cman,rgmanager,gfs2-utils lvm2-cluster
lvm2 是集群逻辑卷,软件包的名字叫 lvm2-cluster
我只需安装 lvm2-cluster
[root@steppingstone ~]# ha ssh node$I 'yum -y install lvm2-cluster' ; done
马哥找一个 initiator 来配置集群,,,我这边不用配置了(因为以前配置好了)
cLVM: 集群逻辑卷,共享存储作成逻辑卷
借用HA的机制,心跳转输机制以及通信机制,及以脑裂的阻止机制,让多个节点同时能够对一个LVM的物理设备(或逻辑设备)发起管理操作,但是某一个节点发起管理操作的时候,它能够加锁,并通知给其它节点,对逻辑卷的操作能够立即通知给其它节点,,让其它节点很快能够看到,,,,所以创建了一个物理卷,其它节点随时可以看到,
cLVM是集群当中使用了一个分布式协作工具,打开这个工具以后,一个控制结构,它能够在各节点之间借助于HA的功能进行通信,,,,
我们对于逻辑卷的管理,仍然都使用本地命令,,,,,,,,,前提cLVM需要在各节点上启动一个服务,这个服务就是让各个节点之间通过这个服务进行通信的,,,,,,,,我们在启动服务之前,得打开LVM功能的应用在集群环境中的协作机制,(叫作集群的类型???LVM的类型???) (/etc/lvm/lvm.conf locking_type 默认为1,应改为3),,然后将clvm的服务启动起来
clvm 依基于cman的rgmanager的启动
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# cd /etc/lvm/
[root@node1 lvm]# vim lvm.conf
.....................................................................................
locking_type = 1 #改为3
.....................................................................................
马哥配置集群
创建集群
增加fence设备
列了fence
添加节点
列出节点
启动cman服务,(和rgmanager服务)要三个一起才能启动
在第一个initiator节点 192.168.0.45 上
[root@node1 lvm]# service cman start
Starting cluster:
Loading modules... done
Mounting configfs... done
Starting ccsd... done
Starting cman... done
Starting daemons... done
Starting fencing... done
Tuning DLM... done
[确定]
在第二个initiator节点 192.168.0.55 上
[root@node2 ~]# service cman start
Starting cluster:
Loading modules... done
Mounting configfs... done
Starting ccsd... done
Starting cman... done
Starting daemons... done
Starting fencing... done
Tuning DLM... done
[确定]
在第三个initiator节点 192.168.0.65 上
[root@node3 ~]# service cman start
Starting cluster:
Loading modules... done
Mounting configfs... done
Starting ccsd... done
Starting cman... done
Starting daemons... done
Starting fencing... done
Tuning DLM... done
[确定]
马哥 启动 三个 cman 停在这儿了
马哥解决思路:看日志
马哥时间已同步,,,,主机名是对的
马哥 iptables 没问题
只有节点一 Online
# 看看状态
看下配置
列出 fence
看看 cluster.conf.old 内容
马哥删了,重来一次
# 为什么有old???old 上面 仅有 node1 node2?????为什么?
# 删掉 cluster.conf.old
#能ping 通 node2
# 三个节点 启动 cman 还是不行
仍是同一个错误
# Name 为啥叫 meat 不是 meatware
# 节点 为什么是 node1.chris.com node2.chris.com node3.chris.com ???
冲突了?
可能是组播 ip 地址冲突???
node1 一上线,马上加入它的集群了,所以 node2 , node3 启动不起来了???
删掉 cluster.conf
再来一遍
还是没有看出啥错误?????
安装下 # system-config-cluster
手动改acno???文档有问题,所以演示能行的办法,
所以用另一种方法
# 没看到这里,刚刚弄的主播地址
启动 三个 cman
能启动了,但是仍然有故障
node2 node3 删掉rhcs的配置文件 cluster.conf
在第一个node 上
删掉以前两个版本
# 为啥没看到组播地址
打开 图形管理界面看看
先启动 node1 的 cman 仍然会报错
是此前曾经启动的进程到这儿了,,,,,,
启动三个节点的 cman 还是不行
由下图,看到了组播地址
在第二个节点上 没看到配置文件传过来
把配置文件 从 node1 复制到 node2 node3
三个节点 cman 好像 可以启动
马哥说 可能集群太多,基于节点刚初始化的时候,里面没有配置文件,可能会接受任何人的ccsd所传过来的信息,所以导致三台主机无论如何自己无法通信了,(刚启动的时候,如果里面没有任何配置文件,启动ccsd进程以后,网络内的任意主机的ccsd通信都会接收,所以导致多个集群产生交叉,尤其是第一次初始化的时候)
处理方法:手动复制配置文件,,,因为事先已定义好组播地址了,这样就不会冲突了
所以处理方法 1)通过 system-config-cluster & 图形界面,自己编个组播ip地址 2) 手动复制cluster.conf到其它节点上
不要使用桥接,因为教室里所有人都在实行组播通信
在三个节点上把集群的逻辑卷的功能给它启用起来
# lvmconf 命令
[root@node1 lvm]# lvmconf -h
usage: /usr/sbin/lvmconf <command>
Commands:
Enable clvm: --enable-cluster [--lockinglibdir <dir>] [--lockinglib <lib>]
# --enable-cluster 表示修改修改 locking_type 为3 的
Disable clvm: --disable-cluster
Set locking library: --lockinglibdir <dir> [--lockinglib <lib>]
Global options:
Config file location: --file <configfile>
[root@node1 lvm]#
在target 192.168.0.100 上 (跳转机)
[root@steppingstone lvm]# ha ssh node$I 'lvmconf --enable-cluster'; done # 三个initiator上的locking_type 都为3了
[root@steppingstone lvm]#
在第一个initiator节点 192.168.0.45 上
[root@node1 lvm]# cd /etc/lvm/
[root@node1 lvm]#
[root@node1 lvm]# grep "locking_type" lvm.conf #看到为3了
locking_type = 3
# NB. This option only affects locking_type = 1 viz. local file-based
# The external locking library to load if locking_type is set to 2.
[root@node1 lvm]#
在第一个initiator节点 192.168.0.45 上
在三个节点上启动集群逻辑卷
[root@steppingstone lvm]# ha ssh node$I 'service clvmd start'; done
Starting clvmd:
Activating VG(s): 1 logical volume(s) in volume group "myvg" now active
clvmd not running on node node3.magedu.com
clvmd not running on node node2.magedu.com
2 logical volume(s) in volume group "VolGroup00" now active
clvmd not running on node node3.magedu.com
clvmd not running on node node2.magedu.com
[确定]
Starting clvmd:
Activating VG(s): 1 logical volume(s) in volume group "myvg" now active
clvmd not running on node node3.magedu.com
2 logical volume(s) in volume group "VolGroup00" now active
clvmd not running on node node3.magedu.com
[确定]
Starting clvmd:
Activating VG(s): 1 logical volume(s) in volume group "myvg" now active
2 logical volume(s) in volume group "VolGroup00" now active
[确定]
[root@steppingstone lvm]#
在第三个initiator节点 192.168.0.65 上 验证一下
[root@node3 ~]# service clvmd status
clvmd (pid 7800) 正在运行...
Clustered Volume Groups: (none)
Active clustered Logical Volumes: (none)
[root@node3 ~]#
在target 192.168.0.100 上 (跳转机) 上
[root@steppingstone lvm]# ha ssh node$I 'chkconfig clvmd on; chkconfig cman on;chkconfig rgmanager on'; done; # 开机自动启动
[root@steppingstone lvm]#
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# cd
[root@node1 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 17.88G
LogVol01 VolGroup00 -wi-ao 2.00G
mydata2 myvg -wi-ao 200.00M
[root@node1 ~]#
[root@node1 ~]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 2610 20860402+ 8e Linux LVM
Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 2610 20964793+ 5 Extended
/dev/sdb5 1 200 1606437 8e Linux LVM
/dev/sdb6 201 323 987966 83 Linux
Disk /dev/sdc: 137.4 GB, 137438953472 bytes
255 heads, 63 sectors/track, 16709 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
[root@node1 ~]#
创建逻辑卷
[root@node1 ~]# pvcreate /dev/sdc #整个盘全做成物理卷 创建物理卷
Writing physical volume data to disk "/dev/sdc"
Physical volume "/dev/sdc" successfully created
[root@node1 ~]#
[root@node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup00 lvm2 a-- 19.88G 0
/dev/sdb5 myvg lvm2 a-- 1.53G 1.34G
/dev/sdc lvm2 a-- 128.00G 128.00G # 物理卷
[root@node1 ~]#
在第二个initiator节点 192.168.0.55 上
[root@node2 ~]# pvs #也能够看到物理卷
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup00 lvm2 a-- 19.88G 0
/dev/sdb5 myvg lvm2 a-- 1.53G 1.34G
/dev/sdc lvm2 a-- 128.00G 128.00G
[root@node2 ~]#
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# vgcreate clustervg /dev/sdc #创建卷组
Clustered volume group "clustervg" successfully created
[root@node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup00 1 2 0 wz--n- 19.88G 0
clustervg 1 0 0 wz--nc 128.00G 128.00G #创建的卷组
myvg 1 1 0 wz--n- 1.53G 1.34G
[root@node1 ~]#
在第三个initiator节点 192.168.0.65 上
[root@node3 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup00 1 2 0 wz--n- 19.88G 0
clustervg 1 0 0 wz--nc 128.00G 128.00G #能看到卷组
myvg 1 1 0 wz--n- 1.53G 1.34G
[root@node3 ~]#
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# lvcreate -L 10G -n clusterlv clustervg #创建逻辑卷 10G吧,不要太大,因为太大,可能格式化等操作会花费很长时间
Logical volume "clusterlv" created
[root@node1 ~]#
在第三个initiator节点 192.168.0.65 上
[root@node3 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 17.88G
LogVol01 VolGroup00 -wi-ao 2.00G
clusterlv clustervg -wi-a- 10.00G #看到了刚创建的逻辑卷
mydata2 myvg -wi-ao 200.00M
[root@node3 ~]#
在第一个initiator节点 192.168.0.45 上
格式化为集群文件系统,而且创建两个日志,等会儿加上去一个日志
[root@node1 ~]# mkfs.gfs2 -j 2 -p lock_dlm -t tcluster:lktb1 /dev/clustervg/clusterlv
# 它实现对这个集群文件系统中的每一位都要格式化,而且格式化以后每一位都要创建相关数据,而后还要通知给其它节点,所以它是让其它节点立即看得到的才行 (马哥说此时格式化所以速度慢,但是我感觉不太慢)
This will destroy any data on /dev/clustervg/clusterlv.
Are you sure you want to proceed? [y/n] y
Device: /dev/clustervg/clusterlv
Blocksize: 4096
Device Size 10.00 GB (2621440 blocks)
Filesystem Size: 10.00 GB (2621438 blocks)
Journals: 2
Resource Groups: 40
Locking Protocol: "lock_dlm"
Lock Table: "tcluster:lktb1"
UUID: CA716E46-CC11-BADC-D1D3-C2E2A83F46A0
[root@node1 ~]#
[root@node1 ~]# mkdir /mydataclvm
[root@node1 ~]# mount -t gfs2 /dev/clustervg/clusterlv /mydataclvm/ #挂上去了
[root@node1 ~]#
[root@node1 ~]# gfs2_tool df /mydataclvm/ # df 子命令可以查看文件系统
/mydataclvm:
SB lock proto = "lock_dlm"
SB lock table = "tcluster:lktb1"
SB ondisk format = 1801
SB multihost format = 1900
Block size = 4096
Journals = 2 # 这是日志个数
Resource Groups = 40
Mounted lock proto = "lock_dlm"
Mounted lock table = "tcluster:lktb1"
Mounted host data = "jid=0:id=458753:first=1"
Journal number = 0
Lock module flags = 0
Local flocks = FALSE
Local caching = FALSE
Type Total Blocks Used Blocks Free Blocks use%
------------------------------------------------------------------------
data 2621144 66195 2554949 3%
inodes 2554965 16 2554949 0%
[root@node1 ~]#
在第二个initiator节点 192.168.0.55 上
[root@node2 ~]# mkdir /mydataclvm
[root@node2 ~]# mount -t gfs2 /dev/clustervg/clusterlv /mydataclvm/ #挂载成功
[root@node2 ~]#
[root@node2 ~]# ls /mydataclvm/
[root@node2 ~]# cd /mydataclvm/
[root@node2 mydataclvm]#
[root@node2 mydataclvm]# touch a.txt
[root@node2 mydataclvm]#
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# ls /mydataclvm/ # 立即看到了 集群文件系统为了能够保证其它节点能够立即访问它所创建的数据,默认情况下都是同步的,在内存在不会停留太久;;;;所以性能很差,一个简单的touch也会卡一下
a.txt
[root@node1 ~]#
[root@node1 ~]# gfs2_tool -h
Clear a flag on a inode
gfs2_tool clearflag flag <filenames>
Do a GFS2 specific "df":
gfs2_tool df <mountpoint>
Freeze a GFS2 cluster:
gfs2_tool freeze <mountpoint> #冻结gfs2文件系统,就是只读的了(跟mysql一样,锁定所有表为读方式后,只允许读,不允许写) 可以cat,
Print the current mount arguments of a mounted filesystem:
gfs2_tool getargs <mountpoint> #可以查看当前的挂载参数
Get tuneable parameters for a filesystem
gfs2_tool gettune <mountpoint> #能够获取到设备的挂载点的文件系统的所有可调参数
List the file system's journals:
gfs2_tool journals <mountpoint>
List filesystems:
gfs2_tool list
Have GFS2 dump its lock state:
gfs2_tool lockdump <mountpoint> [buffersize]
Provide arguments for next mount:
gfs2_tool margs <mountarguments>
Tune a GFS2 superblock
gfs2_tool sb <device> proto [newval]
gfs2_tool sb <device> table [newval]
gfs2_tool sb <device> ondisk [newval]
gfs2_tool sb <device> multihost [newval]
gfs2_tool sb <device> all
Set a flag on a inode
gfs2_tool setflag flag <filenames>
Tune a running filesystem
gfs2_tool settune <mountpoint> <parameter> <value> # 调整 挂载点 参数 值
Shrink a filesystem's inode cache:
gfs2_tool shrink <mountpoint>
Unfreeze a GFS2 cluster:
gfs2_tool unfreeze <mountpoint>
Print tool version information
gfs2_tool version
Withdraw this machine from participating in a filesystem:
gfs2_tool withdraw <mountpoint>
[root@node1 ~]#
[root@node1 ~]# gfs2_tool gettune /mydataclvm/ #斜线不能写
gfs2_tool: gfs2 Filesystem /mydataclvm/ is not mounted.
[root@node1 ~]#
[root@node1 ~]# gfs2_tool gettune /mydataclvm
new_files_directio = 0 #直接IO,这个数据是直接写到磁盘上去的,默认为0表示还没有直接写到磁盘上去,,,刚刚卡的原因是它向其它节点通知其状态信息的,,要立即写到磁盘上去,并且要能够立即让其它节点访问,值需调整为1,,,调整为1则性能更差的
new_files_jdata = 0
quota_scale = 1.0000 (1, 1)
logd_secs = 1
recoverd_secs = 60
statfs_quantum = 30
stall_secs = 600
quota_cache_secs = 300
quota_simul_sync = 64
statfs_slow = 0
complain_secs = 10
max_readahead = 262144
quota_quantum = 60
quota_warn_period = 10
jindex_refresh_secs = 60
log_flush_secs = 60
incore_log_blocks = 1024
[root@node1 ~]#
[root@node1 ~]# gfs2_tool settune /mydataclvm new_files_directio 1 #挂载点 /mydataclvm 后面不能加斜线
[root@node1 ~]#
[root@node1 ~]# gfs2_tool gettune /mydataclvm
new_files_directio = 1 #此时值为1了
new_files_jdata = 0
quota_scale = 1.0000 (1, 1)
logd_secs = 1
recoverd_secs = 60
statfs_quantum = 30
stall_secs = 600
quota_cache_secs = 300
quota_simul_sync = 64
statfs_slow = 0
complain_secs = 10
max_readahead = 262144
quota_quantum = 60
quota_warn_period = 10
jindex_refresh_secs = 60
log_flush_secs = 60 #日志多长时间自动刷新一次,,,,调长点能提高性能
incore_log_blocks = 1024
[root@node1 ~]#
[root@node1 ~]# touch /mydataclvm/b.txt
[root@node1 ~]# gfs2_tool freeze /mydataclvm #冻结文件系统 进行文件备份的时候,比较好用
[root@node1 ~]# touch /mydataclvm/c.txt #冻结后不能创建文件了
打开另一个窗口,解冻
[root@node1 ~]# gfs2_tool unfreeze /mydataclvm
[root@node1 ~]#
[root@node1 ~]# gfs2_tool getargs /mydataclvm #获取挂载参数
statfs_percent 0
data 2
suiddir 0
quota 0
posix_acl 0
upgrade 0
debug 0
localflocks 0
localcaching 0
ignore_local_fs 0
spectator 0
hostdata jid=0:id=262145:first=1
locktable
lockproto
[root@node1 ~]#
[root@node1 ~]# gfs2_tool setargs debug 1 #setargs好像不行
gfs2_tool: unknown action: setargs
[root@node1 ~]#
[root@node1 ~]# gfs2_tool journals /mydataclvm #只有两个日志
journal1 - 128MB
journal0 - 128MB
2 journal(s) found.
[root@node1 ~]#
[root@node1 ~]# gfs2_jadd -h
Usage:
gfs2_jadd [options] /path/to/filesystem
Options:
-c <MB> Size of quota change file
-D Enable debugging code
-h Print this help, then exit
-J <MB> Size of journals
-j <num> Number of journals #指定加几个日志 每加1个,要128M空间,还要通知其它节点
-q Don't print anything
-V Print program version information, then exit
[root@node1 ~]#
[root@node1 ~]# gfs2_jadd -j 1 /mydataclvm #加的过程中死机了
在第一个initiator节点 192.168.0.45 上 #重新开机试一下
[root@node1 ~]# gfs2_jadd -j 1 /dev/clustervg/clusterlv #应该是跟设备,而不是挂载点吧
Filesystem: /mydataclvm
Old Journals 2
New Journals 3
[root@node1 ~]#
在第二个initiator节点 192.168.0.55 上
[root@node2 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 17.88G
LogVol01 VolGroup00 -wi-ao 2.00G
clusterlv clustervg -wi-a- 10.00G #看到了它
mydata2 myvg -wi-ao 200.00M
[root@node2 ~]#
[root@node2 ~]# gfs2_tool journals /mydataclvm #看到了
journal2 - 128MB
journal1 - 128MB
journal0 - 128MB
3 journal(s) found.
[root@node2 ~]#
马哥在第一个节点上 添加 journal,发现死机了
但是马哥由于第一个节点死机,所以没有看到新加的journal
马哥在第二个节点上 添加成功了 journal
做这些操作时,网卡狂闪
马哥 重启 node1 ,发现 三个节点都已经上线了
[root@node1 ~]# clustat #都上线了
Cluster Status for tcluster @ Thu Feb 25 09:38:11 2021
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
node1.magedu.com 1 Online, Local
node2.magedu.com 2 Online
node3.magedu.com 3 Online
[root@node1 ~]#
[root@node1 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 17.88G
LogVol01 VolGroup00 -wi-ao 2.00G
clusterlv clustervg -wi-ao 10.00G
mydata2 myvg -wi-ao 200.00M
[root@node1 ~]#
[root@node1 ~]# gfs2_tool journals /mydataclvm/
gfs2_tool: gfs2 Filesystem /mydataclvm/ is not mounted.
[root@node1 ~]# gfs2_tool journals /mydataclvm #看到三个日志了
journal2 - 128MB
journal1 - 128MB
journal0 - 128MB
3 journal(s) found.
[root@node1 ~]#
在第三个initiator节点 192.168.0.65 上
[root@node3 ~]# mkdir /mydataclvm
[root@node3 ~]# mount -t gfs2 /dev/clustervg/clusterlv /mydataclvm
[root@node3 ~]#
扩展集群逻辑卷
马哥不演示扩展物理卷了
[root@node1 ~]# lvextend -L 15G /dev/clustervg/clusterlv #扩展逻辑卷(的物理边界)到15G (原来是10G,这里使用+5G也行)
Extending logical volume clusterlv to 15.00 GB
Logical volume clusterlv successfully resized
[root@node1 ~]#
[root@node1 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 17.88G
LogVol01 VolGroup00 -wi-ao 2.00G
clusterlv clustervg -wi-ao 15.00G #15G了
mydata2 myvg -wi-ao 200.00M
[root@node1 ~]#
[root@node1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
/dev/mapper/myvg-mydata2 on /mydata2 type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
none on /sys/kernel/config type configfs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
/dev/mapper/clustervg-clusterlv on /mydataclvm type gfs2 (rw,hostdata=jid=0:id=131073:first=1)
[root@node1 ~]#
[root@node1 ~]# df -lh
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
18G 8.1G 8.4G 49% /
/dev/sda1 99M 13M 82M 13% /boot
tmpfs 506M 0 506M 0% /dev/shm
/dev/mapper/myvg-mydata2
194M 48M 137M 26% /mydata2
/dev/mapper/clustervg-clusterlv #为啥这里逻辑卷的逻辑边界显示为10G
10G 388M 9.7G 4% /mydataclvm
[root@node1 ~]#
为什么有时创建文件快,有时慢,,,,,,此时曾经在这个节点上访问过iscsi设备的话,因为连接建立起来了,第二次比较快,,,,,,,,,因为客户端对scsi端的访问并不是实时在线的,所以长时间不访问的,可能连接会断掉,所以访问时间会比较长
在target 192.168.0.100 上执行 # tgtadm --lld iscsi --mode target --op show
在target 192.168.0.100 上又执行 # tgtadm --lld iscsi --mode target --op show
在target 192.168.0.100 上 马哥 tgtd 服务停了,,导致马哥 连接有IO错误,,重启一下 # service tgtd restart 马哥的initiator 连接就好了 ???
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# df -lh
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
18G 8.1G 8.4G 49% /
/dev/sda1 99M 13M 82M 13% /boot
tmpfs 506M 0 506M 0% /dev/shm
/dev/mapper/myvg-mydata2
194M 48M 137M 26% /mydata2
/dev/mapper/clustervg-clusterlv
10G 388M 9.7G 4% /mydataclvm #逻辑卷的逻辑边界还是10G
[root@node1 ~]#
在第一个initiator节点 192.168.0.45 上
[root@node1 ~]# gfs2_grow -h #扩展逻辑卷的逻辑边界
Usage:
gfs2_grow [options] /path/to/filesystem
Options:
-h Usage information
-q Quiet, reduce verbosity
-T Test, do everything except update FS #做测试
-V Version information
-v Verbose, increase verbosity
[root@node1 ~]#
[root@node1 ~]# gfs2_grow /dev/clustervg/clusterlv #不使用-T 直接扩展
FS: Mount Point: /mydataclvm
FS: Device: /dev/mapper/clustervg-clusterlv
FS: Size: 2621438 (0x27fffe)
FS: RG size: 65533 (0xfffd)
DEV: Size: 3932160 (0x3c0000)
The file system grew by 5120MB.
Error fallocating extra space : 文件过大
gfs2_grow complete.
[root@node1 ~]#
[root@node1 ~]# df -lh
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
18G 8.1G 8.4G 49% /
/dev/sda1 99M 13M 82M 13% /boot
tmpfs 506M 0 506M 0% /dev/shm
/dev/mapper/myvg-mydata2
194M 48M 137M 26% /mydata2
/dev/mapper/clustervg-clusterlv #逻辑卷的物理边界扩展了 看到15G了
15G 388M 15G 3% /mydataclvm
[root@node1 ~]#
gfs2_tool
gfs2_jadd -j
gfs2_grow
mkfs.gfs2
fsck.gfs2 # 检测文件系统的
集群文件系统不可靠,严重依赖于集群功能