文章目录

  • 规划与简述
  • 搭建HAproxy+Keepalived集群
    • 编译安装HAproxy
    • 编译安装keepalived
  • 源码编译Nginx+PHP web服务
    • 编译安装nginx
    • 源码编译php
  • 配置mysql数据库连接和主从复制
    • 安装与连接数据库
    • 实现主从复制
  • 部署wordpress站点程序实现NFS网络共享
    • 部署并配置wordpress
    • 实现NFS网络共享
  • inotify+rsync实现数据实时同步
  • 扩展:用LVS替代haproxy代理调度
  • 最后站点测试


规划与简述

 本章会和大家一起搭建一个简单的站点架构,从用户请求开始,到HAproxy代理调度,再到后端LNMP的交互工作,mysql数据库主从复制,以及NFS文件共享实现数据同步。具体结构如下图所示:

 在实验开始前,先简单介绍一下上图的工作流程和结构功能。大家都有过上网查资料、看新闻、购物等经历,我们随手点开一个网站,浏览器会迅速给我们响应出站点内容,其实在这瞬间的一两秒内,是一个很复杂的后端处理过程。
 如上图所示,用户的请求报文首先会通过internet传送过层层路由到达站点外围的防火墙,通过防火墙的规则到达haproxy和keepalived组成的负载均衡调度集群,haproxy负责把用户的请求通过事先设好的调度规则和调度算法转发到后端真实web服务器,haproxy最好是有两台或以上组成,但是用户访问的站点地址通常只能绑定在唯一的一台服务器上,如果两台haproxy都绑定相同的站点地址就会造成IP地址冲突,这时使用keepalived服务就能解决这个问题,我们把站点地址设定为一个虚拟IP,我们称之为VIP,通过keepalived服务把VIP规则添加在这两台机器上,但是在两台服务器都正常运行的情况下,只会有一台服务器拥有这个VIP并对外提供服务,当这台机器或haproxy进程出现故障的时候,VIP会立刻飘动到另一台机器上,继续对外提供服务,这样就很好地解决了单点失败问题,不至于当haproxy服务宕机整个网站就挂了。当请求通过haproxy调度到后端的web服务器后,nginx会根据用户的请求提供相应的服务,如果是静态请求nginx自己就能提供服务,如果是动态请求就会通过fastcgi协议连接php,如果有数据请求php解释器又会通过haproxy四层负载连接数据库。还有就是数据同步,比如用户的第一次请求被调度到第一台web服务器,用户进行了一些操作,比如添加了一件商品到购物车或发表了一张图片,但是过了几分钟用户第二次请求却被调度到了另一台web服务器,这时她会发现刚刚添加的购物车和发表的图片都不见了,这是因为两台web服务器的数据不同步导致的,为了解决这个问题,这里的站点php程序和数据包是单独放置在一台服务器上的,通过NFS服务挂载到两台web服务器,这时候两台web服务使用的数据程序时同一个文件,就不会再发生上述请求不一致的问题了(当然还有更好的方式redis数据库实现session共享,这个以后会和大家共享)。另外为了用户数据的安全,站点通常会实时备份同步数据,这样不至于如果NFS服务器数据丢失了,数据无法就找回的问题,同样,最后的mysql主从复制也是数据同步和备份,毕竟,数据是无价的……
 哈哈,啰嗦了这么多,大家可以跳过上面的简述的…

搭建HAproxy+Keepalived集群

环境准备:两台linux,我们简称HK1和HK2,系统censtos7.7 IP:192.168.131.18、192.168.131.28

编译安装HAproxy

源码包下载地址:http://www.haproxy.org/download/
HAproxy安装依赖lua包,实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio deJaneiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。由于centos7系统自动的lua版本过低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy,这里我是使用的lua-5.3.5和haproxy-2.0.8,过程如下:

