日志服务管理、网络文件共享、数据同步、LVS

一、通过loganalyzer展示数据库中的日志

loganalyzer是用 php 语言实现的日志管理系统,可将MySQL数据库的日志用丰富的WEB方式进行展示,官网:https://loganalyzer.adiscon.com

架构

rsyslog
10.0.0.8
MySQL
10.0.0.18
httpd+php
10.0.0.28

步骤:

rsyslog安装连接mysql模块相关程序包

[root@rsyslog ~]# yum install rsyslog-mysql -y
[root@rsyslog ~]# rpm -ql rsyslog-mysql
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
# 查看sql脚本内容
[root@rsyslog ~]# cat /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
CREATE DATABASE Syslog;
USE Syslog;
CREATE TABLE SystemEvents
(
ID int unsigned not null auto_increment primary key,
CustomerID bigint,
ReceivedAt datetime NULL,
DeviceReportedTime datetime NULL,
Facility smallint NULL,
Priority smallint NULL,
FromHost varchar(60) NULL,
Message text,
NTSeverity int NULL,
Importance int NULL,
EventSource varchar(60),
EventUser varchar(60) NULL,
EventCategory int NULL,
EventID int NULL,
EventBinaryData text NULL,
MaxAvailable int NULL,
CurrUsage int NULL,
MinUsage int NULL,
MaxUsage int NULL,
InfoUnitID int NULL ,
SysLogTag varchar(60),
EventLogType varchar(60),
GenericFileName VarChar(60),
SystemID int NULL
);
CREATE TABLE SystemEventsProperties
(
ID int unsigned not null auto_increment primary key,
SystemEventID int NULL ,
ParamName varchar(255) NULL ,
ParamValue text NULL
);
#将sql脚本复制到10.0.0.18数据库服务器上
scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql 10.0.0.18:/opt

配置mysql数据库

#安装mariadb数据库
[root@mysql ~]# yum install mariadb-server -y
#启动数据库
[root@mysql ~]# systemctl start mariadb
#使用root用户登录数据库,执行mysql-createDB.sql脚本创建相关数据库和表,并授权rsyslog能连接至当前服务器
[root@mysql ~]# mysql -uroot
MariaDB [(none)]> source /opt/mysql-createDB.sql
MariaDB [Syslog]> grant all on Syslog.* to 'rsyslog'@'10.0.0.%' identified by '123456';

配置rsyslog服务器将日志发送至mysql数据库

#配置rsyslog将日志保存到mysql中
[root@rsyslog ~]# vim /etc/rsyslog.conf
#
####MODULES####
#在 MODULES 语言下面,如果是 CentOS 8 加下面行
module(load="ommysql")
#在 MODULES 语言下面,如果是 CentOS 7,6 加下面行
$ModLoad ommysql
#在RULES语句块加下面行的格式
#facility.priority :ommysql:DBHOST,DBNAME,DBUSER, PASSWORD
*.info :ommysql:10.0.0.18,Syslog,rsyslog,123456
#重启rsyslog服务
[root@rsyslog ~]# systemctl restart rsyslog

配置httpd+php服务器

注意:httpd+php服务器为CentOS8

安装httpd,php和相关软件包

yum -y install httpd php-fpm php-mysqlnd php-gd
systemctl enable --now httpd php-fpm

安装LogAnalyzer

可从官网https://download.adiscon.com/loganalyzer/loganalyzer-4.1.12.tar.gz下载

tar xvf loganalyzer-4.1.12.tar.gz
mv loganalyzer-4.1.12/src/ /var/www/html/log
touch /var/www/html/log/config.php
chmod 666 /var/www/html/log/config.php

基于Web页面初始化

访问http://10.0.0.28/log/进行初始化

注意:若httpd+php服务器为CentOS7,访问http://10.0.0.28/log/将不会进入web界面,而是http下载,原因是站点无法正常解析php,还需进行如下配置

下载安装相关依赖包

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install mod_php

