Python第十四周网络知识和数据库知识总结

高性能集群Linux virtual server、Nginx、高可用性集群keepalived

三、高性能集群Linux virtual server

1、cluster概念

系统扩展方式:

Scale up:向上扩展,增强。

Scale out:向外扩展增加设备,调度分配问题,cluster

u Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统

u Linux Cluster类型:

Ø LB:Load Balancing,负载均衡

Ø HA:High Availiablity,高可用,SPOF(single Point Of failure)

MTBF:Mean Time Between Failure 平均无故障时间

MTTR:Mean Time To Restoration( repair)平均恢复前时间

A=MTBF/(MTBF+MTTR)

(0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%

Ø HPC:High-performance computing,高性能 www.top500.org

u 分布式系统:

分布式存储:云盘

分布式计算:hadoop,Spark

 

uLB Cluster的实现

u硬件

F5 Big-IP

Citrix Netscaler

A10 A10

u软件

lvs:Linux Virtual Server

nginx:支持四层调度

haproxy:支持四层调度

ats:apache traffic server,yahoo捐助

perlbal:Perl 编写

Pound

 

u基于工作的协议层次划分:u

传输层(通用):DPORTLVS:nginx:streamhaproxy:mode tcpu

应用层(专用):针对特定协议,自定义的请求模型分类

proxy server:

http:nginx, httpd, haproxy(mode http), …fastcgi:nginx, httpd, …mysql:mysql-proxy,

 

会话保持:负载均衡

(1) session sticky:同一用户调度固定服务器

Source IP:LVS sh算法(对某一特定服务而言)

Cookie

(2) session replication:每台服务器拥有全部session

session multicast cluster

(3) session server:专门的session服务器

Memcached,Redis

u HA集群实现方案

keepalived:vrrp协议

ais:应用接口规范

heartbeat

cman+rgmanager(RHCS)

coresync_pacemaker

 

分布式系统。

 

2、lvs介绍

章文嵩 基层内接。

Vs:虚拟服务器。

Rs:真正提供服务

L4:四层调度

u LVS:Linux Virtual Server,负载调度器,集成内核 章文嵩 阿里

官网:http://www.linuxvirtualserver.org/

VS: Virtual Server,负责调度

RS: Real Server,负责真正提供服务

L4:四层路由器或交换机

u 工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根

据调度算法来挑选RS

u iptables/netfilter:

iptables:用户空间的管理工具

netfilter:内核空间上的框架

流入:PREROUTING –> INPUT

流出:OUTPUT –> POSTROUTING

转发:PREROUTING –> FORWARD –> POSTROUTING DNAT:

目标地址转换; PREROUTING

 

工作原理:vs根据请求报文的目标ip和目标协议及端口将其调度转发至某RS。根据调度算法来挑选RS。

 

数据包三种流向:进入、经过、穿过。

 

lvs集群类型中的术语:

ØVS:Virtual Server,Director Server(DS)

Dispatcher(调度器),Load Balancer

ØRS:Real Server(lvs), upstream server(nginx)

backend server(haproxy)

ØCIP:Client IP

ØVIP: Virtual serve IP VS外网的IP

ØDIP: Director IP VS内网的IP

ØRIP: Real server IP

Ø访问流程:CIP <–> VIP == DIP <–> RIP

 

四表:mangle,nat,filter,raw

五链:

 

DANT:目标的地址的转变。

 

 

访问流程:cip—-vip—-dip—-rip

 

3、Lvs集群的类型

 

ulvs: ipvsadm/ipvs

ipvsadm:用户空间的命令行工具,规则管理器

用于管理集群服务及RealServer

ipvs:工作于内核空间netfilter的INPUT钩子上的框架

ulvs集群的类型:

lvs-nat:修改请求报文的目标IP,多目标IP的DNAT

lvs-dr:操纵封装新的MAC地址

lvs-tun:在原请求IP报文之外新加一个IP首部

lvs-fullnat:修改请求报文的源和目标IP

 

4、Lvs-nat模式

本质上就是多目标的DNAT。通过将请求报文

 

调度过程:NAT模式IP包调度过程。

  • RIP和DIP在一个网段上(可以不再一个上),应该使用私网地址。rs的网关要指向dip。

(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

(3)支持端口映射,可修改请求报文的目标PORT

(4)VS必须是Linux系统,RS可以是任意OS系统

Nat模式ip包调度过程

 

Vs/nat的体系结构

 

5、lvs-DR模型

Ip地址,启动时候发出arp的广播,使用此地址。

数据发送回去的时候直接到达cip,不是原路返回的。

 

LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新

封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出

的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

u Director和各RS都配置有VIP

(1) 确保前端路由器将目标IP为VIP的请求报文发往Director

Ø 在前端网关做静态绑定VIP和Director的MAC地址

Ø 在RS上使用arptables工具

arptables -A IN -d $VIP -j DROP

arptables -A OUT -s $VIP -j mangle –mangle-ip-s $RIP

Ø 在RS上修改内核参数以限制arp通告及应答级别

arp_announce

arp_ignore

  • RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;R的网关不能指向DIP,以确保响应报文不会经由Director(3) RS和Director要在同一个物理网络(4) 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client(5) 不支持端口映射(端口不能修败)(6) RS可使用大多数OS

 

避免ip冲突:

  • 网络中发广播,
  • 对外不宣城使用ip的地址。

 

Rs的rip可以使用私网地址,可以使用公网地址。

请求报文经由lvs,响应报文不经过lvs,有rs直接到达客户端。

端口不支持映射。

 

Rs距离太近了。

6、lvs-tun模式

不修改请求报文的头部,直接增加一层报文头部。

  • dip,VIP,rip都应该是公网地址
  • Rs的网关不能,也不能指向dip
  • 请求报文要经由director,但影响不能经由director
  • 不支持端口映射
  • Rs的os必须支持隧道功能

 

 

 

7、lvs-fullnat模式

同时更改请求报文的源ip地址和目标ip地址进行转发。

Cip   —-> dip

Vip   —–>rip

  • VIP是公网地址,rip和dip是私网地址,且通常不在同一ip网络,因此,rip的网关一般不会指向dip。
  • 认识收到的请求报文原地址是dip,因此,只需要响应给dip,但director还要将其发往client。
  • 请求和享用报文都经由director
  • 支持端口映射

此类型kernel默认不支持。

8、lvs工作模式总结

 

  Vs/nat Vs/tun Vs/dr
Server Any Tunneling Non-arp device
Server network Private Lan/wan Lan
Servernumber Low(10-20) High(100) High(100)
Server gateway Load balancer Own router Own router

 

 

u lvs-nat与lvs-fullnat:请求和响应报文都经由Director

lvs-nat:RIP的网关要指向DIP,源地址指向VIP,

lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信,源地址也要替换。

 

u lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发

往Client

lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发,客户端发请求到lvs,只是参与请求报文,不参与报文的转发。

 

lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信。两个报文头部。请求和响应报文不是同路返回。

9、ipvs scheduler

ipvs scheduler:

u根据其调度时是否考虑各RS当前的负载状态

两种:静态方法和动态方法

调度:静态调度和动态调度

静态方法:仅根据算法本身进行调度。

  • RR轮询
  • WRR加权轮询
  • sh,实现session sticky,源地址hash运算。
  • DH:目标地址hash。正向代理缓存的情况。

不考虑后端服务器的负载状态。

6种动态算法:

动态方法:主要根据每rs当前的负载状态机调度算法进行调度,overhead=value较小的rs将被调度:

  • LC:least connections适用于长连接应用

Overhead=activeconns*256+inactiveconns

  • WLC:默认调度。

Overhead=(activeconns*256+inactiveconns)/weight

  • SED:初始连接高权重优先

Overhead=(activeconns+1)*256/weight

  • NQ:第一轮均匀分配,后续SED。
  • LBLC:动态的DH算法,使用场景,根据负载状态实现正向代理。
  • LBLCR:带复制功能的LBLC。解决LBLC负载不均衡问题,从负载重的复制到负载轻的rs。

10、ipvs

Ipvsadm/ipvs:

Ipvs:

grep -i -C 10 “ipvs” /boot/config-VERSION-RELEASE.x86_64

支持的协议:TCP, UDP, AH, ESP, AH_ESP, SCTP

Ipvs集群:

管理集群服务

管理服务商的rs

11、ipvsadm包构成

程序包:ipvsadm:

Unit File: ipvsadm.service

Ø主程序:/usr/sbin/ipvsadm

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

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

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

12、ipvsadm命令

核心功能:

集群服务管理:增删改,

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

查看:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [–ppersistence_engine] [-b sched-flags]

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

ipvsadm –C 清空

ipvsadm –R 重载

ipvsadm -S [-n] 保存

ipvsadm -a|e -t|u|f service-address -r server-address [options]

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

ipvsadm -L|l [options]

ipvsadm -Z [-t|u|f service-addres

 

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

u增、改:

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

u删除:

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

uservice-address:

-t|u|f:

-t: TCP协议的端口,VIP:TCP_PORT

-u: UDP协议的端口,VIP:UDP_PORT

-f:firewall MARK,标记,一个数字

u[-s scheduler]:指定集群的调度算法,默认为wlc

 

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

u增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w

weight]

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

userver-address:

rip[:port] 如省略port,不作端口映射

u选项:

lvs类型:

-g: gateway, dr类型,默认

-i: ipip, tun类型

-m: masquerade, nat类型

-w weight:权重

 

清空定义的所有内容:ipvsadm –C

u清空计数器:ipvsadm -Z [-t|u|f service-address]

u查看:ipvsadm -L|l [options]

–numeric, -n:以数字形式输出地址和端口号

–exact:扩展信息,精确值

–connection,-c:当前IPVS连接输出

–stats:统计信息

–rate :输出速率信息

uipvs规则: /proc/net/ip_vs

uipvs连接:/proc/net/ip_vs_conn

 

13、保存及重载规则

保存:议保存至/etc/sysconfig/ipvsadm

ipvsadm-save > /PATH/TO/IPVSADM_FILE

ipvsadm -S > /PATH/TO/IPVSADM_FILE

systemctl stop ipvsadm.service

u重载:

ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

ipvsadm -R < /PATH/FROM/IPVSADM_FILE

systemctl restart ipvsadm.service

 

 

yum clean all 清理yum源的缓存。

Lvs只是处理请求报文,网关可以随意配置,不能不配置。

 

14、Lvs

u负载均衡集群设计时要注意的问题

(1) 是否需要会话保持

(2) 是否需要共享存储

共享存储:NAS, SAN, DS(分布式存储)

数据同步:

ulvs-nat:

设计要点:

(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP

(2) 支持端口映射

(3) Director要打开核心转发功能

 

##############练习题一个

 

15、lvs-DR

DR模型中各主机均需要配置VIP,解决地址冲突的方式有三种:

  • 在前端网关做静态绑定
  • 在各rs使用arptables
  • 在各rs修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

u 限制通告级别:arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告

1:尽量避免将接口信息向非直接连接网络进行通告

2:必须避免将接口信息向非本网络进行通告

 

16、rs预配置脚本信息

#!/bin/bash

vip=192.168.0.100

mask=’255.255.255.255‘

dev=lo:1

case $1 in

start)

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $dev $vip netmask $mask broadcast $vip up

route add -host $vip dev $dev

;;

stop)

ifconfig $dev down

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

;;

*)

