Haproxy+Mysql Replication 负载均衡架构

《方案配置》
web服务器:
ha1 :10.10.10.108
ha2 :10.10.10.109
mysql服务器:
ha3 :10.10.10.110 //主库写
ha4 :10.10.10.130 //从库读
Haproxy服务器:
ha5 :10.10.10.140
Mysql-Proxy服务器:
ha6 :10.10.10.150
所有服务器安装依赖库
yum -y install yum-fastestmirror gcc gcc-c++ gcc-g77 flex bison libtool
libtool-libs autoconf kernel-devel libjpeg libjpeg-devel libpng libpng-devel
libpng10 libpng10-devel gd gd-devel freetype freetype-devel libxml2
libxml2-devel zlib zlib-devel glib2 glib2-devel bzip2 bzip2-devel libevent
libevent-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel
krb5 krb5-devel libidn libidn-devel openssl openssl-devel vim-minimal nano
gettext gettext-devel
准备:所有服务器设置SSH无密码登陆。
1. 创建公钥信息:
#ssh-keygen -t rsa
Generating public/private rsa key
pair.
Enter file in which to save the key (<UseHome>/.ssh/id_rsa):Enter passphrase (empty for no passphrase):
Enter same passphrase again:Your identification has been saved in <UseHome>/.ssh/id_rsa.
Your
public key has been saved in <UseHome>.ssh/id_rsa.pub.
The key
fingerprint is:
ba:2c:77:eb:6d:aa:aa:d8:37:08:2f:b1:b9:e8:5a:2f
<UseName>@<HostName>

输入后,会提示创建.ssh/id_rsa、id_rsa.pub的文件,其中第一个为密钥,第二个为公钥。过程中会要求输入密码,为了ssh访问过程无须密码,可以直接回车
2. 复制密匙
#cat id_dsa.pub >> ~/.ssh/authorized_keys
#chmod 600
~/.ssh/authorized_keys
#scp -r ~/.ssh <HostName>:/root/
一、web服务器安装
1、安装lnmp环境
2、设置目录实时同步
实现功能:当用户在本地客户端某目录内建立、修改、删除目录或文件、修改目录或文件的属性,只要执行同步脚本,rsync就会自动找出有改动或删除的数据,将其传送到服务器上,使服务器端某目录内的数据跟本地客户端某目录内的数据保持一致。2.1、服务器端——Ha1、Ha2,设置:
2.1.1:创建用户和组
#groupadd www -g 48
#useradd -u 48 -g www www
#chmod +w
/home/wwwroot
#chown www:www /home/wwwroot
2.1.2:分别安装inotify-tools-3.14
# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# tar zxvf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure
# make && make install
# cp /root/inotify-tools-3.14/src/inotifywait /usr/local/bin/
#如无法运行inotifywait,执行此行
2.1.3:编辑rsync的配置文件
#vi /etc/rsyncd.conf
输入以下内容:
=================================
uid=www
gid=www
max connections=10
use chroot=no
log
file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock
file=/var/run/rsyncd.lock
[myweb]
path=/home/wwwroot
comment =
mywebs
ignore errors
read only = no
hosts allow=ha1 ha2
================================
2.1.4:启动rsync服务器端
#/usr/bin/rsync –daemon
2.2、推送端——Ha1、Ha2,设置:
2.2.1:创建一个shell脚本push.sh
# vi push.sh
ha1为被推送目标服务器脚本放在ha2上,myweb为服务器端rsyncd.conf配置文件中的模块名
ha2为被推送目标服务器时,脚本放在ha1上。分别为ha1、ha2建立推送脚本。
========================================
#!/bin/sh
SRC=/home/wwwroot/
DST=ha2::myweb/
#在ha2上改为ha1::myweb/
INWT=/usr/local/bin/inotifywait
RSYNC=/usr/bin/rsync
EXCDIR=”data/”
#排除目录
$INWT -mrq -e create,move,delete,modify $SRC | while
read D E F;do
$RSYNC -vzrtopg –delete –exclude $EXCDIR $SRC $DST >
/dev/null
done
========================================2.2.2:赋予push.sh执行权限
#chmod +x ./push.sh
#echo “/root/push.sh &” >> /etc/rc.local //加入自启动
二、mysql服务器安装
1、安装mysql-5.1.48.tar.gz
#yum install ncurses-devel.i386
#tar -zxvf mysql-5.1.48.tar.gz
#cd mysql-5.1.48/
#./configure
–prefix=/usr/local/mysql –with-extra-charsets=all –enable-thread-safe-client
–enable-assembler –with-charset=utf8 –enable-thread-safe-client
–with-extra-charsets=all –with-big-tables –with-readline –with-ssl
–with-embedded-server –enable-local-infile
#make && make
install
#cd ../
#groupadd mysql
#useradd -g mysql mysql
#cp
/usr/local/mysql/share/mysql/my-medium.cnf
/etc/my.cnf
#/usr/local/mysql/bin/mysql_install_db –user=mysql
#chown -R
mysql /usr/local/mysql/var
#chgrp -R mysql /usr/local/mysql/.
#cp
/usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
#chmod 755
/etc/init.d/mysql
#chkconfig –level 345 mysql on
#echo
“/usr/local/mysql/lib/mysql” >> /etc/ld.so.conf
#echo “/usr/local/lib”
>>/etc/ld.so.conf
#ldconfig
#ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
#ln -s
/usr/local/mysql/include/mysql /usr/include/mysql
#/etc/init.d/mysql
start
#/usr/local/mysql/bin/mysqladmin -u root password $mysqlrootpwd
#/etc/init.d/mysql restart
#/etc/init.d/mysql stop
#chkconfig
mysql-ndb off
#chkconfig mysql-ndb-mgm off
2、配置Mysql Replication主从库
2.1 连接到主库创建 replication 的用户
mysql> grant
replication slave on *.* to
‘rep’@’slave’ identified by
‘111111’;
2.2 配置主库 10.10.10.110
# vi /etc/my.cnf其他不变,修改 Replication Master 部分======================================
# Replication Master Server
(default)
log-bin = mysql-bin //启用二进制日志
binlog_format= mixed //二进制日志格式

