mysql与nfs存储高可用实现方案及一系列问题的解决方法


前期准备:两台服务器(双网卡双硬盘)系统盘与数据盘分开,centos6.8

heartbeat:心跳监测,控制vip的迁移,联合调度drbd的启用与关停
drbd:负责数据块级别的同步
nfs:提供文件共享服务,借助vip实现高可用

1:修改主机名

2:修改host文件,主机名可以指为心跳线的ip,如下
vim /etc/hosts
192.168.56.50 6-nfs-B
192.168.56.40 6-nfs-M

3:配置心跳主机路由
主6-nfs-M上:

route add -host 192.168.56.50 eth1
echo "route add -host 192.168.56.50 eth1 " >> /etc/rc.local

备6-nfs-B上:

route add -host 192.168.56.40 eth1
echo "route add -host 192.168.56.40 eth1 " >> /etc/rc.local

安装heartbeat
yum install epel* -y
yum clean all
yum makecache
yum install heartbeat -y

进到
cd /usr/share/doc/heartbeat-3.0.4/
cp ha.cf authkeys haresources /etc/ha.d/

配置heartbeat(M与B都是三个文件,其中分别是ha.cf authkeys【此文件权限必须是600】 haresources【资源分配管理文件】)
vim ha.cf

#debugfile /var/log/ha-debug
logfile /var/log/ha-log     #日志文件
logfacility     local0
keepalive 2         #心跳检测间隔时间
deadtime 10         #判断死亡的时间10秒,若10秒未收到回复,立即接手服务
warntime 10         #死亡延迟时间10秒,在上述deadtime未收到回复后,延迟10秒接手服务【在日志里记录一条waring】
#initdead 120          #网络延迟,针对特殊环境(如系统启动后网络无法立即生效的)
#udpport        694        #广播通信的端口
#baud   19200          #采用串口线作心跳,必须设置波特率
#serial /dev/ttyS0      # Linux
#serial /dev/cuaa0      # FreeBSD
#serial /dev/cuad0      # FreeBSD 6.x
#serial /dev/cua/a      # Solaris
#mcast eth0 225.0.0.1 694 1 0  #采用多播形式检测心跳,一般用于备机不止一台时(udp协议)
ucast eth1 192.168.56.50    #采用单播通信(对方心跳ip)
#auto_failback on      #主机再次存活后自动接管服务(一般不建议开启)
node    6-nfs-M         #节点
node    6-nfs-B
#ping  192.168.56.1        #仲裁者地址(足够健壮能有效防止脑裂---最好是默认网关)

编辑双机互联验证文件
vim authkeys 【主备一样】
auth 1
1 crc
chmod 600 authkeys

编辑集群资源文件
vim haresources 【主备相同】
6-nfs-M IPaddr::192.168.1.110/24/eth0
#这里的主机名要是uname -n显示的,并且这里只能设置成为主节点的名字

启动heartbeat
/etc/init.d/heartbeat start


安装drbd

#centos6的drbd yum源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

#centos7的drbd yum源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

yum install kmod-drbd84 drbd84-utils

查看drbd模块是否被加载到内核中
lsmod | grep drbd

将drbd设置为开机加载到内核中
echo “modprobe drbd” >> /etc/rc.local


对硬盘进行分区(主硬盘1个g,备机上的硬盘2个g,)

fdisk -l
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0 1024   #单位是M
parted /dev/sdb p                       #查看分区表
parted /dev/sdb mkpart primary 1025 2048

先不格式化磁盘


编辑drbd配置文件
全局定义配置
vim /etc/drbd.d/global_common.conf

global { usage-count yes;}      #是否参加DRBD使用者统计,默认是yes
common { 
    syncer { rate 30M; }        #设置主备节点同步时的网络速率最大值,这个值应设为磁盘写入速度的30%
    }

vim /etc/drbd.conf或者是res文件

resource meiti {                        #定义资源名称
     protocol C;            #(ABC)A数据一旦写入磁盘并发送到网络中就认为完成了
                    #B收到接收确认就认为完成了写入操作
                    #C写入操作收到写入确认就认为完成了写入操作,
     startup { wfc-timeout 0; degr-wfc-timeout 120; }
     disk { on-io-error detach; }
     net {
     timeout 60;
     connect-int 10;
     ping-int 10;
     max-buffers 2048;
     max-epoch-size 2048;
     }
     on 6-nfs-M {
     device    /dev/drbd0;
     disk      /dev/sdb1;
     address   192.168.56.40:7788;  #drbd监听的地址,本机端口
     meta-disk internal;
     }
     on 6-nfs-B {
     device    /dev/drbd0;
     disk      /dev/sdb1;
     address   192.168.56.50:7788;
     meta-disk internal;
     }
   }

初始化磁盘元数据信息(主机,备机上都要执行)
drbdadm create-md meiti
drbdadm up meiti
cat /proc/drbd
出现字样中出现Secondary/Unknown便是成功了【第二台出现Secondary/Secondary】若都是Unknown便是脑裂


下面的是在主节点6-nfs-M上执行的