配置/etc/httpd/conf/httpd.conf文件,参照下图添加解析php相关配置

配置完后需要重启httpd:systemctl restart httpd

参考:https://www.cnblogs.com/peng-lan/p/11361758.html

二、实现基于MYSQL验证的vsftpd虚拟用户访问

利用pam_mysql模块可实现基于MySQL的FTP虚拟用户功能,FTP服务器只支持CentOS6、7

架构

client
10.0.0.8
FTP Server
10.0.0.18
PAM
My SQL
10.0.0.28

数据库服务器配置

安装数据库

#注意:MySQL8.0由于取消了PASSWORD()函数,因此选择Mariadb或选择MySQL8.0以下的
yum install mariadb-server -y
systemctl enable --now mariadb

配置数据库

[root@mysql ~]# mysql
#建立存储虚拟用户数据库和表
MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> use vsftpd
MariaDB [vsftpd]> create table users (
id int auto_increment not null primary key,
name char(50) binary not null,
password char(48) binary not null
);
#添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储
MariaDB [vsftpd]> insert into users(name,password) values('shichu',password('123456'));
MariaDB [vsftpd]> insert into users(name,password) values('chushi',password('654321'));
MariaDB [vsftpd]> select * from users;
+----+------------+-------------------------------------------+
| id | name | password |
+----+------------+-------------------------------------------+
| 1 | shichu | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | chushi | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 |
+----+------------+-------------------------------------------+
2 rows in set (0.00 sec)
#创建连接的数据库用户
MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'10.0.0.%' identified by '123456';

FTP服务器配置

安装vsftpd和pam_mysql包,对于 centos7:无对应rpm包,需手动编译安装

#安装相关依赖包
yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel
#下载pam-mysql源码进行编译
wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
tar xvf pam_mysql-0.7RC1.tar.gz -C /usr/local/src
cd /usr/local/src/pam_mysql-0.7RC1
./configure --with-pam-mods-dir=/lib64/security
#如果上面命令不指定 --with-pam-mods-dir=/lib64/security 会报以下错误
#checking if the second argument of pam_conv.conv() takes const pointer... no
#configure: error: Your system doesn't appear to be configured to use PAM.
#Perhaps you need to specify the correct location where the PAM modules reside.
#make可省略,直接make install
make && make install
#查看
[root@ftp upload]# ll /lib64/security/pam_mysql*
-rwxr-xr-x 1 root root 882 Jun 6 23:52 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141720 Jun 6 23:52 /lib64/security/pam_mysql.so

新建pam认证配置文件

[root@ftp upload]# cat /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.28 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.28 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

配置字段说明

auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式:
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函数加密
3表示md5加密
4表示sha1加密

建立相应用户和修改vsftpd配置文件

#建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /data/ftproot -r vuser
mkdir /data/ftproot/upload -pv
setfacl -m u:vuser:rwx /data/ftproot/upload #或者更改属组
# 修改vsftpd.conf配置文件
vim /etc/vsftpd/vsftpd.conf
# 添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql

配置虚拟用户具有不同的访问权限

#配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
# 添加如下项
user_config_dir=/etc/vsftpd/conf.d/
#创建所需目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/conf.d/ -pv
#配置虚拟用户的访问权限
#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户shichu具有上传文件的权限,
#可修改/etc/vsftpd/conf.d/shichu文件,在里面添加如下选项并设置为YES即可,只读则设为NO
#注意:需确保对应的映射用户对于文件系统有写权限
[root@ftp ~]# cat /etc/vsftpd/conf.d/shichu
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#登录目录改变至指定的目录
local_root=/data/ftproot1
#更改目录属组
[root@ftp ~]# chown vuser:vuser /data/ftproot1/upload/
[root@ftp ftproot1]# ll /data/ftproot1/
total 0
drwxr-xr-x 2 vuser vuser 39 Jun 7 00:49 upload
[root@ftp ftproot1]#

验证

ftp服务器10.0.0.18准备目录结构如下:

