基于DRBDMYSQL高可用集群

如果企业要建两个或者3个节点的高可用集群,这时如果用iscsi来存储的话,成本会非常的高,如果就可以DRBD这种方案来进行解决。

我们可以找两台主机,在自己的主机上各自分出一块大小一样的分区,那么他们到底两台主机上的数据怎样同时保持同步呢?答案是在他们的内核层次上,通过某种机制来同步两台主机之间的数据同步,那么到底是什么机制呢?这两台主机的地位是否平等?在这种模型中,其中一台主机是出于活动状态的,而另一台主机是出于非活动状态的。我们再说一下这种模式下的工作机制到底是怎样的?我们假如有一个应用程序要存储数据,它首先要跟我们的虚拟文件系统的借口打交道,然后通过文件系统进入我们的内核缓冲区,因为我们的存储或者读的请求往往不止一个,这时我们内核往往是把相邻读写请求在内核中通过一个叫做disk schedule的东东,把他们来个归并,为什么这么做呢,因为这样在存数据时就可以节约了。这时我们通常的流程。但是我们的DRBD来了,当然就要在这里作文章了。

我们的DRBD就出现在缓冲区和disk schedule之间。这时我们就明白了,DRBD通过TCP/IP协议栈来和另一台主机上的DRBD进行通信,从而来完成两台主机之间的数据同步。当然它只对DRBD设备的数据进行存储,如果是其他非DRBD存储,他则不进行干预。这里有一个问题,如果我们要存储的文件数据非常的大,我们是在活动的这台主机上存完了在进行给非活动的那台主机进行传输呢还是同时应用程序存储的数据同时传给两台主机呢,那如果同时进行传输的话,两台主机之间的网络带宽不够大的话,那势必导致应用程序等的太久。实际上DRBD的数据传输模式分为三种。一是要一直送到对方的磁盘上才算成功;二是只要第一台上的TCP缓冲区时就可以给应用程序返回成功的信号;三是当数据到了非活动的主机上的TCP接收的缓冲区时,即可比赛时成功。各种的效率和可靠性一目了然。

这里要注意,我们刚才是在内核进行的,如果我们要对内核进行影响,那就要在用户空间有一个工具叫做DRBDADM来对内核进行操作。我们的两台主机一个叫PRIMARY,一个叫SECONDARY。我们只能在PRIMARY的那台主机上进行DRBD设备进行文件系统的挂在和格式化。而SECONDARY节点上千万不敢进项挂和格式化。那我们能不能两台主机都可以进行同样的操作呢?当然可以,但是还要添加另外的机制来进行实现,那就是使用集群文件系统OCFS或者GFS分布式文件系统。这样以来我们就要考虑更多的因素,我们就要把他们定义为主从的资源。Filesystem一定要和主节点放在一起。

接下来我们要考虑的是:当我们在两台数据之间传传输数据时要不要进行认证,别人给我们篡改了怎么办,要不要做数据的完整性校验,如果我们的主机节点联系不到另一台主机怎么办?假如我们的网络带宽是千兆以太网,我们是全部让DRBD使用呢还是给他事先规定一定的带宽供其使用,这些都是在设计DRBD高可用集群的时候应该考虑的题中之意。而且

按照惯例如果是共同的属性,可以把他们定义在全局的位置。在我们的linux中往往有一些共同的想问题的方法,我应该注意学习。当然既然有用户空间当然应该有用于用户空间的工具,最常用的可能要数DRBDADM这个命令了。这里还有一个概念DRBD为了维持自身的运作也需要有自己的原数据,用DRBDmeta这个命令行工具来进行管理。下边是重要的概念关于DRBD的。DRBD把镜像的设备都称为资源。资源一般有这几部分组成:一是资源名称,这个很好理解,总得起个名字吧。二是DRBD设备必须在/dev目录下有一个具体的设备与之对用,主设备好为147。三是实际的磁盘必须有一个具体的存储空间与之对应。

                                 安装DRBD

DRBD需要的软件有,我们要注意你所下载的rpm包一定要和你所对应的平台相对应,不然的话我们的服务就不能起来。时间同步;ssh双机互信;主机名称和我们的uname解析的主机名称保持一致。具体的归划就是:我们用两台主机在每一台主机上个划分出一个磁盘分区,当然也可以使用整块的硬盘来进行。我们给他起个名字叫mydrbd资源。

172.16.16.11主机上

Rpm - ivh drbd83-8.3.13-2.el5.centos.i386.rpm 

Rpm -ivh kmod -drbd83-8.3.13.el5.centos.i686.rpm 

172.16.16.12这台主机上也要进行同样两个包的安装。

接下来在DRBD的全局的配置文件

Cd /etc/drbd.d

Vim global_common.conf

 这里边主要定义的是全局的参数,如协议,加密算法,速率,同步之类的问题,因为两台主机要通过网络进行通信嘛,当然应该事先商量好怎样来进行通信。

接下来顺利成章的应该进行我们的DRBD资源的通信了。

Vim mydrbd.res (这里的名字是我们自己起的)

