mysql+heartbeat+drbd高可用

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状态



你可能感兴趣的:(mysql+heartbeat+drbd高可用)