你的位置:首页 > 数据库

[数据库]mysql高可用之DRBD + HEARTBEAT + MYSQL


1. 架构

Mysql:

master<=slave

10.24.6.4:3306<=10.24.6.6:3306

VIP:

10.24.6.20

必须使得VIP和mysql处于同一网段,否则无法ping通过

 

2. 参考文档

http://wenku.baidu.com/link?url=QF1pG6DGMtl2uV1yt998xCduKsiEO7Bwn4CW79g0nx6EUw4iNgcBUz_jAA1W0FigPhjpiIs8FPLc9TxvFq_Yx7G-VvWeikFLzZchifM_tSS


3. DRBD 共享内存设置

共享硬盘/dev/sdb1

3.1. 创建一个新硬盘/dev/sdb1但是不要挂载任何目录

 

 

3.2. 修改hosts文件和主机名

在10.24.6.4上

echo "10.24.6.4 drbd01" >> /etc/hosts

echo "drbd01" > /etc/hostname

在10.24.6.6上

echo "10.24.6.6 drbd02" >> /etc/hosts

echo "drbd02" > /etc/hostname

3.3.安装drbd

在10.24.6.4/10.24.6.6上

sudo apt-getinstall drbd8-utils

 

3.4.配置drbd.conf(/etc/drbd.conf)的配置文件(主从都要做)

vim/etc/drbd.conf默认信息为:

       include"/etc/drbd.d/global_common.conf";

   include"/etc/drbd.d/*.res";  

这样你需要去配置global_common.conf以及新建一个以res结尾的资源文件,这里为r0.res

3.5. 配置global_common.conf(主从都要做)

vim /etc/drbd.d/global_common.conf 

 

