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="[email protected]"
#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 [email protected] 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)、测试
略