笔记
-
iptables是用户态的防火墙管理工具,netfilter是内核态真正生成安全规则的框架,主要是五链四表
五链
iptables命令中设置数据过滤或者处理数据包的策略叫做规则,将多个规则合成一个链,叫做规则链
-
PREROUTING
在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
-
INPUT
处理入站的数据包
-
OUTPUT
处理出站的数据包
-
FORWARD
处理转发的数据包
-
POSTROUTING
在进行路由判断之后所要进行的规则
四表
iptables中的规则是用于容纳规则链
-
raw表
关闭nat上启用的连接追踪机制
-
mangle表
拆解报文、修改报文、重新封装报文
-
nat表
网络地址转换
-
filter表
负责过滤功能,防火墙
iptables常用参数
-
-t:表名,如果不写默认针对filter表
-
-v:详细信息
-
-x:展开数字
-
-L:链名
对于规则的操作
查看规则
常使用iptables -t 表名 -vxL 链名查看规则
每个字段的解释
-
policy:当前链的默认策略,当所有规则都没有匹配成功时执行的策略
-
packets:当前链默认策略匹配到的包的数量
-
bytes:当前链默认策略匹配到的包数量
-
pkts:对于规则匹配到的包数量
-
bytes:对应规则匹配到的包大小
-
target:对应规则执行的动作
-
prot:对应的协议,是否针对某些协议应用此规则
-
opt:规则对应的选项
-
in:数据包由哪个接口流入
-
out:数据包由哪个接口流出
-
source:源ip地址
-
distination:目的ip地址
清空规则
-
iptables -t 表名 -F 链名
增加规则
-
iptables -t 表名 -A 链名 匹配条件 -j 执行动作
删除规则
方式一:根据编号进行删除规则
-
在查看规则的命令行后面加上--line-numbers即可显示编号
-
删除:iptables -t 表名 -D 链名 编号即可删除
方拾二:根据匹配条件执行动作进行删除
-
iptables -t 表名 -D 链名 匹配条件 执行动作
修改规则
-
iptables -t 表名 -R 链名 被修改的规则的编号 新的匹配条件 新的执行动作
修改链的默认规则
-
iptables -t 表名 -P 链名 默认动作
自定义链的使用
创建自定义链
-
iptables -t 表名 -N 自定义链名
应用自定义链
-
iptables -t 表名 -I 链名 匹配条件 -j 自定义链名(此处的自定义链名就是上一步创建的自定义链的名字)
创建自定义链的规则
-
iptables -t 表名 -A 自定义链名 匹配条件 执行动作
删除自定义链
-
首先清空自定义链规则
-
然后删除引用链的规则
-
最后在通过iptables -X 自定义链命令删除自定义链
NAT 案例实验
nmcli
:可用于修改网络的一些配置
-
nmcli connection show:展示网卡信息
-
nmcli connection modify 原网卡名称 connection.id 新名称:修改网卡名称
实验一
实验前需要开启linux路由转发功能(默认是关闭的):
[root@eagle ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
-
首先需要准备两台服务器,server1有两块网卡,一块是nat模式,另一块是仅主机模式;server2只需要仅主机模式的网卡
-
同时第二步如下:
-
然后在server1 上完成如下步骤
[root@localhost ~]# echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/50-
default.conf
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
[root@localhost ~]# sysctl -p
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT
--to-source 10.1.0.59
# 下面这条是PAT(上下两个二选一,实验可用下面)
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE(此为自动转换) -
此时在server2上ping server1 的172网址和192网址,若能通,则成功
实验二
映射内网服务
-
只需在server1上输入以下命令,即可通过ssh协议登录server1 的192网址的8822端口号,进而连接到server2服务器
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 8822 -j DNAT --to-destination 172.16.10:22
-
若能成功连接到server2,则实验成功
day6
计划任务
-
计划任务主要是做一些周期性的任务,目前主要用途是定期备份数据
-
计划任务分为 一次性计划任务和周期性周期性计划任务
一次性计划任务
-
首先安装命令“at”
[root@server5 ~]# yum install -y at
-
使用方法一:at 时间→任务→Ctrl D
-
可使用命令查看at任务
[root@server5 ~]# atq
-
-
使用方法二:先编写任务文件,然后再将其添加到at任务中(可适用于任务较多时)
周期性计划任务
-
cron在使用前必须要启动守护进程crond
-
相关的管理命令
[root@localhost ~]# crontab -l # 列出当前用户所有计划任务
[root@localhost ~]# crontab -r # 删除当前用户计划任务
[root@localhost ~]# crontab -e # 编辑当前用户计划任务
管理员可以使用 -u username,去管理其他用户的计划任务
[root@localhost ~]# vi /etc/cron.deny # 这个文件中加入的用户名无法使用cron -
cron语法格式
分 时 日 月 星期 命令
* 表示任何数字都符合
0 2 * * * /run.sh # 每天的2点
0 2 14 * * /run.sh # 每月14号2点
0 2 14 2 * /run.sh # 每年2月14号2点
0 2 * * 5 /run.sh # 每个星期5的2点
0 2 * 6 5 /run.sh # 每年6月份的星期5的2点
0 2 2 * 5 /run.sh # 每月2号或者星期5的2点 星期和日同时存在,那么就是或的关系
0 2 2 6 5 /run.sh # 每年6月2号或者星期5的2点
*/5 * * * * /run.sh # 每隔5分钟执行一次
0 2 1,4,6 * * /run.sh # 每月1号,4号,6号的2点
0 2 5-9 * * /run.sh # 每月5-9号的2点
* * * * * /run.sh # 每分钟
0 * * * * /run.sh # 每整点
* * 2 * * /run.sh # 每月2号的每分钟
日志管理
常见的日志文件(系统、进程、应用程序)
日志文件 作用描述
tail /var/log/messages 系统主日志文件
tail -20 /var/log/messages
tail -f /var/log/messages 动态查看日志文件的尾部
tailf /var/log/secure 认证、安全
tail /var/log/maillog 和邮件postfix相关
tail /var/log/cron crond、at进程产生的日志
tail /var/log/dmesg 和系统启动相关
tail /var/log/audit/audit.log 系统审计日志
tail /var/log/yum.log yum
tail /var/log/mysqld.log MySQL
tail /var/log/xferlog 访问FTP服务器相关
w 当前登录的用户 /var/log/wtmp
last 最近登录的用户 /var/log/btmp
lastlog 所有用户的登录情况 /var/log/lastlog
rsyslog子日志文件系统
-
其中local0-local7一搬用户自己使用
日志等级
级别(日志重要级别) 解释
LOG_EMERG 紧急,致命,服务无法继续运行,如配置文件丢失
LOG_ALERT 报警,需要立即处理,如磁盘空间使用95%
LOG_CRIT 致命行为
LOG_ERR 错误行为
LOG_WARNING 警告信息
LOG_NOTICE 普通
LOG_INFO 标准信息
LOG_DEBUG 调试信息,排错才开,一般不建议使用
-
sshd日志案例
-
server1需要开启监听端口
-
server2需要修改sshd配置文件将日志输出到local0设备中
-
server2修改rsyslog配置文件将local0设备的所有日志等级的日志输出到server1中
-
ssh登陆server2验证server1的日志
-
logrotate(轮转,日志切割)
日志切割的作用是防止日志文件一天天地变的越来越大
-
如果没有日志轮转,日志文件会越来越大
-
将丢弃系统中最旧的日志文件,以节省空间
-
ogrotate本身不是系统守护进程,它是通过计划任务crond每天执行
执行方式一
-
自己通过shell语句完成日志切割,并将其写入到计划任务中周期性执行
执行方式二
-
将某个日志的切割策略写入到/etc/logrotate.conf文件中,计划任务会每天读取logrotate任务来帮助完成日志切割
sshd服务
sshd是基于SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验 证的方法:
-
基于口令的验证—用账户和密码来验证登录;
-
基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的 公钥进行比较;该方式相较来说更安全。
非对称加密算法
-
公钥和私钥是一对密钥对,一次生成的时候会成对出现
-
公钥加密的数据只能由私钥解密,私钥加密的数据只能由公钥解密
-
每个用户的公钥随便可以被任何人获取,每个人的私钥从来不会被别人获取到
对称加密算法
-
对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可 以用作解密密钥
不间断会话服务
screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同 时控制多个远程终端窗口而设计的程序。
[root@localhost ~]# yum -y install screen
管理远程会话
screen命令后可加以下参数再加名字
-
用 -S 参数创建会话窗口
-
用 -d 参数将指定会话进行离线处理
-
用 -x 参数一次性恢复所有的会话
-
用 -ls 参数显示当前已有的会话
-
用 -wipe 参数把目前无法使用的会话删除
FTP(文件传输协议)
FTP协议
-
协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的一个标准
-
FTP运行在OSI模型的应用层,并利用传输协议TCP在不同的主机之间提供可靠的数据传输
-
FTP 在文件传输中还支持断点续传功能,可以大幅度减少CPU网络带宽的开销
两个端口号
-
20端口:用于数据连接
-
21端口:用于控制连接
-
在进行控制连接后才能进行数据连接,连接过程采用TCP/UDP协议
连接模式
-
主动模式:主动模式是由服务器主动发起数据连接
-
被动模式:被动模式是由客户端发起连接
基础配置
-
安装vsftp
[root@localhost ~]#yum -y install vsftpd
-
准备分发文件
root@localhost ~]#touch /var/ftp/abc.txt
-
启动服务
[root@localhost ~]#systemctl start vsftpd
注!:记得关闭防火墙和SElinux
客户端工具
lftp和ftp
-
ftp工具是一定要输入用户名称和密码的,登录成功或者失败会给出提示
-
lftp不会直接给出登 录成功或者失败的提示,需要输入ls工具才可以发现是否连接成功,优点在于连接更加方便
NFS(网络文件系统)
简介
-
Linux/Unix系统之间共享文件系统的一种协议,通过网络让不同的主机之间共享文件或目录
-
NFS的客户端主要为Linux
-
支持多节点同时挂载以及并发写入
-
提供文件共享服务
-
为集群中的web server配置后端存储
-
基于RPC协议
day7
day8
Apache服务
简介
-
Apache HTTP Server简称为Apache,是Apache软件基金会的一个高性能、功能强大、见状 可靠、又灵活的开放源代码的web服务软件
httpd命令以及一些参数
httpd为Apache http server服务提供的工具
-
-c:在读取配置⽂件前,先执⾏选项中的指令。
-
-C:在读取配置⽂件后,再执⾏选项中的指令。
-
-d<服务器根⽬录>:指定服务器的根⽬录。
-
-
-f<设定⽂件>:指定配置⽂件。
-
-h:显示帮助。
-
-
-L:显示httpd指令的说明。
-
-S:显示配置⽂件中的设定。
-
-t:测试配置⽂件的语法是否正确。
-
-v:显示版本信息。
-
-V:显示版本信息以及建⽴环境。
-
-X:以单⼀程序的⽅式来启动服务器。
安装并启动httpd
[root@localhost ~]#yum install -y httpd
[root@localhost ~]#echo '<h1>It works!</h1>' > /var/www/html/index.html
[root@localhost ~]#systemctl start httpd
httpd的相关文件
-
主配置文件
[root@localhost ~] vim /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" # 服务器的根
Listen 80 # 监听的端口
Include conf.modules.d/*.conf # 包含模块
User apache # 用户
Group apache # 属组
ServerAdmin root@localhost # 服务器管理员
<Directory />
AllowOverride none
Require all denied
</Directory> # <Directory>和</Directory>用于封装一组指令,使之仅对某个
目录及其子目录生效。
DocumentRoot "/var/www/html"
ErrorLog "logs/error_log" # 错误日志
LogLevel warn # 日志等级
EnableSendfile on # 开启
IncludeOptional conf.d/*.conf # 虚拟服务器配置文件
说明:<></>此类称之为容器,针对某个容器做配置 -
子配置文件
[root@localhost ~] vim /etc/httpd/conf.d/
-
此文件中可写一些其他配置,最终也会被加载到主配置文件里
-
Apache功能模块
-
httpd有静态功能模块和动态功能模块组成,分别使用httpd -l 和httpd -M查看
-
主配置文件/etc/httpd/conf/httpd.conf文件中指定加载模块配置文件
-
范例:查看模块加载的配置文件
[root@localhost ~]# ls /etc/httpd/conf.modules.d/
00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00-
systemd.conf 01-cgi.conf
[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-base.conf
# 可以看到加载的模块
持久连接
-
持久连接,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成
默认参数
-
可使用Telnet工具测试持久连接
[root@server ~]# yum install telnet -y
#安装Telnet工具
多路处理模块
MPM工作模式
-
prefork:多进程I/O模型,一个主进程,管理多个子进程,一个子进程处理一个请求。
-
worker:复用的多进程I/O模型,多进程多线程,一个主进程,管理多个子进程,一个子进程管理 多个线程,每个 线程处理一个请求。
-
event:事件驱动模型,一个主进程,管理多个子进程,一个进程处理多个请求。
prefork模式
优点:适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要 求将每个请求相互独立的情况 下最好的mpm,这样若一个请求出 现问题就不会影响到其他请求。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并 不擅长处理高并发请求,在这 种场景下,它会将请求放进队列 中,一直等到有可用进程,请求才会被处理。
-
压测工具
[root@localhost ~]# ab -n 1000000 -c 1000 http://127.0.0.1/
# -n 即requests,用于指定压力测试总共的执行次数
# -c 即concurrency,用于指定的并发数
worker模式
-
work使用了多进程和多线程的混合模式,worker模式也同样会先派生一下子进程,然后每个子进程创建 一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。
优点:线程比进程会更轻量,因为线程是通过共享父进程的内存空间,因 此,内存的占用会减少一些, 在高并发高流量的场景下会比 prefork有更多可用的线程,表现会更优秀一些。
缺点:如果一个线程出现了问题也会导致同一进程下的线程出现问题,如 果是多个线程出现问题,也只 是影响apache的一部分,而不是全 部。由于用到多进程多线程,需要考虑到线程的安全。
event模式
-
它和worker模式很像,最大的 区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keepalive,挂载哪里等待,中间基于没有请求过来,一直等到超时)
-
event中会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求u过来的时候,将请求传 递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻 塞。
访问控制机制
-
重新定义根目录
# 定义服务器的文档的页面路径:
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
.......
DocumentRoot "/data/www/html"#此目录可自己设置如/data/html
.......
# 准备页面
[root@server1 ~]# vim /data/www/html/index.httpd
#内容随意写
-
测试访问,发现状态码为403没有权限
-
访问控制机制中开放相应目录权限
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/www/html">
Require all granted
</Directory>
[root@server1 ~]# systemctl restart httpd
-
更加详细的访问控制配置的参数
Require常见配置参数:
Require all granted # 全部放行
Require all denied # 全部拒绝
Require ip IPAd # 放行某ip地址
Require not ip IP # 拒绝某ip地址
Require user user1 # 放行某用户
Require group group1 # 放行某组
PS:34参数需要在…中才可以。
<RequireAll>
Require all granted
Require not ip 10.252.46.165
</RequireAll>
URL匹配规则
-
apache支持针对文件系统和URI的资源进行访问匹配
#基于目录
<Directory “/path">
...
</Directory>
#基于文件
<File “/path/file”>
...
</File>
#基于文件通配符
<File “/path/*file*”>
...
</File>
#基于正则表达式
<FileMatch “regex”>
...
</FileMatch>
-
案例
<FilesMatch ".+\.(gif|jpe?g|png)$">
# ...
</FilesMatch>
<FilesMatch "\.(gif|jpe?g|png)$">
<Files “?at.*”> 通配符
<Files ".ht*"> #禁止直接打开.ht* eg:.htaccess文件
Require all denied
</Files>
用户访问控制
认证方式有basic和digest两种
-
创建用户认证文件,为用户认证做准备(可通过htpasswd -help查看命令参数详情)
[root@server1 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisi
New password:
Re-type new password:
Adding password for user lisi
[root@server1 ~]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan
zhangsan
Adding password for user zhangsan
-
修改配置文件,启用用户认证
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/www/html">
AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf.d/.htpassword
Require user lisi
</Directory>
[root@server1 ~]# systemctl restart httpd.service
-
测试访问,发现lisi可以成功访问,zhangsan不能访问
Options指令
-
后跟1个或多个以空白字符分隔的选项列表, 在选项前的+,- 表示增加或删除指定选项
-
常见选项(默认是全部禁用):
-
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给 用户
-
FollowSymLinks:允许访问符号链接文件所指向的源文件
-
None:全部禁用
-
All: 全部允许
-
-
在html目录下产生如下目录和文件,然后通过浏览器访问这个目录
[root@localhost ~]# cd /data/html/dir
[root@localhost dir]# touch f1 f2
-
这样是不安全的。因为如果没有index.html文件就会把其他的目录显示出来。所以要修改配置‘
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -Indexes
[root@localhost html]# systemctl restart httpd
-
创建一个软连接,把/etc的软连接放到 html/dir 中,同时关闭上述的options -Indexes
[root@localhost dir]# ln -s /etc/hosts hosts
-
可以访问软连接指定文件中的内容。这样也会导致很大的安全风险。
-
关闭FollowSymLinks选项后再次查看,发现软链接文件已经不显示了
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -FollowSymLinks
[root@localhost html]# systemctl restart httpd
AllowOverride指令
AllowOverride指令与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName 指 令指定,AccessFileName .htaccess 为默认值)文件中,覆盖之前的配置指令,只对语句有效,直接在对 应的文件目录中新建一个.htaccess的文件
-
常见用法:
-
AllowOverride All:.htaccess中所有指令都有效
-
AllowOverride None:.htaccess 文件无效,此为httpd 2.3.9以后版的默认值
-
AllowOverride AuthConfig:.htaccess 文件中,除了AuthConfig 其它指令都无法生效, 指定精确指令
-
案例
-
在主配置文件中禁止 Indexes 和 FollowSymLinks ,但是在 .htaccess 中打开
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -Indexes -FollowSymLinks
AllowOverride options=FollowSymLinks,Indexes
[root@localhost ~]# systemctl reload httpd
-
创建 .htaccess 文件,然后发现主配置文件中的设置被修改了
[root@localhost ~]# vim /data/html/dir/.htaccess
[root@localhost ~]# systemctl reload httpd
-
因为有主配置文件中设置了 .htaccess 对应的文件拒绝全部访问,所以相对是安全的
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Files ".ht*">
Require all denied
</Files>
day9
nginx介绍
-
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、 SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
nginx特点
-
支持高并发,消耗内存资源小
-
具有多种功能
-
网站web服务功能
-
网站负载均衡功能
-
正向代理反向代理
-
-
网站缓存功能
-
在多种系统平台都可以部署
-
nginx实现网络通讯时使用的是异步网络IO模型:epoll模型,参考博客:https://segmentfault.com/a/1190000003063859#item-3-13
关于进程I/O的介绍
内核空间和用户空间
-
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
-
为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
进程的切换
-
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
-
进程的切换会带来比较大的资源消耗,因为进程切换会做如下过程
-
保存处理机上下文,包括程序计数器和其它寄存器
-
更新PCB信息
-
把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列
-
选择另一个进程执行,并更新其PCB
-
更新内存管理的数据结构
-
恢复处理机上下文
-
进程的阻塞
-
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态
文件描述符fd
-
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表
缓存I/O
-
数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间
-
数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的
I/O多路复用
select
-
使用数组为单个进程去记录多个文件描述符的状态,每次通过循环遍历的方式访问数组,当发现有就绪的文件描述时返回。因为使用数组组织数据,所以一次性最多只能监听1024个文件描述符
poll
-
与select不同的是使用链表替换了数组,解决了最大长度有限问题,但是依然没有解决循环遍历效率问题
epoll
-
采用基于事件通知的方式,一旦有某个文件描述符就绪,会通过callback回调机制,来主动通知进程有文件描述符就绪,解决了自己循环遍历效率低下的问题
nginx工作原理
-
Nginx由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接 收和分配客户端请求,处 理模块之间的交互。Nginx的各种功能和操作都由模块来实现。Nginx的模 块从结构上分为核心模块、基础模块和第三方 模块
-
核心模块: HTTP模块、EVENT模块和MAIL模块
-
基础模块: HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块
-
第三方模块: HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块及用 户自己开发的模块
-
nginx进程结构
-
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成
主进程(master process)的功能
-
对外接口:接收外部的操作(信号)
-
对内转发:根据外部的操作的不同,通过信号管理worker 监控:
-
监控worker进程的运行状态,worker进程异常终止后,自动重启worker进程
-
读取Nginx配置文件并验证其有效性和正确性
-
建立、绑定和关闭socket连接
-
按照配置生成、管理和结束工作进程
-
接受外界指令,比如重启、升级及退出服务器等指令
-
不中断服务,实现平滑升级,重启服务并应用新的配置
-
开启日志文件,获取文件描述符
-
不中断服务,实现平滑升级,升级失败进行回滚处理
-
编译和处理perl脚本
工作进程(worker process的功能
-
所有Worker进程都是平等的
-
实际处理:网络请求,由Worker进程处理
-
Worker进程数量:在nginx.conf 中配置,一般设置为核心数,充分利用CPU资源,同时,避免 进程数量过多,避免进程竞争CPU资源,增加 上下文切换的损耗
-
接受处理客户的请求
-
将请求依次送入各个功能模块进行处理
-
I/O调用,获取响应数据
-
与后端服务器通信,接收后端服务器的处理结果
-
缓存数据,访问缓存索引,查询和调用缓存数据
-
发送请求结果,响应客户的请求
-
接收主程序指令,比如重启、升级和退出等
-
连接建立和请求处理过程
-
Nginx启动时,Master 进程,加载配置文件
-
Master进程,初始化监听的socket
-
Master进程,fork 出多个Worker进程
-
Worker进程,竞争新的连接,获胜方通过三次握手,建立Socket连接,并处理请求
nginx服务部署安装
yum安装
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install nginx -y
注!!!:nginx启动可使用nginx或者systemctl start nginx启动,整个过程只能使用其中的一种,不能混用。
编译安装
-
从官网获取源码包,以1.18.0举例
[root@localhost ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz -P
/usr/local/src/
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# tar xzvf nginx-1.18.0.tar.gz
[root@localhost src]# cd nginx-1.18.0
[root@localhost nginx-1.18.0]# ./configure --help
-
编译安装
[root@localhost nginx-1.18.0]# yum -y install gcc pcre-devel openssl-devel
zlib-devel
[root@localhost nginx-1.18.0]# useradd -r -s /sbin/nologin nginx
[root@localhost nginx-1.18.0]# ./configure --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
[root@localhost nginx-1.18.0]# make -j 2 && make install
[root@localhost nginx-1.18.0]# chown -R nginx.nginx /apps/nginx
[root@localhost nginx-1.18.0]# ln -s /apps/nginx/sbin/nginx /usr/bin/
[root@localhost nginx-1.18.0]# nginx -v
nginx目录结构介绍
location表达式
-
~ 表示执行一个正则匹配,区分大小写;
-
~* 表示执行一个正则匹配,不区分大小写;
-
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location;
-
= 进行普通字符精确匹配。也就是完全匹配;
-
@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
-
优先级:=/^/ ,~*/常规字符串
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
A:请求 /
B: 请求 index.html
C: 请求 /documents/document.html
D: 请求 /images/1.jpg
E: 请求 /documents/document.gif
客户端相关配置
keepalive_timeout # 保持连接的超时时长
keepalive_requests # 一次连接允许请求资源的最大数量
keepalive_disable # 对某种浏览器禁用长连接
send_timeout # 向客户端发送响应报文的超时时长
client_body_buffer_size # 接收客户端请求报文的body部分的缓冲区大小
client_body_temp_path # 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构
和数量
limit_rate rate # 限制响应给客户端的传输速率
limit_except # 限制对指定的请求方法之外的其它方法的使用客户端
nginx相关模块
ngx_http_access_module
-
实现基于ip的访问控制功能
-
代码实例
server {
...
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}ngx_http_auth_basic_module模块
-
使用基于用户的访问控制,使用basic机制进行用户认证
-
代码示例
location / {
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
htpasswd -bc /etc/nginx/conf/htpasswd admin 123456
将密码文件权限改为600观察会发生什么现象?注:htpasswd工具需要先安装httpd
-
ngx_http_stub_status_module模块
-
用于输出nginx的基本访问状态信息
-
代码实例
location = /basic_status {
stub_status;
}
nginx代理和缓存
介绍
-
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 部网络上的服务 器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器 对外就表现为一个反向代理服务 器,通常使用到的http/https协议和fastgci(将动态内容和http服务器 分离)
正向代理
-
resolver:指定dns服务器地址
-
proxy_pass:代理到的地址
-
resolver_timeout:dns解析超时时长
案例
-
添加配置文件
[root@nginx1 ~]# cat /etc/nginx/conf.d/www.conf
server{
listen *:8090;
resolver 114.114.114.114;
location / {
proxy_pass http://$http_host$request_uri;
}
} -
重启nginx
-
测试
-
方法一:
[root@client ~]# curl -x 192.168.80.10:8090 "http://www.baidu.com" -I
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 21 Jul 2021 06:16:29 GMT
Content-Type: text/html
Content-Length: 277
Connection: keep-alive
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Etag: "575e1f60-115"
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Pragma: no-cache-
方法二
[root@client ~]# export http_proxy=http://192.168.80.10:8090
-
LNMP架构概述
什么是LNMP
-
LNMP是一套技术的组合,L=Linux、N=Nginx、M~=MySQL、P=PHP
LNMP架构是如何工作的
-
首先nginx服务是不能请求动态请求,那么当用户发起动态请求时,nginx无法处理
-
当用户发起http请求,请求会被nginx处理,如果是静态资源请求nginx则直接返回,如果是动态请 求nginx则通过fastcgi协议转交给后端的PHP程序处理
day10
什么是数据
-
数据是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材
-
数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据
数据的定义
-
数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号
数据管理系统种类
-
RDBMS:以多张二维表的方式来存储,又给多张表建立了一定的关系
-
NoSQL:非关系型数据库
功能对比
特点对比
关系型数据库
-
二维表
-
典型产品Oracle传统企业,MySQL互联网企业
-
数据存取是通过SQL(Structured Query Language结构化查询语言)
-
最大特点数据安全性方面强(ACID)
非关系型数据库
-
不是否定关系型数据库,而是做关系型数据库的补充
MySQL的发展史
-
2008年1月16日 MySQL被Sun公司收购
-
2009年4月20日Oracle收购Sun公司,MySQL转入Oracle门下
MySQL安装
yum安装
-
添加源
rpm -ivh https://repo.mysql.com/mysql57-community-release-el7-9.noarch.rpm
-
yum安装
yum install mysql-community-server -y --nogpgcheck
-
启动MySQL
systemctl start mysqld
systemctl enable mysqld -
查看默认密码
grep 'temporary password' /var/log/mysqld.log
源码安装
-
MySQL版本选择
-
5.6:GA(稳定版) 6-12个月 小版本是偶数版是稳定版,奇数版本是开发版
-
5.7:选择5.17版本以上,支持MGR(MySQL自带的高可用)
二进制安装
当前运维和开发最常见的做法是二进制安装MySQL
-
下载二进制包并进行解压
ads.mysql.com/archives/get/p/23/file/mysql-5.6.40-linux•glibc2.12-x86_64.tar.gz
tar xzvf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz -
剩下步骤和源码编译安装一样
部署mariadb
-
安装mariadb-server
-
初始化
Enter current password for root (enter for none): 当前root用户密码为空,所以直接敲回车
OK, successfully used password, moving on...
Set root password? [Y/n] y 设置root密码
New password:
Re-enter new password:
Password updated successfully!
Remove anonymous users? [Y/n] y 删除匿名用户
... Success!
Disallow root login remotely? [Y/n] y 禁止root远程登录
... Success!
Remove test database and access to it? [Y/n] y 删除test数据库
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reload privilege tables now? [Y/n] y 刷新授权表,让初始化生效
... Success!
-
登录数据库
-
主配置文件
[root@node1 ~]# vim /etc/my.cnf
[client] # 客户端基本配置
port = 3306 #客户端默认连接端口
socket = /tmp/mysql.sock #用于本地连接的socket套接字
[mysqld] # 服务端基本配置
port = 3306 # mysql监听端口
socket = /tmp/mysql.sock #为MySQL客户端程序和服务器之间的本地通讯指定一个套接
字文件
user = mariadb # mysql启动用户
basedir = /usr/local/mariadb # 安装目录
datadir = /data/mysql # 数据库数据文件存放目录
log_error = /data/mysql/mariadb.err #记录错误日志文件
pid-file = /data/mysql/mariadb.pid #pid所在的目录
skip-external-locking #不使用系统锁定,要使用myisamchk,必须关闭服务器
密码相关设置
管理员密码的设定
[root@localhost ~]# mysqladmin -uroot -p password 1
Enter password: <首次设置直接回车,第二次修改密码时此处输入旧密码>
管理员密码忘记
-
关闭数据库
[root@localhost ~]# systemctl stop mariadb.service
-
跳过授权登录
mysqld_safe --skip-grant-tables --skip-networking
-
登录MySQL并修改root密码
[root@localhost ~]# mysql
MariaDB [(none)]> use mysql
MaiaDB [mysql]> grant all on *.* to root@'localhost' identified by '777';
ERROR 1290 (HY000): The MariaDB server is running with the --skip-grant•tables option so it cannot execute this statement
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> grant all on *.* to root@'localhost' identified by '777';
Query OK, 0 rows affected (0.00 sec) -
重启数据库
[root@localhost ~]# pkill mysqld
[root@localhost ~]# systemctl restart mariadb
客户端工具
-
mysql可以用来连接数据库
-
--user , -u
-
--host , -h
-
--password , -p
-
--port --portocol
-
--database DATABASE , -D 登录指定数据库
-
-
mysqladmin(可以通过客户端直接执⾏服务器上的命令)
[root@localhost ~]# mysqladmin -uroot -p1 create hellodb
[root@localhost ~]# mysqladmin -uroot -p1 ping 检查服务端存活状态的
[root@localhost ~]# mysqladmin -uroot -p1 status 服务器详细运行状态
[root@localhost ~]# mysqladmin -uroot -p1 status 服务器状态 --sleep 2 --count
10 每两秒钟显示
⼀次服务器实时状态⼀共显示10次
[root@localhost ~]# mysqladmin -uroot -p1 extended-status 显示状态变量
[root@localhost ~]# mysqladmin -uroot -p1 variables 显示服务器变量
[root@localhost ~]# mysqladmin -uroot -p1 flush-privileges 数据库重读授权表,等
同于reload
[root@localhost ~]# mysqladmin -uroot -p1 flush-tables 关闭所有已经打开的表
[root@localhost ~]# mysqladmin -uroot -p1 flush-threds 重置线程池缓存
[root@localhost ~]# mysqladmin -uroot -p1 flush-status 重置⼤多数服务器状态变量
[root@localhost ~]# mysqladmin -uroot -p1 flush-logs ⽇志滚动。主要实现⼆进制和中
继⽇志滚动
[root@localhost ~]# mysqladmin -uroot -p1 flush-hosts 清楚主机内部信息
[root@localhost ~]# mysqladmin -uroot -p1 kill 杀死线程
[root@localhost ~]# mysqladmin -uroot -p1 refresh 相当于同时执⾏flush-hosts
flush-logs
[root@localhost ~]# mysqladmin -uroot -p1 shutdown 关闭服务器进程
[root@localhost ~]# mysqladmin -uroot -p1 version 服务器版本以及当前状态信息
[root@localhost ~]# mysqladmin -uroot -p1 start-slave 启动复制,启动从服务器复制
线程
[root@localhost ~]# mysqladmin -uroot -p1 stop-slave 关闭复制线程 -
在数据库的语句中可以加的命令(最常见是\G,将结果以竖排方式显示)
-
\C:提前终⽌语句执⾏
-
\d: 修改默认结束符
-
\g:⽆论语句结束符是什么,直接将此语句送⾄服务器执⾏
-
\G:⽆论语句结束符是什么,直接将结果送⾄服务端执⾏,⽽且结果以竖排⽅式显示
-
\W:显示语句结束后显示警告信息
-
\w:不显示警告信息 默认输出的格式是表的格式。登录数据库时可以添加参数 --html -H 或者 --xml -X
-
基础SQL语句
-
操作文件夹(库)
增:create database db1 charset utf8;
查:show databases;
改:alter database db1 charset latin1;
删除: drop database db1;
-
操作文件(表)
先切换到文件夹下:use db1
增:create table t1(id int,name char);
查:show tables;
改:alter table t1 modify name char(3);
alter table t1 change name name1 char(2);
删:drop table t1;
-
操作文件中的内容(记录)
增:insert into t1 values(1,'xwz'),(2,'cs'),(3,'tj');
查:select * from t1;
改:update t1 set name='sb' where id=2;
删:delete from t1 where id=1;
清空表:
delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
MySQL体系结构
连接方式
-
TCP/IP 连接
-
socket方式连接
工作流程
-
首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的结构。比如:连接处理、授权认证、安全等
-
第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等
-
第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储 引擎API包含十几个底 层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析 SQL(InnoDB会解析外键定义,因为其 本身没有实现该功能),不同存储引擎之间也不会相互通 信,而只是简单的响应上层的服务器请求。
-
第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬 盘上
程序结构
-
把工作流程相同功能划分为一个结构里,可以形成MySQL的体系结构,如下图。值得一提的是MySQL存 储引擎层使用的是插件式结构,可以根据场景不同选择不同的存储引擎。不同的存储引擎对于上层的应 用程序或者是底层的文件系统是透明的。我们把MySQL的体系结构称为插件式存储引擎结构
连接层
-
提供连接协议:TCP/IP 、SOCKET
-
提供验证:用户、密码,IP,SOCKET
-
提供专用连接线程:接收用户SQL,返回结果
SQL层(重点)
-
接收上层传送的SQL语句
-
语法验证模块:验证语句语法,是否满足SQL_MODE
-
语义检查:判断SQL语句的类型
-
DDL :数据定义语言
-
DCL :数据控制语言
-
DML :数据操作语言
-
DQL: 数据查询语言
-
-
权限检查:用户对库表有没有权限
-
解析器:对语句执行前,进行预处理,生成解析树(执行计划),说白了就是生成多种执行方案
-
优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划。代价模型:资源 (CPU IO MEM)的耗损评估性能好坏
-
执行器:根据最优执行计划,执行SQL语句,产生执行结果
-
提供查询缓存(默认是没开启的),会使用redis tair替代查询缓存功能
-
提供日志记录(日志管理章节):binlog,默认是没开启的
存储引擎层
-
负责根据SQL层执行的结果,从磁盘上拿数据
-
将16进制的磁盘数据,交由SQL结构化化成表
-
连接层的专用线程返回给用户
存储引擎(重点)
-
功能
-
数据读写
-
数据安全
-
提高性能
-
热备份
-
自动故障恢复
-
高可用方面支持
-
种类
InnoDB
-
⽀持事务,主要⾯向在线事务(OLTP)处理的应⽤;
-
⾏锁设计、⽀持外键、⽀持类似于Oracle的⾮锁定读;
-
从5.5.8版本开始,InnoDB存储引擎是默认的存储引擎;
-
将数据放在⼀个逻辑的表空间中,这个表空间就像⿊盒⼀样由InnoDB存储引擎⾃身进⾏管 理;
MyISAM
-
不⽀持事务、表锁设计、⽀持全⽂索引,主要⾯向OLAP数据库应⽤;
-
它的缓冲池只缓存索引⽂件,不缓存数据⽂件;
-
MyISAM存储引擎表由MYD和MYI组成,MYD⽤来存放数据⽂件,MYI⽤来存放索引⽂件。
MEMORY
-
在内存中存储所有数据,应用于对非关键数据由快速查找的场景。
-
Memory类型的表访问数据非常快,因为它的数据 是存放在内存中的,并且默认使用HASH索 引,但是一旦服务关闭,表中的数据就会丢失
-
应用场景:快速定位记录
ARCHIVE
-
Archive存储引擎只⽀持INSERT和SELECT操作,从5.1开始⽀持索引;
-
使⽤zlib算法将数据⾏进⾏压缩后存储,压缩⽐⼀般可达1:10;
-
⾮常适合存储归档数据,如⽇志信息;
-
使⽤⾏锁来实现⾼并发的插⼊操作,但是其本身并不是事务安全的存储引擎,其设计主要⽬标 是提供告 诉的插⼊和压缩功能。
FEDERATED
-
Federated存储引擎表并不存放数据,它只是指向⼀台远程MySQL数据库服务器上的表。这⾮ 常类似于 SQLServer的链接服务器和Oracle的透明⽹关,不同的是它只⽀持MySQL数据库 表,不⽀持异构数据库 表
EXAMPLE
-
这种存储引擎用以保存阐明如何开始写新的存储引擎的 MySql 源码的例子。它主要针对于有 兴趣的开发人员。这 种存储引擎就是一个啥事也不做的 "存根"。你可以使用这种引擎创建 表,但是你无法向其保存任何数据,也无法从 它们检索任何索引
BLACKHOLE
-
黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的 表的查询常常返 回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器 并不会保留这种数据的备份的主从配置 中
MERGE
-
允许 MySql DBA 或开发者将一系列相同的 MyISAM 表进行分组,并把它们作为一个对象进行 引用。适用于超大规 模数据场景,如数据仓库
NDBCLUSTER
-
是⼀个集群存储引擎,类似于Oracle的RAC集群,不过其结构与Oracle的share everything不 同的 是,它使⽤的是share nothing的集群结构,可以提供更⾼的可⽤性;
-
数据全部放在内存中(从5.1版本开始,可以将⾮索引数据放在磁盘上)因此主键查找的速度 极快,并 且通过添加NDB数据存储节点可以线性地提⾼数据库性能,是⾼可⽤、⾼性能的集 群系统;
-
其连接操作是在数据库层完成的,⽽不是在存储引擎层完成的。这意味着,复杂的连接操作需 要巨⼤的 ⽹络开销,因此查询速度很慢。
CSV
-
它的表真的是以逗号分隔的文本文件。CSV 表允许你以 CSV 格式导入导出数据,以相同的读 和写的格式和脚本和 应用交互数据。由于 CSV 表没有索引,你最好是在普通操作中将数据放 在 InnoDB 表里,只有在导入或导出阶段 使用一下 CSV 表
Maria存储引擎
-
新开发的引擎,设计主要⽬标是⽤来取代原来的MyISAM存储引擎,从⽽成为MySQL的默认 存储引 擎
-
⽀持缓存数据和索引⽂件,应⽤了⾏锁设计,提供了MVCC功能,⽀持事务和⾮事务安全的选 项,以及 更好的BLOB字符类型的处理性能
day11
表管理
表的约束规则
-
防止不规范的数据存放在数据库中,DBMS自动按照一定的约束条件对数据进行检测,确保数据库 中存储的数据正 确有效
-
分类:
-
NOT NULL:非空约束
-
Default:当表中某一列有重复内容,避免频繁操作,可以为其设置默认值
-
UNIQUE:唯一约束
-
PRIMARY KEY:主键,唯一标识一条记录
-
主键为了保证表中的每一条数据的该字段都是表格中的唯一值
-
主键必须唯一,主键值非空;
-
可以是单一字段,也可以是多字段组合 单字段主键:
-
-
FOREIGN KEY:外键,从属于主表的一条记录
-
多表
-
-
记录操作
-
插入数据
1. 插入完整数据(顺序插入)
语法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
语法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n);
2. 指定字段插入数据
语法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
3. 插入多条记录
语法:
INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n);
4. 插入查询结果
语法:
INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2
WHERE …;
-
更新数据
语法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;
示例:
UPDATE mysql.user SET password=password(‘123’)
where user=’root’ and host=’localhost’;
-
删除数据
语法:
DELETE FROM 表名
WHERE CONITION;
示例:
DELETE FROM mysql.user
WHERE password=’’;
查询数据
-
语法
SELECT DISTINCT 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
-
优先级
from
where
group by
select
distinct
having
order by
limit
1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.执行select(去重)
5.将分组的结果进行having过滤
6.将结果按条件排序:order by
7.限制结果的显示条数
-
where约束
1. 比较运算符:> < >= <= <> !=
2. between 80 and 100 值在80到100之间
3. in(80,90,100) 值是80或90或100
4. like 'e%'
通配符可以是%或_,
%表示任意多字符
_表示一个字符
5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
#1:单条件查询
SELECT emp_name FROM employee
WHERE post='sale';
#2:多条件查询
SELECT emp_name,salary FROM employee
WHERE post='teacher' AND salary>10000;
#3:关键字BETWEEN AND
SELECT emp_name,salary FROM employee
WHERE salary BETWEEN 10000 AND 20000;
-
group by
单独使用GROUP BY关键字分组
SELECT post FROM employee GROUP BY post;
注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,
需要借
助函数
GROUP BY关键字和GROUP_CONCAT()函数一起使用
SELECT post,GROUP_CONCAT(emp_name) FROM employee GROUP BY post;#按照岗位分组,
并查看组内成
员名
SELECT post,GROUP_CONCAT(emp_name) as emp_members FROM employee GROUP BY
post;
GROUP BY与聚合函数一起使用
select post,count(id) as count from employee group by post;#按照岗位分组,并查
看每个组有多
少人
PS:
1.如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
2.多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
-
聚合函数
#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组
示例:
SELECT COUNT(*) FROM employee;
SELECT COUNT(*) FROM employee WHERE depart_id=1;
SELECT MAX(salary) FROM employee;
SELECT MIN(salary) FROM employee;
SELECT AVG(salary) FROM employee;
SELECT SUM(salary) FROM employee;
SELECT SUM(salary) FROM employee WHERE depart_id=3;
-
having过滤
!!!执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字
段,可以使用聚合
函数
mysql> select @@sql_mode;
-
order by
按单列排序
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary ASC;
SELECT * FROM employee ORDER BY salary DESC;
按多列排序:先按照age排序,如果年纪相同,则按照薪资排序
SELECT * from employee
ORDER BY age,
salary DESC;
-
limit
示例:
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3; #默认初始位置为0
SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
SELECT * FROM employee ORDER BY salary DESC
LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
-
正则表达式
SELECT * FROM employee WHERE emp_name REGEXP '^ale';
SELECT * FROM employee WHERE emp_name REGEXP 'on$';
SELECT * FROM employee WHERE emp_name REGEXP 'm{2}';
小结:对字符串匹配的方式
WHERE emp_name = 'egon';
WHERE emp_name LIKE 'yua%';
WHERE emp_name REGEXP 'on$';
多表连接查询
-
语法
#重点:外链接语法
SELECT 字段列表
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
-
交叉连接
MariaDB [test]> select * from employee2,department;
-
左连接,交叉运算后优先显示左表全部记录
MariaDB [test]> select employee2.id,employee2.name,department.name as
depart_name from
employee2 left join department on employee2.dep_id=department.id;
-
右连接,交叉运算后优先显示右表全部记录
MariaDB [test]> select employee2.id,employee2.name,department.name as
depart_name from
employee2 right join department on employee2.dep_id=department.id;
-
全外连接,显示左右两个表全部记录
MariaDB [test]> select * from employee2 left join department on
employee2.dep_id =
department.id
-> union
-> select * from employee2 right join department on employee2.dep_id =
department.id;
子查询
-
解释
#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等
-
带IN关键字的子查询
#查询平均年龄在25岁以上的部门名
select id,name from department
where id in
(select dep_id from employee group by dep_id having avg(age) > 25);
#查看技术部员工姓名
select name from employee
where dep_id in
(select id from department where name='技术');
#查看不足1人的部门名(子查询得到的是有人的部门id)
select name from department where id not in (select distinct dep_id from
employee);
-
带比较运算符的子查询
#比较运算符:=、!=、>、>=、<、<=、<>
#查询大于所有人平均年龄的员工名与年龄
mysql> select name,age from emp where age > (select avg(age) from emp);
-
带EXISTS关键字的子查询
#department表中存在dept_id=200,Ture
mysql> select * from employee
-> where exists
-> (select id from department where id=200);
数据类型
整数类型
日期时间类型
字符串类型
ENUM和SET类型
-
ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。ENUM只允许从值集 合中选取单个 值,而不能一次取多个值。
-
SET和ENUM非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储 上也有所不同。 set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不 允许注入,而对重复的值将进行自动去重
索引管理
索引介绍
-
功能
1. 索引的功能就是加速查找
2. mysql中的primary key,unique,联合唯一也都是索引,这些索引除了加速查找以外,还有约束
的功能
-
常用索引
普通索引INDEX:加速查找
唯一索引:
-主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
-唯一索引UNIQUE:加速查找+约束(不能重复)
联合索引:
-PRIMARY KEY(id,name):联合主键索引
-UNIQUE(id,name):联合唯一索引
-INDEX(id,name):联合普通索引
-
索引类型
#我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
#不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 #方法一:创建表
时
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);
#方法二:CREATE在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
#方法三:ALTER TABLE在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
#删除索引:DROP INDEX 索引名 ON 表名字; 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;
索引使用
-
创建/删除索引语法
#方法一:创建表时
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);
#方法二:CREATE在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
#方法三:ALTER TABLE在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
#删除索引:DROP INDEX 索引名 ON 表名字;
SQL模型
-
ANSI QUOTES::宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调 整或截断保存,报warning警告。 双引号相当于反引号,只可以引用表名等字段名称,字符串只可 以使用单引号引用;
-
IGNORE_SPACE:在内建函数中忽略多余的空白字符;
-
STRICT_ALL_TABLES:如果没有设置这个值,非法的数据都允许存入,但是会有一个警告提示。如 果设置了,所有非法的数据都不允许填入,并且返回一个错误;
-
STRICT_TRANS_TABLES:向一个支持事务的表中插入非法数据的时候不允许,并且返回一个错 误;
-
TRADITIONAL:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不 能插入,报error错误。用于事物时,会进行事物的回滚
如何查看并修改sql模型?
SELECT @@[GLOBAL | SESSION].sql_mode; 显示值
set GLOBAL | SESSION sql_mode=[值]; 修改值
事务特性
特点
-
把数据库从一种一致性状态转换为另一种一致性状态,来保证数据库的完整性
-
主要用于处理操作量大,复杂高的数据
-
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
-
事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行。全 部执行称为事务提交,全部不执行称为事务回滚。
-
事务主要用于管理insert、update、delete
ACID特性
-
一般来说,事务必须满足四个特性(ACID)
-
A:原子性,事务必须是执行任务的最小原子单位,事务要么成功要么撤回
-
C:一致性,事务是把数据库从一个一致性状态转化为另一个一致性状态
-
I:隔离性,每个事务之间是隔离的
-
D:持久性,事务一旦执行,数据的修改是永久的
四个隔离等级
-
read uncommitted(未提交读):出现脏读的现象
-
read conmitted (提交读):能够解决脏读,修改数据时会加锁。会出现幻读现象
-
repeatable read (可重读):能够解决幻读现象
-
serializable(可串行化读):事务需要按串行化解决(MVCC)
Innodb存储引擎默认可重复读
mysql>begin; #开始一个事务
mysql>insert into a (a) values(555);
mysql>rollback; #回滚,这样数据是不会写入的
mysql>commit; #提交事务
日志管理
日志管理
错误日志是用来记录MySQL数据库的启动、关闭、日常运行过程中、状态信息、警告、错误等信息
-
查看错误日志文件位置
MariaDB [(none)]> show variables like 'log_error';
二进制日志(binlog)
备份恢复必须依赖二进制日志,主从环境必须依赖二进制日志。binlog是SQL层的功能,记录的是变更 的sql语句,不记录查询语句。
-
开启二进制日志
vim /etc/my.cnf
server_id=6 # 设置id
log_bin=mysql-bin # 开启并指定二进制日志目录及前缀名,记得关闭
selinux
binlog_format=row # binlog
的日志记录格式
修改完配置重启服务会自动生成二进制日志
-
查看日志的开启情况
MariaDB [(none)]>show variables like '%log_bin%';
-
查看二进制日志文件数量
MariaDB [(none)]>show binary logs;
-
查看正在使用的二进制日志文件
MariaDB [(none)]> show master status;
-
日志内容查看
MariaDB [binlog]>show binlog events in 'mysql-bin.000003';
Log_name:binlog文件名
Pos:开始的position *****
Event_type:事件类型
Format_desc:格式描述,每一个日志文件的第一个事件,多用户没有意义,MySQL识别binlog必要
信息
Server_id:mysql服务号标识
End_log_pos:事件的结束位置号 *****
Info:事件内容*****
补充:
SHOW BINLOG EVENTS
[IN 'log_name']
[FROM pos]
[LIMIT [offset,] row_count]
-
binlog内容详细查看
[root@localhost ~]# mysqlbinlog --base64-output=decode-rows -vvv
/data/binlog/mysql-bin.000003
-
基于position进行二进制日志截取
[root@localhost ~]# mysqlbinlog --start-position=219 --stop-position=1347
/data/binlog/mysql-bin.000003 >/tmp/bin.sql
慢日志slow_log
慢日志文件是记录运行比较慢的sql语句,将这些sql语句记录下来以便进一步优化。可以自行补充一些 关于慢日志的分析。
-
修改配置文件开启慢日志
开关:
slow_query_log=1
文件位置及名字
slow_query_log_file=/data/mysql/slow.log
设定慢查询时间:
long_query_time=0.1
没走索引的语句也记录:
log_queries_not_using_indexes
[root@localhost ~]# vim /etc/my.cnf
slow_query_log=1
slow_query_log_file=/data/mysql/slow.log
long_query_time=0.1
log_queries_not_using_indexes
[root@localhost ~]# systemctl restart mysqld
备份与恢复
备份方式
-
按照备份数据位置分类
-
热备:硬盘以及内存中的⼀些数据进⾏备份
-
冷备:数据库硬盘中的数据
-
-
按照备份后⽂件的内容
-
逻辑备份:⼀般内容分是sql语句
-
裸⽂件备份:拷⻉数据库的物理文件,⼀般内容是⼆进制数据
-
-
按照备份数据的内容
-
完全备份:对数据库进⾏⼀个完整的备份
-
增量备份:在上次的完全备份基础上对更新的数据进⾏备份
-
⽇志备份:⼆进制⽇志备份-->当数据库宕机之后进⾏数据恢复的依据
-
-
冷备份的优点:
-
备份简单,只要拷⻉相关⽂件即可
-
易于跨平台
-
恢复简单,只要把⽂件恢复到相关位置即可
-
恢复速度快,不需要执⾏任何sql语句,也不需要重新建索引
-
-
冷备份缺点
-
冷备⽂件通常⽐逻辑⽂件⼤很多
-
不是总可以轻易跨平台
-
-
逻辑备份:
-
mysqldump
-
selcet * into outfile 'path/to/file' from tbname;
-
使用mysqldump工具备份
-
mysqldump备份数据库的原理是把数据(包括库表)从MySQL库里以sql语句的形式直接输出或者 生产备份文件的过程,这种备份成sql的方式称为逻辑备份。
-
不带参数备份单个数据库
[root@localhost ~]# mysqldump test > test_db_bak.sql
# 可以打开看看备份的数据
[root@localhost ~]# cat test_db_bak.sql | grep -Ev "#|\*|--|^$"
-
加-B参数备份多个数据库
-
加-B参数的作用是增加创建数据库和连接数据库的语句,后面可以直接接多个库名,同时备份 多个数据库
-
使用-B参数备份的数据会增加两行语句
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER
SET gbk */;
USE `test`;
-
使用gzip压缩备份数据
[root@localhost ~]# mysqldump -B test | gzip> test_db_bak.sql.gz
-
备份多个表或者多个表
# 备份单个表
mysqldump 数据库名 表名 > 备份文件名
# 备份多个表
mysqldump 数据库名 表名1 表名2 … > 备份文件名
恢复
-
将sql语句重新执行一遍,则完成数据恢复
-
可以选择在客户端使用客户端工具运行sql脚本
-
可以在数据库服务器里面执行source命令;
主从复制原理
复制过程
-
主服务器上任何的更新操作会被写入到二进制日志文件中
-
从服务器上的IO线程:
-
检测主服务器的二进制日志文件的变化
-
同步主服务器的二进制日志文件到本地的中继日志中
-
从服务器上的sql线程负责读取和执行中继日志中的sql语句
应用场景
-
一主多从会去对应读写分离
-
写操作由主服务器
-
读操由从服务器
-
-
主服务器上:drop ……
-
要去做备份操作:在服务器上通过LVM快照进行备份
-
-
主服务器挂掉了,用户不可以进行写入操作
-
高可用模型:多主架构
-
任何一台服务器既是主服务器也是从服务器
-
-
高可用架构:MHA架构
MHA架构
简介
MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够 很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅需 要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简 单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。
MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为 主库),大概0.5-2秒内即可完成。
工作流程
-
把宕机的master二进制日志保存下来。
-
)找到binlog位置点最新的slave。
-
在binlog位置点最新的slave上用relay log(差异日志)修复其它slave。
-
将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。
-
将含有最新位置点binlog所在的slave提升为master。
-
将其它slave重新指向新提升的master,并开启主从复制。
架构图
部署
自行百度完成MHA架构的部署,这里给大家提供一篇参考博客:https://www.cnblogs.com/fawaikuangtu123/p/10927888.html
day12
noSQL简史
什么是NoSQL
-
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系 型数据库的数据库管理系统的统称
-
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。 这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展
NoSQL的优点/缺点
优点
-
高可拓展性
-
分布式计算
-
低成本
-
架构的灵活性,半结构化数据
-
没有复杂的关系
缺点
-
没有标准化
-
有限的查询功能
-
最终一致是不直观的程序
RDBMS vs NoSQL
NoSQL
-
代表着不仅仅是SQL
-
没有声明性查询语言
-
没有预定的模式
-
键-值对存储,列存储,文档存储,图形数据库
-
最终一致性,而非ACID属性
-
非结构化和不可预知的数据
-
CAP定理
-
高性能,高可用性和可伸缩性
RDBMS
-
高度组织化结构化数据
-
结构化查询语言(SQL) (SQL)
-
数据和关系都存储在单独的表中
-
数据操纵语言,数据定义语言
-
严格的一致性
-
基础事务
缓存的概念
缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访 问速度较慢的一方的作用
比如 CPU 的一级、二级缓存是保存了 CPU 最近经常访问的数据,内存是保存 CPU 经常访问硬盘的数 据,而且硬盘也有大小不一的缓存,甚至是物理服务器的 raid 卡有也缓存
为了起到加速 CPU 访问硬盘数据的目的,因为 CPU 的速度太快了, CPU 需要的数据硬盘往往不能在短 时间内满足 CPU 的需求
因此 PCU 缓存、内存、 Raid 卡以及硬盘缓存就在一定程度上满足了 CPU 的数据需求,即 CPU 从缓存 读取数据可以大幅提高 CPU 的工作效率
缓存的保存位置
-
客户端:浏览器
-
内存:本地服务器、远程服务器
-
硬盘:本机硬盘、远程服务器硬盘
缓存的特性
-
自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除
-
过期时间:强制过期,源网站更新图片后CDN是不会更新的,需要强制是图片缓存过期
-
命中率:即缓存的读取命中率
系统缓存
buffer与cache
buffer
缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存再写入磁盘,buffer 一般用于写缓 冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速 度,CPU 会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时 间再写入磁盘,所以服务器突然断电会丢失内存中的部分数据
cache
缓存也叫读缓存,一般用于读操作,CPU 读文件从内存读,如果内存没有就先从硬盘读到内存 再读到 CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取
cookie和session
-
Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤,比如加 密后的账户名密码等信息
-
Cookies是服务器在客户端浏览器上存储的小段文本并随每一个请求发送至同一个服务器,是一种实现 客户端保持状态的方案
-
session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当浏览器请求http地址 时,可以基于之前的session实现会话保持、session共享等
CDN(内容分发网络)
-
内容分发网络(Content Delivery Network,CDN)是建立并覆盖在承载网上,由不同区域的服务器组 成的分布式网络。将源站资源缓存到全国各地的边缘服务器,利用全球调度系统使用户能够就近获取, 有效降低访问延迟,降低源站压力,提升服务可用性
用户请求CDN流程
详细说明如下:
-
用户向www.test.com下的某图片资源(如:1.jpg)发起请求,会先向 Local DNS 发起域名解析请 求
-
当 Local DNS 解析www.test.com时,会发现已经配置了 CNAMEwww.test.com.cdn.dnsv1.com,解析请求会发送至 Tencent DNS(GSLB),GSLB 为腾 讯云自主研发的调度体系,会为请求分配最佳节点 IP
-
Local DNS 获取 Tencent DNS 返回的解析 IP
-
用户获取解析 IP
-
用户向获取的 IP 发起对资源 1.jpg 的访问请求
-
若该 IP 对应的节点缓存有 1.jpg,则会将数据直接返回给用户(10),此时请求结束。若该节点未 缓存 1.jpg,则节点会向业务源站发起对 1.jpg 的请求(6、7、8),获取资源后,结合用户自定义 配置的缓存策略,将资源缓存至节点(9),并返回给用户(10),此时请求结束
CDN主要优势
CDN有效解决了目前互联网业务中网络层面的以下问题:
-
用户与业务服务器地域间物理距离较远,需要进行多次网络转发,传输延时较高且不稳定
-
用户使用运营商与业务服务器所在运营商不同,请求需要运营商之间进行互联转发
-
业务服务器网络带宽、处理能力有限,当接收到海量用户请求时,会导致响应速度降低、可用性降 低
-
利用CDN防止和抵御DDos等攻击,实现安全保护
Redis介绍
Redis是什么
Redis 是一个使用 C 语言写成的,开源的 key-value 数据库。和Memcached类似,它支持存储的value 类型相对更多, 包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类 型)。这些数据类型都支持 push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操 作都是原子性的。在此基础上,redis支持各 种不同方式的排序。与memcached一样,为了保证效率, 数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记 录文件,并且在此基础上实现了master-slave(主从)同步
特点
-
速度快,redis虽然式单线程架构,但是由于redis的数据是运行在内存中的,所以redis的运
-
行速度 非常快
-
支持丰富的数据类型,具有五大基本数据类型
-
支持事务
-
丰富的功能特性
Redis单线程架构
-
redis是单线程来处理命令的,所以一条命令从客户端到达服务端不会立刻被执行,所有命令都会 进入一个队列中,然后被执行。当然发送命令、返回结果、命令排队并不是像排队那么简单, redis采用了I/O多路复用的技术来解决I/O的问题
-
单线程访问快的原因
-
第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时间大约为100纳秒,这是 redis达到每秒万级别的访问的重要基础
-
第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处 理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间
-
第三,单线程避免了线程切换和竞态产生的消耗
-
安装部署
软件安装
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install redis -y
相关文件
[root@localhost ~]# rpm -ql redis
/etc/redis.conf # 主配置文件
/usr/bin/redis-benchmark # redis性能检测工具
/usr/bin/redis-check-aof # AOF文件修复工具
/usr/bin/redis-check-rdb # 文件检查工具
/usr/bin/redis-cli # redis客户端
/usr/bin/redis-server # redis服务端
/usr/lib/systemd/system/redis.service # 守护进程
/var/lib/redis # redis数据目录
/var/log/redis # redis日志文件
Redis启动、登录与关闭
-
启动时使用命令redis-server,参数是配置文件(可以指定参数配置文件,也可以不指定使其默认加 载)
[root@localhost ~]# redis-server /etc/redis.conf
或者
[root@localhost ~]#systemctl start redis
-
登录使用redis-cli工具进行登录
[root@localhost ~]# redis-cli -h 192.168.88.132 -p 端口号
-
关闭redis服务
127.0.0.1:6379> SHUTDOWN
not connected>
Redis shell
redis-cli 详解
-
-r(repeat)选项代表将命令执行多次,例如下面操作将会执行三次ping 命令
redis-cli -r 3 ping
PONG
PONG
PONG
-
-i(interval)选项代表每隔几秒执行一次命令,但是-i选项必须和-r选 项一起使用,下面的操作会 每隔1秒执行一次ping命令,一共执行5次
$ redis-cli -r 5 -i 1 ping
PONG
PONG
PONG
PONG
PONG
-
-x选项代表从标准输入(stdin)读取数据作为redis-cli的最后一个参 数,例如下面的操作会将字符 串world作为set hello的值:
$ echo "world" | redis-cli -x set hello
OK
-
-c(cluster)选项是连接Redis Cluster节点时需要使用的,-c选项可以防 止moved和ask异常
-
如果Redis配置了密码,可以用-a(auth)选项,有了这个选项就不需要 手动输入auth命令
redis-server 详解
-
redis-server- -test-memory可以用来检测当前操作系统能否稳定地分配指定容量的内存给 Redis, 通过这种检测可以有效避免因为内存问题造成Redis崩溃,例如下面 操作检测当前操作系统能否提 供1G的内存给Redis
redis-server --test-memory 1024
-
整个内存检测的时间比较长。当输出passed this test时说明内存检测完 毕
Redis的数据类型
-
它主要提供了5种数据类型:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。Redis还提供了Bitmap、HyperLogLog、Geo类型,但这些类型都是基于上述核心数据类型实现的。
数据持久化
-
Redis支持RDB和AOF两种持久化机制,持久化功能能有效地避免因进程退出造成的数据丢失问题,当下 次重启时利用之前之间持久化的文件即可实现数据恢复。简单点说,redis是将数据运行在内存中的,如 果出现服务挂掉或者服务器宕机都可以导致数据全部丢失,为了解决这个问题redis提供了两种解决方 案,分别是rdb、aof
RDB持久化
简介
-
RDB持久是把当前数据生成快照保存到硬盘的过程
-
出发RDB持久化过程为手动触发和自动触发
优点
-
RDB是一个非常紧凑的文件,它保存了redis在某个时间点上的数据集,这种文件非常适合用于进行备份和灾难恢复
-
RDB在恢复大数据集时的速度比AOF的恢复速度要快
缺点
-
RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创 建子进程,属于 重量级操作(内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑),频繁 执行成本过高(影响性能)
-
RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版 本Redis服务无 法兼容新版RDB格式的问题(版本不兼容)
-
在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所 有修改(数据有 丢失)
触发方式
-
自动触发:主配置文件中的save字段
分别表示每900秒数据发生一次改变、每300秒数据发生10次改变、每60秒数据发生10000
次改变会自动触发rdb持久化机制
save 900 1
save 300 10
save 60 10000
-
手动触发
-
save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用
-
bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短
-
默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则 自动执行bgsave
-
BGSAVE流程说明
-
执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进 程,如RDB/AOF子进程,如果 存在bgsave命令直接返回
-
父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通 过info stats命令查看 latest_fork_usec选项,可以获取最近一个fork操作的耗 时,单位为微秒
-
父进程fork完成后,bgsave命令返回“Background saving started”信息 并不再阻塞父进程,可以 继续响应其他命令
-
子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后 对原有文件进行原子替换。执行 lastsave命令可以获取最后一次生成RDB的 时间,对应info统计的rdb_last_save_time选项
-
进程发送信号给父进程表示完成,父进程更新统计信息
运维提示
-
当遇到坏盘或磁盘写满等情况时,可以通过config set dir{newDir}在线 修改文件路径到可用的磁 盘路径,之后执行bgsave进行磁盘切换,同样适用 于AOF持久化文件
-
Redis默认采用LZF算法对生成的RDB文件做压缩处理,压缩后的 文件远远小于内存大小,默认开 启,可以通过参数config set rdbcompression{yes|no}动态修改
-
如果想要恢复相关数据,只需要将相关的RDB文件拷贝到相关的目录下面即可,redis启动时会自动 将rdb文件里的内容加载到内存中
AOF持久化
简介
-
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文 件中的命令达到恢复数据的目的
-
AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式
优点
-
AOF 持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis 最 多也就丢失 1 秒的数据而已
-
AOF 文件使用 Redis 命令追加的形式来构造,因此,即使 Redis 只能向 AOF 文件写入命令的 片断,使用 redis-check-aof 工具也很容易修正 AOF 文件
-
AOF 文件的格式可读性较强,这也为使用者提供了更灵活的处理方式。例如,如果我们不小 心错用了 FLUSHALL 命令,在重写还没进行时,我们可以手工将最后的 FLUSHALL 命令去 掉,然后再使用 AOF 来恢 复数据
缺点
-
对于具有相同数据的的 Redis,AOF 文件通常会比 RDB 文件体积更大
-
虽然 AOF 提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。但 在 Redis 的负载 较高时,RDB 比 AOF 具好更好的性能保证
-
RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,因此从 理论上说,RDB 比 AOF 方式更健壮。官方文档也指出,AOF 的确也存在一 些 BUG,这些 BUG 在 RDB 没有 存在
使用AOF
-
开启AOF功能需要设置配置:appendonly yes,默认不开启。AOF文件名 通过appendfilename配 置设置,默认文件名是appendonly.aof。保存路径同 RDB持久化方式一致,通过dir配置指定
appendonly yes # 将配置文件中appendonly字段设置为yes即可
工作流程
-
所有的写入命令会追加到aof_buf(缓冲区)中
-
AOF缓冲区根据对应的策略向硬盘做同步操作
-
随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩 的目的
-
当Redis服务器重启时,可以加载AOF文件进行数据恢复
架构--主从复制
简介
-
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到 其他机器,满足故障恢复和 负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis副本。 复制功能是高可用Redis 的基础,后面章节的哨兵和集群都是在复制的基础上实现高可用的
优点
-
满足故障和负载均衡等需求
缺点
-
若主节点出现问题,则不能提供服务,需要人工修改配置将从变主,无法实现高可用
-
主从复制主节点的写能力有限
-
单机节点的存储能力有限
数据同步方式
全量同步
-
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。 步骤如下:
-
从服务器连接主服务器,发送SYNC命令;
-
主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执 行的所有写命令;
-
主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的 写命令;
-
从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
-
主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
-
从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
-
增量同步
-
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
-
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接 收并执行收到的 写命令。
同步策略
-
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可 以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成 功,要求从机进行全量同步
架构-哨兵
简介
-
Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人 工将从节点晋升为主节点, 同时还要通知应用方更新主节点地址,对于很多 应用场景这种故障处理的方式是无法接受的
-
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂
工作原理
-
每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着, 如果发现对方在 指定时间( down-after-milliseconds项 )内未回应,则暂时认为对方已挂(主观宕机:sdown),若“哨兵群”中的多数 sentinel,都报告某一master没响应,系统才认为该master”彻底死 亡”(即:客观上的真正down机:odown),通过一定的 vote算法,从剩下的slave节点中,选一台提升为 master,然后自动修改相关配置。
架构--集群
简介
-
redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储 相同的数据,很 浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也 就是说每台redis节点上存储不同的内容
优点
-
将Redis的写操作分摊到了多个节点上,提高写的并发能力,扩容简单
缺点
-
每个Node承担着互相监听、高并发数据写入、高并发数据读出,工作任务繁重
工作原理
-
对象保存到Redis之前先经过CRC16哈希到一个指定的Node上。
-
每个Node被平均分配了一个Slot段,对应着0-16384,Slot不能重复也不能缺失,否则会导致对象 重复存储或无法 存储。
-
Node之间也互相监听,一旦有Node退出或者加入,会按照Slot为单位做数据的迁移。例如Node1 如果掉线了,0- 5640这些Slot将会平均分摊到Node2和Node3上,由于Node2和Node3本身维护的 Slot还会在自己身上不会被重新 分配,所以迁移过程中不会影响到5641-16384Slot段的使用。
day15
思科命令简介
Cisco设备主要有如下三种模式
'>' 用户模式,在这个模式下只能进行有限的查看与测试,不能修改和重启设备
'#' 特权模式,这这个模式下能进行完整的查看与测试,并且允许恢复出厂设置与 重启
'(xxx)'# 各种配置模式,在()中的内容就是提示你当前在什么模块下,下面列出常 见子配置模式
'R1(config)#' 全局配置模式,可以配置设备的属性,比如设备名称之类的,并且 只有全局配置模式才可以 进入到其他的子配置模式
'R1(config-if)#' 接配置模式,可以配置这个接口的属性,比如接IP地址,接口状 态等等
'R1(dhcp-config)#' DHCP配置模式,可以修改这个DHCP池的属性
静态路由
特点
-
需要通过手工的方式进行添加及维护
-
适用于组网规模较小的场景,如果网络规模较大,则配置及维护的成本就会很高
-
无法根据拓扑的变化进行动态的响应(各厂商开发了扩展特性,以便弥补静态路由在这点上的 不足)
-
在大型的网络中,往往采用动、静态路由结合的方式进行部署
环回接口
-
lookback接口,也叫环回口,是一个逻辑的、虚拟的接口
-
使用全局配置命令interface loopback 加上接口编号可创建一个Loopback接口,创建完成后即可 为接口配置IP地址
-
Loopback接口在手工创建后,除非人为shutdown,否则不会DOWN掉
-
Loopback接口常用于
-
模拟路由器的直连网段,可用于测试
-
可用于设备管理(Loopback接口比较稳定)
-
供其他协议使用,例如OSPF、BGP、MPLS等
-
SNMPTraps消息的源地址
缺省路由(默认路由)
ip route 0.0.0.0 0.0.0.0 [IP|INT] # 出接口的地址
DHCP 原理
DHCP:动态主机设置协议(Dynamic Host Configuration Protocol)是一个局域网的网络协议,使用 UDP协议 工作,主要有两个用途:用于内部网或网络服务供应商自动分配IP地址;给用户用于内部网管 理员作为对所有计算 机作中央管理的手段
优点
-
减少管理员的工作量
-
避免IP冲突
-
提高IP地址的利用率
-
移动计算机后不用重新配置网络信息,能够方便更改错误的可能性
-
DHCP用于给设备自动分配IP地址,我们几乎天天用到
DHCP相关概念
-
DHCP客户端:获取网络配置参数
-
DHCP服务端:提供网络配置参数(IP地址,默认网关,租约相关信息等)
-
DHCP服务端:提供网络配置参数(IP地址,默认网关,租约相关信息等)
-
作用域:一个网络中的所有可分配IP地址的连续范围,主要用来定义物理子网的单一IP地址范围, 例如192.168.0.0-192.168.255.255
-
超级作用域:一组作用域的集合,实现一个物理子网中多个逻辑IP地址。
-
排除范围:排除作用域内有限的IP地址序列(不使用DHCP服务)192.168.0.100-192.168.0.200
-
地址池:定义作用域+排除范围后,剩余的地址将形成可用地址池
-
保留:DHCP服务器提供永久地址租约,确保客户端始终使用相同的IP地址
-
租用:客户从服务器上获得并临时占用某IP地址的过程
-
租约:
-
获得的IP地址的使用时间 获得IP地址时租约被激活并更新其地址租约;当租约到期或者被删除时租约停止
-
DHCP运行过程
DHCP客户端在局域网中发起一个DHCPDiscover包,主要用于发现DHCP服务器
DHCP服务端接收到Discover包,回应客端Offer包,用于告诉“我”能提供IP地址
客户端接收到Offer包后,发送Request请求IP地址
服务端发送Ack包,确认信息
DHCP 续租
DHCP租约更新
-
自动更新租约
-
当约期 >= 50% ,自动尝试更新租约
当约期 >= 87.5%,发出广播再次更新租约
当约期 >= 100%,客户机停止使用当前IP地址,只能重新DHCP租约的过程
-
-
手动更新租约
-
Windows:ipconfig /renew 和 /release
Linux:dhclient -r
-
总结
-
客户端会在租约时间过去 的时候以单播方式请求续租
-
在租约时间过去 的时候以广播的方式请求续租
-
在租约时间过去100%的时候,以广播方式重新发现局域网中的DHCP服务器
DNS域名系统
-
一个组织的系统管理机构,维护系统内的每个主机的 IP和主机名 的对应关系
-
如果新计算机接入网络,将这个信息注册到 数据库 中
-
用户输入域名的时候,会自动查询 DNS 服务器,由 DNS服务器 检索数据库, 得到对应的IP地址
域名
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。 例如:http://www.baidu.com(域名使用.连接)
-
. : 根域名
-
com : 一级域名,表示这是一个企业域名。同级的还有 "net"(网络提供商),"org"(非盈利组织) 等
-
baidu : 二级域名, 公司名
-
www : 只是一种习惯用法,并不是每个域名都支持
-
http:// : 要使用什么协议来连接这个主机名
域名解析的过程
1. 浏览器缓存
2. 系统缓存,查找hosts文件
3. 路由器缓存————————以上三步均为DNS客户端的缓存!!
4. ISP DNS缓存
5. 根域名服务器
6. 顶级域名服务器
7. 主机名服务器
8. 保存结果至缓存
DNS查询类型
本地解析:过以前查询获得的缓存信息就地应答查询
递归查询:DNS服务器代表请求客户机联系其他DNS服务器,以完全解析,返回给客户机
迭代查询:客户机自己不断请求DNS服务来解析名称,典型的DNS服务器之间的交互
当你在浏览器中输入URL后会发生什么
-
浏览器发起域名解析,首先查询浏览器缓存,如果没有,就查询hosts文件,如果没有就提出域名 解析请求
-
客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
-
当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接 把查询的结果返回。
-
如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务 器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
-
本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没 有该纪录,则返回相关的下级的域名服务器的地址。
-
重复第四步,直到找到正确的纪录。
-
本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机
域名解析记录
A:记录地址,返回的域名所指向IP地址
NS:域名服务器,返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址
MX:邮箱记录,返回接收电子邮箱的服务器地址
CNAME:规范名称记录,返回另一个域名,即当前查询的域名是另一个域名的跳转
PTR:逆查域名,只用于IP地址查询域名
dig -x
dig [a ns mx ] 查询指定的记录类型
扩展:
TXT:用来做SPF(反垃圾邮箱)
AAAA:用来指定主机名(或域名)对应的IPv6记录。
SRV:记录哪台计算机提供哪个服务。格式:服务
名字、点、协议的类型。
显性URL:从一个地址301重定向另一个地址的时候。 隐性URL:类似显性URL、区别在于隐形URL不会改变地址中的域名。
数据通信基础
ISO组织定义的OSI七层网络模型
物理层
-
不管通过什么样的介质,将信息的二进制能够传递到另外一个节点,这个过程就是物理层
-
物理层定义了一系列传输介质的电气标准,这个是弱电工程师关心的
数据链路层
-
封装成帧、差别检错、透明传输
-
将物理层传递过来的二进制的信号内容进行翻译,翻译的结果被称为数据帧
-
以太网传递的最终形式是二进制,以太网卡都会内置处理芯片,用来处理最初的112个二进制
-
前48位是目的地MAC地址(媒体访问控制,相当于网卡的身份证号码)
-
之后的48位是发送者的MAC地址
-
再之后的16位,表示数据包的类型
-
-
物理层被认为是不可靠的,有可能接触不良,有可能是电测干扰,有可能闪电风暴。。。
-
数据链路层通过CRC循环冗余校验生成校验码,放在数据包最后的FCS,用来保证数据正确, 如果错误则丢弃
网络层
-
路由,寻址功能
-
当计算机从网卡后获得后续数据是ipv4之后,就以ipv4的格式去理解后续的内容
-
需要注意的关键内容如下
-
protocol
-
17:UDP
-
6:TCP
-
-
源与目的ip地址
-
mac地址比作为身份证号,那么ip地址就是当前你所处的位置,快递小哥通过你的位置 找到你,通过你的身份证确认你
-
-
传输层
-
端对端的连接
-
当计算机现在已经确定这个数据就是给我的之后,就需要判断这个数据是什么业务
-
需要注意的关键内容
-
源目的端口号
-
范围是1-65535
-
默认情况下,所有端口都是关闭的,当有程序需要网络通信的时候,就会选择一个端口 号占用
-
正常情况下,电脑上大多数软件端口号是随机的,因为不需要被访问,只需要回复
-
有些服务是需要被访问的,所以这些访问需要占据固定的众所周知的端口号
-
-
在电脑上的c:\windows\system32\dreivers\etc\service文件中保存着windows主
动访问其他主机时候默认使用的端口号
http 80/tcp
ftp 20/tcp 21/tcp
mstsc 3389/tcp 3389udp
dns 54/tcp 53/udp
telnet 23/tcp
ssh 22/tcp
-
在cmd中输入netstat -ano可以查看ip地址、端口号、进程号对应的关系
应用层
-
产生用户数据,为用户提供用户交互的接口
IP地址
-
IP地址是32位二进制,类似手机号码有归属地和号码字段,归属地字段一样,说明在同一个运营商 同一个封你为
-
为了让人类能够记住,不眼花,使用点分十进制
-
ip地址网络位
-
IP地址网络位表示一样是同一个局域网的
-
局域网是多台设备组成,可以直接不受控制的访问
-
正常情况下,一家公司为了安全、财务、研发、it、业务等部门之间相互隔离或者受控
-
-
ip地址主机位
-
在网络位相同的情况下(也就是一个局域网),主机位不能重复
-
主机位是为了帮助局域网内的设备相互之间进行更高层的通信封装使用
-
-
网络类型
-
A:1.0.0.0~126.255.255.255/8
-
127开头的作为本地的测试地址
-
A类地址的局域网可以存在2^24-2个主机
-
-
B:128.0.0.0~191.255.255.255/16
-
B类地址的局域网可以存在2^16-2个主机
-
-
C:192.0.0.0~223.255.255.255/24
-
C类地址的局域网可以存在2^8-2个主机
-
-
D组播没有网络位概念
-
E用不到
-
使用子网掩码来区分网络位和主机位,因为有类的方式使用ip地址空间太土豪
-
子网掩码可以让ip地址自由的划分网络位数,子网掩码也是32位二进制,所以可以和IP地址进 行一一对应,规定子网掩码为1,那么所对应的IP地址就是属于网络位
-
私有IP地址
-
如果要取得互联网合法地址用于通信,必须要找iana.org组织分配
-
很多企业内部都有大量的网络设备,大多数时候这些设备只需要内部通信即可
-
企业的网络管理员可以从如下网段中自行分配地址
-
私有IP地址空间中的地址不需要申请,随意使用,但是不能在互联网上与合法地址通信(因为对方没 法回复你这个地址,因为世界上私有IP地址段无数个重复的,怎么知道回到谁那里呢)
-
而我们明明用的私有IP地址,也可以上网,因为我们需要先把自己的上网请求提交给网络中的网关 (就是你家的出口路由器),再由网关代替我们去获取内容转交给我们的电脑手机,而网关往往能从 运营商那里得到一个合法的公有IP地址
子网掩码
-
网络掩码与IP地址搭配使用,用于描述一个IP地址中的网络部分及主机部分
-
网络掩码32bits,与32bits的IP地址一一对应,掩码中为1的位对应IP地址中的网络位,掩码中为0 的位对应IP地址中的主机位
-
减少一个局域网中的设备数量可以有效降低广播报文消耗资源
-
可变长子网掩码可以将一个局域网中的主机地址分配的更加小
TCP/UDP
-
tcp全称传输控制协议,传输层用来保障数据的可靠传输,并且携带基本的端口号
-
可靠的协议,可以知道数据丢失和差错的信息
-
-
udp全称用户数据报文协议,只携带了基本的端口号
-
尽力而为的协议,无法获知数据的接受情况
-
详情可点击此连接查看http://jimmyf.cn:8888/archives/mian-shi-ti-zheng-li
数据封装
-
数据从产生到传递到目的地的过程中会经历好几个过程,每个过程都负责加工自己这部分的内容, 类似于工厂流水线
-
目前我们只需要有个最基本的概念:
-
IP地址是用来标识网络中位置的,比如你在江苏省xxx市xxx路xxx号
-
MAC地址是每个网络设备的唯一ID,比如你的身份证号码
-
如果想要发送数据,必须(暂且认为必须)同时拥有IP和MAC地址
-
Linux的网络管理基础部分就是需要大家掌握IP地址的配置
-
数据报文
IP网络通信类型
-
单播(Unicast) 、广播(Broadcast)、 组播(Multicast)
day16
NAT(Network Address Translation)
-
当今的互联网是由一个个小的自治系统组成,一个家庭,一个企业就是一个小的自治系统
-
自治系统内部有着众多的设备需要IP地址联网,每个地址都需要去IANA申请明显做不到,所以就会 使用私有IP地址进行分配
-
私有IP地址无法做到互联网通信,在内网之中就需要一个默认网关来代替大家请求互联网数据
-
NAT网络地址转换技术能够将数据包中的IP地址进行转换
NAT优缺点
优点 | 缺点 |
---|---|
节省IP地址空间 | 增加转发延迟 |
解决IP地址重叠问题 | 丧失端到端的寻址能力 |
增加网络的连入Internet的弹性 | 某些应用不支持NAT |
网络变更的时候减少IP重编址带来的麻烦 | 需要一定的内存空间支持动态存储NAT表项 |
对外隐藏内部地址,增加网络安全性 | 需要耗费一定CPU内存资源进行NAT操作 |
NAT术语
术语 | 英文 | 解释 |
---|---|---|
内部本地 | inside local | 转换之前源地址 |
外部本地 | outside local | 转换之前目的地址 |
内部全局 | inside global | 转换之后源地址 |
外部全局 | outside global | 转换之后目的地址 |
-
inside 表示源地址, outside 表示目的地址
-
local 表示转换之前, global 表示转换之后
静态NAT
-
一对一映射,为每个内部的地址指定一个公网IP地址
-
这种方法主要用在内网中存在需要对公网提供服务的服务器的场景,类似的例子有WEB服务器、邮 件服务器、FTP服务器等
PAT(端口地址转换)
-
正常情况下我们家用宽带,或者仅仅只是有上网需求的情况下,没必要为每个设备都申请一个公网 IP(也做不到)
-
在数据通信的时候只是需要一个端口号用于接收和发送数据即可,而一个IP地址可以有65535个端 口号,所以将端口号轮流着分配给内网设备即可
端口映射
-
NAT会导致只能内网主动访问外网,而互联网没法主动访问内部网络,这样虽然保护了内部网络, 但是却丢失了端到端通信的过程
-
端口映射可以将公网IP地址的端口对应到内网某个IP的端口号,从而让内网的设备也可以对外发布 服务
-
端口映射可以让内网多个IP地址共用一个公网IP,可以节约很多成本
负载均衡
-
NAT也支持对公网IP地址的请求,分发给内部的设备来进行处理
动态路由协议
-
通过在路由器上运行动态路由协议,使得路由器之间能够交互“用于路由计算的信息”,从而路由器 动态的“学习”到网络中的路由
管理距离
-
不同的路由协议会有不同的管理距离
-
值越小的管理距离优先级越高
-
当路由器从不同的协议里学习到相同的路由的时候,优先选择优先级高的路由
-
常见的管理距离
静态路由
特点
-
需要通过手工的方式进行添加及维护;
-
适用于组网规模较小的场景,如果网络规模较大,则配置及维护的成本就会很高;
-
无法根据拓扑的变化进行动态的响应(各厂商开发了扩展特性,以便弥补静态路由在这点上的不 足);
-
在大型的网络中,往往采用动、静态路由结合的方式进行部署。
-
配置方式
R1(config)# ip route network-address subnet-mask {ip-add | exit-interface}
环回接口
-
Loopback接口,也叫环回口,是一个逻辑的、虚拟的接口;
-
使用全局配置命令interface loopback 加上接口编号可创建一个Loopback接口,创建完成后即可 为接口配置IP地址;
-
Loopback接口在手工创建后,除非人为shutdown,否则不会DOWN掉; Loopback接口常用于:
-
模拟路由器的直连网段,可用于测试;
-
可用于设备管理(Loopback接口比较稳定);
-
供其他协议使用,例如OSPF、BGP、MPLS等;
-
SNMPTraps消息的源地址;
-
其他用途(Loopback接口的用途十分广泛)。
缺省路由(默认路由)
ip route 0.0.0.0 0.0.0.0 [IP|INT] # 出接口的地址
动态路由协议,RIP
-
RIP是应用及开发较早的路由协议,是典型的距离矢量路由协议
-
适用于小型网络,最大跳数15跳(16跳视为不可达)
-
RIP是基于UDP的,使用端口号520
-
在CISCO IOS平台上的管理距离为120
距离矢量路由协议
-
使用距离矢量路由协议的路由器并不了解网络的拓扑。该路由器只知道:
-
自身与目的网络之间的距离
-
应该往哪个方向或使用哪个接口转发数据包
-
路由器收敛完成
-
当所有路由表包含相同网络可达性信息
-
网络(路由)进入一个稳态
-
路由器继续交换路由信息
-
当无新路由信息被更新时收敛结束
-
网络在达到收敛前无法完全正常工作
RIP解决环路问题的机制
定义最大跳数
-
定义当跳数达到16时认为不可达
水平分割
-
从某个接口学习到的路由,不会再从这个接口更新出去
毒性路由
-
当路由器感知到某个网段发生故障,可以立即泛洪该网段的路由(将其跳数设置为16跳,也 就是不可达),以此来快速刷新网络中其他路由器的路由表。
毒性逆转
-
抑制计时器
触发更新
-
拓扑发生变更时,路由器立即发送更新消息,而不等更新计时器超时
-
OSPF(Open Shortest Path First,开放最短路径优先)是一种链路状态路由协议,无路由循环 (全局拓扑),属于IGP。RFC 2328,“开放”意味着非私有的,对公众开放的。
-
OSPF的报文封装
-
OSPF协议包直接封装于IP,协议号89。 OSPF协议使用的组播地址
-
所有OSPF路由器——224.0.0.5;DR BDR——224.0.0.6
-
OSPF路由协议的管理距离:110
路由重发步概念
-
是可以将不同的自治系统他们之间的路由信息j进行交换
-
从一种协议到另外一种协议
-
同一种协议的不同实例
-
路由重发是针对外部的,自身的路由器不会有变化
day20
通配符
通配符是shell在做PathnameExpansion时用到的。说白了一般只用于文件名匹配,它是由shell解析 的,比如 find,ls,cp,mv等 shell常见通配符
*:匹配0或多个字符
?:匹配任意一个字符
[list]:匹配list中任意单个字符
[c1-c2]:匹配c1-c2中任意单个字符
[^c1-c2]/[!c1-c2]:不匹配c1-c2中任意字符
{string1,string2,...}:匹配{}中任意单个字符串
-
shell元字符
IFS:<tab>/<space>/<enter>
CR:<enter>
=:设定变量
$:取变量值
>/< :重定向
|:管道
&:后台执行命令
():在子shell中执行命令/运算或命令替换
{}:函数中执行/变量替换的界定范围
;:命令结束后,忽略其返回值,继续执行下一个命令
&&:命令结束后,若为true,继续执行下一个命令
||:命令结束后,若为false,继续执行下一个命令
!:非
#:注释
\:转义符
-
shell转义符
'':硬转义,内部所有shell元字符,通配符都会被关掉
"":软转移,内部
find文件查找
-
实时查找工具,通过遍历指定路径下的文件系统完成文件查找
-
工作特点
-
查找速度略慢
-
精确查找
-
实时查找
-
可以满足多种条件匹配
-
find [选项] [路径] [查找条件 + 处理动作]
查找路径:指定具体目录路径,默认是当前文件夹
查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
处理动作:对符合条件的文件做什么操作,默认输出屏幕
查找条件
-
查找条件
根据文件名查找:
-name "filename" 支持global
-iname "filename" 忽略大小写
-regex "PATTERN" 以Pattern匹配整个文件路径字符串,而不仅仅是文件名称
根据属主和属组查找:
-user USERNAME:查找属主为指定用户的文件
-group GROUPNAME:查找属组为指定属组的文件
-uid UserID:查找属主为指定的ID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type Type:
f/d/l/s/b/c/p
根据文件大小来查找:
-size [+|-]N[bcwkMG]
根据时间戳:
天:
-atime [+|-]N
-mtime
-ctime
分钟:
-amin N
-cmin N
-mmin N
根据权限查找:
-perm [+|-]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可
-MODE:每一类对象都必须同时拥有为其指定的权限标准
组合条件:
与:-a
或:-o
非:-not
相关案例:找出/tmp目录下,属主不是root,且文件名不是fstab的文件:
find /tmp \( -not -user root -a -not -name 'fstab'\) -ls
处理动作
-print:默认的处理动作,显示至屏幕
-ls:类型于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {}\:对查找到的每个文件执行由COMMAND指定的命令
对于每个文件执行命令之前,都会交换式要求用户确认
-exec COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令
[root@server1 ~]# find /etc/init.d/ -perm -111 -exec cp -r {} dir1/ \;
{}:用于引用查找到的文件名称自身
注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命
令;另一种方式可规避此问题
find | xargs COMMAND
相关联系及其答案
-
问题
find练习题(
1.查找 /tmp 目录下名字为 aming开头的所有文件。
2.查找指定 inode 的文件或目录
3.找出 tmp 目录下的所有一级子目录
4.在root目录下及其最大两层深度的子目录中,查找 passwd 文件
5.在第二层和第四层子目录之间查找 passwd 文件
6.搜索tmp目录下所属组group1,所属主user1的文件
7.搜索根目录下的 1.txt 2.txt 和 a 目录
8.搜索tmp目录下以 a 开头并且以 c 结尾的文件
9.搜索 tmp 目录下,不是以 a 开头,并且大小超过100M的文件
10.搜索 tmp 目录下,修改时间一年内的文件
11.搜索目录下,修改时间一年内,不是文件的其他类型
12.搜索目录下,修改时间超过一年的并且大于100M的文件
-
答案
1 find /tmp/ -name aming*
2 find / -inum 141418
3 find /tmp/ -maxdepth 1 -a -type d
4 find /root -maxdepth 2 -a -name "passwd*" -a -type f
5 find /root -mindepth 2 -maxdepth 4 -a -name "passwd*" -a -type f
6 find /tmp -group group1 -a -user user1 -a -type f
7 find / -name "[1-2].txt" -type f find / -name "a" -type d
8 find /tmp -name a*c -type f
9 find /tmp -not -name a* -a -size +100M
10 find /tmp -mtime -365 -type f
11 find / -mtime -365 -not -type f
12 find / -mtime +365 -size +100M -type f
正则表达式
正则表达式是用来匹配字符串的,针对文件内容的文本过滤工具里,大都用到正则表达式,如vi,grep,awk,swd等
##字符匹配
.:匹配任意单个字符
[]:匹配指定范围内任意单个字符
[^]:匹配指定范围外任意单个字符
[:alnum:]:字母与数字字符
[:alpha:]:字母
[:blank:]:空格或制表符
[:digit:]:数字
[:graph:]:非控制、非空格字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号字符
[:space:]:空白字符,包括垂直制表符
[:upper:]:大写字母
[:xdigit:]:十六进制数字
##匹配次数
*:匹配前面的字符任意次数
.*:匹配任意长度的字符
\?:匹配其前面字符0或1次,即前面的可有可无
\+:匹配其前面的字符至少1次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{0,n\}:匹配前面的字符至多n次
\{m,\}:匹配前面的字符至少m次
##位置锚定
^:行首锚定,用于模式的最左侧
$:行末锚定,用于模式的最右侧
^PATTERN$:用于模式匹配整行;
^$:空行
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配整个单词
##分组
\(\):将一个或多个字符捆绑在一起;当作一个字符
\(xy\)*ab
Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命令
方式为:
\1,\2,\3……
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1:ab\+\(xy\)*
\2:xy
-
扩展正则表达式
##字符匹配
.
[]
[^]
##次数匹配
*
?:0次或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m次,至多n次
##位置锚定
##分组
()
##或者
a|b
C | cat :C或cat
(C|c)at : C或c
Linux三剑客之grep
grep作用:过滤文本内容
选项 | 描述 |
---|---|
-E :--extended--regexp | 模式是扩展正则表达式(ERE) |
-i :--ignore--case | 忽略大小写 |
-n: --line--number | 打印行号 |
-o:--only--matching | 只打印匹配的内容 |
-c:--count | 只打印每个文件匹配的行数 |
-B:--before--context=NUM | 打印匹配的前几行 |
-A:--after--context=NUM | 打印匹配的后几行 |
-C:--context=NUM | 打印匹配的前后几行 |
--color[=WHEN] | 匹配的字体颜色,别名已定义了 |
-v:--invert--match | 打印不匹配的行 |
-e | 多点操作eg:grep -e "^s" -e "s$" |
正则表达式(基于grep)
-
功能就是用来检索、替换那些符合某个模式(规则)的文本,正则表达式在每种语言中都会有;
-
正则表达式就是为了处理大量的文本或字符串而定义的一套规则和方法
-
通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串
-
Linux正则表达式一般为行为单位处理
基础正则表达式
符号 | 描述 |
---|---|
. | 匹配任意单个字符(必须存在) |
^ | 匹配以某个字符开头的行 |
$ | 配以什么字符结尾的行 |
* | 匹配前面的一个字符出现0次或者多次;eg:a*b |
.* | 表示任意长度的任意字符 |
[] | 表示匹配括号内的一个字符 |
[^] | 匹配字符之外的任意一个字符 |
[] | 匹配非字符内字符开头的行 |
< | 锚定 单词首部;eg: |
> | 锚定 单词尾部:eg:root> |
{m,n} | 表示匹配前面的字符出现至少m次,至多n次 |
() | 表示对某个单词进行分组;\1表示第一个分组进行调用 |
扩展正则
-
egrep ...
-
grep -E ...
-
扩展正则支持所有基础正则;并有补充
-
扩展正则中{}和[]不用转义可以直接使用;
符号 | 描述 |
---|---|
+ | 表示前面的字符至少出现1次的情况 |
¦ | 表示“或” |
? | 表示前面的字符至多出现1次的情况 |
相关练习及其答案
-
问题
grep练习题
假设已经准备好regular_express.txt:
1 过滤下载文件中包含 the 关键字
2 过滤下载文件中不包含 the 关键字
3 过滤下载文件中不论大小写 the 关键字
4 过滤 test 或 taste 这两个单词
5 过滤有 oo 的字节
6 过滤不想要 oo 前面有 g 的
7 过滤 oo 前面不想有小写字母
8 过滤有数字的那一行
9 过滤以 the 开头的
10 过滤 g 后面接 2 到 5 个 o,然后在接一个 g 的字串
11 过滤 g 后面接 2 个以上 o 的
-
答案
1 grep 'the' regular_express.txt
2 grep -v 'the' regular_express.txt
3 grep -i 'the' regular_express.txt
4 grep -e "test" -e "taste" regular_express.txt
5 grep 'oo' regular_express.txt
6 grep "[^g]oo" regular_express.txt
7 grep '[A-Z]\+oo' regular_express.txt
8 grep '[[:digit:]]' regular_express.txt
9 grep '^the*' regular_express.txt
10 grep 'go\{2,5\}g' regular_express.txt
11 grep 'go\{2,\}' regular_express.txt
Linux三剑客之sed
Linux sed命令是利用script来处理文本文件
sed可依照script的指令,来处理、编辑文本文件
sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等;
语法
sed的命令格式: sed [option] 'sed command' filename
sed的脚本格式:sed [option] -f 'sed script' filename
常用选项:
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展表达式
-i :直接修改文件内容
查询文本的方式
使用行号和行号范围
x:行号
x,y:从x行到y行
x,y!:x行到y行之外
/pattern:查询包含模式的行
/pattern/, /pattern/:查询包含两个模式的行
/pattern/,x:x行内查询包含模式的行
x,/pattern/:x行后查询匹配模式的行
动作说明
常用选项:
p:打印匹配的行(-n)
=:显示文件行号
a\:指定行号后添加新文本
i\:指定行号前添加新文本
d:删除定位行
c\:用新文本替换定位文本
w filename:写文本到一个文件
r filename:从另一个文件读文本
s///:替换
替换标记:
g:行内全局替换
p:显示替换成功的行
w:将替换成功的结果保存至指定文件
q:第一个模式匹配后立即退出
{}:在定位行执行的命令组,用逗号分隔
g:将模式2粘贴到/pattern n/
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法! 例如 1,20s/old/new/g 就是啦!
相关练习和答案
-
问题
sed练习题
准备文本内容
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400
Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900
Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln , NB 92743:7/25/53:85100
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900
Lori Gortz:327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Paco Gutierrez:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
Ephram Hardy:293-259-5395:235 CarltonLane, Joliet, IL 73858:8/12/20:56700
James Ikeda:834-938-8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000
Barbara Kertz:385-573-8326:832 Ponce Drive, Gzary, IN 83756:12/1/46:268500
Lesley Kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Sir Lancelot:837-835-8257:474 Camelot Boulevard, Bath, WY 28356:5/13/69:24500
Jesse Neal:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Zippy Pinhead:834-823-8319:2356 Bizarro Ave., Farmount, IL 84357:1/1/67:89500
Arthur Putie:923-835-8745:23 Wimp Lane, Kensington, DL 38758:8/31/69:126000
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:3/19/35:22350
Jose Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600
Tommy Savage:408-724-0140:1222 Oxbow Court, Sunnyvale, CA 94087:5/19/66:34200
Yukio Takeshida:387-827-1095:13 Uno Lane, Ashville, NC 23556:7/1/29:57000
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900
1.把Jon的名字改为Jonathan
2.删除头3行
3.打印第5~10行
4. 删除含有Lane的所有行
5. 打印所有生日在十一月或十二月的行
6. 在以Kare开头的行末尾加上3颗星
7. 将所有包含Jose的行都替换为JOSE HAS RETIRED
8. 删除所有空行
-
答案
1 grep 'Jon' test1 | sed 's/Jon/Jonathan/g'
2 nl test1 | sed '1,3d'
3 nl test1 | sed -n '5,10p'
4 nl test1 | grep 'Lane' | sed '/Lane/d'
5 sed -n '/:[11][12]\//p' test.txt
6 略
7 sed 's/Jose/JOSE HAS RETIRED/g' test1
8 sed '/^$/d' test1
Linux三剑客之awk
使用方法
awk '{pattern + action}' {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花 括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是 要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进 行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文 本。
awk运算符
运算符 | 描述 |
---|---|
赋值运算符 | |
= += -= *= /= %= ^= **= | 赋值语句 |
逻辑运算符 | |
¦¦ | 逻辑或 |
&& | 逻辑与 |
正则运算符 | |
~ !~ | 匹配正则表达式和不匹配正则表达式 |
关系运算符 | |
< <= > >= != == | 关系运算符 |
算数运算符 | |
+ - | 加,减 |
* / & | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
其他运算符 | |
$ | 字段引用 |
空格 | 字符串链接符 |
?: | 三目运算符 |
ln | 数组中是否存在某键值 |
常用 awk 内置变量
变量名 | 属性 |
---|---|
$0 | 当前记录 |
1 n | 当前记录的第n个字段 |
FS | 输入字段分割符 默认是空格 |
RS | 输入记录分割符 默认为换行符 |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFS | 输出字段分割符 默认也是空格 |
ORS | 输出的记录分割符 默认为换行符 |
相关练习及其答案
-
问题
awk练习题
1. 判断服务器上所有用户类型
2,显示出包含Lee和包含kevin的行
Allen Phillips
Green Lee
William Aiden James Lee
Angel Jack
Tyler Kevin
Lucas Thomas
Kevin
3.统计/etc/fstab文件中每个文件系统类型出现的次数
4.计算男生女生的总成绩,平均成绩
[root@centos7 ~]# cat 1.txt
mage 100 male
wang 90 male
zhang 80 female
li 100 female
5.有⼀⽂件记录了1-100000之间的随机的整数共5000个,存储的格式, 100,50,35,89,。。。请取出其中最⼤和最⼩的整数?
#生成五千个随机数
root@qqq:~# for i in $(seq 5000);do shuf -i 1-100000 -n1 >> 1.txt;done
#取最大和最小
-
答案
1 awk -F: '{print $1}' /etc/passwd
2 awk '/(Lee)|(Kevin)/{print$0}' test2
3 awk '/xfs|swap/{print $3}' /etc/fstab | awk 'BEGIN{xfs=0;swap=0;}/xfs/{xfs++}/swap/{swap++}END{print "xfs出现次数:"xfs;print"swap出现次数:"swap}'
4 awk 'BEGIN{male_score;female_score;male_average;female_average}/( male)/{male_score+=$2}/(female)/{female_score+=$2}END{print "男生总成绩:"male_score;print "女生总成绩:"female_score;male_average=male_score/2;print "男生平均成绩:"male_average;female_average=female_score/2;print "女生平均成绩:"female_average}' test3
-
答案二
1 awk -F: '{if($3==0)print "超级管理员:" $1}{if($3<1000 && $3>0)print "系统用户:" $1}{if($3>=1000) print "普通用户:"$1}' /etc/passwd
2 awk '/Lee|Kevin/{print $0}' test1
3 awk '/^[^#]/{fs[$3]++} END{for(i in fs) {print i,fs[i]}}' /etc/fstab
4 awk 'BEGIN{man_nums=0;women_nums=0;man_grade=0;women_grade=0} {if($3=="male") {man_nums++;man_grade+=$2}} {if($3=="female") {woman_nums++;woman_grade+=$2}} END{print "男生总成绩\t"man_grade,"\n女生总成绩\t"woman_grade, "\n男生平均成绩\t"man_grade/man_nums, "\n女生平均成绩\t"woman_grade/woman_nums}' test2
5 awk 'BEGIN{min=100000;max=0} {if($1>max) max=$1} {if ($1<min) min=$1} END{print max,min}' 1.txt
day21
shell脚本编程
简介
-
shell是一个用c语言编写的程序,它是用户使用Linux的桥梁。shell既是一种命令语言,又是一种程序设计语言
-
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的 服务
变量
变量命名
-
命名只能使用英文字母,数字和下划线,首字母不能以数字开头
-
中间不能够有特殊字符,可以使用_下划线
-
不能使用标点符号
-
不能使用bash中的关键字
只读变量
删除变量
变量种类
-
本地变量:生效范围仅为当前shell进程;(其他shell,当前的子sehll进程均无效)
-
变量赋值:name = “value”
-
-
环境变量:生效范围为当前shell进程及子进程
-
变量声明1:export name = “value”
-
变量声明2:declare -x name = “value”
-
bash中有许多内建的变量环境:SHELL,PATH等等
-
-
局部变量:生效范围为当前shell进程中某代码片断(通常指函数)
-
位置变量: 2…来表示,让脚本在脚本代码中调用通过命令行传递给它的参数;
-
特殊变量:? 0 * @ #
$1,$2,…:对应调用第1,第2等参数
$0:命令本身
$*:传递给脚本的所有参数(把所有参数当作整体)
$@:传递给脚本的所有参数
$#:传递给脚本的参数的个数
案例1:
myecho.sh
算数运算
-
运算符
+ - * / % ** ...
增强赋值:
+=,-=,*=,/=,%=
乘法符号有些场景中需要转义 : *\
bash有内建随机数生成器:$RANDOM
-
完成算数运算
(1) let var(变量名)=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr argl arg2 arg3 …)
测试
数值测试
-
‐gt:是否大于
-
‐ge:是否大于等于
-
‐eq:是否等于
-
‐ne:是否不等于
-
‐lt:是否小于
-
‐le:是否小于等于
字符串测试
==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串是否能够被右侧的PATTERN所匹配
Note:此表达式一般用于[[ ]]中
-z “STRING”:测试字符串是否为空,空则为真,不空则为假
-n “STRING”:测试字符串是否不空,不空则为真,空则为假
文件测试
简单的存在性测试:
-a FILE :文件存在性测试,存在为真,否则为假
存在性及类型测试:
-b FLIE:是否存在且为块设备文件;
-c FILE:是否存在且为字符设备文件;
-d FILE:是否存在且为目录文件;
-f FILE:是否存在且为普通文件;
-h FILE 或 -L FILE : 存在且为符号链接文件;
-p FIEL :是否存在且为命名管道文件;
-S FILE:是否存在且为套接文件;
文件权限测试:
-r FILE:是否存在且可读
-w FILE:是否存在且可写
-x FILE:是否存在可执行
文件特殊权限测试:
-g FILE:是否存在且拥有sgid权限;
-u FILE:是否存在且拥有suid权限;
-k FILE:是否存在且拥有sticky权限;
文件大小测试:
-s FILE:是否存在且非空
文件是否打开:
- fd:fd表示文件描述符是否已经打开且与某终端相关
-N FILE:文件自动上一次读取之后是否被修改过;
-O FILE:当前用户是否为文件的属主;
-G FILE:当前有效用户是否为文件数组;
双目测试:
FILE1 -ef FILE2 :FILE1与FILE2是否指向同一个设备上的相同inode
FILE1 -nt FILE2:FILE1是否新于FILE2
FILE1 -ot FILE2:FILE1是否旧于FILE2
组合测试条件
逻辑运算符:
&&代表的意思是当前一个命令执行成功时会继续执行后续的命令,当前一个命令执行失败的时候不会执
行后续的命令
||代表的意思是当前一个命令执行成功时不会继续执行后续的命令,当前一个命令执行失败的时候会执
行后续的命令
第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
Note:必须使用测试命令进行
选择执行
-
单分支选择结构
if 判断条件;then
条件为真的分支代码
fi
-
双分支选择结构
if 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
-
多分支选择结构
if 判断条件;then
条件为真的分支代码
elif 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
用户交互
read命令
-
常用选项:
-
‐p :用于给出提示符,例如:echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示
-
‐n : 用于限定最多可以有多少字符可以作为有效读入
-
‐r :特殊字符生效(/n等),也应采用‐r选项
-
‐t :用于表示等待输入的时间(s),等待时间超过,将继续执行后面的脚本
-
-
练习1:提示为:"input your name:",输入姓名后,进行输出
-
练习2:读取test.txt文本,输出格式为: linecount:context
循环语句
for循环
-
循环体:需要执行的语句,可能执行n遍
-
语法
for 变量名 in 列表;do
循环体
done
-
执行机制:依次将列表中的元素赋值给“变量名”;每次赋值后执行一次循环体;直到列表中的元素 耗尽,循环结束
while循环
-
语法
while 测试条件;do
循环体
done
-
经典使用
-
练习题,猜随机数游戏
额外要求:
# 1. 猜测四次如果没猜中,游戏结束,随机数重新生成
# 2. 如果猜中了游戏结束,输出猜测的次数
ubtil循环
-
while的是条件是测真值,until的条件是测假值
-
语法
until 条件测试;do
循环体
done
-
练习1:99乘法表
函数
-
语法
function FUNNAME(){
函数体
返回值
}
FUNNME #调用函数
-
实例1
-
函数参数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
调试脚本
-
-x : 在执行时显示参数和命令;
-
+x:禁止调试
-
-v:当命令行进行读取时显示输入;
-
+v:禁止打印输入。
-
-
n:检测脚本中的语法错误
-
环境配置
bash配置文件
-
生效范围分类
-
全局配置:
/etc/bashrc
/etc/profile
/etc/profile.d/*.sh-
个人配置
~/.bash_profile
~/.bashrc -
-
功能分类
-
profile类:为交互式的shell提供配置
-
bashrc类:为非交换式的shell提供配置
-
-
shell登录
-
交互式登录:su - USERNAME
-
/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
-
非交换式登录:su USERNAME
-
-
编辑配置文件定义的新设置的生效方式
-
重新启动shell进程
-
使用source命令
-
day22
zabbix监控简介
zabbix优点
-
开源,无软件成本投入
-
Server对设备性能要求低
-
支持设备多,自带多种监控模板
-
支持分布式集中管理,有自动发现功能,可以实现自动化监控
-
开放是接口,扩展性强,插件编写容易
-
当监控的 item 比较多服务器队列比较大时可以采用主动状态,被监控客户端主动 从server 端去下载 需要监控的 item 然后取数据上传到 server 端。 这种方式对服务器的负载比较小
-
API的支持,方便与其他系统结合
zabbix缺点
-
需在被监控主机上安装 agent,所有数据都存在数据库里, 产生的数据据很大,瓶颈主要在数据库
-
项目批量修改不方便
-
社区虽然成熟,但是中文资料相对较少,服务支持有限
-
入门容易,能实现基础的监控,但是深层次需求需要非常熟悉Zabbix并进行大量的二次定制开发难 度较大
-
系统级别报警设置相对比较多,如果不筛选的话报警邮件会很多;并且自定义的项目报警需要自己 设置,过程比较繁琐
-
缺少数据汇总功能,如无法查看一组服务器平均值,需进行二次开发
zabbix组件结构
-
Zabbix_Server:整个监控体系中最核心的组件,它负责接收客户端发送的报告信息,所有配置、 统计数据及操作 数据都由它组织
-
数据库存储:所有配置信息和Zabbix收集到的数据都被存储在数据库中
-
Web界面:为了从任何地方和任何平台都可以轻松的访问Zabbix, 我们提供基于Web的Zabbix界 面。该界面是 Zabbix Server的一部分,通常跟Zabbix Server运行在同一台物理机器上(!如果使 用SQLite,Zabbix Web界面必 须要跟Zabbix Server运行在同一台物理机器上。)
-
Zabbix_Proxy(可选):用于监控节点非常多的分布式环境中,它可以代理zabbix-server的功 能,减轻zabbixserver的压力
-
Zabbix_Agent:zabbix-agent为客户端软件,用于采集各监控项目的数据,并把采集的数据传输给 zabbixproxy或zabbix-server
zabbix监控方式
被动模式
-
被动检测:相对于agent而言;agent, server向agent请求获取配置的各监控项相关的数据, agent接收请求、获取数据并响应给server
主动模式
-
主动检测:相对于agent而言;agent(active),agent向server请求与自己相关监控项配置,主 动地将server配置的监控项相关的数据发送给server
-
主动监控能极大节约监控server 的资源
zabbix架构
zabbix常用术语
-
主机:一台你想监控的网络设备,用ip或域名表示
-
主机组:主机的逻辑组;它包含主机和模板。一个主机组里的主机和模板之间并没有任何直接的关联。通常在给不同用户组的主机分配权限时候使用主机组
-
监控项:你想要接收的主机的特定数据,一个度量数据
-
触发器:一个被用于定义问题阈值和评估监控项接收到的数据的逻辑表达式,当接收到的数据高于阈值时,触发器从OK变成Problem状态。当接收到的数据低于阈值时,触发器保留/返回一个OK的状态
系统监控的自带选项
agent.ping 检测客户端可达性、返回nothing表示不可达。1表示可达
system.cpu.load --检测cpu负载。返回浮点数
system.cpu.util -- 检测cpu使用率。返回浮点数
vfs.dev.read -- 检测硬盘读取数据,返回是sps.ops.bps浮点类型,需要定义1024倍
vfs.dev.write -- 检测硬盘写入数据。返回是sps.ops.bps浮点类型,需要定义1024倍
net.if.out[br0] --检测网卡流速、流出方向,时间间隔为60S
net-if-in[br0] --检测网卡流速,流入方向(单位:字节) 时间间隔60S
proc.num[] 目前系统中的进程总数,时间间隔60s
proc.num[,,run] 目前正在运行的进程总数,时间间隔60S
###处理器信息
通过zabbix_get 获取负载值
合理的控制用户态、系统态、IO等待时间剋保证进程高效率的运行
系统态运行时间较高说明进程进行系统调用的次数比较多,一般的程序如果系统态运行时间占用过高就
需要优化程序,减少系统调用
io等待时间过高则表明硬盘的io性能差,如果是读写文件比较频繁、读写效率要求比较高,可以考虑更
换硬盘,或者使用多磁盘做raid的方案
system.cpu.swtiches --cpu的进程上下文切换,单位sps,表示每秒采样次数,api中参数
history需指定为3
system.cpu.intr --cpu中断数量、api中参数history需指定为3
system.cpu.load[percpu,avg1] --cpu每分钟的负载值,按照核数做平均值(Processor
load (1 min average per core)),api中参数history需指定为0
system.cpu.load[percpu,avg5] --cpu每5分钟的负载值,按照核数做平均值(Processor
load (5 min average per core)),api中参数history需指定为0
system.cpu.load[percpu,avg15] --cpu每5分钟的负载值,按照核数做平均值(Processor
load (15 min average per core)),api中参数history需指定为0