阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL高可用之DRBD + Heartbeat + MySQL

248次阅读
没有评论

共计 16029 个字符,预计需要花费 41 分钟才能阅读完成。

1. 架构

MySQL:

master<=slave

10.24.6.4:3306<=10.24.6.6:3306

VIP:

10.24.6.20

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

2. 参考文档

http://www.linuxidc.com/Linux/2012-05/60478.htm

3. DRBD 共享内存设置

共享硬盘 /dev/sdb1

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

 MySQL 高可用之 DRBD + Heartbeat + MySQL

MySQL 高可用之 DRBD + Heartbeat + MySQL

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;    // 同步的速率 

}

 }       

MySQL 高可用之 DRBD + Heartbeat + MySQL

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;

        }

}

不可以有注释

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

10.24.6.4:

Sudo drbdadm create-md r0

3.8. 错误处理

  MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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

  MySQL 高可用之 DRBD + Heartbeat + MySQL

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

/etc/init.d/drbd start

MySQL 高可用之 DRBD + Heartbeat + MySQL

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:

MySQL 高可用之 DRBD + Heartbeat + MySQL

10.24.6.6:

 MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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

 MySQL 高可用之 DRBD + Heartbeat + MySQL

查看同步进度

cat /proc/drbd 

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

  MySQL 高可用之 DRBD + Heartbeat + MySQL

状态意义:

资源的连接状态;一个资源可能有以下连接状态中的一种
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:

MySQL 高可用之 DRBD + Heartbeat + MySQL

10.24.6.6:

MySQL 高可用之 DRBD + Heartbeat + MySQL

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. 问题

主降为次失败:

MySQL 高可用之 DRBD + Heartbeat + MySQL

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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 

MySQL 高可用之 DRBD + Heartbeat + MySQL

vim /etc/mysql/my.cnf 

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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

MySQL 高可用之 DRBD + Heartbeat + MySQL

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
之后,就可以顺利地干你想干的事儿了!

MySQL 高可用之 DRBD + Heartbeat + MySQL

MySQL 高可用之 DRBD + Heartbeat + MySQL

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 会自动帮我们做好这些事,它会监听服务,一旦服务停止,则从服务会接管服务)

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-04/130097p2.htm

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

  MySQL 高可用之 DRBD + Heartbeat + MySQL

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 的错误

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

MySQL 高可用之 DRBD + Heartbeat + 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 

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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

MySQL 高可用之 DRBD + Heartbeat + MySQL


5.6. 启动 heartbeat

5.7. 启动主 heartbeat

MySQL 高可用之 DRBD + Heartbeat + MySQL

启动日志:

MySQL 高可用之 DRBD + Heartbeat + MySQLMySQL 高可用之 DRBD + Heartbeat + MySQL

5.8. 启动从 heartbeat

MySQL 高可用之 DRBD + Heartbeat + MySQL

启动日志

MySQL 高可用之 DRBD + Heartbeat + MySQL

MySQL 高可用之 DRBD + Heartbeat + MySQL

主 heartbeat 日志:

MySQL 高可用之 DRBD + Heartbeat + MySQL

5.9. 验证

5.9.1. 主 heartbeat 端口检测

MySQL 高可用之 DRBD + Heartbeat + MySQL

5.9.2.  从 heartbeat 端口检测

MySQL 高可用之 DRBD + Heartbeat + MySQL

5.9.3.  主 heartbeat 服务状态

MySQL 高可用之 DRBD + Heartbeat + MySQL

5.9.4. 从 heartbeat 服务状态

 MySQL 高可用之 DRBD + Heartbeat + MySQL

5.9.5. 测试 vip mysql 服务

MySQL 高可用之 DRBD + Heartbeat + MySQL

5.10. Mysql 服务切换测试

5.10.1. 在主 heaartbeat 服务之上切换

MySQL 高可用之 DRBD + Heartbeat + MySQL

5.10.2. Heartbea 服务转移

MySQL 高可用之 DRBD + Heartbeat + MySQL

5.10.3. 转移验证

主 drbd 变成从 drbd

MySQL 高可用之 DRBD + Heartbeat + MySQL

从 drbd 变成主 drbd

MySQL 高可用之 DRBD + Heartbeat + MySQL

主 heartbeat 机器上没有 mysql 服务

MySQL 高可用之 DRBD + Heartbeat + MySQL

从 heartbeat 机器上开启 mysql 服务

MySQL 高可用之 DRBD + Heartbeat + MySQL

6. 总结

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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-04/130097.htm

1. 架构

MySQL:

master<=slave

10.24.6.4:3306<=10.24.6.6:3306

VIP:

10.24.6.20

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

2. 参考文档

http://www.linuxidc.com/Linux/2012-05/60478.htm

3. DRBD 共享内存设置

共享硬盘 /dev/sdb1

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

 MySQL 高可用之 DRBD + Heartbeat + MySQL

MySQL 高可用之 DRBD + Heartbeat + MySQL

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;    // 同步的速率 

}

 }       

MySQL 高可用之 DRBD + Heartbeat + MySQL

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;

        }

}

不可以有注释

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

10.24.6.4:

Sudo drbdadm create-md r0

3.8. 错误处理

  MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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

  MySQL 高可用之 DRBD + Heartbeat + MySQL

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

/etc/init.d/drbd start

MySQL 高可用之 DRBD + Heartbeat + MySQL

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:

MySQL 高可用之 DRBD + Heartbeat + MySQL

10.24.6.6:

 MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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

 MySQL 高可用之 DRBD + Heartbeat + MySQL

查看同步进度

cat /proc/drbd 

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

  MySQL 高可用之 DRBD + Heartbeat + MySQL

状态意义:

资源的连接状态;一个资源可能有以下连接状态中的一种
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:

MySQL 高可用之 DRBD + Heartbeat + MySQL

10.24.6.6:

MySQL 高可用之 DRBD + Heartbeat + MySQL

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. 问题

主降为次失败:

MySQL 高可用之 DRBD + Heartbeat + MySQL

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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 

MySQL 高可用之 DRBD + Heartbeat + MySQL

vim /etc/mysql/my.cnf 

MySQL 高可用之 DRBD + Heartbeat + MySQL

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

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

MySQL 高可用之 DRBD + Heartbeat + MySQL

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
之后,就可以顺利地干你想干的事儿了!

MySQL 高可用之 DRBD + Heartbeat + MySQL

MySQL 高可用之 DRBD + Heartbeat + MySQL

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 会自动帮我们做好这些事,它会监听服务,一旦服务停止,则从服务会接管服务)

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-04/130097p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计16029字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中