1. MySQL高可用需求介绍

1.1 MySQL高可用生产业务需求

在企业实际生产场景中,一主多从的MySQL数据库架构师最常用的架构,该架构部署简单、维护方便,并且通过简单的代理或者通过程序的方式就可以实现对主从库的读写分离,且多个从库还可以通过lvshaproxy实现对多个从库的负载均衡。

但是,在以上的MySQL数据库架构中,我们不难发现,虽然从库是多个,但是主库仅有一个,也就是说主库一旦宕机,所有的写业务就会终止,而从库宕机1个就没什么大的影响。

Mysql+Drbd+Heartbeat高可用服务应用,这个解决方案可以有效的解决主库单点的问题。当主库宕机后。可以实现主库从一个主节点切换到另一个主节点,而所有的从库会自动和新的主库进行同步,且新主库的数据和宕机瞬间的主几乎完全一致,从而实现了MySQL主库的热备方案。

1.2 MySQL高可用架构拓扑

 

正常情况说明:

A. Heartbeat通过串口线或直练线对DB服务做健康检查,并执行DRBDMySQLVIP等资源自动动态切换

B. db-1-2作为db-1-1高可用备份,正常情况下db-1-1提供一个主分区给MySQL使用

C. 物理磁盘做RAID10RAID0,根据性能和冗余需求来选

D. 服务器之间、服务器和交换机之间都是双千兆网卡绑定

E. 应用服务器(包括不限于web等)通过VIP访问MySQL主库

F. MySQLDRBD分区1

G. MySQL slave1MySQL slave2通过VIP同步主库MySQL 3306

H. 以上高可用为MySQL多从的模式,属于一主二从。

1.2.2 MySQL主库宕机切换过程架构拓扑

spacer.gif 

1.2.3 MySQL主库宕机切换新主后架构拓扑

spacer.gif 

提示:经过高可用方案切换后的数据库架构,就是一个常规的主从结构。此时,主库就从热备变成了单点,因此,要尽快恢复原来的主库,以确保切换后的新主库宕机对业务带来的影响。

1.3 MySQL高可用生产需求描述

假设有3台数据库服务器db-1-1/db-1-2/db-1-3,其实际IP分别为10.0.15.81db-1-1),10.0.15.82db-1-2),10.0.15.83db-1-3

db-1-1的数据库文件目录为/data,对前端提供的访问VIP10.0.15.181

配置目标:一旦数据库服务器db-1-1宕机,服务器上的mysql数据库服务和虚拟IP会自动切换到服务器db-1-2继续提供服务,从而达到mysql数据库高可用无业务影响的目的。

这里还有一个特别的问题,就是以前的多个从库如何能自动和新的主库同步,经过实践,通过drbd的方式同步,然后做从库时使用和主库对外提供服务的VIP为同步IP,当主库宕机后,VIP漂移到热备主库,默认情况60秒内,从库就可以找到新的VIP,从而自动和新的主库同步。强调:通过MySQL同步做双主的方式,是难以做到主库宕机从库和新的主库自动同步的

1.4 高可用架构图

单主热备模式:上图

双主热备模式:

spacer.gif 

1.5 网卡及IP资源

名称

接口

IP

用途

MASTER

eth0

10.0.15.81

外网管理IP,用于WAN数据转发


eth1

192.168.2.81

用于MYSQL服务器间心跳连接(直连)


eth2

192.168.3.81

用于MYSQL服务器DRBD同步(直连)

vip


10.0.15.181

用于对外MySQL数据库服务VIP

BACKUP

eth0

192.168.1.82

外网管理IP,用于WAN数据转发


eth1

192.168.2.82

用于MYSQL服务器间心跳连接(直连)


eth2

192.168.3.82

用于MYSQL服务器DRBD同步(直连)

vip




2. 开始部署mysql高可用

2.1 分别修改服务器机器名

分别设置两台机器的hostnamedb-1-1/db-1-2

方法为:编辑/etc/sysconfig/network,设置HOSTNAME=db-1-1HOSTNAME=db-1-2,然后再命令行执行hostname db-1-1hostname db-1-2使设置马上生效