client用虚拟用户shichu登录进入/data/ftproot1目录下,同时具备上传、下载权限

数据库新增alice用户

MariaDB [vsftpd]> insert into users(name,password) values('alice',password('123456'));
MariaDB [vsftpd]> select * from users;
+----+--------+-------------------------------------------+
| id | name | password |
+----+--------+-------------------------------------------+
| 1 | shichu | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | chushi | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 |
| 3 | alice | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+--------+-------------------------------------------+

alice默认进入/data/ftproot目录,具有下载权限,无上传权限

三、配置samba共享,实现/www目录共享

samba服务器

#在samba服务器上安装samba包
yum install samba -y
#创建samba用户和组
groupadd -r admins
useradd -s /sbin/nologin -G admins shi
smbpasswd -a shi #密码123456
useradd -s /sbin/nologin -G admins chu
smbpasswd -a chu #密码654321
#创建/www共享目录,并设置SELinux
mkdir /www
chgrp admins /www
chmod 2775 /www
#samba配置
vim /etc/samba/smb.conf
#新添加如下项
[share]
path=/www
write list = @admins
#添加开机服务自启动并启动服务
systemctl enable --now smb nmb

客户端

#安装samba客户端访问
yum install cifs-utils -y
#用shi用户挂载smb共享并访问
mkdir /mnt/shi
mount -o username=shi //10.0.0.18/share /mnt/shi #密码:123456
echo 'Hello shi' > /mnt/shi/hello.txt
#用chu用户挂载smb共享并访问
mkdir /mnt/chu
mount -o username=chu //10.0.0.18/share /mnt/chu #密码:654321
touch /mnt/chu/chu.txt

目录共享验证

[root@client mnt]# tree
.
├── chu
│ ├── chu.txt
│ ├── hello.txt
│ ├── samba-server.log
│ └── windows.txt
└── shi
├── chu.txt
├── hello.txt
├── samba-server.log
└── windows.txt
2 directories, 8 files

Windows访问查看

(用户名密码分别为shi,123456)

#samba服务器新建samba-server.log文件,Windows客户端新建windows.txt文件
[root@samba-server www]# touch /www/samba-server.log


四、使用rsync+inotify实现/www目录实时同步

架构

client
10.0.0.8
data-server
inotify
/www
10.0.0.28
backup-server
rsyncd
/www
10.0.0.18

backup服务器

说明:系统为CentOS 7

#安装rsync
yum -y install rsync
#修改rsync配置文件
vi /etc/rsyncd.conf
uid = root
gid = root
# use chroot = yes
max connections = 0
ignore errors
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
lock file = /var/run/rsyncd.lock
exclude = lost+found/
reverse lookup = no
#hosts allow = 10.0.0.0/24
[backup] #每个模块名对应一个不同的path目录,如果同名后面模块生效
path = /data/backup/
comment = backup dir
read only = no #默认是yes,即只读
auth users = rsyncuser #默认anonymous可以访问rsync服务器
secrets file = /etc/rsync.pas
#准备备份目录
mkdir -pv /data/backup
#生成验证文件,用户名+密码,修改文件权限
echo "rsyncuser:shichu" > /etc/rsync.pas
chmod 600 /etc/rsync.pas
#启动rsync服务
rsync --daemon #可加入/etc/rc.d/rc.local实现开机自启动

data服务器

#安装inotify-tools:基于epel源
yum install inotify-tools -y
#安装rsync同步工具
yum install rsync -y
#将密码写入文件,还必须修改文件权限
echo "shichu" > /etc/rsync.pas
chmod 600 /etc/rsync.pas

inotify+rsync+shell 脚本实现实时数据同步

vim inotify_rsync.sh
#!/bin/bash
SRC='/www/'
DEST='rsync://rsyncuser@10.0.0.18/backup' # 'root@10.0.0.18::backup'
rpm -q rsync &> /dev/null || yum install rsync -y
inotifywait -mrq --exclude=".*\.swap" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,modify,attrib,\
close_write,move ${SRC} | while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -arz --delete --password-file=/etc/rsync.pas $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was \
backuped up via rsync" >> /var/log/changelist.log
done