server-id = 1 //主库 ID 号
binlog-do-db=data //需要同步的二进制数据库名

binlog-ignore-db=mysql //不同步的二进制数据库名;这个同步后听说很麻烦

log-bin=/var/log/mysql/updatelog //设定生成的 log 文件名
log-slave-updates
//把更新的记录写到二进制文件中
slave-skip-errors //跳过错误,继续执行复制

=======================================

2.3 配置从库 10.10.10.130
#
vi /etc/my.cnf

注释 master 部份,改变# Replication Slave 这部分,
=======================================
# Replication Slave (comment out
master section to use this)
server-id = 2 //服务的唯一 ID 号
master-host = ha3
//master 的 hostname
master-user = rep //master 建立的 replication 用户名master-password = 111111 //master 建立的 replication 用户的密码
master-port =
3306 //master 端口号
master-connect-retry = 60 //如果发现主服务器断线,重新连接的时间差log-bin = mysql-bin //启用二进制日志
replicate-ignore-db = mysql //不需要备份的数据库

replicate-do-db = rep //要同步的库
# replicate-do-db = test
//要同步的数据库名,如果有多个数据库就写多条
log-slave-update
slave-skip-errors

=======================================2.4 备份主库的数据文件到从库
锁住主库的
table,以便备份数据文件到从库进行初始化
mysql> flush tables with read
lock;

Query OK, 0 rows affected (0.00 sec)显示主库状态,注意记下当前二进制日志文件名和 position
mysql> show
master status;

+——————+———-+————–+——————+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+——————+———-+————–+——————+
|
mysql-bin.000001 | 98 | | |

+——————+———-+————–+——————+
1 row
in set (0.00 sec)

将主库 datadir 目录下的数据文件打包复制到从库的 datadir 目录下。
# tar zcvf data169.tar.gz
/var/lib/mysql
2.5 连接到从库进行配置
A. 验证从从库连接到主库;
# /usr/local/mysql/bin/mysql -h
10.10.10.110 -u rep -pB. 停止从库的 slave;
mysql>
STOP SLAVE;

Query OK, 0 rows affected (0.00 sec)mysql> CHANGE MASTER TO
-> MASTER_HOST=’master’,

-> MASTER_USER=’rep’,
-> MASTER_PASSWORD=’111111′,
->
MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=98;

Query OK, 0 rows affected (0.01 sec)
注意到这里 master_log_file 和
master_log_pos 就是前面 show master status 的结果。