2.2 分别增加配置一块硬盘

2.3 分别配置hosts

vim /etc/hosts

10.0.15.81 db-1-1

10.0.15.82 db-1-2

2.4 添加路由

81主机:

route add -host 192.168.2.82 dev eth1

route add -host 192.168.3.82 dev eth2

echo 'route add -host 192.168.2.82 dev eth1' >> /etc/rc.local

echo 'route add -host 192.168.3.82 dev eth2' >> /etc/rc.local

82主机:

route add -host 192.168.2.81 dev eth1

route add -host 192.168.3.81 dev eth2

echo 'route add -host 192.168.2.81 dev eth1' >> /etc/rc.local

echo 'route add -host 192.168.3.81 dev eth2' >> /etc/rc.local

2.5 硬盘分区,格式化

 

2.6 安装相关软件

安装drbdyum -y install kmod-drbd83 drbd83

安装heartbeatyum -y install heartbeat

安装mysql通过编译方式安装

2.7 理顺MySQL数据/data目录各配置列表

主机名称

db-1-1

db-1-2

管理IP

eth0:10.0.15.81

eth0:10.0.15.82

DRBD管理名称

data

data

DRBD挂载目录

/data

/data

DRBD逻辑设备

/dev/drbd0

/dev/drbd0

DRBD对接IP

eth2:192.168.3.81/24

eth2:192.168.3.82/24

DRBD存储设备

/dev/sdb1

/dev/sdb1

DRBD Meta设备

/dev/sdb2

/dev/sdb2

NFS/MySQL导出目录

/data

/data

NFS/MySQL虚拟IP

eth0:10.0.15.181/24

eth0:10.0.15.181/24

注:灰色部分为自动生成

2.8 配置heartbeat服务

在高可用方案中,heartbeat服务的主要作用就是控制IPdrbdmysql等服务根据要在主备节点上正确的启动和停止

Heartbeat的默认配置文件目录为/etc/ha.dHeartbeat常用的配置文件有三个,ha.cfauthkeyharesource

配置名称

作用

备注

ha.cf

heartbeat参数配置文件

在这里配置heartbeat的一些基本参数

authkey

heartbeat认证文件

高可用服务器对之间根据对端的authkey,对对端进行认证,权限必须是600

haresource

heartbeat资源配置文件

如配置IP资源及脚本程序等

2.8.2配置authkey文件

cat authkey

auth 1

1 sha1 47e9336850f1db6fa58bc470bc9b7810eb397f04 

chmod 600 /etc/ha.d/authkey

2.8.3 配置ha.cf

vim ha.cf

#the start by oldboy

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility     local1

 

keepalive 2

deadtime 30

warntime 10

initdead 120

 

#bcast  eth1

mcast eth1 225.0.0.81 694 1 0

 

auto_failback on

node    db-1-1

node    db-1-2

crm     no

2.8.4 配置haresoure文件

vim haresources

#oldboy services

#db-1-1 IPaddr::10.0.15.181/24/eth0  ---->先用这个测试下,是否可以起到VIP

db-1-1 IPaddr::10.0.15.181/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext3 rsdata

2.8.5 配置haresource说明

db-1-1 IPaddr::10.0.0.17/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4 rsdatadb-1-1  ==>主机名,表示初始状态会在db-1-1绑定IP 10.0.15.181

IPaddr  ==>heartbeat配置IP的默认脚本,其后的IP等都是其参数

10.0.15.181/24/eth0   ==>集群对外服务的VIP,初始启动在db-1-1

drbddisk::data   ==>启动drbd data资源,相当于执行/etc/ha.d/resource.d/drbddidk data stop/start

Filesystem::/dev/drbd0::/data::ext3  ==>drbd分区挂载到/data目录,这里相当于/etc/ha.d/resource.d/Filesystem::/dev/drbd0/data ext3 stop/start

rsdata  ==>启动mysql服务脚本。这里相当于/etc/init.d/rsdata stop/start

2.9 测试

/etc/init.d/heartbeat start

