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. 参考文档
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-get install 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 drbdadm create-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 with databases 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: Shutdown complete
140602 22:36:39 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
你已经修改了my.cnf中的datadir的值
你已经chown和chmod了数次新数据目录或者其父路径的属主和权限
你无数次地试图service mysql 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会自动帮我们做好这些事,它会监听服务,一旦服务停止,则从服务会接管服务)