C. 在从库上启动复制进程
mysql> start slave;
Query OK, 0 rows affected (0.00
sec)

2.6 主库开表锁
至此配置基本完成,在主库解开 table 的锁定
mysql> unlock tables;
Query OK, 0 rows affected
(0.00 sec)
三、Haproxy服务器安装
1、编译haproxy-1.3.20.tar.gz
# wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz
# tar zcvf -1.3.20.tar.gz
# cd haproxy-1.3.20
# make TARGET=linux26 PREFIX=/usr/local/haprpxy install
安装完毕后,进入安装目录创建配置文件
# cd /usr/local/haproxy
# mkdir conf
# mkdir logs
# vi conf/haproxy.conf
========================================
global
log 127.0.0.1
local0
maxconn 4096
chroot /usr/local/haproxy
uid 99 #所属运行的用户uid
gid
99 #所属运行的用户组
daemon
nbproc 1
pidfile
/usr/local/haproxy/logs/haproxy.pid
#debug
#quiet
defaults
log global
log 127.0.0.1 local0 #日志文件的输出定向
mode http
#所处理的类别
option httplog #日志类别
option httpclose
option
dontlognull
option forwardfor
option redispatch
retries 2
maxconn 2000
balance roundrobin #负载均衡算法
stats uri /haproxy-stats
#haproxy 监控页面的访问地址
stats realm Haproxy\ statistics
stats auth
admin:123456
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen ha5 10.10.10.140:80 #运行的端口及主机名
mode http
option httpchk GET
/index.php #健康检测
server s1 10.10.10.108:80 weight 3 check #后端的主机 IP
&权衡
server s2 10.10.10.109:80 weight 3 check #后端的主机 IP &权衡
========================================
启动服务:
# /usr/local/haproxy/sbin/haproxy -f
/usr/local/haproxy/haproxy.conf
重启服务:
# /usr/local/haproxy/sbin/haproxy -f
/usr/local/haproxy/haproxy.conf -st `cat /usr/local/haproxy/logs/haproxy.pid`
(没有换行)
停止服务:
# killall haproxy
当然,为了方便系统在开机时加载,还可以创建启动脚本:
# vim /etc/rc.d/init.d/haproxy 内容如下:
========================================
#! /bin/sh
set
-ePATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.conf
PIDFILE=$PROGDIR/logs/$PROGNAME.pid
DESC=”HAProxy
daemon”
SCRIPTNAME=/etc/init.d/$PROGNAME# Gracefully exit if the
package has been removed.
test -x $DAEMON || exit
0

start()
{
echo -n “Starting $DESC: $PROGNAME”
$DAEMON -f
$CONFIG
echo “.”
}

stop()
{
echo -n “Stopping $DESC:
$PROGNAME”
haproxy_pid=cat $PIDFILE
kill $haproxy_pid
echo
“.”
}

restart()
{
echo -n “Restarting $DESC:
$PROGNAME”
$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
echo
“.”
}

case “$1”
in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo
“Usage: $SCRIPTNAME {start|stop|restart}” >&2
exit 1
;;
esac

exit 0

========================================
保存后赐予可执行权限
# chmod +x /etc/rc.d/init.d/haproxy
就可以使用 service haproxy start|stop|restart
来控制服务的启动停止跟重启。
并通过以下命令加载到开机服务启动列表
# chkconfig –add haproxy
配置日志:
# vim /etc/syslog.conf
在最下边增加
local0.* /var/log/haproxy.log
重启核心日志服务使配置起效
# service syslog restart
四、Mysql-Proxy服务器安装
1、安装所需依赖包
#yum -y install gcc gcc-c++ autoconf mysql-devel libtool
pkgconfig ncurses ncurses-devel
2、安装libevent-2.0.10版本
#wget http://monkey.org/~provos/libevent-2.0.10-stable.tar.gz
# tar zxvf libevent-2.0.10-stable.tar.gz
# cd
libevent-2.0.10-stable
# ./configure
# make && make install
3、安装glib-2.18.4版本
#wget http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz
# tar zxvf glib-2.18.4.tar.gz
# cd glib-2.18.4
#
./configure
# make && make install
4、安装readline 6.1
#wget ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz
#
tar readline-6.1.tar.gz
# cd readline-6.1.tar.gz
# ./configure
#
make && make install
# ldconfig //应用ldconfig
5、安装lua-5.1.4
#wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
# tar lua-5.1.4.tar.gz
# cd lua-5.1.4
/**************64位系统,需在CFLAGS里加上-fPIC***************/
#
vi src/Makefile
CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS)
# make linux
#
make install
/**************设置pkg-config
环境变量***************/
# cp etc/lua.pc /usr/local/lib/pkgconfig/# export
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

