双机热备+负载均衡线上方案(Heartbeat+DRBD+NFS+Keepalived+Lnmp)
我们下面来实现一个架构,heartbeat+drbd+nfs实现mysql和网站数据的同步,keepalived实现nginx的高可用,而用nginx和dns轮询实现负载均衡。架构说明目录规划/usr/local/src/lnmp:用来存放源码工具等等
/data:用来存放所有数据和NFS以及DRBD的挂载
/data/shell:用来存放所有管理脚本
/data/mysql:用来挂载DRBD的mysql资源,以供mysql存放数据库
/data/wwwnfs:用来挂载DRBD生成的www资源,以供两个节点挂载到各个节点的/data/www目录,以供论坛等程序数据使用
/data/www:用来挂载NFS资源,用来存放论坛(网站)等程序数据
拓扑工作原理内网:
1,DRBD网络存储创建出两个资源,一个mysql给mysql数据库同步用,一个www给web(论坛)数据NFS共享挂载用,虚拟出两个虚拟IP,一个是 192.168.1.100,用来连接数据库,一个是192.168.1.200,用来给节点挂载NFS
注意:NFS底下挂载了三次:DRBD挂载一次,文件系统挂载一次,客户端挂载一次
2,Heartbeat来实现DRBD的HA,同时虚拟出两个内网IP,并管理NFS,MySQL的启动和关闭
外网:
1,两个节点都用Nginx做均衡器,通过内网调度负载两个节点,实现内部均衡
2,DNS配置双IP对应一个域名的方式来实现DNS轮询,实现外网均衡
3,Keepalived使用双主(master)配置虚拟出两个虚拟IP:节点一 12.12.12.100和节点二 12.12.12.200,同时共外网访问,两个节点互为主从关系,当某个节点挂掉的时候,另外一个节点将同时是两个资源的master,同时拥有两个虚拟IP,实现资源转移。
我们知道DNS的缺点就是生效慢,分配资源不合理,理论上有可能把所有的请求都发送给同一节点,导致均衡不合理导致所有资源不可用,这里我们由于有了NGINX内部负载,就不怕DNS轮询不均衡了,因为NGINX内部有严谨的调度方式,不管那台请求有多少,在内部都能实现理想的调度,这样就能把DNS负载均衡和NGINX完美结合,是硬件资源得到合理的利用,然后利用keepalive保证了每个节点的可靠性,几乎完美!
拓扑图如下:
架构实现LNMP架构配置配置LNMp架构需要注意两点:
注意一:这里MYSQL都不要初始化,不要启动!后面有专门的配置的
注意二:nginx所有端口都改成 8080,因为一会还要安装nginx来做均衡器并对外提供服务,所以不要用默认的80
注意三、nginx和php-fpm运行的用户都是www。
安装配置NFS1、安装NFS
[*]yum install nfs-utils nfs4-acl-tools portmap
2、配置/etc/exports
[*]/data/wwwnfs 192.168.1.0/24(rw,,no_root_squash,sync,anonuid=502,anongid=502)
注意:
/data/wwwnfs:就是给两个节点挂载的目录,所有网站程序都放在这里,实现论坛程序等数据的共享(同步)
anonuid=502,anongid=502:这个表示客户端上任何用户进入到挂载目录都以uid=502和gid=502身份,我这里这个代表的是www用户
3、启动
[*]service portmap start
[*]service nfs start
切忌,必须先启动portmap
[*]chkconfignfs off
[*]chkconfigportmap on
注意:portmap服务器必须常驻,且不收heartbeat管理;而nfs这必须要用heartbeat来管理他的启动和关闭,所以这里要关闭nfs开机自动启动
同时要启动锁机制,因为同时有两个节点要使用同一份数据,所以需要有总裁,这个尤其是在NFS给mysql用的时候是必须要用的,对于论坛或网站,要看情况,如果存在对同一文件同时修改的时候必须要启动NFS锁机制,如果没有这种情况,那么建议不要启动,启动了会降低NFS的性能:
[*]/sbin/rpc.lockd
[*]echo "/sbin/rpc.lockd" >>/etc/rc.local
4、开机自动挂载
[*]echo "sleep 20" >>/etc/rc.local
[*]echo "/bin/mount -t nfs 192.168.1.200:/data/wwwnfs /data/www" >>/etc/rc.local
为什么为延迟20秒再挂载nfs?因为如果不等待立即挂载,会发现挂载不上,这是由于heartbeat启动用的vip还没设置好的原因。
立即挂载:
[*]mount -a
安装配置DRBD安装方法见:http://www.centos.bz/2012/02/drbd-compile-install-deploy/
配置文件DRBD有三种配置文件:
/usr/local/drbd/etc/drbd.conf
/usr/local/drbd/etc/drbd.d/global_common.conf
/usr/local/drbd/etc/drbd.d/*.res
1、drbd.conf
[*]include "drbd.d/global_common.conf";
[*]include "drbd.d/*.res";
2、global_common.conf
[*]global {
[*]usage-count yes;
[*]}
[*]common {
[*]net {
[*] protocol C;
[*]}
[*]}
3、mysql.res和www.res
mysql.res:
[*]vi /usr/local/drbd/etc/drbd.d/mysql.res
[*]#资源组的名称
[*]resource mysql{
[*]
[*]#定义主服务器资源
[*] on node1{
[*]#建立块设备文件
[*] device /dev/drbd1;
[*]#要用于复制的分区
[*] disk /dev/sdb1;
[*]#定义侦听IP和端口
[*] address 192.168.1.10:7788;
[*]#meta data信息存放的方式,这里为内部存储,即和真实数据放在一起存储
[*] meta-disk internal;
[*] }
[*]
[*]#定义备服务器资源
[*] on node2{
[*] device /dev/drbd1;
[*] disk /dev/sdb1;
[*] address 192.168.1.20:7788;
[*] meta-disk internal;
[*] }
[*]
[*] }
www.res:
[*]vi /usr/local/drbd/etc/drbd.d/www.res
[*]#资源组的名称
[*]resource www{
[*]
[*]#定义主服务器资源
[*] on node2{
[*]#建立块设备文件
[*] device /dev/drbd2;
[*]#要用于复制的分区
[*] disk /dev/sdb2;
[*]#定义侦听IP和端口
[*] address 192.168.1.20:7789;
[*]#meta data信息存放的方式,这里为内部存储,即和真实数据放在一起存储
[*] meta-disk internal;
[*] }
[*]
[*]#定义备服务器资源
[*] on node1{
[*] device /dev/drbd2;
[*] disk /dev/sdb2;
[*] address 192.168.1.10:7789;
[*] meta-disk internal;
[*] }
[*]
[*] }
最后复制这些文件到node2。
初始化DRBD资源1)在各个节点启用资源mysql和www
[*]modprobe drbd
[*]dd if=/dev/zero of=/dev/sdb1 bs=1M count=10
[*]dd if=/dev/zero of=/dev/sdb2 bs=1M count=10
[*]drbdadm create-md mysql
[*]drbdadm create-md www
[*]drbdadm up mysql
[*]drbdadm up www
2),提升各个节点上的主
在node1上:
[*]drbdadm primary --force mysql
在node2上:
[*]drbdadm primary --force www
3)格式化drbd块设备
在node1上
[*]mkfs.ext3 /dev/drbd1
在node2上
[*]mkfs.ext3 /dev/drbd2
4)挂载分区
在node1上
[*]mount /dev/drbd1 /data/mysql
在node2上
[*]mount /dev/drbd2 /data/wwwfs
安装配置heartbeat1、安装heartbeat
[*]yum install heartbeat
安装完后会自动建立用户hacluster和组haclient
确保两个节点上hacluster用户的的UID和GID相同
2、同步两台节点的时间
[*]rm -rf /etc/localtime
[*]\cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[*]yum install -y ntp
[*]ntpdate -d cn.pool.ntp.org
3、配置/etc/ha.d/ha.cf
[*]debugfile /var/log/ha-debug #打开错误日志报告
[*]keepalive 2 #两秒检测一次心跳线连接
[*]deadtime 10 #10 秒测试不到主服务器心跳线为有问题出现
[*]warntime 6 #警告时间(最好在 2 ~ 10 之间)
[*]initdead 120 #初始化启动时 120 秒无连接视为正常,或指定heartbeat
[*] #在启动时,需要等待120秒才去启动任何资源。
[*]
[*]udpport 694 #用 udp 的 694 端口连接
[*]ucast eth0 192.168.1.20 #单播方式连接(主从都写对方的 ip 进行连接)
[*]node node1 #声明主服(注意是主机名uname -n不是域名)
[*]node node2 #声明备服(注意是主机名uname -n不是域名)
[*]auto_failback on #自动切换(主服恢复后可自动切换回来)这个不要开启
[*]respawn hacluster /usr/lib/heartbeat/ipfail #监控ipfail进程是否挂掉,如果挂掉就重启它
4、/etc/ha.d/authkeys
[*]auth 1
[*]1 crc
5、/etc/ha.d/haresources
[*]node1 IPaddr::192.168.1.100/24/eth0 drbddisk::mysql Filesystem::/dev/drbd1::/data/mysql::ext3 mysqld portmap
[*]node2 IPaddr::192.168.1.200/24/eth0 drbddisk::www Filesystem::/dev/drbd2::/data/wwwnfs::ext3 portmap nfs
6、创建nfs管理脚本
[*]vi /etc/ha.d/resource.d/nfs
写入:
[*]#!/bin/bash
[*]
[*]NFSD=/etc/rc.d/init.d/nfs
[*]NFSDPID=`/sbin/pidof nfsd`
[*]case $1 in
[*]start)
[*]$NFSD start;
[*];;
[*]stop)
[*]$NFSD stop;
[*] if [ "$NFSDPID" != " " ];then
[*] for NFSPID in $NFSDPID
[*] do /bin/kill -9 $NFSPID;
[*] done
[*] fi
[*];;
[*]*)
[*]echo "Syntax incorrect. You need one of {start|stop }"
[*];;
[*]esac
先启动node1的heartbeat,再启动node2的heartbeat
启动成功后,这里有几项需要检查
node1:
1、执行ip a,检查是否已经设置有虚拟ip 192.168.1.100
2、执行cat /proc/drbd检查状态是否正常
3、执行df -h查看/dev/drbd1是否已经挂载到/data/mysql
4、执行service mysqld status查看mysql是否已经启动
node2:
1、执行ip a查看是否已经设置虚拟ip 192.168.1.200
2、执行cat /proc/drbd检查状态是否正常
3、执行df -h查看/dev/drbd2是否已经挂载到/data/wwwnfs和192.168.1.200:/data/wwwnfs是否已经挂载到/data/www
nginx均衡器配置
[*]userwww;
[*]worker_processes1;
[*]
[*]error_log/var/log/nginx/error.log warn;
[*]pid /var/run/nginx.pid;
[*]
[*]
[*]events {
[*] worker_connections1024;
[*]}
[*]
[*]
[*]http {
[*] include /etc/nginx/mime.types;
[*] default_typeapplication/octet-stream;
[*]
[*] log_formatmain'$remote_addr - $remote_user [$time_local] "$request" '
[*] '$status $body_bytes_sent "$http_referer" '
[*] '"$http_user_agent" "$http_x_forwarded_for"';
[*]
[*] access_log/var/log/nginx/access.logmain;
[*]
[*] sendfile on;
[*] #tcp_nopush on;
[*]
[*] keepalive_timeout65;
[*]
[*] #gzipon;
[*] upstream www.centos.bz_server
[*]{
[*]server 192.168.1.10:8080 weight=3 max_fails=2 fail_timeout=30s;
[*]server 192.168.1.20:8080 weight=9 max_fails=2 fail_timeout=30s;
[*]}
[*]server
[*]{
[*] listen 80;
[*] server_namewww.centos.bz;
[*] location / {
[*] root /data/www/www.centos.bz;
[*] index index.php index.htm index.html;
[*] proxy_redirect off;
[*] proxy_set_header Host $host;
[*] proxy_set_header X-Real-IP $remote_addr;
[*] proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
[*] proxy_pass http://www.centos.bz_server;
[*] }
[*] access_logoff;
[*]}
[*]server
[*]{
[*] listen 8080;
[*] server_namewww.centos.bz;
[*] index index.html index.htm index.php;
[*] root/data/www/www.centos.bz;
[*] #limit_conn crawler20;
[*] location ~ \.php$ {
[*] root /data/www/www.centos.bz;
[*] fastcgi_pass 127.0.0.1:9000;
[*] fastcgi_indexindex.php;
[*] fastcgi_paramSCRIPT_FILENAME/data/www/www.centos.bz/$fastcgi_script_name;
[*] include fastcgi_params;
[*] }
[*] location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
[*] {
[*] expires 30d;
[*] }
[*] location ~ .*\.(js|css)?$
[*] {
[*] expires 1h;
[*] }
[*] access_logoff;
[*] }
[*]}
这里定义了两台用于负载均衡的机子,分别是192.168.1.10:8080和192.168.1.20:8080,通过proxy_pass http://www.centos.bz_server代理循询转发到这两台机,达到负载均衡的作用。
你可以建立index.php,里面写入:
[*]<?php
[*]echo $_SERVER['SERVER_ADDR'];
[*]?>
如果连续刷新几次,得到不同的IP,证明已经均衡负载到不同的服务器。
Keepalived实现nginx和php的HA1、keepalived安装
安装方法见:http://www.centos.bz/2012/02/nginx-keepalived-high-availability/
2、配置
节点一node1配置如下:
[*]global_defs {
[*] notification_email {
[*] admin@centos.bz
[*] }
[*] notification_email_from keepalived@domain.com
[*] smtp_server 127.0.0.1
[*] smtp_connect_timeout 30
[*] router_id LVS_DEVEL
[*]}
[*]vrrp_instance VI_1 {
[*] state MASTER ############ 辅机为 BACKUP
[*] interface eth0
[*] virtual_router_id 100
[*] mcast_src_ip 192.168.1.10########### 本机IP
[*] priority 102 ########### 权值要比 back 高
[*] advert_int 1
[*] authentication {
[*] auth_type PASS
[*] auth_pass 1111
[*] }
[*] virtual_ipaddress {
[*] 12.12.12.100
[*] }
[*]}
[*]
[*]vrrp_instance VI_1 {
[*] state BACKUP
[*] interface eth0
[*] virtual_router_id 200
[*] mcast_src_ip 192.168.1.101 ########### 本机IP
[*] priority 101 ##########权值 要比 master 低。。
[*] advert_int 1
[*] authentication {
[*] auth_type PASS
[*] auth_pass 1111
[*] }
[*] virtual_ipaddress {
[*] 12.12.12.200
[*] }
[*]}
节点二配置:
[*]global_defs {
[*] notification_email {
[*] admin@centos.bz
[*] }
[*] notification_email_from keepalived@domain.com
[*] smtp_server 127.0.0.1
[*] smtp_connect_timeout 30
[*] router_id LVS_DEVEL
[*]}
[*]vrrp_instance VI_1 {
[*] state BACKUP
[*] interface eth0
[*] virtual_router_id 100
[*] mcast_src_ip 192.168.1.20 ########### 本机IP
[*] priority 101 ##########权值 要比 master 低。。
[*] advert_int 1
[*] authentication {
[*] auth_type PASS
[*] auth_pass 1111
[*] }
[*] virtual_ipaddress {
[*] 12.12.12.100
[*] }
[*]}
[*]
[*]vrrp_instance VI_1 {
[*] state MASTER ############ 辅机为 BACKUP
[*] interface eth0
[*] virtual_router_id 200
[*] mcast_src_ip 192.168.1.103########### 本机IP
[*] priority 102 ########### 权值要比 back 高
[*] advert_int 1
[*] authentication {
[*] auth_type PASS
[*] auth_pass 1111
[*] }
[*] virtual_ipaddress {
[*] 12.12.12.200
[*] }
[*]}
3、创建监控脚本
node1监控脚本:
[*]vi /opt/check.sh
[*]#!/bin/bash
[*]while:
[*]do
[*]mysqlcheck=`/usr/bin/mysqladmin -uroot ping 2>&1`
[*]mysqlcode=`echo $?`
[*]heartbeat=`ps -C heartbeat --no-header | wc -l`
[*]if [ $mysqlcode -ne 0 ] ;then
[*] if [ $heartbeat-ne 0 ];then
[*]service heartbeat stop
[*]fi
[*]fi
[*]phpcheck=`ps -C php-fpm --no-header | wc -l`
[*]nginxcheck=`ps -C nginx --no-header | wc -l`
[*]keepalivedcheck=`ps -C keepalived --no-header | wc -l`
[*]if [ $nginxcheck -eq 0 ]|| [ $phpcheck -eq 0 ];then
[*] if [ $keepalivedcheck -ne 0 ];then
[*] killall -TERM keepalived
[*] else
[*] echo "keepalived is stoped"
[*] fi
[*] else
[*] if [ $keepalivedcheck -eq 0 ];then
[*] /etc/init.d/keepalived start
[*] else
[*] echo "keepalived is running"
[*] fi
[*]fi
[*]sleep 5
[*]done
node2监控脚本:
[*]#!/bin/bash
[*]while:
[*]do
[*]phpcheck=`ps -C php-cgi --no-header | wc -l`
[*]nginxcheck=`ps -C nginx --no-header | wc -l`
[*]keepalivedcheck=`ps -C keepalived --no-header | wc -l`
[*]if [ $nginxcheck -eq 0 ]|| [ $phpcheck -eq 0 ];then
[*] if [ $keepalivedcheck -ne 0 ];then
[*] killall -TERM keepalived
[*] else
[*] echo "keepalived is stoped"
[*] fi
[*] else
[*] if [ $keepalivedcheck -eq 0 ];then
[*] /etc/init.d/keepalived start
[*] else
[*] echo "keepalived is running"
[*] fi
[*]fi
[*]sleep 5
[*]done
这个监控代码实现了mysql,nginx,php-fpm的HA。
加上权限,并执行
[*]chmod +x /opt/check.sh
[*]nohup sh /opt/check.sh &
设置开机启动:
echo “nohup sh /opt/check.sh &” >> /etc/rc.loal
4、测试keepalived
分别启动keepalived
[*]service keepalived start
1)执行ip a检查node1和node2是否已经存在vip:12.12.12.100和12.12.12.200
2)测试nginx和php-fpm的HA。在node1执行service nginx stop或者service php-fpm stop停止nginx或php-fpm,过几秒钟后你会发现node2已经接管了vip 12.12.12.100,并且使用vip 12.12.12.100或12.12.12.200浏览nginx网页你会发现网页显示的IP一直是192.168.1.20,表明keepalived已经成功接管node1的vip和nginx或php-fpm服务。
3)测试mysql HA。在node1执行service mysqld stop停止mysql服务,几秒后在node2查看,发现node2已经接管vip 192.168.1.100,并且已经启动mysql服务。
注意:在恢复mysql或nginx,php-fpm时,先停止监控脚本,要不heartbeat或keepalived还没实现接管又被停止。
好好 学习了 确实不错 恋爱就是无数个饭局,结婚就是一个饭局。 我抢、我抢、我抢沙发~ 我本非随便的人,但如果你想随便,那我就随你的便好啦! 在一辆拥挤的公车上,一位女郎忽然叫了起来:别挤啦!别挤啦!把人家的奶都挤出来啦!(她拿着酸奶呢)。 长大了娶唐僧做老公,能玩就玩一玩,不能玩就把他吃掉。
页:
[1]