#先在HK1上安装配置
cd /usr/locate/src        //安装位置,可自定义
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz    //下载lua包
yum install gcc libtermcap-devel ncurses-devel libevent-devel readline-devel   //安装相关依赖包
cd lua-5.3.5
make linux test    //执行此命令即可安装luaroot@Centos7-IP18:src]#lua-5.3.5/src/lua -v           //检测编译安装的lua版本,确认已编译安装了Lua 5.3.5
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rioln -s /usr/local/src/lua-5.3.5/src/lua /usr/bin/lua  //可以创建软连接,替换系统自带的版本//编译安装haproxy-2.0.4.tar.gz,同样是在/usr/locate/src/下
//首先先安装相关依赖包
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
tar xvf haproxy-2.0.4.tar.gzcd haproxy-2.0.8
//编译,指定用到的lua包路径,已经要安装的路径
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy     //执行安装root@realcts7:local]#haproxy/sbin/haproxy -v       //验证haproxy版本
HA-Proxy version 2.0.8 2019/10/23 - https://haproxy.org/cp /usr/local/haproxy/sbin/haproxy /usr/sbin/      //复制到sbin下,变为默认命令
root@Centos7-IP18:local]#which haproxy
/usr/sbin/haproxy#编写HAproxy启动脚本
vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID[Install]
WantedBy=multi-user.target#准备配置文件
useradd -s /sbin/nologin -u 2000 haproxy    //创建haproxy账号
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfgglobal           //全局参数maxconn 100000   //定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。chroot /usr/local/haproxy       //锁定运行目录,编译安装建议一定打开stats socket /var/lib/haproxy/haproxy.sock mode 600 level adminuid 2000         //此处也可以写uid、group,和上面创建的账号保存一致gid 2000daemon           //以守护进程的方式运行#nbproc 4            //开启的haproxy进程数,与CPU保持一致,如果你的CPU是2核:nbproc 2#cpu-map 1 0                                                              cpu-map 1 0#cpu-map 2 1                                                              cpu-map 2 1#cpu-map 3 2         //如果是四核把注释的全打开#cpu-map 4 3pidfile /var/lib/haproxy/haproxy.pidlog 127.0.0.1 local3 info    //日志级别defaultsoption http-keep-alive      //开启与客户端的会话保持option forwardfor           //透传客户端真实IP至后端web服务器maxconn 100000mode http           //默认工作模式,mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OKtimeout connect 300000ms    //#客户端请求到后端server的最长连接等待时间(TCP之前)timeout client 300000ms     //客户端请求到后端服务端的超时超时时长(TCP之后),超时会报502错误timeout server 300000ms     //与客户端的最长非活动时间,建议设长一些listen stats                //设定一个状态页面mode httpbind 0.0.0.0:9999           //状态监听地址和端口stats enablelog globalstats uri /haproxy-status        //登录状态页面uristats auth haadmin:q1w2e3r4ys    //登录状态页面的账户和密码#上面的文件准备完毕后启动haproxy
mkdir /var/lib/haproxy
chown haproxy.haproxy /var/lib/haproxy/ -R   systemctl start haproxy        //开启haproxy
systemctl enable haproxy       //设为开机自启
systemctl status haproxy       //查看运行状况


正常启动后的haproxy状态页面:


编译安装keepalived

keepalived编译安装相对于haproxy来说相对简单,这里使用的是较新的keepalived-2.0.18

cd /usr/local/src/
wget https://keepalived.org/software/keepalived-2.0.18.tar.gz
tar -xvf keepalived-2.0.18.tar.gz -C /usr/local/src/
yum install -y gcc libnfnetlink-devel libnfnetlink ipvsadm  libnl libnl-devel libnl3 libnl3-devel lm_sensors-libs net-snmp-agent-libs net-snmp-libs  openssh-server openssh-clients  openssl openssl-devel automake iproute
cd keepalived-2.0.18/
./configure --prefix=/usr/local/keepalived --disable-fwmark
make && make install

安装完毕后我们开启如下图所示的界面,其中只要没有error,就是正常安装:

#准备启动和配置文件
cp /usr/local/src/keepalived-2.0.18/keepalived/etc/init.d/keepalived.rh.init /etc/sysconfig/keepalived.sysconfig
cp /usr/local/src/keepalived-2.0.18/keepalived/keepalived.service  /usr/lib/systemd/system/
cp  /usr/local/src/keepalived-2.0.18/bin/keepalived  /usr/sbin/mkdir /etc/keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {notification_email {             //发生故障切换时邮件发送的对象,可以按行区分写多个admin@l63.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1        //邮件服务器IP,自定义即可smtp_connect_timeout 30          //router_id HK1              //虚拟路由id,自定义即可,主从不要相同
}
vrrp_instance VI_1 {                //虚拟路由配置state MASTER                    //当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUPinterface ens33                 //绑定为当前虚拟路由器使用的物理接口virtual_router_id 80            //当前虚拟路由器惟一标识,范围是0-255,主从必须要一致priority 100                    //当前物理节点在此虚拟路由器中的优先级;范围1-254,一般主的优先级大于从advert_int 1                    //rrp通告的时间间隔,默认1sunicast_src_ip 192.168.131.18   //指定单播的源IP,即本机地址unicast_peer {                  //指定单播的对方IP,即另一台keepalived服务地址192.168.131.28}authentication {               //认证机制auth_type PASS             //认证类型,主从必须一致auth_pass 1111             //认证密码,主从必须一致}virtual_ipaddress {            //虚拟IP地址,网卡接口要和上面的interface一致192.168.131.249/16 dev ens33 label ens33:0  }
} systemctl start keepalived        //正常配置完成后,开启keepalived服务

检测keepalived运行状况:

检测绑定的虚拟IP:

 在另一台linuxHK2上同样编译安装haproxy和keepalived,步骤和上面的操作都是一样的,唯一不同的就是keepalived的配置文件,需要改动几处即可:

! Configuration File for keepalived
global_defs {notification_email {admin@163.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id HK2
}vrrp_instance VI_1 {state BACKUP                 //前一台是master,这一台设为backupinterface ens33virtual_router_id 80         //虚拟路由id,要和master保证一致priority 80                  //优先级比master要低一些advert_int 1unicast_src_ip 192.168.131.28  unicast_peer {192.168.131.18}authentication {             //认证要保持一致,否则认证会失败auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.131.249/24 dev ens33 label ens33:0   //虚拟IP也要一样}
}

开启keepalived服务:systemctl start keepalived

这时候我们可以测试一下keepalived服务是否可以正常运行实现主从之间虚拟IP飘动绑定,因为HK1的keepalived服务优先级比HK2高,在同时开启keepalived服务运行下虚拟IP是绑定在HK1上的,现在我们手动把HK1的keepalived服务停止或者之间将HK1关机,我们观察HK2的ip变化,会发现虚拟ip会立刻漂浮到了HK2上

 到这里我们就搭建好了HAproxy和Keepalived服务,但是由我们前面的规划图所示,这里可以先把后端的web服务代理调度规则和四层负载连接mysql数据库的规则添加在haproxy的配置文件里,很简单只需要几行代码而已:

vim /etc/haproxy/haproxy.cfg     //在上面写的配置文件最后添加下面代码,HK1和HK2添加一致
listen web_real-80          //代理监听web服务段bind 192.168.131.149:80   //指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中,这里用定义的虚拟IP地址mode http    //工作模式log global   //日志调用项,日志模式在上面defaults定义balance roundrobin    //调度算法,以权重比例轮询server real1 192.168.131.38:80 check weight 1 addr 192.168.131.38 port 80 inter 3s fall 3 rise 5    //定义后端真实服务器,real2为自定义的server nameserver real2 192.168.131.58:80 check weight 2  //check为健康检查,weight为权重listen mysql_3306            //代理监听mysql数据库段bind 192.168.131.249:3306mode tcplog globalserver 192.168.131.78 192.168.131.78:3306  check addr 192.168.131.78 port 3306 inter 3000 fall 2 rise 5

配置完成后重启haproxy服务,再来查看haproxy状态页面,会看见我们刚刚定义的后端web服务和mysql服务,但是因为我们还没有配置,状态显示红色


源码编译Nginx+PHP web服务

服务环境:两台linux系统,分别起名NP1、NP2,NP1IP:192.168.131.38、NP2IP:192.168.131.58
软件安装包:nginx-1.16.1.tar.gz、php-7.3.10.tar.xz

编译安装nginx

yum install gcc pcre-devel openssl-devel zlib-devel   //安装相关依赖包
useradd -s /sbin/nologin nginx -u 2000                //创建nginx账户
cd /usr/local/src
tar xvf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure \                 //执行环境检测并生成Makefile文件
--prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_modulemake && make install                   //安装编译

上面的操作执行无误后,nginx就安装完毕了,在NP2上执行相同的安装步骤即可。在正常启动nginx前,我们还需要修改一下配置文件:

vim /apps/nginx/conf/nginx.confuser  nginx nginx;                         //把nginx服务用户和组改为我们创建的nginxinclude /apps/nginx/conf/conf.d/*.conf;    //这项加在http{}之内,可以单独在conf/conf.d/下创建单独的配置文件mkdir /apps/nginx/conf/conf.d                  //创建conf.d文件夹
vim /apps/nginx/conf/conf.d/abc.conf           //我们创建独立的配置文件,自定义命名,但是必须要以conf结尾server {                                   //下面就是站点配置文件listen 80 default_server;              //nginx监听端口server_name localhost;              location / {root /tmp/nginx/wordpress;          //站点默认访问的根路径index index.php index.html index.htm;if ($http_user_agent ~ "ApacheBench|WebBench|TurnitinBot|Sogou webspider|Grid Service") {#proxy_pass http://www.baidu.com;return 403;}}location ~ \.php$ {#root /tmp/nginx/wordpress;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /tmp/nginx/wordpress$fastcgi_script_name;include fastcgi_params;}location ~ ^/(pm_status|ping)$ {              //状态页面,后面测试可以用到include fastcgi_params;fastcgi_pass 127.0.0.1:9000;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;}
}#nginx服务相关指令
/apps/nginx/sbin/nginx                //执行nginx脚本,开启nginx服务
/apps/nginx/sbin/nginx -s             //-s signal 发送信号给master进程,signal:stop, quit, reopen, reload
/apps/nginx/sbin/nginx -s stop        //关闭nginx服务
/apps/nginx/sbin/nginx -s reload      //加载配置文件
/apps/nginx/sbin/nginx -v             //查看版本编号
/apps/nginx/sbin/nginx -V             //显示版本和编译参数
/apps/nginx/sbin/nginx -t             //检测conf配置文件语法是否错误

一切配置完毕后,可以检测一下配置文件语法是否有错,无报错后开启nginx服务,系统会开启相关进程并打开80端口

源码编译php

 同样在/usr/local/src/下

cd /usr/loacl/src
yum install -y libxml2-devel bzip2-devel libmcrypt-devel
tar xvf php-7.3.10.tar.xz
cd php-7.3.5
./configure --prefix=/apps/php \                               #执行配置选项
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--enable-mbstring \
--enable-xml \
--enable-sockets \
--enable-fpm \
--enable-maintainer-zts \
--disable-fileinfomake && make install//配置:
cd php-7.3.10
cp php.ini-production /etc/php.ini              //复制生成文件模板改名php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm  //复制启动文件并改名
chmod +x /etc/init.d/php-fpm                    //为启动文件添加执行权限cd /apps/php/etc
cp php-fpm.conf.default php-fpm.conf            //复制模板配置文件并改名
cp php-fpm.d/www.conf.default php-fpm.d/www.conf
vim wwwconf
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
…………service php-fpm start                           //启动PHP服务,正确开启会打开9000端口

 正常安装完php后,整个web服务也基本是搭建OK了,NP1和NP2几乎是相同的安装步骤和配置,建议把NP2的域名自定义改一下,其他的没什么需要改动的,正常安装后系统会同时打开80和9000端口:


配置mysql数据库连接和主从复制

首先安装数据库,使用源码编译和yum安装都可以,源码编译的操作我在以前的博客中有详细介绍mysql数据库源码编译安装
这里为方便我是使用yum安装mariadb,Server version: 10.3.11-MariaDB MariaDB Server

安装与连接数据库
//安装数据库
yum install -y mariadb-server mariadb
systemctl start mariadb               //开启数据库服务,会打开3306端口
mysql_secure_installation             //设定数据库密码
mysql -p'密码'                        //登录数据库
create database wordpress;           //创建站点数据库
grant all privileges on wordpress.* to "wordpress"@"192.168.131.%" identified by "password";    //创建并授权连接站点数据库的用户,password是自定义的密码
flush privileges

这时候我们在观察haproxy状态页面,会发现后端数据库项变为了绿色,即表示haproxy检测到了mysql数据库,并处于正常连接配置状态:

另外我们还可以找一台机器通过haproxy的vip和我们在数据库中授权的账户测试一下数据库是否可以连接

实现主从复制

 由上图的规划,我们设定主数据库master为192.168.131.78,从数据库slave为192.168.131.88

#在master上
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]]
log_bin        //打开二进制日志
server_id=8    //自定义一个server_idmysql -p       //-p后直接跟密码,登录数据库
grant replication slave on *.* to 'tom'@'192.168.131.88' identified by '12345';       //创建数据同步账号mysqldump   --all-databases  --single_transaction --flush-logs --master-data=2 --lock-tables > /root/backup.sql  //导出master上的所有数据库
scp /root/backup.sql root@192.168.131.88:/root   //复制到slave上
head -n 30 backup.sql

