LVS后端双写web服务器,基于drbd和gfs2集群文件系统

1600阅读 0评论2016-11-13 lolizeppelin
分类:架构设计与优化

最近嫌同步站点文件麻烦了,于是决定把双写上了
由于gfs2集群文件系统必须启动在RHCS环境中
以前只折腾过heartbeat,keepalive,没接触过RHCS,网上一搜整个都晕了
都不知道什么版本的,加上不熟悉RHCS,一堆cman、pacemaker、crm、corosync
一个一个组件干什么的都不知道, 直接傻逼了。

我们先搞清楚heartbeat、keepalive和RHCS有什么区别联系
1、首先把keepalive剔除, keepalive只是一个轻量的负责管理lvs的工具,不要和我们的集群混在一起
所以keepalive和lvs直接单独玩自己的
2、heartbeat这名词最容易产生混乱
我们先定义下不同的heartbeat表述方式
首先heartbeat表达心跳的含义的时候,我们下面都用中文表示
和keepalive一起的heartbeat软件,有3个大版本, heartbeat v1 heartbeat v2, heartbeat v3,下面说这个软件的时候,我们带上版本号表示,比如heartbeat v123
所有集群软件都要有通过通过多播、ping来通信状态的部分, 我们管这部分叫做heartbeat组件
3、搞清楚各个组件的功能
网上一堆集群概念篇大多数都是TM抄一便的,很容易混乱
其实有些概念是heartbeat v123的,有些概念是RHCS的
现代版的RHCS取消了一些内部组件直接用了heartbeat v123拆分出来的部分组件
混在一起不熟悉的话特别头大
我们先以heartbeat v123的分层来说明组件功能,然后对应到RHCS

首先,集群要有互相通信的部分,这部分也就是heartbeat组件,heartbeat组件一般都通过ping、多播什么的通信这一层叫在heartbeat x.0里叫heartbeat
然后,集群需要通过heartbeat组件反馈不停的同步集群各个节点的状态,仲裁啊投票啊,这一层叫在heartbeat v123里叫CCM
然后,集群要对CCM的同步状态做出决定并执行比如踢出啊,关闭啊什么的,这一层也就是CRM,同时SA要控制集群也是通过CRM提供的接口
最后,实际操作资源,比如关闭IP,关闭进程什么的,在RHCS里以前用rgmanager来做

上述4层无论是什么集群都必须实现的基本功能
以前在heartbeat v12时代这些层是一起的(可以理解为全部打包在heartbeat v12的rpm包里)
到了3.0时代,拆分成了heartbeat组件、CRM组件等
------------------------我们来列出RHCS实现上述功能的组建------------------------------
heartbeat组件
最新RHCS用的corosync来实现这部分功能,redhat6还是通过cman这个壳来配置corosync

新RHCS用的corosync来实现CCM功能
旧RHCS是cman来做的,后来cman完全被corosync取代,虽然cman被取代,但是在redhat6里corosync还是做为cman的插件来运行的
顺便corosync的配置不是通过/etc/corosync/corosync.conf导入的
是pcs启动corosync后通过corosync-objctl这个工具注入进去的,所以你是不能直接找到corosync的配置内容的
而pcs设置的参数也是pcs解析cman的配置文件生成的,要看到设置的corosync参数是什么可以用corosync-objctl -a来找
至于为什么这么绕一圈,完全是为了兼容redhat6早期使用cman的集群,为了能让这些旧集群能正常yum升级而且sa不用重写配置文件。
所以cman还以一个壳的形式存在,到redhat 7以后因为不用考虑兼容所就不需要cman这个壳了

CRM组件就是pacemaker, rpm -ql pacemaker一下他的文件,类似以前heartbeat x.0的ocf资源文件就归他了(以前heartbeat 1.0/2.0时代用的ocf资源归于resource-agents这个rpm包,这个包是属于heartbeat v3的)
以前RHCS实现这部分功能的rgmanager,
最新的RHCS已经选择pacemaker来执行资源操作, 7已经没了cman和rgmanager
所以我们现在根本不用看rgmanager,直接用pacemaker
CRM和最后实际操作资源那一层一般混在一起
pacemaker文档地址
--------------------------------------------------------------------------------------------------
这样一来heartbeat v123的部分就和RHCS对应上了
RHCS作为集群的基本组件都有了,也就是pacemaker+corosync
ps:上面其实划分比较笼统,一些细节参考比如
从pacemaker 1.1.8开始,crm(这里的crm指的是crm命令行工具)发展成了一个独立项目,叫crmsh。也就是说,我们安装了pacemaker后,并没有crm这个命令,我们要实现对集群资源管理,还需要独立安装crmsh。
使用了crmsh,就不在需要安装heartbeat,之前的版本中都需要安装heartbeat以利用其crm进行资源管理。网上大量的教程中都是基于pacemaker1.1.8以前的版本的
redhat  6系列用的pacemaker还是1.1.4,所以crm命令行工具还在pacemaker里
下面这个对层级划分说的比较好
http://dengxi.blog.51cto.com/4804263/1705367
这个把RHCS的演化说了不少
http://jowin.blog.51cto.com/10090021/1722241
简单来说corosync发展得太强了把原来相同功能的都取代了
--------------------------------------------------------------------------------------------------
接下来是说说RHCS多于heartbeat v123的功能
1、Distributed Lock Manager 一个分布式锁管理器
集群文件系统必备的功能、多写肯定是要加锁的,这个服务是集群文件系统的根本
网上的的“DLM的请求是本地的,不需要网络请求,因此请求会立即生效”,这个请求立刻生效很容易误导人
集群的锁肯定是要和集群通信的,只是在gfs2看来,它只向本地dlm请求而已,但dlm回应前也是要去网络走一圈的