资源用关键字resource开始,后边是资源的名字后边是两个花括号括起来的内容了。其中on后边的主机名字一定要和你uname的名字相一致。而且两台主机都要能互相通过主机名进行访问。 

      Resource mydrbd {

              On node1.magedu.com {

              Device /dev/drbd0; drbd对应的相应的设备)

              Disk /dev/sda5; (具体对应的物理存储空间,在这里一定要注意磁盘的大小一定要一样,名称可以不一样)

              Address 172.16.16.11:7789; (默认的端口号是7789

              Meta-disk internal; (通过内部磁盘) 

}

              On node2.magedu.com {

              Device /dev/drbd0;

              Address 172.16.16.12:7789;

              Meta-disk internal;

}

以上两个文件复制到另外一个节点上。

这时就可以启动我们的drbd了,这里要注意启动之前先初始化

在两台上执行同样的命令Drbdadm create-md mydrbd

然后就是在两台主机上执行同样的启动命令

Service drbd start (注意是同时)

这时我们应该可以使用drbd-overview来查看一下我们的drbd的状态,在任一节点上扣可以进行。会发现两台都是处于secondary状态。我们需要把一个节点提升为主节点。

在你想让的那台主机上执行drbdsetup /dev/drbd0 primary -o ,这时我们再查看状态时,会发现其中的一台主机成为主机了。这时从主机会像主主机同步数据。

接下来的步骤,我们只需要在主节点上格式化磁盘,并创建挂在点,并进行挂载即可。

Mke2fs -j -L DRBD /dev/drbd0

Mkdir -pv /www/htdocs

Mount /dev/drbd0  /www/htdocs

Cd /www/htdocs

Cp /etd/inittab /www/htdocs

下来我们想把主备节点想换一下,即把现在的主节点换为被节点,而把现在是备用的节点换为主用的节点,具体操作步骤如下:

卸载主节点上的文件系统

Umount  /www/htdocs

然后把当前主节点切换为备用的节点

Drbdadm secondary mydrbd(注意这里是以资源级别来进行的)

然后把另一台主机切换为主的

Drbdadm primary mydrbd

在这台主机上先创建目录

Mkdir /www/htdocs

然后挂载

Mount /dev/drbd0  /www/htdocs

Cd /www/htdocs

我们会发现我们刚才在那台主机上拷贝的/etc/inittab文件,我们在这台主机上也能看到,这就说明两台主机实现了高可用,一台主机出故障了,就由另一台主机进行来进行业务的处理。

这就使我们DRBD 

关键如何让我们的DRBD成为我们corosyne集群里的一个高可用资源,我们刚才需要手动来实现切换,在实际的生产环境中,一个集群节点出现了故障,将自动侦测到并且实现自动的切换。

我们在的任务是我们要在两台主机上运行mysql服务和DRBD那么在corosync上把它们定义为高可用的资源,在其中主机出现故障的情况下自动实现故障的转移。

我们先在其中的一台主机上创建MYSQL的挂载点。

Mkdir /data/mydata

然后安装mysql软件,我们把它放在/usr/local下,我们对他作一下简单的配置。

我们先把DRBD挂载在主drbd主机上

Mount /dev/drbd0  /data/mydata

并且把它们的属主属组改为MYSQl,因为我们使用root的用户身份进行操作以上步骤的。

当然我们的两台主机上都应该有一样idmysql用户。

Cd /usr/local

Ln -sv mysql-5.5.28-linux2.6-i686mysql

Cd mysql

Chown -R  root:mysql  .

执行脚本scripts/mysql_install_db  --user=mysql --datadir=/data/mydata

提供服务脚本,让他能支持常规的服务启动方式,即可以支持service start等的方式启动mysql服务。

Cp support-files/mysql.server  /etc/rc.d/init.d/mysql

这次试验我们不使用共享配置文件,而是两个节点保持自己本地的配置文件。

 Cp support-files/mysql.server  /etc/rc.d/init.d/init.d/mysqld

Cp support-files/my-large.cnf /etc/my.cnf

Vim /etc/my.cnf 里边只是增加一个目录而已。

Datadir=/data/mydata

启动mydql测试下,service myqld start

进入mysql数据库

/usr/local/mysql/bin/mysql

然后在里边创建一个数据库

这时一定要把Mysql服务停止

Service mysql stop

然后卸载掉数据目录,让mysql在另一个节点上也能挂载,并且mysql服务也能启动起来。

把当前节点设为被动模式

Drbdadm secondary mydrbd

下边的是在另外一个节点上进行的操作

首先当然是先把这个节点提升为主节点

Drbd primary mydrbd

创建数据目录

Mkdir -pv /data/mydata

Mount /dev/drbd0 /data/mydata

再检查一下是否有mysql

这个用户注意这里的id号必须要和刚才那个节点上的id号相同。

用 id  mysql这个命令

这时就不用初始化这个数据库了,但是要把刚才节点上的配置文件拷贝过来

Scp /etc/my.cnf  node2: /etc (这里的node2是我们第二个节点的主机名称)

同样的要创建链接

Cd /usr/local

Ln -sv mysql-5.5.28-linux2.6-i686 mysql

Chown -R root.mysql .

给他一个常规的启动服务的脚本

Scp /etc/rc.d/init.d/mysqld node2:/etc/init.d/

这时候就可以在node2上启动mysql服务了

Service mysqld start

进入到mysql

执行命令 /usr/local/mysql/bin/mysql

Show databases

这时在这台主机上就可以看到刚才在那台主机上创建的数据库了。

推出服务,然后停止服务

Service mysqld stop

一定不能让两边的mysql开机自动启动,两台主机都要执行相同的指令

Chkconfig mysqld off

还要停止drbd,当然首先应该卸载掉

Umont  /data/mydata

Service drbd stop 

并且要切换成为备用模式,这时大家知道现在两台主机都是sencondary模式了。

并且两台主机都不能让DRBD开机自动启动,因此需同时都执行指令

Chkconfig drbd off

接下来就是要配置在corosync下的高可用集群了。

接下来就是要安装我们的高可用集群所需的软件了。这些软件在我们的/pub/Sources/corosync目录下

Cd /pub/Sources/corosync

Mget *.rpm

这里有几个不用

Rm -f openais* ldirector-1.0.1-1-l.el5.i386.rpm 

其余的咚咚都要装上

Yum install -y --nogpgcheck localinstall *.rpm

同样的操作在另外一个节点上执行相同的操作步骤。

在节点以上的操作

Cd /etd/corosyne

复制配置文件

Cp corosync.conf.example  corosync.conf

然后编辑配置文件

最关键是在后边的空行部分添加如xia内容

Service {

       Ver: 1

        Name:   pacemaker 

Aisexec  {

         User:   root

         Group::  root

}

然后创建认证密钥,然后保存权限复制到另一台主机上去。

Corosyne-keygen

Scp -p authkey xorosync.conf node2:/etc/corosync/

启动corosync服务

Service corosync start

在另外一台主机上也要启动该服务(当然我们要实现创建集群的日志文件目录,该目录曾在配置文件中配置。

Mkdir /var/log/cluster

Service corosync start

另外一台主机上也要启动该服务。

我们要定义主从资源首先要定义助资源,然后把它定义为克隆类的资源。一般来讲克隆类的资源一定是某个主资源的克隆资源。主资源不启动,而是克隆类的资源在运行(主资源只能在一个节点上进行运行。而克隆类的资源的意思就是某些资源要同时在几个节点之间同时同时运行,即使是名称叫做master-slave类的资源也是某写主资源的克隆,只不过一个叫做master而已。

下来就是配置了,先配置几个全局的属性

Crm configure

Property stonith-enable=false(禁用此设备)

Property no-quorum-policy=ignore (关掉选举投票功能)

Verify(验证一下)

Commit(提交该配置)

要想定义克隆类的资源,我们首先要定义主资源

我们先定义drbd资源,当然drbd给我们提供的资源代理很关键,有多个drbd的资源代理,我们选用drbd给我们提供的资源代理。

Primitive MyDRBD ocf:linbit:drbd params drbd_resource=mydrbd op start timeout op stop ttimeout=100(先定义下主资源

我们的目的是要创建主从

Master ms_MyDRBD MyDRBD meta master-max=1 master-node-max1 clone-max=2 clone-node -max=1 notify=true(表示的是给MyDRBD的作的主从

Verigy

Commit

注意我们以上的操作只要在一台主机上进行操作即可。

我们可以切换一下

Crm node standby

Crm node online

这时节点一就成为备用节点了。

还没有完

我们知道我们要让drbd自动挂载在/data/mydata下,而且fileesystem要和主节点在一起,因此需要我们有一定规则。下边是具体的操作

Primitive MyFS ocf:heartbeat:Filesystem params device=dev/drbd0 directory=:data/mydata fstype=ext3 op start timeout=60 op stop timeout=60(注意这时千万不敢提交,因为还要定义和drbd的主节点在一起。

Colocation MyFS_on_ms_MyDRBD_master inf:MyFS ms_MyDRBD:,Master

Order MyFS_after_ms_MyDRBD_master mandatory: ms_MyDRBD:promoto MyFS:start(这一步的意思是我们要先转换角色后在进行挂载,而不是相反,这个很重要。

Verify

Commit

还没完,我们要让MYSQL也启动起来。

Primitive Mysql lsb:mysqld(定义主资源) 

Colocation MySQL_with_MyFS inf:MySQL MyFS(定义在一起) 

Order MySQL_after_MyFS mandatory:MyFS MySQL(定义启动的先后次序)

Verify

Commit

还有呢,

在节点以上启动mysql 

/usr/local/bin/mysql(他现在是处于primary状态)

创建一个数据库

然后把节点一置为standby状态

在节点二上执行

/usr/local/mysql

我们就会发现在节点二上可以看到我们刚刚在节点一上创建的数据库,而我们根本就没有再节点二上创建此数据库,这就使关于mysql的高可用集群的创建。

Ip的定义

Primitive MyIP ocf:heartbeat:IPaddr2 ip=172.16.100.7

Colocation MyIP_with_MyDRB_master inf: MyIP  ms_MyDRBD:Master

Verify 

Commit