echo “Usage: $(basename $0) start|stop”

exit 1

;;

Esac

 

17、vs的配置脚本

#!/bin/bash

vip=’192.168.0.100′

iface=’eth0:1’mask=’255.255.255.255′

port=’80’

rs1=’192.168.0.101′

rs2=’192.168.0.102′

scheduler=’wrr’

type=’-g’

case $1 in

start)

ifconfig $iface $vip netmask $mask broadcast $vip up

iptables -F

ipvsadm -A -t ${vip}:${port} -s $schedule

ripvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1

ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1

;;

stop)

ipvsadm -C

ifconfig $iface down

;;

*)

echo “Usage $(basename $0) start|stop“;exit 1

;;

esac

 

##############################实现NAT模式

18、firewall Mark

Fwm:fire wall mark

Mark target 可用于给特定的报文打标记

–set-mark value

其中:value为十六进制数字

借助于防火墙标记分类报文,而后基于标记定义集群服务,可将多个不同的应用使用同一个集群服务进行调度。

实现方法:

在Director主机打标记:

iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport –dports $port1,$port2,… -j MARK –set-mark NUMBER

Ø在Director主机基于标记定义集群服务:

ipvsadm -A -f NUMBER [options]

19、持久连接

u session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无

法实现

u 持久连接( lvs persistence )模板:实现无论使用任何调度算法,在一段时间内

