下面一起来了解下mysql、heartbeat、drbd如何实现数据库高可用群集,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql、heartbeat、drbd如何实现数据库高可用群集这篇短内容是你想要的。
DRBD 概述
一、DRBD简介
DRBD 的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD
是由内核模块和相关脚本而组成,用来构建数据的高可用性集群。其实现方式是通过网络来镜像整个磁盘设备(数据)。你可以把它看作是一种基于网络的 RAID1。它允许用户在远程机器上建立一个本地块设备的实时镜像。
二、DRBD工作原理
(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD
Secondary)。另一个主机再将数据存储到自己的磁盘中。目前,DRBD每次只允许对一个节
点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。
三、DRBD与HA的关系
一个 DRBD 系统由两个节点构成,与HA 集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问 DRBD 设备(/dev/drbd*)。在主节点写入的数据通过 DRBD 设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的 DRBD 设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD 只是将数据从 DRBD 设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而 DRBD 也可以作为一个共享存储设备,使用 DRBD 不需要太多的硬件的投资。因为它在TCP/IP 网络中运行,所以,利用DRBD 作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错。
四、DRBD复制模式
协议 A :
异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点。
协议 B :
内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了远程节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘。
协议 C :
同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但 I / O 吞吐量依赖于网络带宽一般使用协议 C,但选择 C 协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议。
Heartbeat
一、heartbeat简介
Heartbeat 是 Linux-HA 工程的一个组件,自1999 年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用,这里分析的是2007年1月18日发布的版本 2.0.8。
随着 Linux 在关键行业应用的逐渐增多,它必将提供一些原来由 IBM 和 SUN 这样的大型商业公司所提供的服务,这些商业公司所提供的服务都有一个关键特性,就是高可用集群。
二、heartbeat 工作原理
Heartbeat 最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过
网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
三、高可用集群
高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心跳”的代码完成。在 Linux-HA 里这个功能由一个叫做heartbeat 的程序完成。
环境描述:
操作系统 | IP地址 | 主机名 | 软件包列表 |
CentOS release 6.5 | 192.168.200.101 | server1 | DRBD 、heartbeat 、mysql |
CentOS release 6.5 | 192.168.200.102 | server2 | DRBD 、heartbeat 、mysql |
CentOS release 6.5 | 192.168.200.103 | Slave1 | Mysql |
CentOS release 6.5 | 192.168.200.104 | Slave2 | mysql |
CentOS release 6.5 | 192.168.200.105 | Lvs-m | Lvs+keepalived |
CentOS release 6.5 | 192.168.200.106 | Lvs-s | Lvs+keepalived |
配置过程:
安装前准备配置:
所有主机需要添加一块60G的SCSI接口硬盘
配置所有机器:
关闭防火墙和selinux机制
[root@localhost ~]# service iptables stop
[root@localhost ~]# setenforce 0
主从都要配置,分区不需要格式化
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
Command action
e extended
p primary partition (1-4)
P
Partition number (1-4): 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610,default 2610): +10G
Command (m for help): w
[root@server1 ~]# partprobe /dev/sdb
从主机改为 server2
[root@localhost ~]# vim /etc/sysconfig/network
2 HOSTNAME=server1
[root@localhost ~]# hostname server1
[root@localhost ~]# bash
[root@server1 ~]# vim /etc/hosts
3 192.168.200.101 server1
4 192.168.200.102 server2
Heartbeat安装:
主从都需要安装
把包上传到/root下,按照顺序安装。
[root@server1 ~]#rpm -ivhPyXML-0.8.4-19.el6.x86_64.rpm
[root@server1 ~]#rpm -ivhperl-TimeDate-1.16-13.el6.noarch.rpm
[root@server1 ~]#rpm -ivhresource-agents-3.9.5-24.el6_7.1.x86_64.rpm
[root@server1 ~]#rpm -ivh lib64ltdl7-2.2.6-6.1mdv2009.1.x86_64.rpm
[root@server1 ~]#rpm -ivhcluster-glue-libs-1.0.5-6.el6.x86_64.rpm
[root@server1 ~]#rpm -ivhcluster-glue-1.0.5-6.el6.x86_64.rpm
[root@server1 ~]#yum -y install kernel-devel kernel-headers
[root@server1 ~]#rpm -ivh heartbeat-libs-3.0.4-2.el6.x86_64.rpmheartbeat-3.0.4-2.el6.x86_64.rpm
安装配置 DRBD:
主从都需要安装
[root@server1 ~]# tar xf drbd-8.4.3.tar.gz
[root@server1 ~]# cd drbd-8.4.3
[root@server1 drbd-8.4.3]#./configure--prefix=/usr/local/drbd --with-km --with-heartbeat
[root@server1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/&& make &&
make install
[root@server1 drbd-8.4.3]# mkdir -p/usr/local/drbd/var/run/drbd
[root@server1 drbd-8.4.3]# cp/usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/
[root@server1 drbd-8.4.3]# chkconfig --add drbd
[root@server1 drbd-8.4.3]# cd drbd
[root@server1 drbd]# make clean
[root@server1 drbd]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/
[root@server1 drbd]# cp drbd.ko /lib/modules/2.6.32-504.el6.x86_64/kernel/lib/
[root@server1 drbd]# depmod
[root@server1 drbd]# cp -R/usr/local/drbd/etc/ha.d/resource.d10 * * * * ntpdate time.nist.gov
修改四台数据库主机的配置文件(注意server_id不要一样)开启binlog日志
[root@server1~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to preventassorted security risks
symbolic-links=0
relay-log =relay-log-bin
server_id =1
relay-log-index= slave-relay-bin.index
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
重启服务
[root@server1 ~]# /etc/init.d/mysqld restart
停止 mysqld: [确定]
正在启动 mysqld: [确定]
在serve1上授权,允许从云服务器同步,查看主云服务器的binlog
[root@server1 ~]# msyql
mysql> grant replication slave on *.* to'user'@'192.168.200.%' identified by '123456';
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 187 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
从云服务器同步server1,查看从云服务器状态。
mysql> change master to master_host='192.168.200.254',master_user='user',master_password='123456',master_log_file='mysql-bin.000002', master_log_pos=106;
mysql> flush privileges;
mysql> start slave;
mysql> show slave status \G
在带有VIP的主数据库创建库,验证从云服务器是否同步
server1
mysql> create database abc;
slave
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| abc |
| b |
| mysql |
| test |
+--------------------+
5 rows in set (0.00 sec)
配置LVS+keepalived实现负载
安装keepalived服务,并配置VIP和节点健康检查
在主节点上操作
[root@localhost ~]# yum -y install keepalived
[root@localhost ~]# cd /etc/keepalived/
[root@localhost ~]# cp keepalived.confkeepalived.conf.bak
[root@localhost ~]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
stateMASTER
interface eth0
virtual_router_id 51
priority100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.100
}
}
virtual_server 192.168.200.100 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.200.103 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.104 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备节点与主节点的操作一样,只有配置文件有一些区别
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
stateBACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.100
}
}
virtual_server 192.168.200.100 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.200.103 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.104 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
编写脚本,配置从数据库(主从都要做)
[root@slave1~]# vim /opt/lvs-dr
#!/bin/bash
VIP="192.168.200.100"
/sbin/ifconfigeth0 192.168.200.103/24 up
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@slave2~]# vim /opt/lvs-dr
#!/bin/bash
VIP="192.168.200.100"
/sbin/ifconfigeth0 192.168.200.104/24 up
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
添加执行权限,执行脚本
chmod +x /opt/lvs-dr
echo "/opt/lvs-dr" >> /etc/rc.local
/opt/lvs-dr
[root@slave1~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdiscnoqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet127.0.0.1/8 scope host lo
inet 192.168.200.100/32 brd192.168.200.100 scope global lo:0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu1500 qdisc pfifo_fast state UP qlen 1000
link/ether00:0c:29:3f:03:d5 brd ff:ff:ff:ff:ff:ff
inet192.168.200.103/24 brd 192.168.200.255 scope global eth0
启动keepalived
[root@localhost keepalived]# /etc/init.d/keepalivedstart
正在启动 keepalived: [确定]
安装ipvsadm用于查看节点记录(主从节点都要配置)
[root@localhost ~]# yum -y install ipvsadm
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
->RemoteAddress:Port ForwardWeight ActiveConn InActConn
TCP 192.168.200.100:3306 rr persistent 50
-> 192.168.200.103:3306 Route 1 0 0
-> 192.168.200.104:3306 Route 1 0 0
[root@localhost ~]#/etc/init.d/ipvsadm save
[root@localhost ~]#/etc/init.d/ipvsadm restart
验证
验证主主切换是否同步从数据库
server1上关闭heartbeat
[root@server1 ~]# service heartbeat stop
Stopping High-Availability services: Done.
slave上查看同步信息
mysql> show slave status\G
*************************** 1. row***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.200.253
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000023
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 552
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
如果不同步,停一下同步,再重启查看。
验证从数据库是否轮询
在主lvs上查看连接信息
[root@localhost~]# watch ipvsadm -Lnc //实时查看远程连接信息
-c (--connection) 显示LVS目前的连接信息
在其他主机通过VIP进行连接测试
[root@localhostkeepalived]# mysql -umydb -h292.168.200.100 -p123456 -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| slave1 |
| test |
+--------------------+
查看主lvs信息,等第一次连接断开再测试。
[root@localhost keepalived]# mysql -umydb-h292.168.200.100 -p123456 -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| slave2 |
| test |
+--------------------+
看完mysql、heartbeat、drbd如何实现数据库高可用群集这篇文章后,很多读者朋友肯定会想要了解更多的相关内容,如需获取更多的行业信息,可以关注我们的数据库栏目。