启动数据同步脚本

bash inotify_rsync.sh

测试

在data服务器/www目录下新建、修改、删除文件,将自动同步到backup服务器/data/backup目录下

[root@data www]# touch 1.log
[root@data www]# mkdir 2
[root@data www]# touch 3.txt
[root@data www]# echo '1111' >> 1.log
[root@data www]# rm -f 3.txt

查看data服务器变更记录

[root@data ~]# tail -f /var/log/changelist.log

backup服务器自动同步data服务器/www目录文件变动情况

说明

  1. inotify-tools

参考文档:https://github.com/rvoicilas/inotify-tools/wiki

inotify-tools包主要工具:

  • inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控

  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotifywait 命令

格式:

inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

常用选项

-m, --monitor 始终保持事件监听
-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive 递归监控目录数据信息变化
-q, --quiet 输出少量事件信息
--exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
--excludei <pattern> 和exclude相似,不区分大小写
-o, --outfile <file> 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
-s, --syslogOutput 发送错误到syslog相当于标准错误输出
--timefmt <fmt> 指定时间输出格式
--format <fmt> 指定的输出格式;即实际监控输出内容
-e 指定监听指定的事件,如果省略,表示所有事件都进行监听

inotifywait 的--timefmt 时间格式

参考 man 3 strftime

%Y #年份信息,包含世纪信息
%y #年份信息,不包括世纪信息
%m #显示月份,范围 01-12
%d #每月的第几天,范围是 01-31
%H #小时信息,使用 24小时制,范围 00-23
%M #分钟,范围 00-59
%S #秒,范例 0-60

范例:

--timefmt "%Y-%m-%d %H:%M:%S"

inotifywait 的 --format 格式定义

%T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w #事件出现时,监控文件或目录的名称信息,相当于dirname
%f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename
%e #显示发生的事件信息,不同的事件默认用逗号分隔
%Xe #显示发生的事件信息,不同的事件指定用X进行分隔

范例:

--format "%T %w%f event: %;e"
--format '%T %w %f'

inotifywait -e 选项指定的事件类型

create #文件或目录创建
delete #文件或目录被删除
modify #文件或目录内容被写入
attrib #文件或目录属性改变
close_write #文件或目录关闭,在写入模式打开之后关闭的
close_nowrite #文件或目录关闭,在只读模式打开之后关闭的
close #文件或目录关闭,不管读或是写模式
open #文件或目录被打开
lsdir #浏览目录内容
moved_to #文件或目录被移动到监控的目录中
moved_from #文件或目录从监控的目录中被移动
move #文件或目录不管移动到或是移出监控目录都触发事件
access #文件或目录内容被读取
delete_self #文件或目录被删除,目录本身被删除
unmount #取消挂载

范例:

-e create,delete,moved_to,close_write,attrib

范例:使用inotifywait

#监控一次性事件
inotifywait /data/www
Setting up watches.
Watches established.
/data/www/ CREATE f1.txt
#持续前台监控
inotifywait -mrq /data/www --exclude=".*\.swx|\.swp"
/data/www/ OPEN f1.txt
/data/www/ ACCESS f1.txt
/data/www/ CLOSE_NOWRITE,CLOSE f1.txt
#持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --
format "%T %w%f event: %e"
#持续前台监控特定事件
inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event:
%;e" -e create,delete,moved_to,close_write,attrib
  1. rsync命令常见选项
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象
-z :传输时进行压缩提高效率
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能。
--remove-source-files:要求删除源端已经成功传输的文件

五、LVS调度算法总结

主要分为静态、动态以及内核4.15版本后新增共三类十二种调度算法

静态方法

仅根据算法本身进行调度

  1. RR:roundrobin,轮询,较常用
  2. WRR:Weighted RR,加权轮询,较常用
  3. SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中RS(RealServer),从而实现会话绑定
  4. DH:Destination Hashing;目标地址hash,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如Web缓存

