前面两篇介绍了LVS和Heartbeat并进行了基本的搭建,这里我们将LVS与Heartbeat结合起来,高可用加负载均衡,并添加共享存储DRBD以及Mysql数据库。
问题的引入
在之前添加LVS的健康检查时,因为其本身并没有服务健康检查,即使一台real server服务器出现故障,LVS虚拟服务器依旧会将客户端的请求数据包发送至这台服务器,这显然是不合理的,所以在使用LVS时,一般会使用ldirectord软件对LVS下的real server服务器进行健康检查,如果一台服务器出现故障,会将这台服务器从LVS中去除,当服务恢复时,再重新加入到LVS中。
这虽然可以解决LVS的健康检查问题,使得可以监控real server服务器,但是并不能改变LVS是单点的事实,如果LVS虚拟服务器出现了故障,那么就会导致整个LVS体系瘫痪,此时就需要用到高可用集群套件来使得LVS有主备功能,实现高可用。当一台LVS虚拟服务器出现故障,会自动切换到另一台LVS虚拟服务器。
这里我们的是LVS和高可用集群套件heartbeat的结合,形成一个LVS-heartbeat体系,来实现LVS的高可用,并且会再结合DRBD,MySQL数据库实现主备的共享存储。
这是简单制作的整体拓扑图:
先有一个整体的思想
lvs + heartbeat
基础环境:
- 使用的环境是redhat6.5的linux操作系统。
- 有一台物理主机和四台虚拟主机,server1和server2作为LVS的虚拟服务器,在其上加入heartbeat高可用套件,server3和server4作为real
server服务器,提供Apache服务。 - LVS采用DR模式。
- 要求selinux,iptables关闭
*由于LVS+健康监测之前已经搭建过,而ldriecrord这个服务本身就是heartbeat内部的服务,所以只需要在LVS完整搭建的基础上再直接按照前面heartbeat所讲解的方法搭建heartbeat就可以直接实现LVS+heartbeat,并且测试也是之前的方法。这里就不再特别说明。
下面直接开始添加后面的服务。
添加DRBD
概述:
DRBD(Distributed Replicated Block Device)
DRBD 号称是“网络RAID”,开源软件,由LINBIT 公司开发。DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。
它由内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID-1的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在文件系统中。本地节点与远程节点的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。
drdb复制的是磁盘的存储数据块
为了能够管理和配置 DRBD 的资源,DRBD 配备了一些管理工具与内核模块进行通信:
drbdadm:高层的 DRBD 程序管理套件工具。它从配置文件/etc/drbd.conf 中获取所有配置参数。drbdadm 为drbdsetup 和 drbdeta 两个命令充当程序的前端应用,执行 drbdadm 实际是执行的 drbdsetup 和drbdeta 两个命令。
drbdsetup:drbdsetup 可以让用户配置已经加载在内核中运行的 DRBD 模块,它是底层的 DRBD程序管理套件工具。使用该命令时,所有的配置参数都需要直接在命令行中定义,
虽然命令和灵活,但是大大的降低了命令的简单易用性,因此很多的用户很少使用。- drbdmeta:drbdmeta 允许用户创建、转储、还原和修改 drbd 的原数据结构。
添加DRBD
一、基本环境配置
1、安装软件(主备服务器server1)
软件下载地址 : http://oss.linbit.com/drbd
yum install gcc flex rpm-build kernel-devel -y //解决软件依赖性'
"因为此处用的软件包是源码,为了便于后期的维护,把它制作成RPM包,所以要用到rpmbuild命令具体的参数使用可以查看,rpmbuild --help"
yum install -y rpm-build ##rpmbuild命令需要安装的是rpm-build软件
rpmbuild ~ ##在家目录生成 rpmbuild 编译所需路径
cp drbd-8.4.0.tar.gz rpmbuild/SOURCES/ ##需要把待制作的软件包拷贝到root/rpmbuild/SOURCES/目录下
tar zxf drbd-8.4.0.tar.gz
cd drbd-8.4.0
./configure --enable-spec --with-km
开始制作RPM包
rpmbuild -bb drbd.spec ##编译生成 drbd rpm 包
rpmbuild -bb drbd-km.spec ##编译 drbd 内核模块
##如果没有关于内核模块的这个包,那么服务drbd将无法启动
##rpm包制作成功后,自动会添加/lib/modules/2.6.32-431.el6.x86_64/updates/drbd.ko模块
## 所有制作好的rpm包都在/root/rpmbuild/RPMS/x86_64/这个目录下,一共8个,一个都不能少
cd ~/rpmbuild/RPMS/x86_64
ls查看8个包:
drbd-8.4.4-4.el6.x86_64.rpm
drbd-bash-completion-8.4.4-4.el6.x86_64.rpm
drbd-heartbeat-8.4.4-4.el6.x86_64.rpm
drbd-km-2.6.32_431.el6.x86_64-8.4.4-4.el6.x86_64.rpm
drbd-pacemaker-8.4.4-4.el6.x86_64.rpm
drbd-udev-8.4.4-4.el6.x86_64.rpm
drbd-utils-8.4.4-4.el6.x86_64.rpm
drbd-xen-8.4.4-4.el6.x86_64.rpm
rpm -ivh * ##安装所有的包
拷贝生成的 rpm 包到另一主机(server2),并安装软件包:
scp ~/rpmbuild/RPMS/x86_64/* 172.25.77.2:/root
ssh root @172.25.77.2 'rpm -ivh /root/drbd-*.rpm'
2、添加磁盘分区
在server1和server2端,分别添加一块4G大小的虚拟磁盘
- fdisk -l 此时应该能看到/dev/vdb被添加出来了
//这里每台主机不一定相同,即不一定是/dev/vdb
3、修改配置文件
DRBD 的所有的控制都是在配置文件/etc/drbd.conf 中。配置文件包含如下内容:
include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/*.res";
- 通常情况下, /etc/drbd.d/global_common.conf 包含 global 和 common 的 DRBD配置部分,而.res文件都包含一个资源的部分。
在/usr/share/doc/drbd-utils-8.4.4下有配置模板
cd /usr/share/doc/drbd-utils-8.4.4
ls
ChangeLog COPYING drbd.conf.example README
进入/etc/drbd.d,编辑一个以.res结尾的文件,文件名可以随意取
vim /etc/drbd.d/drdb.res
resource demo { #mysqldata,是指定的资源的名字
meta-disk internal; # internal表示将metadata存放到drbd挂在的磁盘分区的最后的位置上
device /dev/drbd1;
syncer {
verify-alg sha1;
}
on server1 { #每个主机的说明以"on"开头,后面必须是主机名
disk /dev/vdb; #此处的disk必须是添加磁盘时 fdisk -l 显示的
address 172.25.32.1:7789; # 设置DRBD的监听端口,用于与另一台主机通信
}
on server2 {
disk /dev/vdb;
address 172.25.32.2:7789;
}
}
将编辑好的配置文件拷贝到另一个节点(server2)
scp drbd.res 172.25.32.2:/etc/drbd.d ##两边的配置文件一模一样
需要注意的一点:
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的
内部metadata:内部metadata存放在同一块硬盘或分区的最后的位置上- 优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
- 缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。
外部metadata:外部的metadata存放在和数据磁盘分开的独立的块设备上
- 优点:对于一些写操作可以对一些潜在的行为提供一些改进
- 缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要人工干预操作来进行现有node新硬盘的同步了
二、服务配置
1、开启drbd
drbdadm create-md demo
/etc/init.d/drbd start
//这里最下面的 ” …… “表示它在等待另一个节点,即在server2上也要开启
//这时两端就都开启了
初始化成功,并启动服务都ok,在/dev/下会生成 /dev/drbd1这个设备名。后面的存储,使用的也是 /dev/drbd1
ll /dev/drbd1
brw-rw---- 1 root disk 147, 1 May 23 15:14 /dev/drbd1
2、 查看分区信息
//在两台服务器上都是Secondary/Secondary
tips :
/proc/drbd 是一个虚拟的文件,用于显示当前配置的所有 drbd 资源的实时状态。简单介绍下/proc/drbd文件中各字段的含义:
第一行显示的为当前系统使用的drbd的版本,第二行包含一些特定的编译信息。 CS(connnection state):网络连接状态
使用命令 drbdadm cstate 查看资源的连接状态。常见的状态有:
- Connected 连接:Drbd 已经建立连接,数据镜像现在可用,节点处于正常状态。
- Disconnecting 断开:断开只是临时状态,下一个状态将是 StandAlone 独立的。
- Unconnected 悬 空 : 是 尝 试 连 接 前 的 临 时 状 态 , 可 能 的 下 一 个 状 态 为
WFconnection 和WFReportParams。 - Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为 Unconected 悬空。
- RO(role 角色):节点的角色
本地节点一般显示在前,对等节点资源显示在后。资源的角色一般为如下之一:
- Primary 主:资源目前为主,并且可能正在被读取或者写入。若不是双主模式被激活,这种角色只可能出现在两节点中的一个上。
- Secondary次:资源目前为次。正常接收对等节点的更新(除非运行在断开模式下才不是),但是它既不能被读取也不能被写入。这种角色只能是两节点中的一个。
- Unknown 未知:资源角色目前未知。本地资源不会出现这种状态,只有对等节点在断开模式下才会出现在这种情况。 DS(disk
stats): 磁盘状态
本地和对等节点的磁盘状态都有可能是以下状态之一:
- Consistent:一个没有连接的节点数据一致。当建立连接时,它决定数据是 UpToDate 或者是Outdated。
- UpToDate:一致的最新的数据状态,这个状态是正常的状态。
- Failed 失败:本地块设备报告 I/O 错误的下一个状态。其下一个状态为 Diskless 无盘。
- Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态。
- Outdated:数据资源是一致的,但是已经过时。
- DUnknown:当对等节点网络连接不可用时出现这种状态。
3、数据同步
将 demo 设置为 primary 节点,并同步数据:(在 demo 主机执行以下命令)
drbdsetup /dev/drbd1 primary –force
//一旦开始,两边都会开始同步,即在server2上查看也是在读进度条的。
- 完成后 ,在server1上可以看到
//这里是Primary在前,即为主节点 - server2:
//副节点
两个节点上的块设备都完全同步之后,使用诸如ext4的文件系统格式化主节点上的 DRBD 设备
mkfs.ext4 /dev/drbd1
- 注 : 只用格式化一次,另一端自动就已经格式化了
三、测试
server1:
挂载文件系统,存放数据:
卸载文件系统,将 demo 设置为 secondary 节点:
drbdadm secondary demo ##设置节点等级
server2:
将 remote 设置为 primary 节点,挂载文件系统,查看数据是否同步:
//可以看到刚刚创建的文件直接就存在了
注意:
两台主机上的/dev/drbd1 不能同时挂载,只有状态为 primary 时,才能被挂载使用,而此时另一方的状态为 secondary。
即:主备只能主操作,也只能一点挂载,格式化也值在主一次就行,另一个用要转换,转换时要解除占用
添加MySQL数据库
正常的生产环境中,一定是用数据库在操作的,所以,我们再向刚刚的服务中再添加数据库,这里使用的是MySQL数据库。
操作环境就是接着上面的继续
1、安装数据库(两端同时做)
yum install mysql-server -y
启动mysql会生成 /var/lib/mysql/mysql.sock 停掉就没了
2、将文件系统重新挂载在/var/lib/mysql下,这里是数据库的文件存储目录
*需要修改这个目录的所属用户和所属组为mysql,mysql,不然root用户是无法共享的
刚刚因为实验停在了server2上,所以我们现在用server2操作,实际效果是完全一样。
完成后将/dev/lib/mysql文件夹中的所有文件删除,不然影响测试效果
重新设置自动挂载(DRBD+MySQL)
在server1重新编辑Heartbeat服务的/etc/ha.d/haresources文件
注意:
这里的服务后面的顺序是开启heartbeat时自动启动服务的顺序,所以应该是启动网络,然后drbddisk,下来文件系统的挂载,然后在开启MySQL数据库。
其中的drbddisk, Filesystem调用的是/etc/ha.d/resource.d/下的相应脚本文件
发送到server2端
测试
将两主机的所有服务关闭,重新启动服务
在启动heartbeat之前,必须保证/dev/drbd1没有在任一个节点上挂载。而且,172.25.32.1(server1)为主设备,172.25.32.2(server2)为从设备,按配置文件的修改
- 在两个设备上,分别启动heartbeat服务,当主设备启动正常后,再启动从设备
开启服务之后,可以发现已经自动挂载,并且VIP也设置好了,数据库也已经开启。
在server1端:
进入mysql数据库添加信息:
- 这时,比拟一个特殊状况,直接将server1的heartbeat关闭
server2端:
此时因为配置了高可用,所以server2会自动接管server1的工作,然后直接在server2进入数据库查看:
//数据是存在的,配置成功!!
这就实现了LVS + Heartbeat + DRBD + MySQL这一整体架构。