#在slave上
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server_id=10      //为当前节点设置一个全局惟一的ID号,不要和master一样
read_only=ON     //最好设置数据库只读mysql < /root/backup.sql  //将master复制过来的备份文件导入数据库
mysql -p                  //登录数据库
#下面的代码是填写master的IP地址,在master上创建的授权账号密码,以及我们记录的日志名称和位置
CHANGE MASTER TO MASTER_HOST='192.168.131.78',MASTER_USER='tom',MASTER_PASSWORD='12345',MASTER_LOG_FILE='mariadb-bin.000006', MASTER_LOG_POS=389;
start slave;  //开启slave线程show slave status\G;     //查看slave线程状态


 主从复制到处就搭建好了,如果你不是太确定的话,可以在master上创建一个库,然后立刻在slave上面查看此库有没有被同步过来……


部署wordpress站点程序实现NFS网络共享

 安装实验规划,我们把wordpress站点程序部署到NFS服务器上,通过网络挂载到后端的web服务器NP1和NP2,这里使用的wordpress程序包为wordpress-5.2.3

部署并配置wordpress
#解压下载好的wordpress程序包
unzip wordpress-5.2.3-zh_CN.zip
cp -r wordpress /data/devops/     //我把解压后的wordpress复制到/data/devops/下,你可以自定义路径
cd /data/devops/wordpress
cp wp-config-sample.php wp-config.php    //把模板文件改名vim wp-config.php    #更改配置文件里的下面这几段连接数据库行,其他不用动
/** MySQL数据库名 */
define( 'DB_NAME', 'wordpress' );    //上面数据库中创建的站点数据库名
/** MySQL数据库用户名 */
define( 'DB_USER', 'wordpress' );   //授权访问该站点库的用户
/** MySQL数据库密码 */
define( 'DB_PASSWORD', 'password' );    //你当时授权是自定义的密码
/** MySQL主机 */
define( 'DB_HOST', '192.168.131.249' );   //这里填写haproxy的vip,因为我们在haproxy上面配置了数据库的tcp代理
/** 创建数据表时默认的文字编码 */
define( 'DB_CHARSET', 'utf8' );
/** 数据库整理类型。如不确定请勿更改 */
define( 'DB_COLLATE', '' );setfacl -R -m u:2000:rwx wordpress        //2000为web服务器上nginx账户的uid,给nginx一个acl权限
root@localhost:devops]#getfacl wordpress/
# file: wordpress/
# owner: root
# group: root
user::rwx
user:2000:rwx
group::r-x
mask::rwx
other::r-x

 这样我们的wordpress站点程序文件就准备好了,然后我们需要把它通过NFS服务挂载到web服务器上去

