MySQL+Heartbeat+DRBD+LVS+keepalived实现数据库高可用群集

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机制

[[email protected] ~]# service iptables stop

[[email protected] ~]# setenforce 0

主从都要配置,分区不需要格式化

[[email protected] ~]# 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

[[email protected] ~]# partprobe /dev/sdb

从主机改为 server2

[[email protected] ~]# vim /etc/sysconfig/network

2 HOSTNAME=server1

[[email protected] ~]# hostname server1

[[email protected] ~]# bash

[[email protected] ~]# vim /etc/hosts

3 192.168.200.101 server1

4 192.168.200.102 server2

Heartbeat安装:

主从都需要安装

把包上传到/root下,按照顺序安装。

[[email protected] ~]#rpm -ivhPyXML-0.8.4-19.el6.x86_64.rpm

[[email protected] ~]#rpm -ivhperl-TimeDate-1.16-13.el6.noarch.rpm

[[email protected] ~]#rpm -ivhresource-agents-3.9.5-24.el6_7.1.x86_64.rpm

[[email protected] ~]#rpm -ivh lib64ltdl7-2.2.6-6.1mdv2009.1.x86_64.rpm

[[email protected] ~]#rpm -ivhcluster-glue-libs-1.0.5-6.el6.x86_64.rpm

[[email protected] ~]#rpm -ivhcluster-glue-1.0.5-6.el6.x86_64.rpm

[[email protected] ~]#yum -y install kernel-devel kernel-headers

[[email protected] ~]#rpm -ivh heartbeat-libs-3.0.4-2.el6.x86_64.rpmheartbeat-3.0.4-2.el6.x86_64.rpm

安装配置 DRBD:

主从都需要安装

[[email protected] ~]# tar xf drbd-8.4.3.tar.gz

[[email protected] ~]# cd drbd-8.4.3

[[email protected] drbd-8.4.3]#./configure--prefix=/usr/local/drbd --with-km --with-heartbeat

