corosync+pacemker的高可用集群,
可以分为几层:从下往上,分为Messaging Layer(信息传递层或基础架构层,用来传递心跳信息等的程序),Resoure Layer(资源管理器层(全局的),管理资源),Local Resouce Manager(本地资源管理器),在上面是资源代理,
这种形式的高可用集群,一旦分区,需要quorum(拥有法定票数) > total/2(总数),拥有法定票数多的一方代表集群进行工作
vote system: (投票系统)
少数服从多数:quorum> total/2
withquorum: 拥有法定票数
withoutquorum: 不拥有法定票数
两个节点(偶数个节点):
Pingnode
qdisk
如果是两个节点的后端服务器,需要加仲裁机制,才能让集群正常的工作
资源管理层用来定义和管理资源,资源之间有位置关系(也叫约束)
资源类型:
primitive:主资源,原始资源;在集群中只能运行一个实例;
clone:克隆资源,在集群中可运行多个实例;匿名克隆、全局惟一克隆、状态克隆(主动、被动)
multi-state(master/slave):克隆资源的特殊实现;多状态资源;
group: 组资源;
启动或停止;
资源监视
相关性:
资源属性:
priority: 优先级;
target-role:started,stopped, master;
is-managed:是否允许集群管理此资源;
resource-stickiness:资源粘性;
allow-migrate:是否允许迁移;
约束:score
位置约束:资源对节点的倾向性;
(-oo,+oo):
任何值+无穷大=无穷大
任何值+负无穷大=负无穷大
无穷大+负无穷大=负无穷大
排列约束:资源彼此间是否能运行于同一节点的倾向性;
顺序约束:多个资源启动顺序依赖关系,即谁先启动,谁后启动;
CentOS7中,使用的是corosync v2(带有投票系统) + pacemaker (独立服务)
集群的全生命周期管理工具:
pcs:agent(pcsd)
crmsh:agentless (pssh)
配置集群的前提:
(1)时间同步;
(2)基于当前正在使用的主机名互相访问;
(3)是否会用到仲裁设备;
配置两节点的集群服务,首先安装pcs,安装pcs会自动安装corosync和pacmaker
示例:pcs的方式配置集群,用pcs管理集群
两个节点都安装pcs,时间要同步,要能基于主机名进行访问,需要修改/etc/hosts文件(ansible的使用,如有疑问可以查看本人的ansible的博客)
然后在每个节点启动pcsd.service,并让开机自启动
systemctl start pcsd.service
systemctl enable pcsd.service
使用ansible进行启动
ansible websrvs -m service -a 'name=pcsdstate=started enabled=yes'
websrvs里包括172.16.249.115 172.16.249.159
可以使用systemctl status pcsd 来查看
然后给hacluster这个用户设置密码
ansible websrvs -m shell -a 'echo"mageedu" | passwd --stdin hacluster'
然后配置corosync 在其中的任意一个节点上进行配置(pcs help 可以查看pcs的命令)
pcs cluster auth centos71 centos72 做认证
这样验证就通过了,你要保证每个节点的hacluster的用户的信息是一样的,
在另一个节点上测试下
然后设定集群
pcs cluster setup --name mycluster centos71centos72
如果你以前做过corosync集群,加个选项–force强制重新生成下
然后进入/etc/corosync/里面会有一个corosync.conf配置文件,这个文件默认是不存在的
可以修改配置文件(/etc/corosync/ corosync.conf),把日志的存放位置改下
然后其他节点也需要修改,
这个不需要修改就可以启动,这里为了查看日志方便,才修改的
然后启动集群任意节点中pcs cluster start - - all 因为这里只有一个集群,所以使用all,如果有多个,可以指定集群名来启动
然后检查集群启动的状态
检查各节点通信状态(显示为no faults即为OK):
corosync-cfgtool -s
可以看到没问题
检查集群成员关系及Quorum API:
corosync-cmapctl | grep members
这样集群就没问题了
还可以使用 pcs status 来查看集群状态
这里有个警告,需要修改集群的全局属性stonith-enabled=false就可以了,
Current DC是集群中用来决策的节点
crm_verify -L –V这个命令可以查看集群是否有问题
配置集群全局属性,pcs property set stonith-enabled=false,然后在检查就没问题了
pcs resource describe 可以查看资源的配置命令格式
查看一个详细资源的配置信息
pcs resource describe 资源名 例:pcs resourcedescribe ocf:heartbeat:IPaddr
这样就可以查看这个资源的怎样配置的了
定义资源,pcs resource create webip ocf:heartbeat:IPaddrip="172.16.36.88" op monitor interval=20s timeout=10s
删除资源,pcs resource delete webip 这样就可以删除
然后定义下一个资源
pcs resource create webserver systemd:httpdop monitor interval=30s timeout=20s
查看状态
要把这两个资源绑到一块,使用约束,或者定义成组,这里定义成组
pcs resource group add webservice webipwebserver
在看状态
这样资源就在一个节点上了
测试下
然后把这个节点状态改为standby,资源就会到另一个节点上了
pcs cluster standby centos71
可以看到在另一个节点上了,测试下
示例:手动配置 corosync + pacemaker 使用crmsh来管理集群
首先在三个节点上172.16.249.195(centos7),172.16.249.115(centos71),172.16.249.159(centos72),安装httpd服务,
设置测试页
[root@centos7 ansible_playbooks]# echo"This is node1
" >/var/www/html/index.html
[root@centos7 ansible_playbooks]# ansible172.16.249.159 -m shell -a'echo "This is node3
">/var/www/html/index.html'
172.16.249.159 | success | rc=0 >>
[root@centos7 ansible_playbooks]# ansible172.16.249.115 -m shell -a'echo "This is node2
">/var/www/html/index.html'
172.16.249.115 | success | rc=0 >>
然后测试服务是否都没问题了,把服务停掉,然后把服务加入到列表中
然后做corosync+pacemaker集群服务
首先安装 corosync和 pacemaker, 使用ansible
创建一个installcpk.yml,然后加入内容如下:
- hosts: websrvs
remote_user: root
tasks:
- name: install corosync pacemaker
yum: name=corosync state=present
yum: name=pacemaker state=present
然后使用 ansible-playbook installcpk.yml
这样就安装好了
使用多播的形式来进行heartbeat的信息交互,然后crmsh认证
首先复制配置文件
cd /etc/corosync/
[root@centos7 corosync]# ls
corosync.conf.example corosync.conf.example.udpu corosync.xml.example uidgid.d
[root@centos7 corosync]# cp corosync.conf.example corosync.conf
然后修改配置文件
因为开启认证了,所以要生成认证文件
corosync-keygen
然后把配置文件和认证文件,复制给其他节点
scp -p authkey corosync.confcentos71:/etc/corosync/
scp -p authkey corosync.conf centos72:/etc/corosync/
然后验证没有问题的话,就可以启动了
写一个ansible剧本,
vim startcpk.yml
- hosts: websrvs
remote_user: root
tasks:
- name: start corosync
service: name=corosync state=started
然后执行就行了
使用这个命令corosync-cfgtool –s验证以下
其他节点也都验证一下
使用这个命令corosync-cmapctl也可以验证,里面有下面这些信息就可以了
然后启动pacemaker ,配置文件在/etc/sysconfig/pacemaker里,一般不用改,如果想单独生成日志文件,打开下面这一项
写入到刚才的ansible剧本里,然后执行
使用ps aux 查看下
然后使用crm_mon来监控集群服务
可以看到,节点都启动成功了,就是没有资源定义
下面来定义资源,可以使用crmsh和pcs等,也可以直接使用二进制的接口命令也可以设置
下面使用crmsh,只需要在一个节点安装crmsh就行了,然后在这个节点进行配置
使用crm_verify -L –V 可以查看集群的状态,这里显示错误,是因为我们没有STONITH设备,但默认开启了这一项,所以需要修改这一项stonith-enabled为false
安装crmsh来进行修改和定义资源
首先下载,
crmsh-2.1.4-1.1.x86_64.rpmpssh-2.3.1-4.2.x86_64.rpm python-pssh-2.3.1-4.2.x86_64.rpm
这几个rpm包,然后yum -y install *.rpm(你要保证当前目录下,就只有这三个rpm包)
然后就可以使用crm工具了
然后就行资源的定义,修改STONITH这一项crm(live)# configure property stonith-enabled=false
然后在crm_verify -L -V检查集群就没问题了,下面开始配置资源
show可以查看已定义的资源,然后定义IP这个资源,使用verify可以检查错误,如果出错会提示,如果出错,可以使用delete webip这个资源
primitive webip ocf:heartbeat:IPaddr paramsip="172.16.36.88" op monitor interval=30s timeout=20s
primitive webserver systemd:httpd opmonitor interval=30s timeout=20s
colocation webserver_with_webip inf:webserver webip 这是定义这两个资源在一起,排列约束
order webserver_afterwebip Mandatory: webipwebserver定义顺序约束
然后提交commit
使用show xml 可以看到配置的配置文件,定义好提交,然后在使用status就可以查看集群的状态了,从上图可以看出,资源已经启动了
查看下ip地址
地址加上了,然后访问下
然后把第一个节点变为备用
然后使用这个命令crm node standby
然后在查看状态
可以看到迁移了,
然后去centos71上看下,然后在访问下
没问题了,然后再把节点一还原回来,看下资源会不会切换来
可以看到资源没有动,我们可以定义位置约束,只要这个节点在,就会把资源移动到这个节点上
location webservice_pref_centos7 webip 100:centos7 定义位置约束
然后commit同步
可以看到资源回到cemtos7上了
下面把web的页面放在nfs服务器上,然后修改资源进行操作
首先在nfs服务器上创建一个目录,mkdir /www/htdocs -pv
然后写一个测试页echo "
Test Page on NFS Server
" >/www/htdocs/index.html然后把这个目录输出出去,编辑/etc/exports
然后执行service nfs start,然后确保没有被iptables阻断
然后chkconfig nfs on 让其能开机启动
然后测试一下,
在其他主机上使用showmount -e 172.16.249.248
可以看到没问题了
然后挂载上,访问测试下
然后使用crmsh定义nfs资源
然后把刚定义的顺序和绑定的约束删掉
delete webserver_with_webip
delete webserver_afterwebip
然后定义资源
primitive webstore ocf:heartbeat:Filesystemparams device="172.16.249.248:/www/htdocs"directory="/var/www/html" fstype="nfs" op start timeout=60sop stop timeout=60s op monitor interval=20s timeout=40s
colocation webserver_with_webstore_and_wibipinf: webserver (webip webstore)
order webstore_after_webip Mandatory: webipwebstore
order webserver_after_webstore Mandatory:webstore webserver
commit,
status
然后测试就行了
使用corosync + pacemaker做mysql集群
首先设置nfs
然后在nfs共享的目录里,创建一个data目录,属主属组改为mysql 权限766
负载mysql服务
然后在节点主机里,创建一个/mydata/data/目录属主属组改为mysql权限766
修改/etc/my.cnf的datadir=/mydata/data 然后重启mariadb,如果能正常启动没有问题的话
就把上面做的资源修改下就可以实现mysql集群了。(这个以后有时间在演示)