drbdadm -- --overwrite-data-of-peer primary meiti #这是一个置主的命令
cat /proc/drbd                                         #这个命令可以查看状态
mkfs.ext4 -b 4096 /dev/drbd0                           #创建文件系统,启动了drbd后,格式化主就行,-b指定字节,drbd0对应sdb1
tune2fs -c -1 /dev/drbd0                               #设置最大计数为1,我也不知道干嘛的

创建一个目录作为挂载点【以下两步主从都操作】
mkdir /data
mount /dev/drbd0 /data #在备机上不进行挂载
测试一下能否同步【下面在主上创建文件,去从上查看】
cd /data
touch 123.txt

验证备机6-nfs-B上是否同步过来数据
drbdadm down meiti #先宕掉drbd,再挂载物理设备,进入挂载目录,查看内容
mount /dev/sdb1 /data
cd /data


drbd故障调试(注意这是在双方都启动的状态时候查看哈,别他么drbd起都没起来就迫不及待了)

常用命令
drbdadm up meiti
drbdadm down meiti
【双Secondary情况】
1)在主节点置:drbdadm primary meiti
【Secondary/Unknown】–网卡停掉可能造成
1)查看网络通否:ping
2)在从节点置从:drbdadm secondary meiti
断开链接:drbdadm disconnect meiti
```shell
drbdadm -- --discard-my-data connect meiti
```
3)在主节点上手动连接:drbdadm connect meiti

注意看日志进行分析


配合heartbeat调试drbd
调整/etc/ha.d/haresources

6-nfs-M IPaddr::192.168.1.110/24/eth0 drbddisk::meiti Filesystem::/dev/drbd0::/data::ext4
#6-nfs-M IPaddr::192.168.1.110/24/eth0 drbddisk::meiti Filesystem::/dev/drbd0::/data::ext4 mysqld
#heartbeat默认集成了drbd,与mysql的控制脚本,若是实现mysql高可用,后面就需要加mysqld

模拟测试:
1)停掉主节点的hearbeat【查看】
a)vip 是否飘逸 ——因为后面要用到nfs
b)查看从节点是否变成primary状态
c)df -h 查看是否有挂载/dev/drbd0 到/gzd 上
d)启动主节点的hearbeat,查看上面三个状态


nfs的安装与配置:
请参考这篇文章https://boke.wsfnk.com/archives/59.html

mysql的安装与配置:
请参考这篇文章https://boke.wsfnk.com/archives/49.html
注意:mysql高可用不比nfs存储高可用,他对数据的一致性,要求近乎苛刻,因为一但出现,脑裂,数据库里的数据难以比对,确认是否一致

配合heartbeat+drbd实现nfs高可用

主从节点都要将nfs,drbd,heartbeat设为开机自启动,mysql不要设置为开机自启动,mysql服务作为heartbeat的一项资源会统一管理。
chkconfig nfs off
echo “/etc/init.d/rpcbind start” >> /etc/rc.local
echo “/etc/init.d/nfs start” >> /etc/rc.local
echo “/sbin/drbdadm up meiti” >> /etc/rc.local
【注意,若要达到让heartbeat控制drbd,实现故障转移,必须要在drbd启动之后启动heartbeat服务,当然直接将他们设为开机自启动也是ok的,没有问题】
【还有,当heartbeat长时间无法关闭时,他会自动重启服务器,这个时候多半是出现问题了】
【注意,若是drbd,宕掉了,只有手工重启了,当然也可以交给heartbeat】

注意用这样的配置实现nfs高可用方案出现的问题
1:主机宕机后,备机vip接管需要一段时间(大约30秒)
2:由于heartbeat心跳接管问题,当从状态(vip在备机上,主机启动后,主机无法接管vip,而且备机会自动重启,同时也释放了vip),以至于造成无vip状态(偶尔出现)
这种情况,可以将其中一台机器重启便可解决—-当然关闭vip抢占功能,可以避免
3:主机,在不停用heartbeat之前,无法通过命令关机,
4:由于heartbeat与drbd联动的原因,强制停掉heartbeat会导致系统重启
5:经常会出现,系统重启后,需要等待手动输入yes才能启动系统–(这个问题,120秒后会自动跳过,然后启动系统,也有不启动的时候)—建议配一个远程管理口
6:生产服务器上,建议将心跳线与数据同步线分开,为保证心跳,可以增加心跳线数量,数据同步线也是一样的道理,当然将drbd线用在服务器与服务器直连,不过交换机也行,可以减少网络中的arp广播


升级空间,迁移数据将会遇到的问题

主节点配额1g,备节点配额2g,会同步主设备上的块(包括分区表)也就是说当主与备的磁盘分区小不一样的时候,
即便备的磁盘配额比主的大,切换后,备节点的磁盘配额依旧会显示为主节点的配额
若是需要资源迁移,需要解决备节点磁盘配额不对的问题(原来的备节点变为新的主节点)

可以在备节点上
停掉heartbeat:pkill heartbeat
停掉drbd资源:drbdadm down meiti

执行如下命令,需要先卸载分区,
fsck -f /dev/sdb1
resize2fs /dev/sdb1

提醒:若是仅因为分区显示不正常,比实际小,可以用上面的命令进行修复,若是后期分区不够用,需要扩,那么在设计之初便可以考虑使用lvm技术


参考文章
http://network.51cto.com/art/201010/230237_all.htm

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/61.html

最后编辑于:2020/1/14作者: 辣条①号

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注