[[email protected] drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/&& make &&

make install

[[email protected] drbd-8.4.3]# mkdir -p/usr/local/drbd/var/run/drbd

[[email protected] drbd-8.4.3]# cp/usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/

[[email protected] drbd-8.4.3]# chkconfig --add drbd

[[email protected] drbd-8.4.3]# cd drbd

[[email protected] drbd]# make clean

[[email protected] drbd]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/

[[email protected] drbd]# cp drbd.ko /lib/modules/2.6.32-504.el6.x86_64/kernel/lib/

[[email protected] drbd]# depmod

[[email protected] drbd]# cp -R/usr/local/drbd/etc/ha.d/resource.d/* /etc/ha.d/resource.d/

[[email protected] drbd]# cd /usr/local/drbd/etc/drbd.d/

[[email protected] drbd]# cat /usr/local/drbd/etc/drbd.conf

# You can find an example in/usr/share/doc/drbd.../drbd.conf.example


//此目录下所有以.res    结尾的都为资源文件

include"drbd.d/global_common.conf";

include "drbd.d/*.res";                                     

配置global_common.conf文件(主从一致)

[[email protected] drbd.d]# pwd

/usr/local/drbd/etc/drbd.d

[[email protected] drbd.d]# cp global_common.conf{,-$(date+%s)}

[[email protected] drbd.d]# vim global_common.conf

global {

usage-count yes;                                                 // 是否对使用信息作统计, 默认为 yes

}

common {

startup {

wfc-timeout 120;                                                  // 等待连接的超时时间

degr-wfc-timeout 120;

}

disk {

on-io-error detach;                                             //当IO出现错误时执行的动作

}

net {

protocol C;                                                             // 复制模式为第 3

}

}

配置资源文件(主从一致)

[[email protected] drbd.d]# vim r0.res

resource r0 {                                                          //r0资源名称

on server1 {

device /dev/drbd0;                                            // 逻辑设备路径

disk /dev/sdb1;                                                   // 物理设备

address 192.168.200.101:7788;                      //主节点

meta-disk internal;

}

on server2 {

device /dev/drbd0;

disk /dev/sdb1;

address 192.168.200.102:7788;                       // 备节点

meta-disk internal;

}

}

 

[[email protected] drbd.d]# scp global_common.conf r0.res

192.168.200.102:/usr/local/drbd/etc/drbd.d

创建元数据(两个节点上操作)

[[email protected] drbd.d]# modprobe drbd

[[email protected] drbd.d]# lsmod | grep drbd

drbd 310268 0

libcrc32c 1246 1 drbd

[[email protected] drbd.d]# dd if=/dev/zero bs=1M count=1of=/dev/sdb1

[[email protected] drbd.d]# drbdadm create-md r0 // 输出以下信息

The server‘s response is:

you are the 57184th user to install this version

Writing meta data...

initializing activity log

NOT initializing bitmap

New drbd meta data block successfully created.        //当输出成功信息后可 Ctrl+C结束

 

注意:

当执行命令”drbdadm create-md r0 ”时,出现以下错误信息。

Device sizewould be truncated, which

would corruptdata and result in

‘accessbeyond end of device‘ errors.

You need toeither

* useexternal meta data (recommended)

* shrink thatfilesystem first

* zero outthe device (destroy the filesystem)

Operationrefused.

Command‘drbdmeta 0 v08 /dev/xvdb internal create-md‘ terminated with exit code 40

drbdadmcreate-md r0: exited with code 40

解决办法:初始化磁盘文件格式, dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync

启动 DRBD(主从节点都要执行)

[[email protected] drbd.d]# /etc/init.d/drbd start

Starting DRBD resources: [

create res: r0

prepare disk: r0

adjust disk: r0

adjust net: r0

]

........

[[email protected] drbd.d]# netstat -anpt | grep 7788

tcp 0 0 192.168.200.101:35654 192.168.200.102:7788

ESTABLISHED -

tcp 0 0 192.168.200.101:7788 192.168.200.102:33034

ESTABLISHED -

[[email protected] drbd.d]# netstat -anpt | grep 7788

tcp 0 0 192.168.200.102:7788 192.168.200.101:48501

ESTABLISHED -

tcp 0 0 192.168.200.102:10354 192.168.200.101:7788

ESTABLISHED -

手动验证主从切换:

初始化网络磁盘(主节点上执行)

[[email protected] drbd.d]# drbdadm -- --overwrite-data-of-peerprimary r0

[[email protected] drbd.d]#watch -n 2  cat /proc/drbd                   //动态显示同步内容

version: 8.4.3 (api:1/proto:86-101)

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515build by [email protected], 2016-12-04

13:39:22

0: cs:SyncSource ro:Primary/Secondaryds:UpToDate/Inconsistent C r-----

ns:116024 nr:0 dw:0 dr:123552 al:0 bm:7 lo:0 pe:1 ua:7ap:0 ep:1 wo:f oos:10374340

 [>....................] sync‘ed: 1.2%(10128/

 

数据同步测试(主节点上操作前 6 6  步骤,次节点上操作后三步骤)

server1上操作

[[email protected] drbd.d]# mkfs.ext4 /dev/drbd0

[[email protected] drbd.d]# mkdir /mysqldata

[[email protected] drbd.d]# mount /dev/drbd0 /mysqldata

[[email protected] drbd.d]# echo www.crushlinux.com >/mysqldata/file             // 建立测试文件

[[email protected] ~]# umount /dev/drbd0

[[email protected] ~]# drbdadm secondary r0                                     // 主降为次

server2上操作

[[email protected] drbd.d]# drbdadm primary r0                      // 次升为主

[[email protected] drbd.d]# mkdir /mysqldata

[[email protected] drbd.d]# mount /dev/drbd0 /mysqldata

[[email protected] drbd.d]# ls /mysqldata                                   // 在备节点上查看数据

file lost+found                                                                                 // 可以看到创建的文件

安装 MySQL

更改Mysql数据库的存储位置为共享目录(主从都要执行)

[[email protected] ~]# yum -y install mysql mysql-server

[[email protected] ~]# vim /etc/my.cnf

2datadir=/mysqldata/mysql

[[email protected] ~]# chown -R mysql.mysql /mysqldata

[[email protected] ~]# chkconfig mysqld on

注意:此时我们修改了数据目录和其属主和权限,有时会因为此操作导致数据库无法启动,

解决方法:

一,查看你的 selinux 是否处于打开状态,将其关闭。

二,/etc/apparmor.d/usr.sbin.mysqld文件中,有两行内容规定了 mysql 使用数据文件的路径权限,改掉即可,重启/etc/init.d/apparmor restart

进行数据库测试

因为此前的操作,现在把server2 节点降为次

[[email protected] ~]# umount /dev/drbd0

[[email protected] ~]# drbdadm secondary r0

 

把server1 升为主节点

[[email protected] ~]# drbdadm primary r0

[[email protected] ~]# mount /dev/drbd0 /mysqldata

[[email protected] ~]# /etc/init.d/mysqld start

 

在 server1上创建一个库 crushlinux,然后主降为备,把server2 升为主查看库有没有同步。

[[email protected] ~]# mysql

mysql> create database crushlinux;

Query OK, 1 row affected (0.00 sec)

mysql> exit

Bye

[[email protected] ~]# service mysqld stop                                           //server1的操作

[[email protected] ~]# umount /dev/drbd0                               //server1的操作

[[email protected] ~]# drbdadm secondary r0                                    //server1的操作

server2上操作

[[email protected] drbd.d]# drbdadm primary r0                     //server2的操作

[[email protected] drbd.d]# mount /dev/drbd0 /mysqldata          //server2的操作

[[email protected] drbd.d]# service mysqld start                      //server2的操作

[[email protected] drbd.d]# ls /mysqldata/mysql/                             //server2的操作

crushlinux ibdata1 ib_logfile0 ib_logfile1 mysql test

配置 heartbeat :

配置ha.cf文件(主从大体一致)

[[email protected] ~]# cd /usr/share/doc/heartbeat-3.0.4/

[[email protected] heartbeat-3.0.4]# cp ha.cf authkeysharesources /etc/ha.d/

[[email protected] heartbeat-3.0.4]# cd /etc/ha.d/

[[email protected] ha.d]# vim ha.cf

29 logfile /var/log/ha-log

34 logfacility local0

48 keepalive 2                                                                          //多长时间检测一次

56 deadtime 10                                                                       //连续多长时间联系不上后认为对方挂掉(秒)

61 warntime 5                                                                          //连续多长时间联系不上开始警告提示

71 initdead 100                                                                       //主要是给重启后预留的一段忽略时间

76 udpport 694                                                                       //UDP端口

121 ucast eth0 192.168.200.102                                        //填写对方 IP (主从的差异点)

157 auto_failback on                                                            //节点修复后是否切换回来

211 node server1                                                                   //节点名称

212 node server2                                                                   //节点名称

253 respawn hacluster /usr/lib64/heartbeat/ipfail   //控制 IP切换的程序

配置hasresources件(主从一致)

[[email protected] ha.d]# vim haresources

server1 IPaddr::192.168.200.254/24/eth0:0 drbddisk::r0    

Filesystem::/dev/drbd0::/mysqldata::ext4 mysqld               //注意是一行内容

[[email protected] ha.d]# ln -s /etc/init.d/mysqld /etc/ha.d/resource.d/mysqld

server1IPaddr::192.168.200.254/24/eth0      #主机名,后跟虚拟IP地址、接口

drbddisk::r0                                                                #管理drbd资源

Filesystem::/dev/drbd0::/mysqldata::ext4mysqld   #文件系统,目录及格式,后跟nfs资源脚本

配置authkeys文件(主从一致)

[[email protected] ha.d]# vim authkeys

23 auth 1

24 1 crc

[[email protected] ha.d]# chmod 600 authkeys

HA验证:

主从节点启动heartbeat

[[email protected] ha.d]# service heartbeat start

 

查看主节点VIP  是否存在

[[email protected] ha.d]# ip a  // 需要等待 10 

inet 192.168.200.254/24 brd 192.168.200.255 scopeglobal secondary eth0:0

验证:先停掉server1上的heartbeat服务,查看 VIP是否能转移

此时 server2 上的mysql服务是关闭的

server1

[[email protected] ha.d]# mysqladmin -uroot ping                            //备节点操作

mysqladmin: connect to server at ‘localhost‘ failed

error: ‘Can‘t connect to local MySQL server throughsocket ‘/var/lib/mysql/mysql.sock‘ (2)‘

Check that mysqld is running and that the socket:‘/var/lib/mysql/mysql.sock‘ exists!

server2

[[email protected] ha.d]# service heartbeat stop                      //主节点操作

Stopping High-Availability services: Done.

[[email protected] ha.d]# ip a                                                           //备节点操作

inet 192.168.200.254/24 brd 192.168.0.255 scope globalsecondary eth0:0

[[email protected] ha.d]# mysqladmin -uroot ping                   //备节点操作,发现 mysql随之启动

Mysqld is alive

此时还不具备停掉mysql后VIP漂移的功能,需要添加脚本实现,当发现mysql 服务出现挂掉,就停掉heartbeat服务,实现 VIP转移(双方都要在后台执行)

[[email protected] ~]# vim chk_mysql.sh

#!/bin/bash

mysql="/etc/init.d/mysqld"

mysqlpid=$(ps-C mysqld --no-header | wc -l)

whiletrue

do

if [$mysqlpid -eq 0 ];then

$mysqlstart

sleep 3

mysqlpid=$(ps-C mysqld --no-header | wc -l)

if [$mysqlpid -eq 0 ];then

/etc/init.d/heartbeatstop

echo"heartbeat stopped,please check your mysql !" | tee -a

/var/log/messages

fi

fi

done

[[email protected] ha.d]# bash chk_mysql.sh &

[[email protected] ha.d]# echo “bash chk_mysql.sh &”>> /etc/rc.local

配置主从复制

保持时间同步(主从都要配)

[[email protected] ~]# crontab –e

*/10 * * * * ntpdate time.nist.gov

 

修改四台数据库主机的配置文件(注意server_id不要一样)开启binlog日志

[[email protected]~]# 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

重启服务

[[email protected] ~]# /etc/init.d/mysqld restart

停止 mysqld:                                              [确定]

正在启动 mysqld:                                          [确定]

在serve1上授权,允许从服务器同步,查看主服务器的binlog

[[email protected] ~]# 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和节点健康检查

在主节点上操作

[[email protected] ~]# yum -y install keepalived

[[email protected] ~]# cd /etc/keepalived/

[[email protected] ~]# cp keepalived.confkeepalived.conf.bak

[[email protected] ~]# vim keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

    [email protected]

    [email protected]

    [email protected]

   }

notification_email_from [email protected]

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 {

    [email protected]

    [email protected]

    [email protected]

   }

notification_email_from [email protected]

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

        }

}

}