3. 配置DRBD服务

在高可用方案中,DRBD的主要作用就是确保数据能实时完整从主节点同步到热备节点上。

3.1 加载drbd模块到内核

modprobe drbd(临时生效)

lsmod | grep drbd

3.2 初始化DRBDmetadata并启动DRBD

创建DRBD记录信息的metdata分区数据块

drbdadm create-md data

drbdadm up all

3.3 指定一个要同步的资源,同步数据到对端

在主节点的一端执行

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

此步执行完,如果从端分区为空,就会自动开始进行数据同步

从端查看:

cat /proc/drbd

version: 8.4.1 (api:1/proto:86-100)

GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@db-1-2, 2016-04-29 02:11:47

 0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----

    ns:0 nr:396288 dw:396288 dr:0 al:0 bm:24 lo:1 pe:9 ua:0 ap:0 ep:1 wo:b oos:1145924

[====>...............] sync'ed: 26.0% (1145924/1542212)K

finish: 0:00:11 speed: 99,072 (99,072) want: 102,400 K/sec

3.4 配合heartbeat调试drbd服务

需要执行相关切换命令确保heartbeat服务及drbd服务之间的配合是正确的才能继续进行。这类似项目阶段的里程碑,成功配置drbd服务,并且能配合heartbeat服务进行主备切换时第二步。

cat /etc/ha.d/haresources

db-1-1 IPaddr::10.0.15.181/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4

重新启动heartbeat服务

判断heartbeat配合drbd启动成功的3

1ifconfig 查看是否有VIP

2df -h  查看drbd0是否挂载

3cat /proc/drbd 查看Primary/Secondary主从是否正确

3.5 heartbeat配合drbd调试的结论

主备节点的启动顺序是相同的:

1)VIP启动 2drbd启动 3drbd分区的挂载

发生切换时主或者备节点释放资源的顺序是相同的,但是和上面启动的顺序是相反的

1)drbd分区的挂载 2drbd启动和设置 3vip的启动

重点中的重点:

根据heartbeat的日志文件以及heartbeat原理及启动资源的顺序去排查问题

排查的方法就是按照启动heartbeat服务,heartbeat加载脚本资源的顺序手动启动检查。

4. MySQL服务安装配置

4.1 挂载drbd0分区到/data目录

生产应用场景这里的挂载操作是由heartbeat控制挂载和卸载的

mount /dev/drbd0

4.2 安装mysql

cd /home/yan/tools/

........

4.3 创建数据文件目录

mkdir -p /data/3306/data

4.4 上传3306 my.cnf配置文件,mysql启动脚本

4.5 授权

chown mysql:mysql /data/3306/

4.6 初始化数据库并加700权限

chmod 700 mysql

export PATH=/application/mysql-5.5.32/bin:$PATH >> /etc/profile

./mysql_install_db --basedir=/application/mysql-5.5.32/ --datadir=/data/3306/data --user=mysql

chown -R mysql:mysql /data/

4.7 启动数据库

/data/3306/mysql start

或者手动启动:

/application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf

4.8 测试备节点数据库

备节点上的MySQL仅仅执行到make install完成就不需要操作了,因为MySQL的数据文件会被drbd运送到备节点分区里,因此,正常情况下,我们手工模拟停止drbd服务,挂载数据分区后,MySQL服务能正常启动才对

我们也可以在备节点安装数据库,但目的仅仅是测试备节点的安装和启动是否正常,测试完毕后,需要把/data里的数据移走或者删除

4.9 创建一个多实例(3307

mkdir -R /data/3307/data

初始化:

./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3307/data/ --user=mysql

4.10 设置3307 3306的从库

要使用VIP进行同步,这样当主库挂掉后能够

5.

5.1 主库宕机后恢复了,如何将宕机恢复后的主库变为主

启动ha,或者hb_takevoerha自动接管的参数

5.2 监控方案

a.服务本身

b.主从同步状态和延迟时间

c.裂脑监控:备节点出现VIP就认为裂闹了。更细致的就是主节点宕机并且备节点VIP出现。

d.监控drbd的同步状态