文章目录
规划与简述
本章会和大家一起搭建一个简单的站点架构,从用户请求开始,到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 //执行此命令即可安装lua
root@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-Rio
ln -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.gz
cd 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.cfg
global //全局参数
maxconn 100000 //定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
chroot /usr/local/haproxy //锁定运行目录,编译安装建议一定打开
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 2000 //此处也可以写uid、group,和上面创建的账号保存一致
gid 2000
daemon //以守护进程的方式运行
#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 3
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info //日志级别
defaults
option http-keep-alive //开启与客户端的会话保持
option forwardfor //透传客户端真实IP至后端web服务器
maxconn 100000
mode http //默认工作模式,mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK
timeout connect 300000ms //#客户端请求到后端server的最长连接等待时间(TCP之前)
timeout client 300000ms //客户端请求到后端服务端的超时超时时长(TCP之后),超时会报502错误
timeout server 300000ms //与客户端的最长非活动时间,建议设长一些
listen stats //设定一个状态页面
mode http
bind 0.0.0.0:9999 //状态监听地址和端口
stats enable
log global
stats uri /haproxy-status //登录状态页面uri
stats 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.loc
smtp_server 192.168.200.1 //邮件服务器IP,自定义即可
smtp_connect_timeout 30 //
router_id HK1 //虚拟路由id,自定义即可,主从不要相同
}
vrrp_instance VI_1 { //虚拟路由配置
state MASTER //当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface ens33 //绑定为当前虚拟路由器使用的物理接口
virtual_router_id 80 //当前虚拟路由器惟一标识,范围是0-255,主从必须要一致
priority 100 //当前物理节点在此虚拟路由器中的优先级;范围1-254,一般主的优先级大于从
advert_int 1 //rrp通告的时间间隔,默认1s
unicast_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.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id HK2
}
vrrp_instance VI_1 {
state BACKUP //前一台是master,这一台设为backup
interface ens33
virtual_router_id 80 //虚拟路由id,要和master保证一致
priority 80 //优先级比master要低一些
advert_int 1
unicast_src_ip 192.168.131.28
unicast_peer {
192.168.131.18
}
authentication { //认证要保持一致,否则认证会失败
auth_type PASS
auth_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 name
server real2 192.168.131.58:80 check weight 2 //check为健康检查,weight为权重
listen mysql_3306 //代理监听mysql数据库段
bind 192.168.131.249:3306
mode tcp
log global
server 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_module
make && make install //安装编译
上面的操作执行无误后,nginx就安装完毕了,在NP2上执行相同的安装步骤即可。在正常启动nginx前,我们还需要修改一下配置文件:
vim /apps/nginx/conf/nginx.conf
user nginx nginx; //把nginx服务用户和组改为我们创建的nginx
include /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 web
spider|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-fileinfo
make && 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_id
mysql -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_watches
yum install -y inotify-tools
#配置生成密码文件,用以和BK端rsync服务连接认证
echo "password" > /etc/rsync.pass //password为自定义的密码
chmod 600 /etc/rsync.pass
vim 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
done
nohup ./inotify_rsync.sh &> /dev/null & //后台实时执行脚本
#在BK服务器端
yum install -y rsync rsync-daemon
echo "rsyncuser:password" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
mkdir /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 6
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.131.38 80 {
weight 1
TCP_CHECK {
connect_timeout5
nb_get_retry3
delay_before_retry3
connect_port80
}
}
real_server 192.168.131.58 80 {
weight 1
TCP_CHECK {
connect_timeout5
nb_get_retry3
delay_before_retry3
connect_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服务器上的,好了整个实验到这里就已经结束了,由于时间有限,实验中还有很多可以完善的点和更好的解决方案,这些以后都会和大家慢慢分享,也由于本人的水平有限,实验中间不免会出现描述不明确或直接的错误,希望大家发现后及时提醒指出,万分感谢……