实现NFS网络共享

 想启用NFS网络共享服务,需要安装软件包nfs-utils,还要确保NFS服务器和两台web服务器时间同步、网络通顺等。

#开始配置nfs共享
yum -y install nfs-utils
vim /etc/exports     //把共享规则下入到此文件下
#下面的代码意思是:首先是存放到共享的wordpress程序文件的目录路径,*共享给所有主机,生产环境下要具体写虚共享的IP地址,rw是用读写权重,anonuid=2000,anongid=2000,all_squash是全压榨为UID为2000的nginx账户,就是我们上面设定acl账户的权限
/data/devops      *(rw,anonuid=2000,anongid=2000,all_squash)   //只需这一行代码,保存退出exportfs -r      //加载配置文件是共享生效
root@localhost:~]#exportfs -v    //查看共享
/data/devops    <world>(sync,wdelay,hide,no_subtree_check,anonuid=2000,anongid=2000,sec=sys,rw,root_squash,all_squash)systemctl start nfs    //开启nfs服务

查看nfs服务运行状态:

 然后再分别在web服务器NP1和NP2上挂载此nfs共享:

#由我们在nginx配置文件里写好的默认站点访问路径,我们需要把wordpress挂载到/tmp/nginx/下
yum install -y nfs-utils
showmount -e 192.168.131.8     //查看NFS服务器共享的内容,后面的ip为NFS服务器的ip
mount -t nfs 192.168.131.8:/data/devops /tmp/nginx      //用mount只是临时挂载,如果想要永久挂载需要写入到fstab文件里
vim /etc/fstab   //打开fstab文件,添加下面一行代码
192.168.131.8:/data/devops  /tmp/nginx  nfs  defaults        0 0[root@localhost ~]# ll /tmp/nginx/    //此时nginx文件下就会看见wordpress目录
total 105
drwxrwxr-x. 5 root root  4096 Nov  8 19:43 wordpress

 分别在NP1和NP2上执行上述相同的命令操作即可挂载站点文件。


