通过lvs+heartbeat实现对mysql的负载均衡高可用

时间:2021-09-07 22:22:28

1、摘要

本文主要通过lvs+heartbeat实现对mysql的负载均衡高可用。

keepalived是基于主机或网络服务的高可用方式,目的是用户service的双机。


2、安装

1)、软件包准备

ipvsadm-1.26.tar.gz

mysql-5.5.28.tar.gz

cmake-2.8.11.2.tar.gz

heartbeat-2.0.8.tar.gz

libnet-1.1.2.1.tar.gz


2)、配置Director Server

a、检查kernel是否已经支持LVS的ipvs模块

# modprobe -l |grep ipvs

kernel/net/netfilter/ipvs/ip_vs.ko

kernel/net/netfilter/ipvs/ip_vs_rr.ko

kernel/net/netfilter/ipvs/ip_vs_wrr.ko

kernel/net/netfilter/ipvs/ip_vs_lc.ko

kernel/net/netfilter/ipvs/ip_vs_wlc.ko

kernel/net/netfilter/ipvs/ip_vs_lblc.ko

kernel/net/netfilter/ipvs/ip_vs_lblcr.ko

kernel/net/netfilter/ipvs/ip_vs_dh.ko

kernel/net/netfilter/ipvs/ip_vs_sh.ko

kernel/net/netfilter/ipvs/ip_vs_sed.ko

kernel/net/netfilter/ipvs/ip_vs_nq.ko

kernel/net/netfilter/ipvs/ip_vs_ftp.ko

kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko


b、在Director Server中安装LVS

# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux#解决ipvsadm找不到内核

# yum install -y libnl*

# yum install -y popt*

# rpm -ivh popt-static-1.13-7.el6.x86_64.rpm#前三步是解决安装ipvsadm-1.26报错的软件包

# tar zxvf ipvsadm-1.26.tar.gz

# cd ipvsadm-1.26

# make

# make install

# ipvsadm --help#出现ipvsadm帮助提示表示ipvsadm已经安装成功


c、在Director Server中配置VIP,route、路由转发等

vim /etc/init.d/lvsDR

#!/bin/sh

# description: Start LVS of Director server

VIP=10.0.2.200

chmod 755 /etc/rc.d/init.d/functions

/etc/rc.d/init.d/functions

case "$1" in

    start)

# set the Virtual IP Address and sysctl parameter

/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add -host $VIP dev eth0:0

echo "1" >/proc/sys/net/ipv4/ip_forward 

;;

    stop)

        echo "0" >/proc/sys/net/ipv4/ip_forward

/sbin/route del -host $VIP dev eth0:0

        /sbin/ifconfig eth0:0 down

        ;;

    *)

        echo "Usage: $0 {start|stop}"

        exit 1

esac

# chmod 755 /etc/init.d/lvsDR

# /etc/init.d/lvsDR start


d、在Director Server中安装heartbeat

# tar zxvf libnet-1.1.2.1.tar.gz

# cd libnet

# ./configure

# make && make install

# yum install -y libxml2 libxml2-devel bzip2-devel glib2-devel libtool-ltdl-devel libxslt-devel ncurses-devel swig

# groupadd -g 694 haclient

# useradd -u 694 -g haclient hacluster

# tar zxvf heartbeat-2.0.8.tar.gz

# cd heartbeat-2.0.8

# ./ConfigureMe configure --enable-fatal-warnings=no --disable-swig --disable-snmp-subagent LIBS='/lib/libuuid.so.1' #如果是64为则为LIBS='/lib64/libuuid.so.1'

# make 

# make install

# cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/

# cp ldirectord/ldirectord.cf /etc/ha.d/

# 在编辑安装heartbeat过程中可能出现如下错误

错误1:

pils.c:245: warning: initialization from incompatible pointer type

pils.c:246: warning: initialization from incompatible pointer type

gmake[2]: *** [pils.lo] Error 1

gmake[2]: Leaving directory `/usr/local/src/heartbeat-2.0.4/lib/pils'

gmake[1]: *** [all-recursive] Error 1

gmake[1]: Leaving directory `/usr/local/src/heartbeat-2.0.4/lib'

make: *** [all-recursive] Error 1

参考README里的方法:gmake DESTDIR="$PWD/heartbeat-2.0.4/=inst" distcheck后出现下面的错误

PIC -o .libs/pils.o

../../../lib/pils/pils.c:245: warning: initialization from incompatible pointer type

../../../lib/pils/pils.c:246: warning: initialization from incompatible pointer type

gmake[3]: *** [pils.lo] Error 1

gmake[3]: Leaving directory `/usr/local/src/heartbeat-2.0.4/heartbeat-2.0.4/_build/lib/pils'

gmake[2]: *** [all-recursive] Error 1

gmake[2]: Leaving directory `/usr/local/src/heartbeat-2.0.4/heartbeat-2.0.4/_build/lib'

gmake[1]: *** [all-recursive] Error 1