6、安装mysql-proxy-0.8.1
# tar zxvf mysql-proxy-0.8.1.tar.gz
# cd
mysql-proxy-0.8.1
# ./configure
# make && make install
7、设置mysql-proxy开机启动,先下载写好的服务脚本:
#wget http://customcode.googlecode.com/files/mysql-proxy
#
cp mysql-proxy /etc/init.d/
# chmod 755 /etc/init.d/mysql-proxy
#
chkconfig mysql-proxy on
/*****下载的mysql-proxy启动文件是dos格式,需转换成unix********/
#
vi /etc/init.d/mysql-proxy
:set ff=unix
/****************建立参数文件*******************/
# vi
/etc/sysconfig/mysql-proxy
================================
# Options to mysql-proxy
# do not
remove –daemon
# 其他参数添加在–daemon后面
PROXY_OPTIONS=”–daemon
–admin-address=:4041 –admin-username=admin –admin-password=*****
–admin-lua-script=/usr/local/lib/mysql-proxy/lua/admin.lua
–proxy-address=:4040 –proxy-backend-addresses=10.10.10.110:3306
–proxy-read-only-backend-addresses=10.10.10.130:3306
–proxy-lua-script=/usr/local/share/doc/mysql-proxy/rw-splitting.lua”
================================
启动脚本解释:
–daemon 采用daemon方式启动
–admin-address=:4041 指定mysql
proxy的管理端口,在这里,表示本机的4041端口
–admin-username=admin 管理地址用户名
–admin-password=***** 管理地址登陆密码
–proxy-address=:4040 指定mysql
proxy的监听端口,可以用 127.0.0.1:4040表示
–proxy-backend-addresses=10.10.10.110:3306
指定mysql主机的端口
–proxy-read-only-backend-addresses=10.10.10.130:3306
指定只读的mysql主机端口
(可以指定多条记录)
–proxy-lua-script=/usr/local/share/doc/mysql-proxy/rw-splitting.lua
指定lua脚本,在这里,使用的是rw-splitting脚本,用于读写分离

整个方案的特点是:

本BLOG系统用于学习交流用,限于服务器硬件设备的限制,本方案中使用的机器为虚拟机;每台虚拟机配置均为:2cpu/256m/10G,CPU性能不高,以本方案测试结果为:最大承受100个并发连接。

1. 利用haproxy进行负载均衡,将请求队列分发到108、109服务器上,均衡规则为权重轮询。

2.
108与109为web服务器,它将接收和反馈来自client的请求,在负载均衡基础上,必须保证两服务器之间的数据一致同步,这里我使用了Rsync工具,在108与109上分别安装Rsync服务器。再配置同步脚本push.sh,相互同步。push会对本机web目录进行监视,若有文件进行了新的修改,push会立即作出响应将文件增量更新到异机上。它对于一般数据量不大的文件同步速度还是相当快的。

3.
利用mysql-proxy将主数据库110和从数据库130进行读写分离,可强化mysql数据的并发承受能力。mysql-proxy是一个轻量级的mysql数据库代理服务器,主要针对mysql
replication架构进行读写分离的中间件。

4. 110与130为mysql
replication主从库架构,这个实时复制的方案已经应用得很广泛。mysql-proxy架构能将sql指令请求进行分析,如果sql
行为为insert、delete、update等操作,它便会转发到主库上去,而select、show等,它即转发到从库上去,这样便很好地解决读写分离,降低数据同步异常的情况。该架构缺点是容易发生单点故障,当主库宕机时,从库无法自动接管主库服务。为解决这种先天的不足,在mysql
master库上可以加做HA高可用性架构,这样就可解决发生单点的可能。

赞(0)
未经允许不得转载:运维军团 » Haproxy+Mysql Replication 负载均衡架构

评论 抢沙发

*

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址