inotify+rsync实现数据实时同步

inotify:异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
实现inotify软件包:inotify-tools,sersync,lrsyncd

要实现数据的实时同步,我们利用监控服务inotify监控同步数据服务器目录中信息的变化,当发现目录中数据产生变化时,就利用rsync服务推送到备份服务器上。这里的同步数据服务器为NFS服务器,我们把用以备份的服务器称为BK(backup)服务器.
查看NFS服务器内核是否支持inotify:

#在NFS服务器上
ls -l /proc/sys/fs/inotify #列出下面的文件,说明服务器内核支持inotify-rw-r--r-- 1 root root 0 Dec 7 10:10 max_queued_events-rw-r--r-- 1 root root 0 Dec 7 10:10 max_user_instances-rw-r--r-- 1 root root 0 Dec 6 05:54 max_user_watchesyum install -y inotify-tools
#配置生成密码文件,用以和BK端rsync服务连接认证
echo "password" > /etc/rsync.pass      //password为自定义的密码
chmod 600 /etc/rsync.passvim inotify_rsync.sh                   //编写inotify实时监控脚本
#!/bin/bash
SRC='/data/devops'                     //要备份同步的文件目录
DEST='rsyncuser@192.168.131.68::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
donenohup ./inotify_rsync.sh  &> /dev/null &      //后台实时执行脚本#在BK服务器端
yum install -y rsync rsync-daemon
echo "rsyncuser:password" > /etc/rsync.pass
chmod 600 /etc/rsync.passmkdir /backup                //创建备份目录#服务器端启动rsync服务
rsync --daemon 可加入/etc/rc.d/rc.local实现开机启动
systemctl start rsyncd       //centos7或8#测试
watch -n 0.5 ls -l /backup/devops  //观察sdevops目录里的文件实时变化,以0.5秒时间为间隔更新