2、Fence, 这玩意我记得heartbeat v123里也有配置
基本上只得就是hp ilo之类的,在pacemaker中定义为stonith

3、ccs服务(cluster configuration system集群配置系统)
以前我们配置heartbeat v12需要在每个节点改配置文件
通过这个服务就监控集群配置文件,一个结点改了,其他节点自动同步
然后、这玩意跟着cman一起被淘汰了,不用安装

以前heartbeat v123因为是双机,所以这方面不怎么注重,操作哪个节点就去哪个节点去就可以了,配置也手动复制过去就可以了
RHCS的数量会多,轮询登陆其他机器操作来肯定是不行的
所以启动、关闭集群节点什么的,都要有命令行或者gui工具能直接控制到集群任意节点

最新RHCS用的工具就是pcs
以前用什么不用管,反正现在安装pcs就对了
pcs要启动一个守护进程,这个进程提供http服务
我们操作集群的时候都是通过pcs的http服务去群发/接收命令的
因为pcs web服务器的存在,我们可以在任意已经启动的集群节点上运行pcs命令控制集群
当然pcs在每个节点都要启用,这玩意代替了ccc
注:pcs操作集群调用的crm命令行的工具,pcs在redhat 6.x里还会调用cman里面的部分工具

搞清楚这些以后
双写RHCS web集群我们就安装这些
cman、corosync、pacemaker、pcs、drbd、gfs2-utils

前置操作
ssh root互相信任 # 其实这个应该是不需要的
使用相同的hacluster密码   # hacluster的密码是个pcs的web用的 pcs的web没用数据库,直接pam来验证用户

第一步执行认证
pcs --debug cluster auth node1 node2 -u hacluster
比较倒霉第一步直接运行报错.....
Failed to initialize the objdb API. Error
Cannot read config 'cluster.conf' from '/etc/cluster/cluster.conf': No such file\n",   # 这个配置文件在后面集群setup的时候会生成
Cannot read config '/var/lib/pcsd/cfgsync_ctl': No such file or directory - /var/lib/pcsd/cfgsync_ctl
Unable to connect to node xxxx, no token available
这部分我折腾一天中文英文翻了一堆资料
总之就是连不上2224端口,执行pcs --debug cluster auth的时候
发现抓包都没数据过来
最后发现直接用IP去认证居然成功了
回头一想恍然大悟,又是域名字符串不标准的坑,域名不得包含下划线.ruby的http访问库严格检查了这个,反馈又不清晰,debug里警告有多,我简直草泥马
如果不是我发现IP能认证,如果不是我接触过unity获取初始化地址出现过类似的问题
真尼玛比要读一遍里面的请求代码才能解决了,前面三条警告是完全不用理会的
警告原因有兴趣可以看看



第二部创建集群
pcs cluster setup --name web_gfs 
--force参数将删除旧集群


第三部验证集群配置
crm_verify -L -V
# 肯定会出现stonith的相关报错,关掉fence设备
pcs property set stonith-enabled=false 
# 我们只有双节点,要关闭投票系统
pcs property set no-quorum-policy=ignore  


第四部设置drbd
drbd需要和内核版本一直,所以redhat 6每次yum update都要重新编译,还好7已经包含在内核中
制作drbd的kmod和util的安装包看http://blog.chinaunix.net/uid-23504396-id-5755177.html
配置参考官方文档
简要配置好的
global_common.conf
资源配置

点击(此处)折叠或打开

  1. resource data {
  2. device /dev/drbd0;
  3. disk /dev/sda2;
  4. meta-disk internal;
  5. on node1 {
  6. address 192.168.1.9:7789;
  7. }
  8. on node2 {
  9. address 192.168.1.10:7789;
  10. }
  11. }
# 每个节点都通过dd清理sda2开头数据段
# 每个节点执行初始化drbd元数据(data是资源名)
drbdadm createmd data
# 每个节点都启动drbd资源(data是资源名)
drbdadm up data
# 确认drbd已经启动
cat /proc/drbd
# 任意找一个节点,将自身提升为primary 
drbdadm primary data
# 关闭drbd
/etc/init.d/drbd stop