gmake[1]: Leaving directory `/usr/local/src/heartbeat-2.0.4/heartbeat-2.0.4/_build'

gmake: *** [distcheck] Error 2

解决办法:

./ConfigureMe configure --enable-fatal-warnings=no

./ConfigureMe make --enable-fatal-warnings=no

用这种方法能编译了


错误2:

cc1: warningsbeing treated as errors

pils.c:245:error: initialization fromincompatible pointer type

pils.c:246:error: initialization fromincompatible pointer type

gmake[2]: ***[pils.lo] Error 1

gmake[2]:Leaving directory`/root/heartbeat-2.0.7/lib/pils'

gmake[1]: ***[all-recursive]Error 1

gmake[1]:Leaving directory`/root/heartbeat-2.0.7/lib'

make: ***[all-recursive] Error 1

解决方法将/root/heartbeat-2.0.7/lib/pils里的makefile中的所有-Werror删除


错误3:

cc1: warningsbeing treated as errors

client_lib.c:1850:error: 'display_orderQ'defined but not used

gmake[2]: ***[client_lib.lo]Error 1

gmake[2]:Leaving directory`/root/heartbeat-2.0.7/lib/hbclient'

gmake[1]: ***[all-recursive]Error 1

gmake[1]:Leaving directory`/root/heartbeat-2.0.7/lib'

make: ***[all-recursive] Error 1

解决方法将/root/heartbeat-2.0.7/lib/hbclient里的makefile中的所有-Werror删除



错误4:

cc1: warningsbeing treated as errors

stonith_signal.h:34:error:'stonith_signal_set_simple_handler' defined but not used

gmake[4]: ***[apcmaster.lo]Error 1

gmake[4]:Leaving directory`/root/heartbeat-2.0.7/lib/plugins/stonith'

gmake[3]: ***[all-recursive]Error 1

gmake[3]:Leaving directory`/root/heartbeat-2.0.7/lib/plugins/stonith'

gmake[2]: ***[all-recursive]Error 1

gmake[2]:Leaving directory`/root/heartbeat-2.0.7/lib/plugins'

gmake[1]: ***[all-recursive]Error 1

gmake[1]:Leaving directory`/root/heartbeat-2.0.7/lib'

make: ***[all-recursive] Error 1

解决方法:

将/root/heartbeat-2.0.7/lib/plugins/stonith里的makefile中的所有-Werror删除


错误5:

cc1: warningsbeing treated as errors

conf_lex.c:1195:Error:‘input’定义后未使用

gmake[2]: ***[recoverymgrd-conf_lex.o]Error 1

gmake[2]:Leaving directory`/root/heartbeat-2.0.7/telecom/recoverymgrd'

gmake[1]: ***[all-recursive]Error 1

gmake[1]:Leaving directory `/root/heartbeat-2.0.7/telecom'

make: ***[all-recursive] Error 1

解决方法:

将/root/heartbeat-2.0.7/telecom/recoverymgrd里的makefile中的所有-Werror删除


安装成功标志信息:

结束后出现

chown hacluster/var/lib/heartbeat/cores/hacluster

chmod700/var/lib/heartbeat/cores/hacluster

gmake[2]:Nothing to be done for`install-data-am'.

gmake[2]:Leaving directory`/root/heartbeat-2.0.7'

gmake[1]:Leaving directory`/root/heartbeat-2.0.7'

则证明安装成功


e、在Director Server中配置heartbeat

# vim /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

TYPE=Ethernet

BOOTPROTO=none

IPADDR=10.1.1.1

PREFIX=24

# service network restart


# 配置主配置文件

# mv /etc/ha.d/ha.cf /etc/ha.d/ha.cf.bak

# vim /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log#指名heartbeat的日志存放位置

#crm yes#是否开启Cluster Resource Manager(集群资源管理)功能。

bcast eth1#指明心跳使用以太网广播方式,并且是在eth1接口上进行广播。

keepalive 2#指定心跳间隔时间为2秒(即每两秒钟在eth1上发送一次广播)。

deadtime 30#指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服务资源。

warntime 10#指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务。

initdead 120#在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。

udpport 694#设置广播通信使用的端口,694为默认使用的端口号。

baud 19200#设置串行通信的波特率。

serial /dev/ttyS0#选择串行通信设备,用于双机使用串口线连接的情况。如果双机使用以太网连接,则应该关闭该选项。

#ucast eth0 192.168.1.2#采用网卡eth0的udp单播来组织心跳,后面跟的IP地址应为双机对方的IP地址。

#mcast eth0 225.0.0.1 694 1 0#采用网卡eth0的Udp多播来组织心跳,一般在备用节点不止一台时使用。Bcast、ucast和mcast分别代表广播、单播和多播,是组织心跳的三种方式,任选其一即可。

auto_failback on#用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点,如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点。

#stonith baytech /etc/ha.d/conf/stonith.baytech# stonith的主要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性和完整性。  

