天天看点

菜鸟学Linux 第084篇笔记 lvs持久连接和awk简单使用

菜鸟学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

记录变量

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 }

...

一、常见的模式类型:

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