------------------------------------------------------------------------------------------------------------
--------------------------------关闭所有集群相关资源------------------------------------------------
--------------------------------禁止相关服务器启动------------------------------------------------
--------------------------------php nginx drbd 都要关闭并禁止自启动-----------------------------

------------------------------------------------------------------------------------------------------------

第五部创建集群资源
因为我们CRM组件就是pacemaker,所以resource的参数就是pacemaker的参数,下面是pacemaker的文档地址,翻下面文档比上网找靠谱多了

一些具体问题处理的参考
http://blog.chinaunix.net/uid-23504396-id-5755321.html
我们直接说过程
# 先设置默认参数
pcs resource op defaults timeout=30s
# 列出已经设置的默认参数
pcs resource op defaults 

确定启动顺序
我们需要所有节点的dlm启动后drbd才能把自己设置为primaries
当所有的drbd设置为primaries以后我们才能mount分区
顺序为
1、dlm 全局锁, drbd
2、drbd设置promote
3、mount drbd分区(gfs2文件系统)
4、php
5、nginx

-----------------------------------------------------------------------------
1、创建dlm集群全局锁服务
pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s timeout=5s on-fail=standby clone interleave=false # interleave必须为false
pcs resource show dlm # 查看参数是否正确,想了一下如果一个节点stop了的话按照下面的设置所有节点都会停掉,所以修改下参数
pcs resource update dlm op monitor on-fail=stop interval=5s timeout=2s # 更新设置参数,改成stop,间隔时间也修改下
pcs resource meta dlm-clone ordered=false  # dlm不需要按顺序启动
-----------------------------------------------------------------------------

2、创建drbd服务
# drbd必须设置为Master/Slave模式,不然启动后不会调用promote来将自己变为主节点
# linbit:drbd脚本要求必须有参数clone-max=2, notify_start_uname(启动drbd服务的节点), notify也必须为true
# 这里interleave必须为true(默认值就是true,不设置也可以)
# op monitor的interval参数必须不一样,应该是pcs检查的原因,直接编辑xml文件interval应该是可以的一样的
# drbd_resource就是drbd配置文件中的资源名
pcs resource create drbd ocf:linbit:drbd drbd_resource=data op monitor role=Master interval=15s timeout=5s on-fail=stop op monitor role=Slave interval=30s timeout=5s on-fail=stop meta clone-max=2 notify_start_uname="node1 node2" notify=true interleave=true 
# 设置设置为主从模式,只有主从模式,才会自动调用promote修改drbd的状态,如果用普通的clone模式,需要自己写一个修改状态的脚本并作为资源
pcs resource master ms-drbd drbd
# 允许二个主,notify_start_uname和notify也要照原始资源设置一次
pcs resource meta ms-drbd master-max=2 notify_start_uname="node1 node2" notify=true interleave=true
# 设置资源粘性,强制ms-drbd绑定到node1和node2
pcs constraint location ms-drbd  prefers node1 INFINITY
pcs constraint location ms-drbd  prefers node2 INFINITY
# 执行上述命令后pcs好像有个bug会多出一个没意义INFINITY的约束,手动删一样
interleave必须为true否则参考http://blog.chinaunix.net/uid-23504396-id-5755321.html
# 设置顺序,dlm锁服务启动以后才能调用promote(就是drbd进程可以先起来,但是要等dlm锁服务启动以后才能调用promote将自己改为Primary)
pcs constraint order start dlm-clone then promote ms-drbd 
-----------------------------------------------------------------------------

3、格式化drbd分区
# 先确认集群资源正常启动,检查drbd同步情况,确认后执行格式化
mkfs.gfs2 -p lock_dlm -t web_gfs:gfs2_drbd -j 2 /dev/drbd0
-----------------------------------------------------------------------------

3、创建gfs2文件系统mount到节点的服务
pcs resource create fs_gfs2 Filesystem device="/dev/drbd0" directory="/data" fstype="gfs2" options="noatime" op monitor on-fail=stop clone
# 必须等drbd将自己设置为Primary后才启动mount服务
pcs constraint order promote ms-drbd then start fs_gfs2-clone
-----------------------------------------------------------------------------

4、php和nginx服务
pcs resource create php lsb:php-fpm op monitor interval=10min timeout=10s clone
pcs resource create nginx lsb:nginx op monitor interval=10min timeout=10s clone
# php必须在mount后才启动,nginx必须php启动后才启动
pcs constraint order start fs_gfs2-colne then start php-clone
pcs constraint order start php-clone then start nginx-clone 
-----------------------------------------------------------------------------


上一篇:Mysql主从同步失败,the slave's relay log is corrupted
下一篇:aclocal、autoconf、automake、autoheader、configure使用