mysql+drbd+heartbeat高可用综合
在企业的实际生产中, 一主多从的mysql数据库架构是最常用的DB架构方案,该架构方案部署简单,维护方便
并且通过配置简单的代理或者通过程序的方式就可以实现应用服务器对主从库的读写分离,且多个从库还可以通过lv或者
haproxy等代理实现对多个从库的负载均衡,分担读的压力,同时排除单点
但是,在以上的mysql数据库架构中,我们不难发现,虽然从库是多个,但是主库仅有一个,也就是说一旦主库宕机,所有的
写业务都会终止,而从库宕机一个就没有什么大的影响,那么如何解决这个主库单点的问题呢,其实,最简单的方案就是做好监控
,然后主库宕机后,有管理员人为的手工选择最快的从库改为主,然后让其他从库和新主库同步,这个方式简单易行,但是需要人工
处理,对有些要求高的场合高度不够,那有没有不需要人工处理的方案呢
mysql高可用生产需求
假设有三台数据库服务器data-1-1/data-1-2/data-1-3,其实际ip分别为10.0.0.7(data-1-1)
10.0.0.8(data-1-2),10.0.0.9(data-1-3机器)
data-1-1的数据库文件目录为/data,对前端提供访问的vip为10.0.0.17
配置目标:一旦主数据库data-1-1宕机,服务器上的mysql数据库服务和虚拟ip会自动切换到服务器data-1-2
从而达到mysql数据库高可用无业务影响的目的,
这里会有一个特别的问题,就是以前的多个从库如何自动和新的主库同步,经过实践,通过drbd的方式同步的数据库,以及做从库时使用和
主库对外提供的vip为同步vip,当主库宕机后,vip飘逸到热备主库,默认情况60秒内,从库就可以连接到新的
vip,从而自动和新的主库同步,这里需要强调下,通过mysql同步做双主的方式,是难以做到主库宕机从库和新的
主库自动同步
生产配置场景
删除两台虚拟机的硬盘,从新添加两块两G 的硬盘,从新添加两块两G硬盘
10.1.7网卡及ip资源【工作中】
名称 接口 ip 用途
master eth0 10.0.0.7 管理ip,用于lan内数据转发
eth1 10.0.10.7 用于mysql服务器间心跳连接直连
eth2 10.0.11.7 用于mysql服务器drbd同步直连
vip 10.0.0.17 用于提供对外mysql数据库服务vip
backup eth0 10.0.0.8 管理ip,用于lan数据转发
eth1 10.0.10.8 用于mysql服务器间心跳直连
eth2 10.0.11.8 用于mysql服务器drbd同步直连
【本实例】
名称 接口 ip 用途
master eth1 192.168.88.144 管理ip,用于lan内数据转发 10.0.0.7
eth2 192.168.88.44 用于mysql服务器间心跳连接直连 10.0.10.7
vip 192.168.88.04 用于提供对外mysql数据库服务vip
backup eth1 192.168.88.132 管理ip,用于lan数据转发10.0.0.8
eth2 192.168.88.32 用于mysql服务器间心跳直连10.0.10.8
vip 192.168.88.02
安装前准备【在两台虚拟机上】
添加网络适配器桥接
添加一块scsi硬盘2G
1.配置主机名
hostname data-1-1
hostname data-1-2
在setup->dns configuration调整主机名data-1-1
/sbin/route add -host 192.168.88.32 dev eth2
/sbin/route add -host 192.168.88.44 dev eth2
echo `/sbin/route add -host 10.0.0.64 dev1`>>/etc/rc.local
修改host
127.0.0.1 localhost.localdomain localhost.localdomain localhost4 ##没有data-1-1 localhost4.localdomain4 localhost
::1 localhost.localdomain localhost.localdomain localhost6 localhost6.localdomain6 localhost #没有data-1-
192.168.88.144 data-1-1
192.168.88.132 data-1-2
2.下载并安装epel包
wget http://mirror.hust.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@data-1-1 soft]# rpm -ivh epel-release-6-8.noarch.rpm
[root@data-1-1 soft]# yum install heartbeat -y
[root@data-1-1 soft]# ls /etc/ha.d -d
/etc/ha.d
[root@data-1-1 soft]# cd /etc/ha.d
[root@data-1-1 ha.d]# vi ha.cf
debugfile /var/log/ha-debug #调试日志文件
logfile /var/log/ha-log #系统运行日志文件
logfacility local0 #日志记录等级
keepalive 2 #心跳频率,2表示2秒;200ms则表示200毫秒
deadtime 10 #节点死亡时间,就是过了10秒后还没有收到心跳就认为主节点死亡
warntime 5 #告警时间
initdead 120 #初始化时间
udpport 694 #心跳信息传递的udp端口
#bcast eth1 #采用udp广播播来通知心跳,建议在备用节点不只一台时使用
mcast eth2 225.0.0.1 694 1 0 #采用udp多播来通知心跳,建议在备用节点不只一台时使用
#ucast eth1 10.0.0.64 #采用udp单播来通知心跳,注意:这一项在2个节点IP
auto_failback on
#如果主节点重新恢复过来,主节点将主动将资源抢占过来,如果为off,则只当备用节点当掉后,主节点才取回资源
watchdog /dev/watchdog
#看门狗。如果本节点在超过1分钟后还没有发出心跳,那么本节点自动重启
node data-1-1 #主节点名称,与uname -n显示必须一致
node data-1-2 #备用节点名称
respawn hacluster /usr/lib64/heartbeat/ipfail #
apiauth ipfail gid=haclient uid=hacluster
[root@data-1-1 ha.d]# vi haresources
data-1-1 IPaddr::192.168.88.4/24/eth1 ###vip
data-1-2 IPaddr::192.168.88.2/24/eth1 ###vip
root@data-1-1 ha.d]# vi authkeys
auth 1
1 crc
root@data-1-1 ha.d]#chmod 600 authkeys
[root@data-1-1 ha.d]#/etc/init.d/heartbeat start注意检查防火墙和ping不要用restart
[root@data-1-1 ha.d]# ps -ef |grep heartbeat
root 3385 1 0 18:04 ? 00:00:00 heartbeat: master control process
root 3390 3385 0 18:04 ? 00:00:00 heartbeat: FIFO reader
root 3391 3385 0 18:04 ? 00:00:00 heartbeat: write: mcast eth1
root 3392 3385 0 18:04 ? 00:00:00 heartbeat: read: mcast eth1
root 4071 2426 0 18:05 pts/0 00:00:00 grep heartbeat
drbdadm up data
drbdadm over
磁盘分区
root@localhost ha.d]# fdisk -l
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0 1024 ## Ignore/Cancel? Ignore
parted /dev/sdb p
parted /dev/sdb mkpart primary 1025 2146
parted /dev/sdb p
[root@localhost ha.d]# parted /dev/sdb p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 1024MB 1024MB primary
2 1025MB 2146MB 1121MB primary
下载drbd的包
wget http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
[root@localhost soft]# rpm -ivh elrepo-release-6-5.el6.elrepo.noarch.rpm
[root@localhost soft]# yum install drbd kmod-drbd84 -y
yum install kernel* 重启
modprobe drbd
lsmod |grep drbd
echo "modprobe drbd >/dev/null 2>&1" >/etc/sysconfig/modules/drbd.modules
[root@data-1-2 ~]# vi /etc/drbd.conf
global {
usage-count no;
}
common {
syncer {
rate 10M;#工作中开大一点
verify-alg crc32c;
}
}
#primary for drbd1若增加资源就增加resource
resource data {
protocol C;
disk {
on-io-error detach;
}
on data-1-1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.88.44:7788;#心跳网卡
meta-disk /dev/sdb2[0];
}
on data-1-2 {
device /dev/drbd0;
disk /dev/sdb1; #数据盘
address 192.168.88.32:7788;#心跳网卡
meta-disk /dev/sdb2[0];#meta分区
}
}
[root@data-1-1 ~]# drbdadm create-md data 两台
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
[root@data-1-2 ~]# drbdadm up data两台
[root@data-1-1 ~]# cat /proc/drbd两边都是从
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:999984
[root@data-1-2 ~]# cat /proc/drbd两边都是从
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:999984
[root@data-1-1 ~]# drbdadm -- --overwrite-data-of-peer primary data置主
[root@data-1-1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:41064 nr:0 dw:0 dr:41743 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:958920
[>....................] sync'ed: 4.5% (958920/999984)K
finish: 0:00:46 speed: 20,532 (20,532) K/sec
[root@data-1-2 ~]# mkdir /data两台
[root@data-1-1 ~]# mkfs -t ext4 -b 4096 /dev/drbd0格式化 单台
[root@data-1-1 ~]# mount /dev/drbd0 /data单台
[root@data-1-2 ~]# drbdadm down data 单台
[root@data-1-2 ~]# mount /dev/sdb1 /mnt
[root@data-1-2 ~]# ll /mnt
total 64
drwx------. 2 root root 16384 Mar 18 04:48 lost+found
-rwxr-xr-x. 1 root root 48568 Mar 18 04:50 poahaijaio
[root@data-1-2 ~]# drbdadm up data
[root@data-1-1 ha.d]# vi /etc/ha.d/haresources[两台]
data-1-1 IPaddr::192.168.88.4/24/eth1 drbddisk::data Filesystem::/dev/drbd0::/data::ext4###vip
data-1-2 IPaddr::192.168.88.2/24/eth1 ###vip
他做了三件事, 1启动heartbeat 2up data 3.挂载 /data
重启两台/etc/init.d/heartbeat start一定会有vip
oot@data-1-1 ha.d]# /etc/init.d/heartbeat start
ot@data-1-1 ha.d]# ip addr|grep 192
@data-1-1 ha.d]# cat /proc/drbd
[root@data-1-1 ha.d]# df -h
注意一定要两边的drbdadm up data
mysql安装
1.解压配置
[root@data-1-1 soft]# tar -zxf mysql-5.5.32-linux2.6-x86_64.tar.gz
[root@data-1-2 soft]# cd mysql-5.5.32-linux2.6-x86_64
[root@data-1-2 mysql-5.5.32-linux2.6-x86_64]# mkdir /usr/local/mysql
[root@data-1-1 mysql]# cd /application/mysql-5.5.32
[root@data-1-1 mysql-5.5.32]# cp -rp * /usr/local/mysql
2.创建用户
groupadd mysql
useradd -g mysql -M mysql
3.初始化
mkdir -p /data/{3306,3307}/data
[root@data-1-1 3306]# cd /data/3306
[root@data-1-1 3306]# vi my.cnf
[root@data-1-1 3306]# tree /datat
/datat [error opening dir]
0 directories, 0 files
[root@data-1-1 3306]# tree /data
/data
├── 3306
│?? ├── data
│?? └── my.cnf
└── 3307
└── data
[root@data-1-1 3306]# chown -R mysql.mysql /data
[root@data-1-1 3306]# find /data/ -type f -name "mysql" |xargs ls -l
total 8
drwxr-xr-x. 2 mysql mysql 4096 Mar 22 03:45 data
-rw-r--r--. 1 mysql mysql 1688 Mar 22 03:52 my.cnf
[root@data-1-1 3306]# tail -1 /etc/profile
unset -f pathmunge
[root@data-1-2 soft]# cd mysql-5.5.32-linux2.6-x86_64
[root@data-1-2 mysql-5.5.32-linux2.6-x86_64]# cp support-files/mysql.server /etc/init.d/mysql
[root@data-1-2 mysql-5.5.32-linux2.6-x86_64]# cd scripts
[root@data-1-1 scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3306/data --user=mysql
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf 2>&1 > /dev/null &
[root@data-1-1 3306]# netstat -lntup|grep 330
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 44383/mysqld
[root@data-1-2 scripts]# cd /data
[root@data-1-2 data]# ls
3306 3307
[root@data-1-2 data]# mv * /tmp移走所有的数据
[root@data-1-1 3306]# /usr/share/heartbeat/hb_standby 模拟宕机
出现脑裂现象
[root@data-1-2 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4112
[root@data-1-2 ~]# drbdadm secondary data
[root@data-1-2 ~]# drbdadm -- --discard-my-data connect data
[root@data-1-1 ~]# /usr/share/heartbeat/hb_takeover
##########不能在 heartbeat挂载的时候初始化表空间,不然会提示表空间不足
[root@data-1-1 ha.d]# vi /etc/ha.d/haresources[两台]
data-1-1 IPaddr::192.168.88.4/24/eth1 drbddisk::data Filesystem::/dev/drbd0::/data::ext4 mysql###vip
data-1-2 IPaddr::192.168.88.2/24/eth1 ###vip
[root@data-1-1 3306]# cp /data/3306/mysql /etc/ha.d/resource.d/
[root@data-1-1 3306]# chmod +x /etc/ha.d/resource.d/mysql
注意df -h drbd状态