动态方法

主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

  1. LC:least connections适用于长链接应用

    Overhead=activeconns*256+inactiveconns

  2. WLC:Weighted LC,默认调度方法,较常用

    Overhead=(activeconns*256+inactiveconns)/weight

  3. SED:Shorest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接

    Overhead=(activeconns+1)*256/weight

  4. NQ:Nerver Queue,第一轮均匀分配,后续SED

  5. LBLC:Locality-Based LC,动态的DH算法,适用场景:根据负载状态实现正向代理,实现Web Cache等

  6. LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,实现Web Cache等

内核4.15版本后新增调度算法

  1. FO:Weighted Fail Over,在FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度;属于静态算法
  2. OVF:Overflow-connection,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器;属于动态算法

一个可用的真实服务器需要同时满足以下条件:

  • 未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
  • 真实服务器当前的活动连接数量小于其权重值
  • 其权重值不为零

六、LVS的跨网络DR实现

LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。

架构

仅主机模式
VMnet1
NAT模式
VMnet8
Client
192.168.10.6/24
GW:192.168.10.200
Router
eth0:10.0.0.200/24
eth0:172.16.0.200/24
eth1:192.168.10.200/24
switch
LVS
lo:VIP:172.16.0.100/32
eth0:DIP:10.0.0.8/24
GW:10.0.0.200
RS1
lo:VIP:172.16.0.100/32
eth0:RIP1:10.0.0.7/24
GW:10.0.0.200
RS2
lo:VIP:172.16.0.100/32
eth0:RIP2:10.0.0.17/24
GW:10.0.0.200

术语

VS:Virtual Server,Director Server(DS),Dispatcher(调度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)
CIP:Client IP
VIP:Virtual IP,VS外网的IP
DIP:Director IP,VS内网的IP
RIP:Real Server IP
访问流程:CIP<-->VIP==DIP<-->RIP

注意:所有主机禁用iptables和SELinux

Client

配置网络

