ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

笔记

2022-07-11 21:00:15  阅读:144  来源: 互联网

标签:数据 redis 笔记 服务器 日志 root localhost


day5

  • 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 链名查看规则

image-20220702191109263

每个字段的解释

  • policy:当前链的默认策略,当所有规则都没有匹配成功时执行的策略

  • packets:当前链默认策略匹配到的包的数量

  • bytes:当前链默认策略匹配到的包数量

 

  • pkts:对于规则匹配到的包数量

  • bytes:对应规则匹配到的包大小

  • target:对应规则执行的动作

  • prot:对应的协议,是否针对某些协议应用此规则

  • opt:规则对应的选项

  • in:数据包由哪个接口流入

  • out:数据包由哪个接口流出

  • source:源ip地址

  • distination:目的ip地址

清空规则

  • iptables -t 表名 -F 链名

增加规则

  • iptables -t 表名 -A 链名 匹配条件 -j 执行动作

删除规则

方式一:根据编号进行删除规则

  • 在查看规则的命令行后面加上--line-numbers即可显示编号

image-20220702193421153

  • 删除:iptables -t 表名 -D 链名 编号即可删除

方拾二:根据匹配条件执行动作进行删除

  • iptables -t 表名 -D 链名 匹配条件 执行动作

修改规则

  • iptables -t 表名 -R 链名 被修改的规则的编号 新的匹配条件 新的执行动作

修改链的默认规则
  • iptables -t 表名 -P 链名 默认动作

自定义链的使用

image-20220702195746832

创建自定义链

  • iptables -t 表名 -N 自定义链名

应用自定义链

  • iptables -t 表名 -I 链名 匹配条件 -j 自定义链名(此处的自定义链名就是上一步创建的自定义链的名字)

创建自定义链的规则

  • iptables -t 表名 -A 自定义链名 匹配条件 执行动作

删除自定义链

image-20220702200725451

  • 首先清空自定义链规则

  • 然后删除引用链的规则

  • 最后在通过iptables -X 自定义链命令删除自定义链

NAT 案例实验

nmcli:可用于修改网络的一些配置

  • nmcli connection show:展示网卡信息

  • nmcli connection modify 原网卡名称 connection.id 新名称:修改网卡名称

    image-20220702202615209

实验一

实验前需要开启linux路由转发功能(默认是关闭的):

 [root@eagle ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

 

  • 首先需要准备两台服务器,server1有两块网卡,一块是nat模式,另一块是仅主机模式;server2只需要仅主机模式的网卡

  • 同时第二步如下:

    image-20220702203727839

    image-20220702203919178

  • 然后在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

    image-20220703185613769

    • 可使用命令查看at任务

       [root@server5 ~]# atq

      image-20220703185737452

  • 使用方法二:先编写任务文件,然后再将其添加到at任务中(可适用于任务较多时)

    image-20220703190134068

周期性计划任务

  • cron在使用前必须要启动守护进程crond

  • 相关的管理命令

     [root@localhost ~]# crontab -l # 列出当前用户所有计划任务
     [root@localhost ~]# crontab -r # 删除当前用户计划任务
     [root@localhost ~]# crontab -e # 编辑当前用户计划任务
     管理员可以使用 -u username,去管理其他用户的计划任务
     [root@localhost ~]# vi /etc/cron.deny # 这个文件中加入的用户名无法使用cron

    image-20220703191042421

  • 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任务来帮助完成日志切割

image-20220703193443972

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协议

连接模式

  • 主动模式:主动模式是由服务器主动发起数据连接

  • 被动模式:被动模式是由客户端发起连接

image-20220703200856605

基础配置

  • 安装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<服务器根⽬录>:指定服务器的根⽬录。

  • -D<设定⽂件参数>:指定要传⼊配置⽂件的参数。

  • -f<设定⽂件>:指定配置⽂件。

  • -h:显示帮助。

  • -l:显示服务器编译时所包含的模块。

  • -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等功能。并且支持很多第三方的模块扩展。

  • 官方:http://www.nginx.org/

nginx特点

  • 支持高并发,消耗内存资源小

  • 具有多种功能

    • 网站web服务功能

    • 网站负载均衡功能

    • 正向代理反向代理

  • 网站缓存功能

  • 在多种系统平台都可以部署

  • nginx实现网络通讯时使用的是异步网络IO模型:epoll模型,参考博客:https://segmentfault.com/a/1190000003063859#item-3-13

关于进程I/O的介绍

内核空间和用户空间

  • 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

  • 为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。

进程的切换

  • 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。

  • 进程的切换会带来比较大的资源消耗,因为进程切换会做如下过程

    1. 保存处理机上下文,包括程序计数器和其它寄存器

    2. 更新PCB信息

    3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列

    4. 选择另一个进程执行,并更新其PCB

    5. 更新内存管理的数据结构

    6. 恢复处理机上下文

进程的阻塞

  • 正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态

文件描述符fd

  • 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表

缓存I/O

  • 数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间

  • 数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的

I/O多路复用

select

  • 使用数组为单个进程去记录多个文件描述符的状态,每次通过循环遍历的方式访问数组,当发现有就绪的文件描述时返回。因为使用数组组织数据,所以一次性最多只能监听1024个文件描述符

poll

  • 与select不同的是使用链表替换了数组,解决了最大长度有限问题,但是依然没有解决循环遍历效率问题

epoll

  • 采用基于事件通知的方式,一旦有某个文件描述符就绪,会通过callback回调机制,来主动通知进程有文件描述符就绪,解决了自己循环遍历效率低下的问题

nginx工作原理

  • Nginx由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接 收和分配客户端请求,处 理模块之间的交互。Nginx的各种功能和操作都由模块来实现。Nginx的模 块从结构上分为核心模块、基础模块和第三方 模块

    1. 核心模块: HTTP模块、EVENT模块和MAIL模块

    2. 基础模块: HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块

    3. 第三方模块: 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服务器 分离)

