目录
一、宏观理解集群
集群中的一个服务器称为一个节点node。
集群资源以mysql为例一般有:vip(浮动IP)、mysql(服务)、存储(共享存储)。所有资源作为一个整体提供服务,称为服务组。集群资源不运行在同一个node时,集群不能正常工作。为了集群资源运行在同一个node上,需要配置集群的约束条件。约束条件:location、order、colocation。
- location:资源优先在哪个node上运行
- order:资源的启动顺序(先启动vip、再启动共享存储、再启动服务)
- colocation:保证资源运行在同一个node上(其他资源跟着哪个资源跑)
心跳线:在私有网络中,各个node之间互相探测,看其他node是否正常。各个node之间互相争抢资源(互相认为其他node有故障),会出现脑裂状态,会造成数据丢失。
fence/stonith:stonith=shoot the other node in the head,通常是电源交换机来解决脑裂,他会把有问题的node重启或关机,避免脑裂。
node和共享存储之间用多路径multipath,防止一条线路故障导致不可用。
二、微观理解集群
CRM:Cluster Resource Manager 集群资源管理器,每个node上一个头儿
PE:Policy Engine 策略引擎,从CRM中重选出DC
DC:Designated Coordinator 指定协调器,集群中有一个CRM作为DC
LRM:Local Resource Manager 本地资源管理器,接受CRM的指令,调用RA来管理各自node上的资源
CIB:Clister Infomation Base 集群信息库,是关于集群的数据库,由节点更新,为PE做决策提供依据
RA:Resource Agent 资源代理启动脚本,RA有三种:LSB、systemd、OCF。
- RHEL6前 LSB---/etc/init.d/
- RHEL7后 systemctl
- OCF 开放集群框架,是第三方的启动脚本
以3节点集群为例,node1、2、3中当前活跃节点是node3。集群的故障转移是这样实现的
- 如果node3挂了被node1、2心跳检测到
- 那么node1、2就更新CIB的信息
- PE根据CIB的信息决策其余node中哪个node最适合接管,比如node2接管
- PE决定node2上的CRM作为新的DC
- node2变成活跃节点,node2的CRM命令LRM启动服务
- LRM通过调用各种RA来启动服务
以上的集群架构通过集群软件实现,常用的集群软件是
- pacemaker来实现CRM
- corosync来实现心跳线信息
三、安装高可用集群环境
3.1、实验环境简介
虚拟机server作为实验平台,server必须把光盘挂着以充当yum源。在server上使用KVM运行5台虚拟机分别为node1~5。在root的家目录放入安装node的文件(目录rh436_new)和安装脚本。在server上:放入tar包,解压缩并进入rh436_new目录,执行server.sh脚本配置初始环境。执行以后会自动重启,初始环境完成。
[root@server:~]# tar xvzf rh436_new.tar.gz
[root@server:~]# cd rh436_new/
[root@server:~/rh436_new]# ll
total 505M
-rw-r--r--. 1 root root 505M Mar 13 2018 node.qcow2
-rw-r--r--. 1 kevin kevin 167 May 5 2016 README
-rwxr-xr-x. 1 kevin kevin 793 May 5 2016 reinstall.sh
-rwxr-xr-x. 1 kevin kevin 1.5K May 5 2016 server.sh
[root@server:~/rh436_new]# ./server.sh
在server上:virsh list查看虚拟机状态
[root@server:~]# virsh list
Id Name State
----------------------------------------------------
在server上:reinstall.sh 1 2 3 4 5可以安装或者重置node1 node2 ... node5
[root@server:~]# reinstall.sh 1
[root@server:~]# reinstall.sh 2
...
[root@server:~]# reinstall.sh 5
启停某个node
[root@server:~]# virsh start node1
[root@server:~]# virsh shutdown node1
远程到某个node上,密码都是redhat。
[root@server:~]# ssh node1
Warning: Permanently added 'node1,192.168.122.10' (ECDSA) to the list of known hosts.
root@node1's password:
[root@node1 ~]#
3.2、安装集群软件并配置集群
在3个node上:装包pcs,启动服务pcsd。装pcs包会创建用户hacluster,更改其密码。验证集群是否正常。同理node2、3。
[root@node1 ~]# yum install pcs -y
[root@node1 ~]# systemctl enable pcsd; systemctl start pcsd
[root@node1 ~]# echo redhat | passwd---stdin hacluster
集群各节点node1、node2、node3互相做认证,这个过程只需要在一个结点上操作即可
[root@node1 ~]# pcs cluster auth node1 node2 node3
Username: hacluster
Password:
node1: Authorized
node2: Authorized
node3: Authorized
在server上:打开firefox,访问https://node1:2224,用hacluster/redhat登录。
点击Create New新建一个集群,起名cluster1,加入node1、node2和node3,点Create Cluster创建。
集群cluster1看到有3个node,各个node之间的pacemaker要等一会儿才能正常运行起来。
这里有nodes、resource、fence device、cluster properties、manage clusters等。
分别管理node、资源、fence、集群属性、管理集群等。
我们访问的是https://node1:2224,所以cluster properties是node1的properties。
此时,在cluster properties里面,
把No Quorum Policy选为Ignore
把Stonith Enable不勾选
保证后面可以顺利添加资源,如vip
访问https://node2:2224,用hacluster/redhat登录
添加已有的集群,点Add Existing,因为已经配置过node1,所以填写node1添加
访问https://node3:2224,同理配置
3.3、用命令行创建集群
命令行使用man pcs查看例子。下面用命令行创建和用浏览器创建一样的集群。
[root@node3 ~]# pcs cluster setup --start --enable --name cluster1 node1 node2 node3
Shutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop pacemaker.service
Redirecting to /bin/systemctl stop corosync.service
Killing any remaining services...
Removing all cluster configuration files...
node1: Succeeded
node2: Succeeded
node3: Succeeded
Starting cluster on nodes: node1, node2, node3...
node1: Starting Cluster...
node3: Starting Cluster...
node2: Starting Cluster...
node1: Cluster Enabled
node2: Cluster Enabled
node3: Cluster Enabled
关闭stonith enable
[root@node1 ~]# pcs property set stonith-enabled=false
[root@node1 ~]# pcs property show
Cluster Properties:
cluster-infrastructure: corosync
cluster-name: cluster1
dc-version: 1.1.12-a14efad
have-watchdog: false
stonith-enabled: false
不启用quorum策略
[root@node1 ~]# pcs property set no-quorum-policy=ignore
[root@node1 ~]# pcs property show
Cluster Properties:
cluster-infrastructure: corosync
cluster-name: cluster1
dc-version: 1.1.12-a14efad
have-watchdog: false
no-quorum-policy: ignore
stonith-enabled: false
这些属性的名字一般是浏览器里cluster property中名字的连字符形式,比如,Stonith Enabled就是stonith-enabled,No Quorum Policy就是no-quorum-policy,以此类推。