扩展:用LVS替代haproxy代理调度

 上面已经完成了整个实验的所有搭建与配置,这里顺便说一下,用LVS替代haproxy实现向后端web服务器转发请求,不需要手动配置ipvs规则,我们把代理规则写在keepalived的配置文件里即可:

vim /etc/keepalived/keepalived.conf       //在原有的配置文件最后添加下面代码virtual_server 192.168.131.249 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPsorry_server 127.0.0.1 80real_server 192.168.131.38 80 {weight 1TCP_CHECK {connect_timeout5nb_get_retry3delay_before_retry3connect_port80}}real_server 192.168.131.58 80 {weight 1TCP_CHECK {connect_timeout5nb_get_retry3delay_before_retry3connect_port80}}
}
#重启keepalived服务,查看ipvs规则:
[root@localhost /]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.131.249:80 rr-> 192.168.131.38:80            Route   1      0          0         -> 192.168.131.58:80            Route   1      0          0 #这时候关闭haproxy依然能正常访问站点,注意haproxy关闭后,mysql代理即无效了,这时候要直连数据库服务器……

最后站点测试

 好了,到现在为止,我们的整个服务的配置搭建已经完成了,现在开启所有我们配置好的服务,在haproxy服务器上的状态页上有所有代理服务的状态显示,显示为绿色即为正常连接状态:

 我们找一台客户端,给虚拟IP起一个域名,我们打开hosts文件C:\Windows\System32\drivers\etc\hosts,在里面添加:
192.168.131.249 www.wdpress.net
然后在浏览器里输入刚刚设定的域名:www.wdpress.net

正常情况下会打开如上的页面,我们自定义一个站点名称和密码,然后登陆进去

登陆进去后我们会看见很多选项,可以试着更改一下主题和发表一篇文章,点击发布:

然后重新登陆,可以看到设定的主题和发布的文章:

 为了测试出我们的请求会被haproxy调度到后端不同的web服务器上去,可以在其中一台服务器上的nginx配置文件里添加隐藏版本的命令:

vim /apps/nginx/conf/nginx.conf
http {                       //在http之内server之外server_tokens off;        //隐藏版本命令server {}
}

第一次刷新:

再次刷新:

 很明显相同的请求是被调度到不同的web服务器上的,好了整个实验到这里就已经结束了,由于时间有限,实验中还有很多可以完善的点和更好的解决方案,这些以后都会和大家慢慢分享,也由于本人的水平有限,实验中间不免会出现描述不明确或直接的错误,希望大家发现后及时提醒指出,万分感谢……