global {  

usage-count no;   //帮LINBIT公司统计drbd使用量 } 

common {  

protocol C;//C为最安全同时也是性能最好的一种确认写操作完成的方法 

syncer {   

rate 100M;     //同步的速率 

}

 }        

3.6.配置ro.res(主从都要做)

sudo vim/etc/drbd.d/r0.res

resource r0{//r0资源名称,以后很多地方会用到

         on drbd01 {

                   device       /dev/drbd0;               //逻辑设备的路径

                   disk  /dev/sdb1;                 //物理设备

                   address    10.24.6.4:7788;       //主节点

                   meta-disk internal;

         }

         on drbd02 {

                   device       /dev/drbd0;

                   disk  /dev/sdb1;

                   address    10.24.6.6:7788;       //从节点

                   meta-disk internal;

         }

}

不可以有注释

3.7. 初始化drbd的metadata(在主节点上操作)

10.24.6.4:

Sudo drbdadmcreate-md r0

 

3.8. 错误处理

   

执行如下命令: dd if=/dev/zero bs=1M count=1 of=/dev/sdb1;sync 

再次执行drbdadm create-md r0看到success则表示成功。

   

3.9. 启动drbd服务(主从都执行)

/etc/init.d/drbd start

 

cat/proc/drbd 

ro:Secondary/Secondary表示还没有建立主盘

ds:Inconsistent/Inconsistent表示两节点(master/slave)的逻辑设备(即/dev/drbd0)中的数据未同步

本地和对等节点的硬盘有可能为下列状态之一:
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,但是已经过时
DUnknown:当对等节点网络连接不可用时出现这种状态
Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态

3.10. 端口检测

10.24.6.4:

10.24.6.6:

 

3.11. 初始化网络硬盘(主节点执行)

drbdadm -- --overwrite-data-of-peer primary r0

 

查看同步进度

cat /proc/drbd 

ds:UpToDate/Inconsistent表示两节点正在同步数据

3.12. 启用和禁用资源(不必须)

######手动启用资源 
drbdadm up <resource> 
######手动禁用资源 
drbdadm down <resource> 
注释: 
resource:为资源名称;当然也可以使用all表示[停用|启用]所有资源

3.13. 升级和降级资源(不必须)

######升级资源 
drbdadm primary <resource> 
######降级资源 
drbdadm secondary <resource> 
注释:在单主模式下的DRBD,两个节点同时处于连接状态,任何一个节点都可以在特定的时间内变成主;但两个节点中只能一为主,如果已经有一个主,需先降级才可能升级;在双主模式下没有这个限制

3.14. 如何查看资源连接状态

[root@nod1 ~]# drbdadm cstate r0  #r0为资源名称 
Connected

   

状态意义:

资源的连接状态;一个资源可能有以下连接状态中的一种
StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况
Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams
Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空
BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空
NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
WFConnection:等待和对等节点建立网络连接
WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包
Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态
StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS
StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行
PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
VerifyS:以本地节点为验证源的线上设备验证正在执行
VerifyT:以本地节点为验证目标的线上设备验证正在执行

3.15. 资源同步完成

10.24.6.4:

10.24.6.6:

3.16. 数据同步测试

现在将磁盘格式化后并可以向其中写数据,这些数据会同步到从节点中

 

mkfs.ext4 /dev/drbd0 

mount /dev/drbd0 /mnt/data 

(注意:只有主盘节点才能挂载磁盘) 

cd /mnt/data 

mkdir testfile                 //新建名为testfile的测试文件 

umount /dev/drbd0           //卸载磁盘 

drbdadm secondary r0         //主降为次,即刚开始主节点的磁盘是主盘,现在降为从盘,往主盘里写数据,从从盘里读数据。 在drbd02上(从节点) 

drbdadm primary r0            //次升为主,即将从节点的磁盘升为主盘资格这样才能从从节点的机器读取磁盘的数据。 

mount /dev/drbd0 /mnt/data    //升主后才有挂在权限 cd /mnt/data ls –l 

将会看到我们在主节点中建立的名为testfile的文件夹。 (啰嗦一下: 

要想完成主从Mysql数据的备份,到这里大家应该有点启发了,我么只需要将Mysql的数据保存到/mnt/data(我们将/dev/drbd0挂在的路径)中即可这样主Mysql往这个区域写数据,drbd会帮我们自动将这些数据同步到从节点中,这样装在从节点机

器上的Mysql也从这里读取数据。这样便实现了两份数据的自动备份。 )

 

 

3.17. 问题

主降为次失败:

 

因为降级的本身的目录正在使用

4. MYSQL 设置

4.1. 更改Mysql数据库的存储位置为共享目录(主从都执行)

默认情况下数据库的存储位置是/var/lib/mysql(可以在/etc/mysql/my.cnf中的datadir位置找到),现在要将其改为存在/share_mysql下。

 

将/var/lib/mysql下的数据复制到/share_mysql下

 cp -r /var/lib/mysql   /share_mysql 

vim /etc/mysql/my.cnf 

找到datadir这一行将其值改为/share_mysql/mysq

4.2. 赋予数据库用户访问权限

 

4.3. 系统级别修改权限

140602 22:36:39 mysqld_safe Starting mysqld daemon withdatabases from /home/mysql

140602 22:36:39 [Warning] Can't create test file/home/mysql/localhost.lower-test

140602 22:36:39 [Warning] Can't create test file/home/mysql/localhost.lower-test

/usr/libexec/mysqld: Can't change dir to '/home/mysql/'(Errcode: 13)

140602 22:36:39 [ERROR] Aborting

 

140602 22:36:39 [Note] /usr/libexec/mysqld: Shutdowncomplete

 

140602 22:36:39 mysqld_safe mysqld from pid file/var/run/mysqld/mysqld.pid ended

 

你已经修改了my.cnf中的datadir的值
你已经chown和chmod了数次新数据目录或者其父路径的属主和权限
你无数次地试图servicemysql start,或者/etc/init.d/mysql start,以及mysql_install_db!

恭喜你看见这篇文章,我在被系统坑了几个小时之后,找到了解决的方法。

这个原因有二,其中任意的一个原因都会造成你被系统告知这个warning。如果你不是一个专业的linux系统安全工程师,或者你只是个PHP程序员,并没有对系统安全有深入的研究,你就不会太容易找到它的答案。

第一,selinux,记得当年念书时,字符界面安装redhat(很古老的操作系统么。。。)的时候,有这么一个选项,通常大家都听取前辈的建议,改变默认值以不安装它。但如果你恰好要操作的这台机器开着selinux,它确实能够使你的mysql无法在新目标位置进行mysql_install_db的操作,并爆出标题所示的警告。一个简单的解决办法是使用命令暂时关闭selinux,以便让你的操作可以继续下去
setenforce 0
但最好使用一个永久方法,以便在重启后继续不要这货。
修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启或等待下次重启。

第二,apparmor,这个坑爹货和selinux一样的坑爹,它也对mysql所能使用的目录权限做了限制
在/etc/apparmor.d/usr.sbin.mysqld 这个文件中,有这两行,规定了mysql使用的数据文件路径权限

/var/lib/mysql/ r,
/var/lib/mysql/** rwk,

你一定看到了,/var/lib/mysql/就是之前mysql安装的数据文件默认路径,apparmor控制这里mysqld可以使用的目录的权限
我想把数据文件移动到/data/mysql下,那么为了使mysqld可以使用/data/mysql这个目录,照上面那两条,增加下面这两条就可以了

/data/mysql/ r,
/data/mysql/** rwk,

重启apparmor,/etc/init.d/apparmor restart
之后,就可以顺利地干你想干的事儿了!

4.4. 数据库同步测试

在10.24.6.4上启动mysql 建立一个名为share_mysql的数据库。

第一步保证10.24.6.4为primary,10.24.6.6为secondary

 

主从切换挂载

service mysql stop        # 关闭mysql服务

drbdadm secondary r0            #将10.24.6.4降为备用

umount /dev/drbd0                  #卸载虚拟硬盘

在drbd02上 

drbdadm primary r0     #将10.24.6.6升为主用

mount /dev/drbd0      # 挂载虚拟硬盘

service mysql start       # 启动数据库

进去mysql中查看是否已有从drbd01同步过来的名为test的数据库。

OK至此测试就完成了。 

 

(啰嗦下:聪明的读者可能会问,每次都这样操作效率也太低了吧,对的,接下来heartbeat会自动帮我们做好这些事,它会监听服务,一旦服务停止,则从服务会接管服务)

 

5.HEARTBEAT设置

让虚拟硬盘的主从切换更智能

5.1. 安装heartbeat

apt-get install heartbeat

(ps: Heartbeat的主要配置文件有ha.cf、haresources和authkeys。在Heartbeat安装后,默认并没有这3个文件,可以从官方网站下载得到,也可以直接从解压的源码目录中找到)

5.2. 配置文件

5.3. 配置ha.cf.

sudo cp /usr/share/doc/heartbeat/ha.cf.gz  / etc/ha.d

sudo gzip -d ha.cf.gz

sudo vim ha.cf:

logfacility local0 #这个是设置heartbeat的日志,这里是用的系统日志

keepalive 500ms #多长时间检测一次 

deadtime 10 #连续多长时间联系不上后认为对方挂掉了(单位是妙)

warntime 5 #连续多长时间联系不上后开始警告提示 

initdead 100 #这里主要是给重启后预留的一段忽略时间段(比如:重启后启动网络等,  如果在网络还没有通,

keepalive检测肯定通不过,但这时候并不能切换)

bcast eth0 

auto_failback off #恢复正常后是否需要再自动切换回来 

node drbd01 #节点名(必须是集群中机器的主机名,通过uname -n取得)

node drbd02 #节点名(必须是集群中机器的从机名,通过uname -n取得)  

ping 10.0.65.250(默认网关,可以通过route命令得到) 

respawn root /usr/lib/heartbeat/ipfail #这里是配置ip绑定和切换的功能, ipfail就是控制ip切换的程序 

apiauth ipfail gid=root uid=root #控制ip切换的时候所使用的用户  deadping 5

5.4. 配置资源文件/etc/ha.d/haresources

sudo cp /usr/share/doc/heartbeat/haresources.gz  /etc/ha.d/

cd /etc/ha.d

sudo gzip -d haresources.gz

   

Haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以 及启动的服务等集群资源,文件每一行可以包含一个或多个资源脚本名,资源之间使用空格隔开,参数之间使用两个冒号隔开,在两个HA节点上该文件必须完全一致,此文件的一般格式为:  

node-name network  <resource-group>    node-name表示主节点的主机名,必须和ha.cf文件中指定的节点名一致。network用于设定集群的IP地址、子网掩码和网络设备标识等。需要注意的是,这里指定的IP地址就是集群对外服务的IP地址,resource-group用来指定需要Heartbeat托管的服务,也就是这些服务可以由Heartbeat来启动和关闭。如果要托管这些服务,就必须将服务写成可以通过start/stop来启动和关闭的脚步,然后放到/etc/init.d/或者/etc/ha.d/resource.d/目录下,Heartbeat会根据脚本的名称自动去/etc/init.d或者/etc /ha.d/resource.d/目录下找到相应脚步进行启动或关闭操作。

下面对配置方法进行具体说明:  

drbd01 IPaddr::192.68.100.120/24/eth0:0 drbddisk::r0 

Filesystem::/dev/drbd0::/mnt/data::ext4 mysql 

(ps:在上面的例子中,提供了对mysql资源的启动和关闭,所以需要在/etc/ha.d/resource.d这个目录下去创建一个控制该资源启动脚本,命令为: ln -s /etc/init.d/mysql /etc/ha.d/resource.d/mysql) 

其中,drbd01是HA集群的主节点,IPaddr为heartbeat自带的一个执行脚本,Heartbeat首先将执行/etc/ha.d/resource.d/IPaddr 192.68.100.120/24 start的操作,也就是虚拟出一个子网掩码为255.255.255.0,IP为192.68.100.120的地址。此IP为Heartbeat对外提供服务的网络地址,同时指定此IP使用的网络接口为eth0。接着,Heartbeat将执行共享磁盘分区的挂载操作,"Filesystem::/dev/drbd0::/mnt/data::ext4"相当于在命令行下执行mount操作,即"mount -t ext4 /dev/drbd0 /mnt/data",最后mysql服务。 注意主节点和备份节点中资源文件haresources要完全一样。 因此对于我们应该这样写 

drbd01 IPaddr::192.68.100.120/24/eth0:0 

drbddisk::r0 

Filesystem::/dev/drbd0::/mnt/data::ext4 mysql 不要写成如下这样: 

drbd01 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/data::ext4 mysql192.68.100.120 

会报heartbeat Cannot use default route w/o netmask的错误,具体原因见: http://lists.linux-ha.org/pipermail/linux-ha/2002-November/005911.html

 

drbd01  IPaddr::10.24.6.20/24/eth0:0    drbddisk::r0   Filesystem::/dev/drbd0::/share_mysql::ext4      mysql

 

 

5.5. 配置资源文件/etc/ha.d/authkeys

sudo cp/usr/share/doc/heartbeat/authkeys /etc/ha.d/

authkeys文件用于设定Heartbeat的认证方式,共有3种可用的认证方式,即 crc、 md5和sha1。3种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果Heartbeat集群运行在安全的网络上,可以使用crc方式;如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高;如果是处于网络安全和系统资源之间,可以使用md5认证方式。这里我们使用crc认证方式,设置如下:        auth 1       1 crc        #2 sha1 sha1_any_password       #3 md5 md5_any_password  

需要说明的一点是:无论auth后面指定的是什么数字,在下一行必须作为关 键字再次出现,例如指定了"auth 6",下面一定要有一行"6认证类型"。   

最后确保这个文件的权限是600(即-rw——-)。

  

5.6. 启动heartbeat

5.7. 启动主heartbeat

启动日志:

5.8. 启动从heartbeat

启动日志

 

主heartbeat日志:

5.9. 验证

5.9.1. 主heartbeat端口检测

5.9.2.  从heartbeat端口检测

5.9.3.  主heartbeat服务状态

5.9.4. 从heartbeat服务状态

 

5.9.5. 测试vip mysql服务

 

 

5.10. Mysql服务切换测试

5.10.1. 在主heaartbeat服务之上切换

5.10.2. Heartbea服务转移

5.10.3. 转移验证

主drbd变成从drbd

从drbd变成主drbd

主heartbeat机器上没有mysql服务

从heartbeat机器上开启mysql服务

 

6. 总结

  • 主mysql和从mysql只能同时存在一个服务
  • 主mysql挂的时候,heartbeat将通过drbd共享mysql的数据,然后在从heartbeat启动一个新服务
  • 主mysql和从mysql可以转移
  • 主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点并由从节点运行服务
  • 适合做双机热备
  • share disk架构