码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2017-07-10 22:16:30      阅读:446      评论:0      收藏:0      [点我收藏+]

标签:mysql、heartbeat、drbd、lvs、keepalived、数据库高可用

DRBD  概述

一、DRBD简介

         DRBD 的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD

是由内核模块和相关脚本而组成,用来构建数据的高可用性集群。其实现方式是通过网络来镜像整个磁盘设备(数据)。你可以把它看作是一种基于网络的 RAID1。它允许用户在远程机器上建立一个本地块设备的实时镜像。

二、DRBD工作原理

         (DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD

Secondary)。另一个主机再将数据存储到自己的磁盘中。目前,DRBD每次只允许对一个节

点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。

技术分享

三、DRBDHA的关系

         一个 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项目最成功的一个例子,在行业内得到了广泛的应用,这里分析的是2007118日发布的版本 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

配置过程:

技术分享

安装前准备配置:

所有主机需要添加一块60GSCSI接口硬盘

配置所有机器:

关闭防火墙和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.d/* /etc/ha.d/resource.d/

[root@server1 drbd]# cd /usr/local/drbd/etc/drbd.d/

[root@server1 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文件(主从一致)

[root@server1 drbd.d]# pwd

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

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

[root@server1 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

}

}

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

[root@server1 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;

}

}

 

[root@server1 drbd.d]# scp global_common.conf r0.res

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

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

[root@server1 drbd.d]# modprobe drbd

[root@server1 drbd.d]# lsmod | grep drbd

drbd 310268 0

libcrc32c 1246 1 drbd

[root@server1 drbd.d]# dd if=/dev/zero bs=1M count=1of=/dev/sdb1

[root@server1 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(主从节点都要执行)

[root@server1 drbd.d]# /etc/init.d/drbd start

Starting DRBD resources: [

create res: r0

prepare disk: r0

adjust disk: r0

adjust net: r0

]

........

[root@server1 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 -

[root@server2 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 -

手动验证主从切换:

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

[root@server1 drbd.d]# drbdadm -- --overwrite-data-of-peerprimary r0

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

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

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515build by root@bogon, 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上操作

[root@server1 drbd.d]# mkfs.ext4 /dev/drbd0

[root@server1 drbd.d]# mkdir /mysqldata

[root@server1 drbd.d]# mount /dev/drbd0 /mysqldata

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

[root@server1 ~]# umount /dev/drbd0

[root@server1 ~]# drbdadm secondary r0                                     // 主降为次

server2上操作

[root@server2 drbd.d]# drbdadm primary r0                      // 次升为主

[root@server2 drbd.d]# mkdir /mysqldata

[root@server2 drbd.d]# mount /dev/drbd0 /mysqldata

[root@server2 drbd.d]# ls /mysqldata                                   // 在备节点上查看数据

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

安装 MySQL

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

[root@server1 ~]# yum -y install mysql mysql-server

[root@server1 ~]# vim /etc/my.cnf

2datadir=/mysqldata/mysql

[root@server1 ~]# chown -R mysql.mysql /mysqldata

[root@server1 ~]# chkconfig mysqld on

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

解决方法:

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

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

进行数据库测试

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

[root@server2 ~]# umount /dev/drbd0

[root@server2 ~]# drbdadm secondary r0

 

server1 升为主节点

[root@server1 ~]# drbdadm primary r0

[root@server1 ~]# mount /dev/drbd0 /mysqldata

[root@server1 ~]# /etc/init.d/mysqld start

 

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

[root@server1 ~]# mysql

mysql> create database crushlinux;

Query OK, 1 row affected (0.00 sec)

mysql> exit

Bye

[root@server1 ~]# service mysqld stop                                           //server1的操作

[root@server1 ~]# umount /dev/drbd0                               //server1的操作

[root@server1 ~]# drbdadm secondary r0                                    //server1的操作

server2上操作

[root@server2 drbd.d]# drbdadm primary r0                     //server2的操作

[root@server2 drbd.d]# mount /dev/drbd0 /mysqldata          //server2的操作

[root@server2 drbd.d]# service mysqld start                      //server2的操作

[root@server2 drbd.d]# ls /mysqldata/mysql/                             //server2的操作

crushlinux ibdata1 ib_logfile0 ib_logfile1 mysql test

配置 heartbeat

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

[root@server1 ~]# cd /usr/share/doc/heartbeat-3.0.4/

[root@server1 heartbeat-3.0.4]# cp ha.cf authkeysharesources /etc/ha.d/

[root@server1 heartbeat-3.0.4]# cd /etc/ha.d/

[root@server1 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件(主从一致)

[root@server1 ha.d]# vim haresources

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

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

[root@server1 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文件(主从一致)

[root@server1 ha.d]# vim authkeys

23 auth 1

24 1 crc

[root@server1 ha.d]# chmod 600 authkeys

HA验证:

主从节点启动heartbeat

[root@server1 ha.d]# service heartbeat start

 

查看主节点VIP  是否存在

[root@server1 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

[root@server2 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

[root@server1 ha.d]# service heartbeat stop                      //主节点操作

Stopping High-Availability services: Done.

[root@server2 ha.d]# ip a                                                           //备节点操作

inet 192.168.200.254/24 brd 192.168.0.255 scope globalsecondary eth0:0

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

Mysqld is alive

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

[root@server1 ~]# 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

[root@server1 ha.d]# bash chk_mysql.sh &

[root@server1 ha.d]# echo “bash chk_mysql.sh &”>> /etc/rc.local

配置主从复制

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

[root@server1 ~]# crontab –e

*/10 * * * * 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 -h192.168.200.100 -p123456 -e ‘show databases;‘

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

| Database          |

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

| information_schema |

| mysql             |

| slave1             |

| test              |

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

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

[root@localhost keepalived]# mysql -umydb-h192.168.200.100 -p123456 -e ‘show databases;‘

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

| Database          |

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

| information_schema |

| mysql             |

| slave2             |

| test              |

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

 


本文出自 “微凉清风的博客” 博客,请务必保留此出处http://amunlinux.blog.51cto.com/13112118/1946055

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

标签:mysql、heartbeat、drbd、lvs、keepalived、数据库高可用

原文地址:http://amunlinux.blog.51cto.com/13112118/1946055

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!