(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS

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

u 持久连接实现方式:

Ø 每端口持久(PPC):每个端口对应定义为一个集群服务,每集群服务单独调度

Ø 每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端

口上的应用统一调度,即所谓的port Affinity

Ø 每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端

对所有应用的请求都调度至后端主机,必须定义为持久模式

20、lvs高可用性

u 1 Director不可用,整个系统将不可用;SPoF Single Point of Failure

解决方案:高可用

keepalived heartbeat/corosync

u 2 某RS不可用时,Director依然会调度请求至此RS

解决方案: 由Director对各RS健康状态进行检查,失败时禁用,成功时启用

keepalived heartbeat/corosync ldirectord

检测方式:

(a) 网络层检测,icmp

(b) 传输层检测,端口探测

(c) 应用层检测,请求某关键资源

RS全不用时:backup server, sorry server

21、ldirectord

uldirectord:监控和控制LVS守护进程,可管理LVS规则

u包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

u文件:

/etc/ha.d/ldirectord.cf 主配置文件

/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版

/usr/lib/systemd/system/ldirectord.service 服务

/usr/sbin/ldirectord 主程序

/var/log/ldirectord.log 日志

/var/run/ldirectord.ldirectord.pid pid文件

22、ldirectord配置文件实例

checktimeout=3

checkinterval=1

autoreload=yes

logfile=“/var/log/ldirectord.log“ #日志文件

quiescent=no #down时yes权重为0,no为删除

virtual=5 #指定VS的FWM或IP:port

real=172.16.0.7:80 gate 2

real=172.16.0.8:80 gate 1

fallback=127.0.0.1:80 gate #sorry server

service=http

scheduler=wrr

checktype=negotiate

checkport=80

request=”index.html”

receive=“Test Ldirector”

 

 

 

四、Nginx

1、性能影响

u有很多研究都表明,性能对用户的行为有很大的影响:u79%的用户表示不太可能再次打开一个缓慢的网站u47%的用户期望网页能在2秒钟以内加载u40%的用户表示如果加载时间超过三秒钟,就会放弃这个网站u页面加载时间延迟一秒可能导致转换损失7%,页面浏览量减少11%u8秒定律:用户访问一个网站时,如果等待网页打开的时间超过8秒,会有超过30%的用户放弃

 

2、httpd mpm

Prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责影响一个请求。

Worker:线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求。

Event:线程模型,三级结构,主进程master负责生成子进程,每个子进程响应多个请求。

3、I/O模型

网络IO:本质上就是socket读取

磁盘IO、

每次IO,都要经由两个阶段。

第一步:将数据从磁盘文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长。

第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短。

 

同步/异步:关注的是消息通信机制。

同步:synchronous 调用者自已主动等待被调用者返回消息,才能继续执行

异步:asynchronous 被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

 

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起。

非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起

I/O:模型:

阻塞型,非阻塞型、复用型、信号驱动型、异步

 

4、IO模型的实现

1同步阻塞IO模型

u同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞

u用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等

到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作

u用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个IO请

求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何

事情,对CPU的资源利用率不够

 

2)同步非阻塞IO模型