正向代理

  1. resolver:指定dns服务器地址

  2. proxy_pass:代理到的地址

  3. 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版本选择

二进制安装

当前运维和开发最常见的做法是二进制安装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方式连接

 

工作流程

 

  1. 首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的结构。比如:连接处理、授权认证、安全等

  2. 第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等

  3. 第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储 引擎API包含十几个底 层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析 SQL(InnoDB会解析外键定义,因为其 本身没有实现该功能),不同存储引擎之间也不会相互通 信,而只是简单的响应上层的服务器请求。

  4. 第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬 盘上

程序结构

  • 把工作流程相同功能划分为一个结构里,可以形成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命令;

主从复制原理

复制过程

  1. 主服务器上任何的更新操作会被写入到二进制日志文件中

  2. 从服务器上的IO线程:

  3. 检测主服务器的二进制日志文件的变化

  4. 同步主服务器的二进制日志文件到本地的中继日志中

  5. 从服务器上的sql线程负责读取和执行中继日志中的sql语句

应用场景

  • 一主多从会去对应读写分离

    • 写操作由主服务器

    • 读操由从服务器

  • 主服务器上:drop ……

    • 要去做备份操作:在服务器上通过LVM快照进行备份

  • 主服务器挂掉了,用户不可以进行写入操作

    • 高可用模型:多主架构

    • 任何一台服务器既是主服务器也是从服务器

  • 高可用架构:MHA架构

 

 

MHA架构

简介

MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够 很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅需 要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简 单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。

MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为 主库),大概0.5-2秒内即可完成。

工作流程

  1. 把宕机的master二进制日志保存下来。

  2. )找到binlog位置点最新的slave。

  3. 在binlog位置点最新的slave上用relay log(差异日志)修复其它slave。

  4. 将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。

  5. 将含有最新位置点binlog所在的slave提升为master。

  6. 将其它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流程

详细说明如下:

  1. 用户向www.test.com下的某图片资源(如:1.jpg)发起请求,会先向 Local DNS 发起域名解析请 求

  2. 当 Local DNS 解析www.test.com时,会发现已经配置了 CNAMEwww.test.com.cdn.dnsv1.com,解析请求会发送至 Tencent DNS(GSLB),GSLB 为腾 讯云自主研发的调度体系,会为请求分配最佳节点 IP

  3. Local DNS 获取 Tencent DNS 返回的解析 IP

  4. 用户获取解析 IP

  5. 用户向获取的 IP 发起对资源 1.jpg 的访问请求

  6. 若该 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流程说明

 

  1. 执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进 程,如RDB/AOF子进程,如果 存在bgsave命令直接返回

  2. 父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通 过info stats命令查看 latest_fork_usec选项,可以获取最近一个fork操作的耗 时,单位为微秒

  3. 父进程fork完成后,bgsave命令返回“Background saving started”信息 并不再阻塞父进程,可以 继续响应其他命令

  4. 子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后 对原有文件进行原子替换。执行 lastsave命令可以获取最后一次生成RDB的 时间,对应info统计的rdb_last_save_time选项

  5. 进程发送信号给父进程表示完成,父进程更新统计信息

运维提示

  • 当遇到坏盘或磁盘写满等情况时,可以通过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即可
工作流程

 

  1. 所有的写入命令会追加到aof_buf(缓冲区)中

  2. AOF缓冲区根据对应的策略向硬盘做同步操作

  3. 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩 的目的

  4. 当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段的使用。

 

标签:数据,redis,笔记,服务器,日志,root,localhost
来源: https://www.cnblogs.com/jimmyf/p/16439710.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有