编写脚本,配置从数据库(主从都要做)

[[email protected]~]# 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

 

[[email protected]~]# 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

 [[email protected]~]# 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

[[email protected] keepalived]# /etc/init.d/keepalivedstart

正在启动 keepalived:                                      [确定]

安装ipvsadm用于查看节点记录(主从节点都要配置)

[[email protected] ~]# yum -y install ipvsadm

[[email protected] ~]# 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

[[email protected] ~]#/etc/init.d/ipvsadm save

[[email protected] ~]#/etc/init.d/ipvsadm restart

验证

验证主主切换是否同步从数据库

server1上关闭heartbeat

[[email protected] ~]# 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上查看连接信息

 [[email protected]~]# watch ipvsadm -Lnc           //实时查看远程连接信息

-c (--connection) 显示LVS目前的连接信息

在其他主机通过VIP进行连接测试

 [[email protected]]# mysql -umydb -h192.168.200.100 -p123456 -e ‘show databases;‘

+--------------------+

| Database          |

+--------------------+

| information_schema |

| mysql             |

| slave1             |

| test              |

+--------------------+

查看主lvs信息,等第一次连接断开再测试。

[[email protected] keepalived]# mysql -umydb-h192.168.200.100 -p123456 -e ‘show databases;‘

+--------------------+

