双机热备+负载均衡线上方案(Heartbeat+DRBD+NFS+Keepalived+Lnmp)-linux安全运维_跨零代码

跨零代码为大家提供高品质的运维解决方案,请大家多多来访,跨零不胜感激,在此谢过。

我们下面来实现一个架构,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保证了每个节点的可靠性,几乎完美!

拓扑图如下:
双机热备+负载均衡线上方案(Heartbeat+DRBD+NFS+Keepalived+Lnmp)

架构实现

LNMP架构配置

配置LNMP架构需要注意三点:

注意一:这里MYSQL都不要初始化,不要启动!后面有专门的配置的 注意二:nginx所有端口都改成 8080,因为一会还要安装nginx来做均衡器并对外提供服务,所以不要用默认的80 注意三、nginx和php-fpm运行的用户都是www

 

安装配置NFS

1、安装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    chkconfig  nfs off    chkconfig  portmap 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://kua0.com/15837.html

配置文件

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/wwwnfs

安装配置heartbeat

1、安装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均衡器配置

user  www; worker_processes  1;   error_log  /var/log/nginx/error.log warn; pid        /var/run/nginx.pid;     events {     worker_connections  1024; }     http {     include       /etc/nginx/mime.types;     default_type  application/octet-stream;       log_format  main  '$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.log  main;       sendfile        on;     #tcp_nopush     on;       keepalive_timeout  65;       #gzip  on;  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_name  www.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 https://www.centos.bz_server;     }     access_log  off;   } server   {     listen       8080;     server_name  www.centos.bz;     index index.html index.htm index.php;     root  /data/www/www.centos.bz;     #limit_conn   crawler  20;  location ~ /.php$ {         root           /data/www/www.centos.bz;         fastcgi_pass   127.0.0.1:9000;         fastcgi_index  index.php;         fastcgi_param  SCRIPT_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_log  off;       } }

这里定义了两台用于负载均衡的机子,分别是192.168.1.10:8080和192.168.1.20:8080,通过proxy_passhttps://www.centos.bz_server代理循询转发到这两台机,达到负载均衡的作用。

你可以建立index.php,里面写入:

<?php echo $_SERVER['SERVER_ADDR']; ?>

如果连续刷新几次,得到不同的IP,证明已经均衡负载到不同的服务器。

Keepalived实现nginx和php的HA

1、keepalived安装

安装方法见:https://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.local

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还没实现接管又被停止。


//下面这个css和插件后台设置的主题有关系,如果需要换样式,则需要修改以下CSS名称

从零到一,创造未来!跨零代码综合IT问题解决服务站,欢迎你的到来。运维教程 只为你绽放。

本文固定链接: http://kua0.com/2019/02/02/双机热备负载均衡线上方案heartbeatdrbdnfskeepalivedlnmp-linux安全运维_跨/

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注