[root@client ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.6
PREFIX=24
GATEWAY=192.168.10.200
ONBOOT=yes

查看网络状态

[root@client ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:c0:57:53 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.6/24 brd 192.168.10.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec0:5753/64 scope link
valid_lft forever preferred_lft forever
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.200 0.0.0.0 UG 100 0 0 eth0
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@client ~]# hostname -I
192.168.10.6

Router

启动内核中路由转发功能

[root@router ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p

配置网络

[root@router ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.200
PREFIX=24
ONBOOT=yes
[root@router ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
NAME=eth0
BOOTPROTO=static
IPADDR=172.16.0.200
PREFIX=24
ONBOOT=yes
[root@router ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.10.200
PREFIX=24
ONBOOT=yes

查看网络状态

[root@router ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:a8:95:8e brd ff:ff:ff:ff:ff:ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 172.16.0.200/24 brd 172.16.0.255 scope global noprefixroute eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea8:958e/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:a8:95:98 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.200/24 brd 192.168.10.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea8:9598/64 scope link
valid_lft forever preferred_lft forever
[root@router ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.10.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
[root@router ~]# hostname -I
10.0.0.200 172.16.0.200 192.168.10.200

LVS

配置网络

[root@lvs ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@lvs ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo
IPADDR=172.16.0.100
NETMASK=255.255.255.255
NETWORK=172.16.0.100
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

查看网络状态

[root@lvs ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/32 brd 172.16.0.100 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:b0:55:72 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.8/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feb0:5572/64 scope link
valid_lft forever preferred_lft forever
[root@lvs ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@lvs ~]# hostname -I
10.0.0.8

LVS规则配置

#安装
yum -y install ipvsadm
#配置规则
[root@lvs ~]# ipvsadm -A -t 172.16.0.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.7:80 -g
[root@lvs ~]# ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.17:80 -g
#查看规则
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.100:80 rr
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.17:80 Route 1 0 0

RS1

配置网络

[root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo
IPADDR=172.16.0.100
NETMASK=255.255.255.255
NETWORK=172.16.0.100
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

查看网络状态

[root@rs1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/32 brd 172.16.0.100 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:81:15:3e brd ff:ff:ff:ff:ff:ff
inet 10.0.0.7/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe81:153e/64 scope link
valid_lft forever preferred_lft forever
[root@rs1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs1 ~]# hostname -I
10.0.0.7

安装httpd

yum -y install httpd
echo `hostname -I` > /var/www/html/index.html
systemctl enable --now httpd

IPVS配置

[root@rs1 ~]# echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce

RS2

配置网络

[root@rs2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@rs2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo
IPADDR=172.16.0.100
NETMASK=255.255.255.255
NETWORK=172.16.0.100
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

查看网络状态

[root@rs2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/32 brd 172.16.0.100 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e9:a2:65 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.17/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee9:a265/64 scope link
valid_lft forever preferred_lft forever
[root@rs2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs2 ~]# hostname -I
10.0.0.17

安装httpd

yum -y install httpd
echo `hostname -I` > /var/www/html/index.html
systemctl enable --now httpd

IPVS配置

[root@rs1 ~]# echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce

测试

按LVS轮询调度方式

[root@client ~]# curl 172.16.0.100
10.0.0.17
[root@client ~]# curl 172.16.0.100
10.0.0.7
[root@client ~]# curl 172.16.0.100
10.0.0.17
[root@client ~]# curl 172.16.0.100
10.0.0.7

RS1 日志

[root@rs1 ~]# tail -f /var/log/httpd/access_log
192.168.10.6 - - [09/Jun/2022:00:31:49 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:31:50 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:31:51 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:31:53 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:32:01 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:33:21 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:33:22 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0"

RS2日志

[root@rs2 ~]# tail -f /var/log/httpd/access_log
192.168.10.6 - - [09/Jun/2022:00:31:48 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:31:50 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:31:51 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:31:52 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:32:00 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:33:18 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.10.6 - - [09/Jun/2022:00:33:21 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"

ipvsadm命令说明

程序包:ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save

规则重载工具:/usr/sbin/ipvsadm-restore

配置文件:/etc/sysconfig/ipvsadm-config

ipvs调度规则文件:/etc/sysconfig/ipvsadm

ipvsadm核心功能

  • 集群服务管理:增、删、改
  • 集群服务的RS管理:增、删、改
  • 查看

ipvsadm 工具用法:

#管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
[--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address #删除
ipvsadm –C #清空
ipvsadm –R #重载,相当于ipvsadm-restore
ipvsadm -S [-n] #保存,相当于ipvsadm-save
#管理集群中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]

管理集群服务:增、改、删

增、修改

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

service-address:
-t|u|f:
-t: TCP协议的端口,VIP:TCP_PORT 如: -t 10.0.0.100:80
-u: UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,标记,一个数字
[-s scheduler]:指定集群的调度算法,默认为wlc

范例

ipvsadm -A -t 10.0.0.100:80 -s wrr

删除

ipvsadm -D -t|u|f service-address

管理集群上的RS:增、改、删

增、改

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

ipvsadm -d -t|u|f service-address -r server-address

server-address:
rip[:port] 如省略port,不作端口映射
选项:
lvs类型:
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重

范例

ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:8080 -m -w 3

清空定义的所有内容

ipvsadm -C

清空计数器

ipvsadm -Z [-t|u|f service-address]

查看

ipvsadm -L|l [options]

--numeric, -n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出
--stats:统计信息
--rate :输出速率信息

ipvs规则

/proc/net/ip_vs

ipvs连接

/proc/net/ip_vs_conn

保存

建议保存至/etc/sysconfig/ipvsadm

ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service #会自动保存规则至/etc/sysconfig/ipvsadm

重载

ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
systemctl start ipvsadm.service #会自动加载/etc/sysconfig/ipvsadm中规则
posted @   areke  阅读(357)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示