u用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断

地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即 “轮询”

机制

u整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为

了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源

u是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其他IO模型中使

用非阻塞IO这一特性

 

3IO多路复用模型

u 多个连接共用一个等待机制,本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上,而不是阻塞在真正的IO操作上

u 用户首先将需要进行IO操作添加到select中,继续执行做其他的工作(异步),同时等待select系统调用返回。当数据到达时,IO被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。

u 从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视IO,以及调用select函数的额外操作,效率更差。并且阻塞了两次,但是第一次阻塞在select上时,select可以监控多个IO上是否已有IO操作准备就绪,即可达到在同一个线程内同时处理多个IO请求的目的。而不像阻塞IO那种,一次只能监控一个IO

u 虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只是注册自己需要的IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率

u IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因为它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO模型,而非真正的异步IO

4)多路IO复用

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通

知该进程

u IO多路复用适用如下场合:

Ø 当客户端处理多个描述符时(一般是交互式输入和网络套接口),必须使用

I/O复用

Ø 当一个客户端同时处理多个套接字时,此情况可能的但很少出现

Ø 当一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用

到I/O复用

Ø 当一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用

Ø 当一个服务器要处理多个服务或多个协议,一般要使用I/O复用

5)信号驱动IO模型

信号驱动IO:signal-driven I/O

u用户进程可以通过sigaction系统调用注册一个信号处理程序,然后主程序可以

继续向下执行,当有IO操作准备就绪时,由内核通知触发一个SIGIO信号处理程

序执行,然后将用户进程所需要的数据从内核空间拷贝到用户空间

u此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执

行,只要等待来自信号处理函数的通知

u该模型并不常用

I/O模型的具体实现:

Select:Linux实现对应,I/O复用模型,BSD4.2最早实现。

 

6异步IO模型

u异步IO与信号驱动IO最主要的区别是信号驱动IO是由内核通知何时可以进行IO

操作,而异步IO则是由内核告诉我们IO操作何时完成了。具体来说就是,信号

驱动IO当内核通知触发信号处理程序时,信号处理程序还需要阻塞在从内核空

间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直接是在第二个阶段

完成后内核直接通知可以进行后续操作了

u相比于IO多路复用模型,异步IO并不十分常用,不少高性能并发服务程序使用

IO多路复用模型+多线程任务处理的架构基本可以满足需求。况且目前操作系统

对异步IO的支持并非特别完善,更多的是采用IO多路复用模型模拟异步IO的方

式(IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定

的缓冲区中)

 

7)五种IO模型

 

lamp  lnmp  lemp

8)IO模型的具体实现

主要实现方式有几种:

Select:Linux实现对应,IO复用模型,bsd4.2最早实现。

Poll:Linux实现,对应IO复用模型,system v Unix最早实现。

Epoll:Linux实现,对应IO模型,具有信号驱动IO模型的某些特征。

Kqueue:rreedsd实现,对应IO复用模型,具备信号驱动IO模型的某些特征。

/dev/poll:SUN的Solaris实现,对应I/O复用模型,具有信号驱动I/O模型的某些特性

Iocp Windows实现,对应第5种(异步I/O)模型

5、select/poll/epoll

uSelect:POSIX所规定,目前几乎在所有的平台上支持,其良好跨平台支持也是

它的一个优点,本质上是通过设置或者检查存放fd标志位的数据结构来进行下

一步处理

u缺点

Ø单个进程可监视的fd数量被限制,即能监听端口的数量有限

cat /proc/sys/fs/file-max

Ø对socket是线性扫描,即采用轮询的方法,效率较低

Øselect 采取了内存拷贝方法来实现内核将 FD 消息通知给用户空间,这样一

个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结

构时复制开销大

 

poll

Ø本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每

个fd对应的设备状态

Ø其没有最大连接数的限制,原因是它是基于链表来存储的

Ø大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复

制是不是有意义

Øpoll特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会

再次报告该fd

Ø边缘触发:只通知一次

 

u epoll:在Linux 2.6内核中提出的select和poll的增强版本

Ø 支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚

变为就需态,并且只会通知一次

Ø 使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用

类似callback的回调机制来激活该fd,epoll_wait便可以收到通知

u 优点:

Ø 没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个

端口)

Ø 效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD

才会调用callback函数,即epoll最大的优点就在于它只管理“活跃”的连接,而跟连