LNMP+HAproxy+Keepalived+NFS集群架构相关推荐

  1. Keepalived+LVS+Nginx+DRBD+Heartbeat+Zabbix集群架构

    2019独角兽企业重金招聘Python工程师标准>>> 本文由阿呆&zhdy合作完成! 一.准备工作: 1.1 6台模拟服务器: 确保每台机器 全部关闭 firewall 以 ...

  2. Linux集群架构(下)——DR模式、keepalived+LVS

    2019独角兽企业重金招聘Python工程师标准>>> Linux集群架构(下) 八.DR模式搭建 8.1 准备工作 试验需求三台机器: 分发器,也叫调度器(简写为dir) : 19 ...

  3. 企业中MySQL高可用集群架构三部曲之MM+keepalived

    各位老铁们,老张与大家又见面了.看到各位在博客里面给我的留言和访问量的情况,我很是欣慰,也谢谢大家对我的认可.我写这些博客,就是想把自己对于MySQL数据库的一些看法和自己平时的实战经验分享出来,我们 ...

  4. 汇总-13台虚拟机搭建一个高可用负载均衡集群架构

    要求 用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下. 设计你认为合理的架构,用visio把架构图画出来 搭建lnmp.tomcat+jdk环境 三个站点分别为:dis ...

  5. 大中型网站集群架构企业级高标准全自动实战项目征集

    大中型网站集群架构企业级高标准全自动实战 发布本博文目标: 老男孩教育全新期中集群架构项目实战(老男孩老师亲自带队) 1)征集网友或老男孩教育学生资源3-5人. 2)树立老男孩教育运维班期中集群架构项 ...

  6. 5 高可靠,构建RabbitMQ集群架构

    5 高可靠,构建RabbitMQ集群架构 本章为大家讲解RabbitMQ集群架构的各种姿势,以及从零到一带大家构建高可靠性的RabbitMQ集群架构(Haproxy + Keepalived),并分享 ...

  7. 0604 linux集群架构(上)

    0604 linux集群架构(上) 一.集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的 ...

  8. 学习笔记0604----Linux集群架构(一)

    Linux集群架构一 预习内容 1. 集群介绍 2. keepalived介绍 3. 用keepalived配置高可用集群 3.1 两台服务器分别安装keepalived 3.2 master端进行设 ...

  9. 消息队列专题(架构篇):RabbitMQ 的集群架构模式

    RabbitMQ 的集群架构模式主要有四种,分别是主备模式.远程模式.多活模式和镜像模式,本篇博客将依次介绍这四种架构模式,其中的镜像模式使用范围最广,我们将对其进行重点介绍. 主备模式 主备模式是指 ...

最新文章

  1. gc java root_聊聊Java的GC机制
  2. 操作系统真实的虚拟内存是什么样的
  3. pythonjieba分词_$好玩的分词——python jieba分词模块的基本用法
  4. Leetcode怎么调试java代码,LeetCode–正则表达式匹配
  5. G - Super Jumping! Jumping! Jumping!(动态规划)
  6. 纯软件归档产品的好处
  7. java web js 创建文件夹_如何在web工程里用java代码用程序动态添加css,images,js等文件夹...
  8. USB转NRF24L01模块 带UI上位机
  9. Linux网络服务--DHCP原理与配置 理论+实验(DHCP的分配方式,工作原理详解,配置文件修改和客户端的使用方式DHCP中继的配置命令)
  10. 用python统计字母个数_如何用python统计字符串中字母个数?
  11. 电脑数据格式化如何快速简单恢复数据?
  12. AlphaZero登上Science封面:从小白开始制霸多个游戏
  13. nb 底特律 外包公司,招人,
  14. 『互联网架构』软件架构-深入理解Ribbon
  15. 数组方法中会更改原数组,不会更改原数组(详细)
  16. 【fragment】Android Fragments 详细使用
  17. 《Linux 驱动:输入子系统》
  18. 毕业设计 STM32天气预报盒子 - 嵌入式 单片机 物联网
  19. 利用Python提取ABAQUS的计算结果(ODB)信息
  20. 腾讯云七月优惠活动云服务器限量秒杀20元起

热门文章

  1. SQL笔记(3)——MySQL数据类型
  2. 关于扩展欧几里得求最小正整数解
  3. 驱动开发:内核通过PEB得到进程参数
  4. 中国十大最难辨认姓氏
  5. 现代C++之SFINAE
  6. 跃点数win电脑应用
  7. PCIE——第 9 章——流量控制
  8. Linux进程间通信——pipe应用实例
  9. 白素贞-许汉文的思念
  10. 使用webpack中的externals配置项如何配置