菜鸟学Linux 第084篇笔记 lvs持久连接和awk简单使用
内容总览
lvs持久连接
awk, gawk 简单使用
awk变量
awk操作符
awk 模式和动作 pattern action
awk 数组 array
LVS持久连接
无论使用任何算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派发至
此前选定的RS。
持久连接模板(内存缓冲区)
每一个客户端 及分配给它的RS的映射关系
在基于ssl,需要用到持久连接
PPC 将来自于同一个客户端对同一个服务的请求,始终定向至此前选定的RS
持久端口连接
ipvsadm -A -t 192.168.11.122:80 -p 300
PCC 将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS,
持久客户端连接 (把所有端口全部都定义为集群服务,一律向RS转发)
ipvsadm -A -t 192.168.11.122:0 -p 300
PNMPP 持久防火墙标记连接
作用是将pcc的功能再进行优化,pcc虽然可以持久客户端连接,但是会将所有的
port都会转给real server, 而PNMPP则可以限制其只有某些个端口进行转发
原理, 是使用iptables标记某些端口将这些端口标记为一个数字
然后ipvsadm -f flag支持接收标记,所以当收到所标记的数值时就会将
其调度到real server
For example, say we want to create one-hour persistent port affinity between
ports 80 and 443 on VIP 172.16.100.6 for real servers 172.16.100.7 and 172.16.100.8 :
/sbin/iptables -F -t mangle
/sbin/iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.100.6
--dport 80 -j MARK --set-mark 1 (此为一行命令)
/sbin/iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.100.6
--dport 443 -j MARK --set-mark 1 (此为一行命令)
/sbin/ipvsadm -A -f 1 -s rr -p 3600
/sbin/ipvsadm -a -f 1 -r 172.16.100.7 -m
/sbin/ipvsadm -a -f 1 -r 172.16.100.8 -m
配置持久连接
ipvsadm -A|E ... -p timeout
timeout: 持久连接时长,默认300秒,单位是秒
rsync server (inotify+rsync server)
更新速度比较慢,尤其文件比较大时,再用此种方式不太合适
金山开发的工具 sersync 基于C++开发的
支持并发多线程复制,执行性能非常好
可以接收inotify发来的信息
适用服务器比较多, 需要复制大文件的环境比较适用
(自行研究并配置使其可工作)
grep 文本过虑器
grep 'pattern' input_file ...
sed 流编辑器 实现对文本编辑
sed 'COMMAND/pattern/' input_file...
awk 报告生成器
格式化以后,显示
nawk
gawk
# awk [options] 'script' file file2, ...
# awk [options] 'PATTERN { action }' file file2 ...
$0 表示一整行
$1, $2, $.... 表示切片的第N个
print 打印其后边所定义的变量或字符
printf 打印其后边所定义的变量或字符(有格式的输出)
printf format, item1,item2..
format格式以%开头,后跟一个字符,如下:
%c character显示字符的ASCII码
%d, %i 十进制整数
%e, %E 科学计数法显示数值
%f 显示浮点数
%g, %G 以科学计数法的格式或浮点数的格式显示数值
%s 显示字符串
%u 无符号整数
%% 显示%自身
修饰符
N 显示宽度(N要替换为数值)
- 左对齐
+ 显示数值符号
如 # awk -F: '{printf "%-15s%i\n",$1,$3}' /etc/passwd
awk变量
记录变量
OFS="#" output Filed Separater,定义输出分隔符为#
FS=":" 定义输入分隔符为:
awk -F: 也可以定义输入分隔符
数据变量
NR the number of input records,
awk已经处理过的行数,如果多个文件,行数会累加
FNR 与NR不同的是,FNR是记录已经被处理过的当前文件的行数
NF Number of field, 显示行共有的字段个数,注意数值会随着分隔符不同而变化
自定义变量
定义变量test并打印出该变量
# awk -v test="hello test" 'BEGIN{print test}'
第二种定义变量并打印方式
# awk 'BEGIN{test="hello test";print test}'
awk的操作符:
1.算术操作符:
-x: 负值
+x: 转换为数值;
x^y:
x**y: 次方
x*y: 乘法
x/y:除法
x+y:
x-y:
x%y:
2.字符串操作符:
只有一个,而且不用写出来,用于实现字符串连接;
3.赋值操作符:
=
+=
-=
*=
/=
%=
^=
**=
++
--
需要注意的是,如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代;
4.布尔值
awk中,任何非0值或非空字符串都为真,反之就为假;
5.比较操作符:
x < y True if x is less than y.
x <= y True if x is less than or equal to y.
x > y True if x is greater than y.
x >= y True if x is greater than or equal to y.
x == y True if x is equal to y.
x != y True if x is not equal to y.
x ~ y True if the string x matches the regexp denoted by y.
x !~ y True if the string x does not match the regexp denoted by y.
subscript in array True if the array array has an element with
the subscript subscript.
6.表达式间的逻辑关系符:
&&
||
7.条件表达式:C语言的语法
selector?if-true-exp:if-false-exp
8.函数调用:
function_name (para1,para2)
awk的模式和action:
awk 'program' input-file1 input-file2 ...
其中的program为:
pattern { action }
pattern { action }
...
一、常见的模式类型:
1、Regexp: 正则表达式,格式为/regular expression/
如: # awk -F: '/^\(/sbin\)/{print $NF}' /etc/passwd
2、expresssion: 表达式,其值非0或为非空字符时满足条件,
如:$1 ~ /oot$/ 或 $1 == "root",用运算符~(匹配)和!~(不匹配)。
# awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd
匹配$7里以bash结尾的行 并显示$1,$7
3、Ranges: 指定的匹配范围,格式为pat1,pat2
# awk -F: '"^r","^m"{print $1,$3,$7}' /etc/passwd
表示匹配从第一个pattern到pattern所匹配到的行
4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次
如# awk -F: '$3<500{printf "%-20s%-5i%-20s\n",$1,$3,$7}BEGIN
{print "User ID Shell"}END{print "this is end of file"}' /etc/passwd
在匹配开始时会打印User ID Shell 结束时会显示this is end of file
(这里仅做测试使用)
5、Empty(空模式):匹配任意输入行;
二、常见的Action
1、Expressions:
2、Control statements
3、Compound statements
4、Input statements
5、Output statements
三、Control Statements 控制语句:
(需要读懂并会写)
3.1 if-else
语法:if (condition) {then-body} else {[ else-body ]}
例子:
awk -F: '{if ($1=="root") print $1, "Admin";
else print $1, "Common User"}' /etc/passwd
awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin";
else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd
awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd
3.2 while循环 是对一行的每一个字段做循环
语法: while (condition){statement1; statment2; ...}
awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd
awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}' /etc/passwd
3.3 do-while
语法: do {statement1, statement2, ...} while (condition)
awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
3.4 for
语法: for ( variable assignment; condition; iteration process)
{ statement1, statement2, ...}
awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd
for循环还可以用来遍历数组元素: 与C相同
语法: for (i in array) {statement1, statement2, ...}
awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH)
{printf "%15s:%i\n",A,BASH[A]}}' /etc/passwd
3.5 case (与C相同)
语法:switch (expression) { case VALUE or /REGEXP/: statement1,
statement2,... default: statement1, ...}
3.6 break 和 continue
常用于循环或case语句中
3.7 next
提前结束对本行文本的处理,并接着处理下一行;
例如,下面的命令将显示其ID号为奇数的用户:
# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd
四、awk中使用数组
4.1数组
array[index-expression]
index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不
存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数
据组中是否存在某元素,需要使用index in array的方式。
要遍历数组中的每一个元素,需要使用如下的特殊结构:
for (var in array) { statement1, ... }
其中,var用于引用数组下标,而不是元素值;
例子:
netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
每出现一被/^tcp/模式匹配到的行,数组S[$NF]就加1,
NF为当前匹配到的行的最后一个字段,此处用其值做为数组S的元素索引;
awk '{counts[$1]++}; END {for(url in counts) print counts[url], url}'
/var/log/httpd/access_log(一行命令)
用法与上一个例子相同,用于统计某日志文件中IP地的访问量
4.2 删除数组变量
从关系数组中删除数组索引需要使用delete命令。使用格式为:
delete array[index]
本文转自Winthcloud博客51CTO博客,原文链接http://blog.51cto.com/winthcloud/1892941如需转载请自行联系原作者
Winthcloud