| Database          |

+--------------------+

| information_schema |

| mysql             |

| slave2             |

| test              |

+--------------------+

时间: 2025-01-01 20:50:11

MySQL+Heartbeat+DRBD+LVS+keepalived实现数据库高可用群集的相关文章

LVS+Keepalived+Nginx+Tomcat高可用集群搭建(转)

LVS+Keepalived+Nginx+Tomcat高可用集群搭建 最近公司重整架构,十几台服务器而且还要尽可能节约成本.我就谷歌了一下在几种集群之前进行比较最终采用了Keepalived+Nginx做负债均衡高可用.虽然之前也研究过集群,看过很多集群方面的原理和架构,但毕竟没有真正操作过以下案例是在虚拟机中完成实验其实对于高可用搭建来说只用给出Keepalived和Nginx的配置即可后面的一些安装搭建完全是本人项目需要可以不用理睬仅供参考. 本文只是实验搭建记录方便以后在服务器中实施搭建.

LVS+Keepalived搭建MyCAT高可用负载均衡集群

LVS+Keepalived 介绍 LVS LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.目前有三种IP负载均衡技术(VS/NAT.VS/TUN和VS/DR),十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq). Keepalvied Keepalived在这里主要用作RealServer的健康状态检查以及Mast

利用lvs keepalived配置redis高可用及负载均衡