#watchdog /dev/watchdog#该选项是可选配置,是通过Heartbeat来监控系统的运行状态。使用该特性,需要在内核中载入"softdog"内核模块,用来生成实际的设备文件,如果系统中没有这个内核模块,就需要指定此模块,重新编译内核。编译完成输入"insmod softdog"加载该模块。然后输入"grep misc /proc/devices"(应为10),输入"cat /proc/misc |grep watchdog"(应为130)。最后,生成设备文件:"mknod /dev/watchdog c 10 130" 。即可使用此功能。 

node    node.1#主节点主机名,可以通过命令“uanme �Cn”查看。

node    node.2#备用节点主机名。

ping 10.0.0.254#选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接。

respawn hacluster /usr/lib/heartbeat/ipfail #该选项是可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程遇到故障可以自动重新启动。最常用的进程是ipfail,此进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动ipfail进程的身份。如果系统为64为,那么路径为/usr/lib64/heartbeat/ipfail


# 配置资源文件

# mv /etc/ha.d/haresources /etc/ha.d/haresources.bak

# vim /etc/ha.d/haresources#MASTER和BACKUP此文件内容必须完全一致

node.1 IPaddr::10.0.2.200/24/eth0:0 ldirectord

# node.1是HA集群的主节点,IPaddr为heartbeat自带的一个执行脚步,heartbeat首先将执行/etc/ha.d/resource.d/IPaddr 10.0.2.200/24 start的操作,也就是虚拟出一个子网掩码为255.255.255.0,IP为10.0.2.200的地址,此IP为heartbeat对外提供服务的网络地址,同时指定此IP使用的网络接口为eth0:0,然后启动ldirectord服务。

# 配置认证文件

# vim /etc/ha.d/authkeys

auth 1

1 crc

#2 sha1 sha1_any_password

#3 md5 md5_any_password

# chmod 600 /etc/ha.d/authkeys


# 配置ldirectord.cf

# mv /etc/ha.d/ldirectord.cf /etc/ha.d/ldirectord.cf.bak

# vim /etc/ha.d/ldirectord.cf

# Global Directives

checktimeout=3#判定real server出错的时间间隔。

checkinterval=1#指定ldirectord在两次检查之间的间隔时间。

#fallback=127.0.0.1:80#当所有的real server节点不能工作时,web服务重定向的地址。

autoreload=yes#是否自动重载配置文件,选yes时,配置文件发生变化,自动载入配置信息。

logfile="/var/log/ldirectord.log"#设定ldirectord日志输出文件路径。

#logfile="local0"

#emailalert="admin@x.y.z"

#emailalertfreq=3600

#emailalertstatus=all

quiescent=yes#当选择no时,如果一个节点在checktimeout设置的时间周期内没有响应,ldirectord将会从LVS的路由表中直接移除real server,此时,将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,如果选择为yes,当某个real server失效时,ldirectord将失效节点的权值设置为0,新的连接将不能到达,但是并不从LVS路由表中清除此节点,同时,连接跟踪记录和程序连接模板仍然保留在Director上。

#Sample configuration for a MySQL virtual service.

virtual = 10.0.2.200:3306 #指定虚拟的IP地址和端口号,注意,在virtual行后面的行必须缩进4个空格或以一个tab字符进行标记。

real=node.3->node.4:3306 gate 10#指定Real Server服务器地址和端口,同时设定LVS工作模式,用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。

#fallback=127.0.0.1:3306

service=mysql#指定服务的类型,

scheduler=rr#指定调度算法

#persistent=600

#netmask=255.255.255.255

protocol=tcp#指定协议的类型

checkport=3306#指定监控的端口号。

checktype=connect#指定Ldirectord的检测类型

login="mysql"

passwd="123456"

database="cluster"

request="SELECT * FROM test"


# 配置BACKUP节点同MASTER一样,并且设置时间同步,参考“搭建配置NTP服务器”一文


# /etc/init.d/heartbeat start

# ipvsadm #查看real server 和权值不为0

# ifconfig #查看有没有加载eth0:0 VIP


3)、配置Real Server

a、mysql的安装以及主从配置参考“MySQL同步复制”一文


b、配置vip和arp

# vim /etc/init.d/lvsrs

#!/bin/bash

#description : Start Real Server 

VIP=10.0.2.200

/etc/rc.d/init.d/functions

case "$1" in

start)

echo " Start LVS  of  Real Server"

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.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

sysctl -p

;;

stop)

/sbin/ifconfig lo:0 down

/sbin/route del -host $VIP dev lo:0

echo "close LVS Director server"

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

;;

*)

        echo "Usage: $0 {start|stop}"

        exit 1

esac

# chmod 755 /etc/init.d/lvsrs

# /etc/init.d/lvsrs start


c、配置mysql,注意要在master数据库中配置

mysql> use mysql;

mysql> CREATE USER 'mysql'@'localhost' IDENTIFIED BY '123456';

mysql> grant all privileges on *.* to mysql@10.0.100.34 identified by '123456';   #允许10.0.100.34的mysql用户访问本数据库

mysql> flush privileges;

mysql> create database cluster;

mysql> use cluster

mysql> create table test(ename varchar(10));


4)、测试


本文出自 “kimileonis” 博客,请务必保留此出处http://kimileonis.blog.51cto.com/5531747/1545392