接总数无关

Ø 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用

mmap减少复制开销

 

 

 

6、Nginx介绍

Nginx:engine X ,2002年,开源,商业版

uhttp协议:web服务器(类似于httpd)、http reverse proxy(类似于

httpd)、imap/pop3 reverse proxy,tcp

uNGINX is a free, open-source, high-performance an HTTP and reverse

proxy server, a mail proxy server, and a generic TCP/UDP proxy server

uC10K(10K Connections)

u二次开发版:Tengine, OpenResty

u官网:http://nginx.org

 

正向代理和反向代理:

 

u特性:

Ø 模块化设计,较好的扩展性

Ø 高可靠性

Ø 支持热部署:不停机更新配置文件,升级版本,更换日志文件

Ø 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需要2.5M内存

Ø event-driven,aio,mmap,sendfile

u基本功能:

Ø 静态资源的web服务器

Ø http协议反向代理服务器

Ø pop3/imap4协议反向代理服务器

Ø FastCGI(lnmp),uWSGI(python)等协议

Ø 模块化(非DSO),如zip,SSL模块

 

7、Nginx架构

 

uweb服务相关的功能:

虚拟主机(server)

支持 keep-alive 和管道连接

访问日志(支持基于日志缓冲提高其性能)

url rewirte

路径别名

基于IP及用户的访问控制

支持速率限制及并发数限制

重新配置和在线升级而无须中断客户的工作进程

Memcached 的 GET 接口

 

 

nginx的程序架构:

master/worker结构

Ø一个master进程:

负载加载和分析配置文件、管理worker进程、平滑升级

Ø一个或多个worker进程

处理并响应用户请求

Ø缓存相关的进程:

cache loader:载入缓存对象

cache manager:管理缓存对象

 

unginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和

卸载

u模块分类:

Ø核心模块:core module

Ø标准模块:

  • HTTP 模块: ngx_http_*

HTTP Core modules 默认功能

HTTP Optional modules 需编译时指定

  • Mail 模块 ngx_mail_*
  • Stream 模块 ngx_stream_*

Ø第三方模块

8、nginx的功用

静态的web资源服务器

html,图片,js,css,txt等静态资源

u结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求

uhttp/https协议的反向代理

uimap4/pop3协议的反向代理

utcp/udp协议的请求转发(反向代理)

 

curl www.jd.com -I  查看一个网站的web服务器。

 

9、安装nginx

1)yum install epel-release -y  安装epel源。  centos7上面

2)yum install nginx

3)systemctl start nginx  (查看80端口是否是nginx占用的)

4)systemctl stop firewalld 关闭防火墙

5)curl-ip地址就可以访问主页,浏览器上也可以访问。

6)cd /etc/nginxvim nginx.conf相关配置文件。

7)使用:

mkdir /app/website{1,2,3} -pv  创建三个网站

写入文件:echo www.a.com > /app/website1/index.html

cd /etc/nginx/conf.d编辑vim vhost.conf

文件,创建以下内容:

server {

listen 80;

server_name www.a.com;

root /app/website1/;

}

server {

listen 80;

server_name www.b.com;

root /app/website2/;

}

server {

listen 80;

server_name www.c.com;

root /app/website3/;

}

生效以下服务:

systemctl restart nginx

 

Ping www.a.com网站和curl 网站。

 

利用另外一台虚拟主机访问网站:

改变主机的vim /etc/hosts文件,增加要访问的网址ip和网站名词。

 

 

反向代理服务器实现:

 

 

课件文档:官方:

http://nginx.org/packages/centos/7/x86_64/RPMS

u Fedora-EPEL:

https://mirrors.aliyun.com/epel/7/x86_64/

u 编译安装:

  • yum install pcre-devel openssl-devel zlib-devel
  • useradd -r nginx
  • ./configure –prefix=/usr/local/nginx –conf-path=/etc/nginx/nginx.conf –error-logpath=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pidpath=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –user=nginx –group=nginx

–with-http_ssl_module –with-http_v2_module –with-http_dav_module –withhttp_stub_status_module –with-threads –with-file-aio

  • make && make install

u编译安装nginx选项:

Ø –prefix=/etc/nginx 安装路径

Ø –sbin-path=/usr/sbin/nginx 指明nginx程序文件安装路径

Ø –conf-path=/etc/nginx/nginx.conf 主配置文件安装位置

Ø –error-log-path=/var/log/nginx/error.log 错误日志文件安装位置

Ø –http-log-path=/var/log/nginx/access.log 访问日志文件安装位置

Ø –pid-path=/var/run/nginx.pid 指明pid文件安装位置

Ø –lock-path=/var/run/nginx.lock 锁文件安装位置

Ø –http-client-body-temp-path=/var/cache/nginx/client_temp 客户端body部分的临时文

件存放路径,如果服务器允许客户端使用put方法提交大数据时,临时存放的磁盘路

 

–http-proxy-temp-path=/var/cache/nginx/proxy_temp 作为代理服务器,服务器响应

报文的临时文件存放路径

Ø –http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 作为fastcgi代理服务器,服务

