分类: 系统运维
2016-10-27 20:28:41
1. 什么是集群?
简单的说?集群?cluster?就是一组计算机?它们作为一个整体向用户提
供一组网络资源。这些单个的计算机系统就是集群的节点?node
一个理想的集群是?用户从来不会意识到集群系统底层的节点?在他/她们看来?集群是一个系统?而非多个计算机系统。并且集群系统的管理员可以随意增加和删改集群系统的节点。
2. 实验环境
1> 业务网,虚拟机 172.25.0.0网段
2> 存储,虚拟机中192.168.1.0网段
3> 存储,虚拟机中192.168.2.0网段
4> 心跳线,虚拟机中192.168.0.0网段
5> 实验环境红帽官方可下载
红帽6 集群工具:
luci
红帽7 集群工具:
pcs
nodea:
yum
-y install pcs
systemctl
stop firewalld
systemctl
disable firewalld
systemctl
start pcsd
systemctl
enable pcsd
(安装pcs以后会有一个hacluster)
echo
redhat | passwd --stdin hacluster
以下在任意节点输入都一样
pcs
cluster auth nodea.cluster0.example.com nodeb.cluster0.example.com
nodec.cluster0.example.com
Username:
hacluster
Password: redhat 需要输入的部分
pcs cluster status 查看当前集群状态
crm_mon -1 查看当前集群状态
pcs cluster stop nodea.cluster0.exampele.com 停止nodea节点
pcs cluster start nodea.cluster0.example.com 启动nodea节点
pcs cluster stop all 停止所有节点
pcs cluster enable --all 开启节点永久生效
pcs cluster disable --all 关闭节点永久生效
现在创建一个vip(虚拟ip):
选择RESOURCE选项卡, 点击ADD 添加资源
Resource
ID: vip
ip:
172.25.0.100
ip addr 查看当前所有ip的详细信息(包括子ip)
pcs cluster standby nodea.cluster0.example.com 模拟nodea坏了
pcs cluster unstandby nodea.cluster0.example.com 模拟nodea好了
pcs resource move vip nodea.cluster0.example.com 将vip移动到nodea节点
corosync-quorumtool -l 显示所有节点信息(包括票数Votes)
quorum=N(机器总数(若是奇数, 则quorum=N/2+1)(quorum是存活要素)
如何推翻quorum的限制:
vim /etc/corosync/corosync.conf
票数总数的配置文件
quorum_votes: 3 修改某个节点的 票数
:wq
pcs
cluster stop --all
pcs cluster sync 集群间的同步
pcs
cluster start --all
(在企业中间, 不建议更改票数)
nodeb:
yum
-y install pcs
systemctl
stop firewalld
systemctl
disable firewalld
systemctl
start pcsd
systemctl
enable pcsd
(安装pcs以后会有一个hacluster)
echo
redhat | passwd --stdin hacluster
nodec:
yum
-y install pcs
systemctl
stop firewalld
systemctl
disable firewalld
systemctl
start pcsd
systemctl
enable pcsd
(安装pcs以后会有一个hacluster)
echo
redhat | passwd --stdin hacluster
foundation:
firefox
Username:
hacluster
Password:
redhat
create
new
Cluster
Name: cluster1
Node1:
nodea.cluster0.example.com
Node2:
nodeb.cluster0.example.com
Node3:
nodec.cluster0.example.com
...
(没有使用fence的时候, 将cluster propetries选项中的stonith enabled勾去掉)
No Quorum Policy: 集群存活的要素
脑裂: 节点间由于某种原因无法回复心跳, 导致的抢占资源的现象
fence分为两种: 线缆fence,
电源fence
virbr0: 用于物理机和kvm虚拟机之间进行通信的平台
nodea:
yum -y install fence-virt* 安装fence驱动
mkdir
/etc/cluster
systemctl
restart fence_virtd
nodeb:
yum
-y install fence-virt*
mkdir
/etc/cluster
systemctl
restart fence_virtd
pcs stonith fence nodea 手动fence节点nodea
nodec:
yum
-y install fence-virt*
mkdir
/etc/cluster
systemctl
restart fence_virtd
foundation:
yum
-y install fence-virt*
mkdir
/etc/cluster
cd
/etc/cluster
dd if=/dev/zero of=fence_xvm.key bs=4k count=1 创建一个钥匙
fence_virtd -c 初始化设备
Interface[virtbr0]:
br0 实际企业环境中这个写心跳网络的接口
scp
/etc/cluster/fence_xvm.key root@nodea:/etc/cluster
scp
/etc/cluster/fence_xvm.key root@nodeb:/etc/cluster
scp
/etc/cluster/fence_xvm.key root@nodec:/etc/cluster
systemctl
restart fence_virtd
systemctl
enable fence_virtd
首先勾选stonith选项, 选择stonith action的方式, 修改Cluster Delay(等待时间)
然后切换到网页上fence
devices选项卡, 选择Add
type选择fence_xvm
Fence instance Name: 填写这个fence的名字, 创建fence
因为我们是虚拟的fence,
所以我们选择Advanced Arguments(高级参数)
写上pcmk_host_list:
nodea,nodeb,nodec(写kvm虚拟机名称, 不是主机名)
高可用: 保证业务不断
lsb: 集群的一个标准(老标准)
ocf: 新的标准
页面上创建资源,
Class选择ocf:heartbeat, Type选择IPaddr2, Resource ID: vip, Optional Arguments中是一些参数
standby表示将此机器拉到100%,(模拟的)
failback: 资源的轮转
在资源中,
Resource Location Preferences中可以设置节点或规则(node/rule),
其中score代表优先级(数字越大越高)
在Resource
Meta Attributes中可以设置一些参数, 参数要背
NONE: resource-stickiness
Value: 100 (表示优先级)
这个参数的值决定资源是否会回飘(其中Value值的INFINTY表示无限大)
当元属性中的此参数的Value的值加上资源的备份机(即当前的nodeb的Score的值, 如果不大于(不包括等于)主节点nodea的Score的值, 则资源在主节点故障消除以后会移动到主节点.
NONE: is-managed Value: false
这个参数为false代表着此资源不随着集群飘
NONE: priority Value: (数字) 这个参数会去比较所有资源的这个值, 如果这个值是最低的, 那就会放弃掉这个值, 那么此服务就会被down掉
在集群环境中, 搭建的所有服务都不需要启动, 服务都由集群控制
资源绑定:
nodea:
yum
-y install httpd
nodeb:
yum
-y install httpd
nodec:
yum
-y install httpd
安装完httpd后, 在集群的资源中添加资源, 选择systemd,
Type中选择httpd, 添加Resource ID, 创建资源
然后在资源中创建一个Group,
需要先勾选再添加Group, (注意, 在勾选的时候没有全选的说法, 而且,
还需要安装访问顺序进行勾选)
先配noded, 在配nodea,b,c, 关机先关nodea, 同理, 开机先开nodec,开机一定要等noded开启完毕
nodea:
yum
-y install iscsi-init*
vim
/etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2016-09.com.example:node
:wq
systemctl
restart iscsid
systemctl
restart iscsi
# 双线备份
iscsiadm
-m discovery -t sendtargets -p 192.168.1.13
iscsiadm -m node -T iqn.2016-09.com.example:storage -p 192.168.1.13
-l # 映射过来是sda
iscsiadm
-m discovery -t sendtargets -p 192.168.2.13
iscsiadm -m node -T iqn.2016-09.com.example:storage -p 192.168.2.13
-l # 映射过来是sdb
# 双线备存在的问题就是硬盘名字不同, 资源飘逸后的名字不同
# 做多路径:
yum
-y install device-mapper-multipath
systemctl
enable multipathd
systemctl
restart multipathd
multipath -l # 查看多路径运行状态, 发现dm_multipath模块未加载
lsmod | grep dm_multipath #
查看加载的模块
modprobe dm_multipath # 加载模块, 临时生效
vim
/etc/rc.d/rc.local
modprobe dm_multipath # 设置模块永久加载
:wq
rhel 7 默认没有给/etc/rc.d/rc.local执行权限, 所以需要给文件添加执行权限
复制默认配置文件到/etc下:
cp
/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc
systemctl
restart multipathd
multipath -l # 即可查看到软件自动扫描后对相同uuid的设备生成的设备名(mpatha)
fdisk /dev/mapper/mpatha # 模拟出来的设备在/dev/mapper下
vim
~/.bash_profile
PATH:$PATH:$HOME/bin:/usr/lib/udev
# 为了能使用scsi_id命令
:wq
scsi_id -u -g /dev/sda # 查看scsi设备id
vim
/etc/multipath.conf
user_friend_names yes # 表示多路径会自动生成一个名字
user_friend_names no # 不让它自动生成
find_multipaths yes # 表示会检测多路径的配置文件是否完整
multipaths {
multipath {
wwid 设备id
alias mydisk
}
}
:wq
在/etc/multipath目录下有个wwids文件, 里面是自动识别多路径的设备的id号
systemctl
restart multipathd
fdisk
/dev/mapper/mydisk
...
partprobe
/dev/mapper/mydisk
mkfs.xfs
/dev/mapper/mydisk1
# 取消iscsi连接
iscsiadm -m node -T iqn.2016-09.com.example:storage -p 192.168.2.13
-u # 当前断掉
iscsiadm -m node -U all # 当前断掉所有
iscsiadm -m node -T iqn.2016-09.com.example:storage -p 192.168.2.13
-o delete # 永久断掉
nodeb:
yum
-y install iscsi-init*
vim
/etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2014-09.com.example:node
:wq
systemctl
restart iscsid
systemctl
restart iscsi
# 双线备份
iscsiadm
-m discovery -t sendtargets -p 192.168.1.13
iscsiadm
-m node -T iqn.2016-09.com.example:storage -p 192.168.1.13 -l
iscsiadm
-m discovery -t sendtargets -p 192.168.2.13
iscsiadm
-m node -T iqn.2016-09.com.example:storage -p 192.168.2.13 -l
# 做多路径:
yum
-y install device-mapper-multipath
systemctl
enable multipathd
systemctl
restart multipathd
multipath -l # 查看多路径运行状态, 发现dm_multipath模块未加载
lsmod | grep dm_multipath #
查看加载的模块
modprobe dm_multipath # 加载模块, 临时生效
vim
/etc/rc.d/rc.local
modprobe dm_multipath # 设置模块永久加载
:wq
rhel 7 默认没有给/etc/rc.d/rc.local执行权限, 所以需要给文件添加执行权限
复制默认配置文件到/etc下:
cp
/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc
systemctl
restart multipathd
multipath -l # 即可查看到软件自动扫描后对相同uuid的设备生成的设备名(mpatha)
fdisk /dev/mapper/mpatha # 模拟出来的设备在/dev/mapper下
vim
~/bash_profile
PATH:$BASH$/usr/bin:/usr/lib/udev
# 为了能使用scsi_id命令
:wq
scsi_id -u -g /dev/sda # 查看scsi设备id
vim
/etc/multipath.conf
user_friend_names yes # 表示多路径会自动生成一个名字
user_friend_names no # 不让它自动生成
find_multipaths yes # 表示会检测多路径的配置文件是否完整
multipaths {
multipath {
wwid 设备id
alias mydisk
}
}
:wq
在/etc/multipath目录下有个wwid文件, 里面是自动识别多路径的设备的id号
fdisk
/dev/mapper/mydisk
...
partprobe
/dev/mapper/mydisk
nodec:
yum
-y install iscsi-init*
vim
/etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2014-09.com.example:node
:wq
systemctl
restart iscsid
systemctl
restart iscsi
# 双线备份
iscsiadm
-m discovery -t sendtargets -p 192.168.1.13
iscsiadm
-m node -T iqn.2016-09.com.example:storage -p 192.168.1.13 -l
iscsiadm
-m discovery -t sendtargets -p 192.168.2.13
iscsiadm
-m node -T iqn.2016-09.com.example:storage -p 192.168.2.13 -l
# 做多路径:
yum
-y install device-mapper-multipath
systemctl
enable multipathd
systemctl
restart multipathd
multipath -l # 查看多路径运行状态, 发现dm_multipath模块未加载
lsmod | grep dm_multipath #
查看加载的模块
modprobe dm_multipath # 加载模块, 临时生效
vim
/etc/rc.d/rc.local
modprobe dm_multipath # 设置模块永久加载
:wq
rhel 7 默认没有给/etc/rc.d/rc.local执行权限, 所以需要给文件添加执行权限
复制默认配置文件到/etc下:
cp
/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc
systemctl
restart multipathd
multipath -l # 即可查看到软件自动扫描后对相同uuid的设备生成的设备名(mpatha)
fdisk /dev/mapper/mpatha # 模拟出来的设备在/dev/mapper下
vim
~/bash_profile
PATH:$BASH$/usr/bin:/usr/lib/udev
# 为了能使用scsi_id命令
:wq
scsi_id -u -g /dev/sda # 查看scsi设备id
vim
/etc/multipath.conf
user_friend_names yes # 表示多路径会自动生成一个名字
user_friend_names no # 不让它自动生成
find_multipaths yes # 表示会检测多路径的配置文件是否完整
multipaths {
multipath {
wwid 设备id
alias mydisk
}
}
:wq
在/etc/multipath目录下有个wwid文件, 里面是自动识别多路径的设备的id号
fdisk
/dev/mapper/mydisk
...
partprobe
/dev/mapper/mydisk
noded:
mkdir
/virtio
dd if=/dev/zero of=/virtio/vdisk1 bs=1M count=1024 # 创建一个1G的文件做虚拟分区
yum
-y install targetcli
systemctl
stop firewalld
systemctl
disable firewalld
systemctl
enable target
systemctl
start target
targetcli
>ls
>cd backstores/fileio # 如果用文件创建的虚拟设备, 建议放在fileio(也可以随便放)
>create
iscsi_store /virtio/vdisk1
>cd
/iscsi
>create
iqn.2016-09.com.example:storage
>cd
iqn.2016-09.com.example:storage/tpg1/acls
>create iqn.2016-09.com.example:node # 这个node可以随便取, 但是其他节点上的连接名字必须是这个
>cd
luns
>create
/backstores/fileio/iscsi_store
>exit
systemctl
restart target
集群级存储之数据同步
ext4, xfs都是单机版文件系统, 也是日志文件系统
由于日志文件系统无法扩大日志存储的部分, 所以不适用于集群环境
集群环境采用的日志文件系统是GFS, 分为两种类型: log.dlm和log_nolock(单机版). 因为dlm有锁机制
单机lvm就叫lvm2, 集群用的是clvm(cluster lvm)
在iscsi共享存储+fence完成的基础上(不创建分区的前提下)
ndoea:
yum -y install dlm lvm2-clutster gfs2-utils
cd /etc/lvm
vim lvm.conf
locking_type = 1 # 单机版
locking_type = 3 # 集群版
:wq
或者用lvmconf --enable-cluster命令更改成集群版lvm
systemctl stop lvm2-lvmetad # 关闭单机版lvm2
systemctl disable lvm2-lvmetad
添加资源:
Class: pacemaker
Type: controld
Clone: 勾上
Resource ID: cluster-dlm
创建
添加资源:
Class: heartbeat
Type: clvm
Clone: 勾上
Resource ID cluster-clvm
点击dlm资源
选择Resource Ordering Preferences中添加
cluster-clvm starts after cluster-dlm starts # 表示会先启动clvm
以下步骤任何一个节点都可以:
pvcreate /dev/mapper/mpatha1
vgcreate cluster_vg1 /dev/mapper/mpatha1
lvcreate -L 800M -n cluster_lv1 cluster_vg1
lvdisplay
mkfs.gfs2 -p lock_dlm -t cluster1:mygfs2(集群名:文件系统名字) -j 4(节点数量加1, 便于拓展) /dev/cluster_vg1/cluster_lv1
mkdir /xx
mount /dev/cluster_vg1/cluster_lv1 /xx
df -h # 查看到使用了空间为(128*4)日志区这么多个
cd /xx
echo 'hello' > aa
# 红帽6上, 不是随系统安装时产生的分区, 默认不具有acl功能, 需要用tune2fs -o acl 分区名(此命令仅适用与ext文件系统)来开启acl
GFS2文件格式默认不支持acl, 开启acl的方法是:
mount -o remount,acl /xx 重新挂载, 临时生效, 永久生效要放入集群中
磁盘配额:
mount -o remount,quota=on /xx
quotacheck -cugm /xx
edquota -u tom(用户名)
uid 1001):
blocks(以块大小衡量,可以不写) soft hard inodes(以文件个数衡量) soft hard
cluster_lv1 0 102400(单位KB) 204800 0 0 0
:wq
repquota -a 查看quota信息
添加资源:
Class: heartbeat
Type: Filesystem
Resource Group: WEB
Resource ID: web-fs
device: /dev/cluster_vg1/cluster_lv1
directory: /var/www/html
fstype: gfs2
Optional Argument:
option: acl, quota=on
创建
添加资源HTTPD...
绑定组
corosync-cfgtool -s # 显示心跳来自哪个网络
nodeb:
yum -y install dlm lvm2-cluster gfs2-utils
lvmconf --enable-cluster
systemctl stop lvm2-lvmeta # 关闭单机版lvm2
systemctl disable lvm2-lvmeta
mkdir /xx
mount /dev/cluster_vg1/cluster_lv1 /xx
cd /xx
cat aa # 可以看到数据已同步
nodec:
yum -y install dlm lvm2-cluster gfs2-utils
lvmconf --enable-cluster
systemctl stop lvm2-lvmeta # 关闭单机版lvm2
systemctl disable lvm2-lvmeta
mkdir /xx
mount /dev/cluster_vg1/cluster_lv1 /xx
心跳 rrp
nodea:
cd /etc/corosync
vim corosync.conf # 编辑配置文件, 添加一条心跳网络
totem {
rrp_mode: active
interface {
ringnumber: 0
bindnetaddr: 172.25.0.0
mcastaddr: 239.255.1.1
mcastport: 5405
ttl: 1
}
interface {
ringnumber: 1
bindnetaddr: 192.168.0.0
mcastaddr: 239.254.1.1
mcastport: 5405
ttl: 1
}
}
:wq
# rrp_mode 有两个值, 一个active, 一个passive
pcs cluster stop --all
pcs cluster sync
pcs cluster start --all
corosync-cfgtool -s # 显示心跳来自哪个网络