需求 我们用ES做日志服务,架构是 上游数据来源=>redis=>logstash=>ES redis目前还是单点, 没有做高可用, 现在数据量越来越多, 如果下游消费不出问题还好, redis里面数据来了就走,但是下游一旦出问题, 分给redis的内存半小时就撑满了. 看到redis3.0 beta版本已经提供了集群功能, 但是需要client以集群模式接入, 我们这么多上游用户, 不太可能统一要求他们改造. 公司也有硬件的LB, 同事在E公司的时候就是用的硬件LB. 但接入还要申请,

LVS+KeepAlived,RabbitMQ高可用负载均衡

最近团队准备对项目进行重构,其中用到了RabbitMQ,也考虑了几个方案,下边着重介绍在项目中即将采用的方案.关于RabbitMQ就不在这里详细说明,具体查看 RabbitMQ中文手册.直接看架构图: 如图所示: 前端采用keepalived+lvs实现高可用负载均衡, RabbitMQ HA 队列(镜像队列)进行消息队列结构复制.本方案中搭建两个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务.任务处理进程同时监控

inotify+rsync+mysql主主复制+keepalived实现zabbix高可用

思路:主备机通过inotify+rsync实现文件同步,通过mysql主主复制实现数据同步,同一时刻只有一台服务器能对外提供zabbix服务,web端登陆虚ip访问,被监控主机通过配置虚ip来完成监控. 配置: 主机 ip 操作系统 zabbix版本 mysql版本 inotify版本 rsync版本 备注 zabbix-server01 172.27.9.80 Centos7.3.1611 zabbix_server (Zabbix) 3.4.10 5.7.22 3.14 3.1.2 关闭防火

LVS+Keepalived负载均衡高可用如此简单?

今天简单写下lvs+keepalive实现负载均衡和高可用的功能,仅供参考!关于它们的详细介绍这里就不描述了,大家可以自行搜索下! lvs+keepalived网络拓扑图: 一.准备一个vip和4台虚拟机: vip:192.168.1.100 向外提供服务的ip,一般是绑定域名的 192.168.1.10 LB1_master调度器IP 192.168.1.13  LB2_slave调度器IP 192.168.1.11 nginx服务器IP 192.168.1.12  apache服务器IP 二

lvs + keepalived + nginx + tomcat高可用负载反向代理服务器配置(一) 简介

一. 为什么这样构架 1. 系统高可用性 2. 系统可扩展性 3. 负载均衡能力 LVS+keepalived能很好的实现以上的要求,LVS提供负载均衡,keepalived提供健康检查,故障转移,提高系统的可用性!采用这样的架构以后 很容易对现有系统进行扩展,只要在后端添加或者减少realserver,只要更改lvs的 配置文件,并能实现无缝配置变更!nginx提供反向代理,而tomcat则提供web服务. 二.LVS LVS是Linux Virtual Server的简写,意即Linux虚拟

lvs + keepalived + nginx 实现高可用

1.目的 lvs是四层的负载均衡,keepalived为lvs提供高可用服务,同时检查后端nginx的健康状态,nginx主要用来做七层的负载均衡 2.拓扑图 服务器 IP地址 说明 Director主节点 192.168.3.105 lvs keepalived Director备节点 192.168.3.104 lvs keepalived Real server1: 192.168.3.106:89 nginx Real server1: 192.168.3.107:89 nginx vi

LVS+keepalived 实现web高可用负载均衡集群

1.实验环境 4台CentOS-7.5虚拟机web-1:192.168.18.103web-2:192.168.18.104keepalived-1(LVS-DR模式):192.168.18.107 keepalived-2(LVS-DR模式):192.168.18.108 vip:192.168.18.110其中keepalived和lvs安装在同一台机器,web单独一台安装客户端为:个人win10笔记本(192.168.18.102)4台虚机防火墙和selinux均已关闭 2.安装keepa