器响应报文的临时文件存放路径

Ø –http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 作为uwsgi代理服务器,服务器

响应报文的临时文件存放路径

Ø –http-scgi-temp-path=/var/cache/nginx/scgi_temp 作为scgi反代服务器,服务器响应

报文的临时文件存放路径

Ø –user=nginx 指明以那个身份运行worker进程,主控master进程一般由root运行

Ø –group=nginx

Ø –with-http_ssl_module 表示把指定模块编译进来

 

u ls /usr/local/nginx/

html是测试页,sbin是主程序

u ls /usr/local/nginx/sbin/

nginx 只有一个程序文件

u ls /usr/local/nginx/html/

50x.html index.html 测试网页

u Nginx:默认为启动nginx

-h 查看帮助选项

-V 查看版本和配置选项

-t 测试nginx语法错误

-c filename 指定配置文件(default: /etc/nginx/nginx.conf)

-s signal 发送信号给master进程,signal可为:stop, quit, reopen, reload 示例:-s

stop 停止nginx -s reload 加载配置文件

-g directives 在命令行中指明全局指令

 

分为master进程和worker进程。

制作虚拟主机网站

 

 

 

4、反向代理http协议

调度的集合

 

 

 

 

Weight=number权重

设置down,只是先更新一部分。

 

 

Ip-hash:客户端的ip地址做hash计算。源地址。

 

 

 

五、高可用性集群keepalived

1、集群cluster

集群类型:

Lb lvs/nginx(http/upstream,stream/upstream)。

HA的高可用性

Spof:single point of failure

Hpc

系统可用性的公式: A=MTB/(MTBF+MTTR)

(0,1),95%

几个9指标:99%,99.999%,99.9999%:

系统故障:

硬件故障:设计缺陷,wear out(损耗)、自然灾害

软件故障:设计缺陷

2、集群cluster

u提升系统高用性的解决方案之降低MTTR:

手段:冗余redundant

active/passive 主备

active/active双主

active –> HEARTBEAT –> passive

active <–> HEARTBEAT <–> active

u高可用的是“服务”:

HA nginx service:

vip/nginx process[/shared storage]

资源:组成一个高可用服务的“组件”

(1) passive node的数量

(2) 资源切换

 

shared storage:

NAS:文件共享服务器;

SAN:存储区域网络,块级别的共享

uNetwork partition:网络分区

quorum:法定人数

with quorum: > total/2

without quorum: <= total/2

隔离设备: fence

node:STONITH = Shooting The Other Node In The Head,断

电重启

资源:断开存储的连接

 

TWO nodes Cluster

辅助设备:ping node, quorum disk

uFailover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作

uFailback:故障移回,即某资源的主节点故障后重新修改上线后,将之前已转移

至其它节点的资源重新切回的过程

uHA Cluster实现方案:

ais:应用接口规范 完备复杂的HA集群

RHCS:Red Hat Cluster Suite红帽集群套件

heartbeat

corosync

vrrp协议实现:虚拟路由冗余协议

Keepalived

 

 

 

3、keepalived

vrrp协议:Virtual Router Redundancy Protocol

u术语:

虚拟路由器:Virtual Router

虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器

物理路由器:

master:主设备

backup:备用设备

priority:优先级

VIP:Virtual IP

VMAC:Virutal MAC (00-00-5e-00-01-VRID)

 

u通告:心跳,优先级等;周期性

u工作方式:抢占式,非抢占式

u安全工作:

认证:

无认证

  • 简单字符认证:预共享密钥Ssh-keygen生产公钥私钥。

MD5

u工作模式:

主/备:单虚拟路径器

主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)

 

ukeepalived:

vrrp协议的软件实现,原生设计目的为了高可用ipvs服务

u功能:

Øvrrp协议完成地址流动

Ø为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

Ø为ipvs集群的各RS做健康状态检测

Ø基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,

以此支持nginx、haproxy等服务

 

u组件:

Ø 核心组件:

vrrp stack

ipvs wrapper

checkers

Ø 控制组件:配置文件分析器

Ø IO复用器

Ø 内存管理组件

 

Keepalived组成:

 

 

Keepalived实现:

uHA Cluster 配置准备:

Ø (1) 各节点时间必须同步

ntp, chrony

Ø (2) 确保iptables及selinux不会成为阻碍

Ø (3) 各节点之间可通过主机名互相通信(对KA并非必须)

建议使用/etc/hosts文件实现

Ø (4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(对KA并

非必须)

 

keepalived安装配置:

CentOS 6.4+ Base源

u程序环境:

Ø主配置文件:/etc/keepalived/keepalived.conf

Ø主程序文件:/usr/sbin/keepalived

ØUnit File:/usr/lib/systemd/system/keepalived.service

ØUnit File的环境配置文件:/etc/sysconfig/keepalived

 

配置文件组件部分:

uTOP HIERACHY

GLOBAL CONFIGURATION

Global definitions

Static routes/addresses

VRRPD CONFIGURATION

VRRP synchronization group(s):vrrp同步组

VRRP instance(s):即一个vrrp虚拟 路由器

LVS CONFIGURATION

Virtual server group(s)

Virtual server(s):ipvs集群的vs和rs

 

配置语法:

u 配置虚拟路由器:

vrrp_instance <STRING> {

….

}

u 专用参数:

state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是

MASTER,余下的都应该为BACKUP

interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口

virtual_router_id VRID:当前虚拟路由器惟一标识,范围是0-255

priority 100:当前物理节点在此虚拟路由器中的优先级;范围1-254

advert_int 1:vrrp通告的时间间隔,默认1s

 

 

authentication { #认证机制auth_type AH|PASSauth_pass <PASSWORD> 仅前8位有效}virtual_ipaddress { #虚拟IP<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label

<LABEL>192.168.200.17/24 dev eth1192.168.200.18/24 dev eth2 label eth2:1}track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移eth0eth1

 

unopreempt:定义工作模式为非抢占模式

upreempt_delay 300:抢占式模式,节点上线后触发新选举操作的延迟时长,

默认模式

u定义通知脚本:

notify_master <STRING>|<QUOTED-STRING>:

当前节点成为主节点时触发的脚本

notify_backup <STRING>|<QUOTED-STRING>:

当前节点转为备节点时触发的脚本

notify_fault <STRING>|<QUOTED-STRING>:

当前节点转为“失败”状态时触发的脚本

notify <STRING>|<QUOTED-STRING>:

通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

 

 

4、单主配置详细信息

u单主配置示例:

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1 #主机名,在另一结点为node2

vrrp_mcast_group4 224.0.100.100

}

 

vrrp_instance VI_1 {

state MASTER #在另一个结点上为BACKUP

interface eth0virtual_router_id 6 #多个节点必须相同

priority 100 #在另一个结点上为90

advert_int 1  #通告间隔1s

authentication {

auth_type PASS #预共享密钥认证

auth_pass 571f97b2}

virtual_ipaddress {

172.18.100.66/16 dev eth0 label eth0:0

}

track_interface {

eth0

}

}

 

5、双主配置信息

双主模型示例:

! Configuration File for keepalived

Global_defs{

notification_emai{

root@localho

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_mcast_group4 224.0.100.100

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 6

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 571f97b2

}

virtual_ipaddress {

172.16.0.10/16 dev eth0

}

}

 

vrrp_instance VI_2 {

state BACKUP

interface eth0

virtual_router_id 8

priority 98

advert_int 1

authentication {

auth_type PASS

auth_pass 578f07b2

}

virtual_ipaddress {

172.16.0.11/16 dev eth0

}

}

 

脚本:

#!/bin/bash

#

contact=’root@localhost’

notify() {

mailsubject=”$(hostname) to be $1, vip floating”

mailbody=”$(date +’%F %T’): vrrp transition, $(hostname) changed to be $1″

echo “$mailbody” | mail -s “$mailsubject” $contact

}

case $1 in

master)

notify master

;;

backup)

notify backup

;;

fault)

notify fault

;;

*)

echo “Usage: $(basename $0) {master|backup|fault}”

exit 1

;;

esac

 

脚本调用方法:

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

notify_fault “/etc/keepalived/notify.sh faul

 

常用参数:

u delay_loop <INT>:检查后端服务器的时间间隔

u lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法

u lb_kind NAT|DR|TUN:集群的类型

u persistence_timeout <INT>:持久连接时长

u protocol TCP:服务协议,仅支持TCP

u sorry_server <IPADDR> <PORT>:所有RS故障时,备用服务器地址

u real_server <IPADDR> <PORT>

{

weight <INT> RS权重

notify_up <STRING>|<QUOTED-STRING> RS上线通知脚本

notify_down <STRING>|<QUOTED-STRING> RS下线通知脚本

HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { … }:定义当前主

机的健康状态检测方法

}

6、Keepalived配置检测

u HTTP_GET|SSL_GET:应用层检测

HTTP_GET|SSL_GET {

url {

path <URL_PATH>:定义要监控的URL

status_code <INT>:判断上述检测机制为健康状态的响应码

digest <STRING>:判断为健康状态的响应的内容的校验码

}

connect_timeout <INTEGER>:连接请求的超时时长

nb_get_retry <INT>:重试次数

delay_before_retry <INT>:重试之前的延迟时长

connect_ip <IP ADDRESS>:向当前RS哪个IP地址发起健康状态检测请求

connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求

bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址

bind_port <PORT>:发出健康状态检测请求时使用的源端口

}

u TCP_CHECK {

connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测

请求

connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求

bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址

bind_port <PORT>:发出健康状态检测请求时使用的源端口

connect_timeout <INTEGER>:连接请求的超时时长

}

7、单主模型ipvs实例

u高可用的ipvs集群示例:

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_mcast_group4 224.0.100.10

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 6

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 571f97b2

}

virtual_ipaddress {

172.16.0.10/16 dev eth0

}

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

notify_fault “/etc/keepalived/notify.sh fault”

}

 

virtual_server 172.16.0.10 80 {

delay_loop 3

lb_algo rr

lb_kind DR

protocol TCP

sorry_server 127.0.0.1 80

real_server 172.16.0.11 80 {

weight 1

HTTP_GET {

url {

path /

status_code 200

}

connect_timeout 1

nb_get_retry 3

delay_before_retry 1

}

}

 

real_server 172.16.0.12 80 {

weight 1

HTTP_GET {

url {

path /

status_code 200

}

connect_timeout 1

nb_get_retry 3

delay_before_retry 1

}

}

8、双主模型的lvs集群

双主模式的lvs集群,拓扑、实现过程;

配置示例(一个节点):

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from kaadmin@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_mcast_group4 224.0.100.100

}

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 6

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass f1bf7fde

}

virtual_ipaddress {

172.16.0.80/16 dev eth0 label eth0:0

}

 

 

track_interface {

eth0

}

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

notify_fault “/etc/keepalived/notify.sh fault”

}

 

vrrp_instance VI_2 {

state BACKUP

interface eth0

virtual_router_id 8

priority 98

advert_int 1

authentication {

auth_type PASS

auth_pass f2bf7ade

}

 

virtual_ipaddress {

172.16.0.90/16 dev eth0 label eth0:1

}

track_interface {

eth0

}

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

notify_fault “/etc/keepalived/notify.sh fault”

}

 

virtual_server fwmark 3 {

delay_loop 2

lb_algo rr

lb_kind DR

nat_mask 255.255.0.0

protocol TCP

sorry_server 127.0.0.1 80

real_server 172.16.0.11 80 {

weight 1

HTTP_GET {

url {

path /

status_code 200

}

connect_timeout 2

nb_get_retry 3

delay_before_retry 3

}

}

 

real_server 172.16.0.12 80 {

weight 1

HTTP_GET {

url {

path /

status_code 200

}

connect_timeout 2

nb_get_retry 3

delay_before_retry 3

}

}

}

 

9、keepalived调用脚本进行资源监控

u keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

u vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,

定义在vrrp实例之外

u track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的

vrrp_script

u 分两步:(1) 先定义一个脚本;(2) 调用此脚本

vrrp_script <SCRIPT_NAME> {

script “”

interval INT

weight -INT

}

track_script {

SCRIPT_NAME_1

SCRIPT_NAME_2

}

 

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_mcast_group4 224.0.100.10

}

 

vrrp_script chk_down {

script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0”

interval 1

weight -20

}

vrrp_script chk_nginx {

script “killall -0 nginx && exit 0 || exit 1”

interval 1

weight -20

fall 2 #2次检测失败为失败

rise 1 #1次检测成功为成功

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 14

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 571f97b2

}

virtual_ipaddress {

172.18.0.93/16 dev eth0

}

track_script {

chk_down

chk_nginx

}

notify_master “/etc/keepalived/

notify.sh master”notify_backup “/etc/keepalived/

notify.sh backup”notify_fault “/etc/keepalived/notify.sh fault

}

 

10、同步组

u LVS NAT模型VIP和DIP需要同步,需要同步组

u vrrp_sync_group VG_1 {

group {

VI_1 # name of vrrp_instance (below)

VI_2 # One for each moveable IP.

}

}

vrrp_instance VI_1 {

eth0

vip

}

vrrp_instance VI_2 {

eth1

dip

}

 

 

双主模型,解决高可用问题。

带有lvs的功能。

两个虚拟路由器,每个里面都有worker和master。

Keepalived支持ipvs:配置虚拟主机。

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/100807

(0)
上一篇 2018-06-10 18:21
下一篇 2018-06-10 20:57

相关推荐

  • Python高阶函数及装饰器

    First Class Object 函数在Python中是一等公民 函数也是对象,可调用的对象 函数可作为普通变量、参数、返回值等 高阶函数 数学定义:y=g(f(x)) 高阶函数需满足的条件,至少其一 接受一个或多个函数作为参数 输出一个函数 内建函数的高阶函数 排序:sorted(iterable[,key][,reverse]) 返回一个新列表,对一…

    2018-04-22
  • 树 非线性结构,每个元素都可以有多个前驱和后继 树是n(n>=0)个元素 n = 0时,称为空树 树只有一个特殊的没有前驱的元素,称为树的根root 树中除了根结点,其余元素只能有一个前驱,可以有0个或者多个后继 递归定义 树T是n(n>=0)个元素的集合,n=0时,称为空树 有且只有一个特殊元素根,剩余元素都可以被划分为m个互不相交的集合T1,…

    2018-04-16
  • Python函数

    函数 数学函数 Python函数 若干语句块、函数名称、参数列表构成,组织代码的最小单元 完成一定的功能 作用 结构化编程对代码的最基本的封装,一般按照功能组织一段代码 复用,减少冗余代码 简洁美观,可读易懂 函数分类 内建函数,max()、reversed() 库函数,math.ceil() 函数定义、调用 def语句定义函数 def 函数名(参数列表):…

    2018-04-16
  • Python 部分知识点总结(八)

    此篇博客只是记录第十周未掌握或不熟悉的知识点,用来加深印象。

    Python笔记 2018-05-13