地址 上海石门二路 网站建设,专业做网站 上海,重庆有哪些建设公司,网站想上线怎么做第一章 Linux
1.1 计算机硬件软件体系 冯诺依曼 (数学家,计算机之父) 冯诺依曼体系
计算机的指令和数据都是二进制存储,并且存放到一起程序和指令都是顺序执行的计算机硬件由输入,输出,存储,运算器与控制器组成 输入设备 比如:键盘,鼠标等. 输出设备 打印机输出#xff0…第一章 Linux
1.1 计算机硬件软件体系 冯诺依曼 (数学家,计算机之父) 冯诺依曼体系
计算机的指令和数据都是二进制存储,并且存放到一起程序和指令都是顺序执行的计算机硬件由输入,输出,存储,运算器与控制器组成 输入设备 比如:键盘,鼠标等. 输出设备 打印机输出显示器输出等 存储设备 RAM 内存随机存储 速度快,容量小,掉电易失,逻辑IO ROM 硬盘只读内存空间 容量大,速度慢,长久保存,物理IO CPU(中央处理器) 控制器 用来控制和指挥程序和数据的输入运行以及处理运算结果 运算器 运行算数运算和逻辑运算并将中间结果暂存到运算器中
1.1.1 硬盘的分类 机械硬盘 半机械半电子的硬盘,数据是随机存储的,所以读取速度取决于 (转速 寻到时间) 转速7200转/分 100-200M/s 寻道时间:找到对应的扇区 2.每个扇区的大小都是相同的,当我们使用磁盘时,都是以扇区为单位分配空间 3.特殊环境下,如果能保证数据读写的连续性硬盘性能会得到很大提升 固态硬盘 可以理解为多个U盘穿连在一起 读写速度的区别 固态硬盘的读取速度普遍可以达到400M/s写入速度也可以达到130M/s以上固态硬盘的读写速度是普通机械硬盘的3-5倍。
1.1.2 网络连接概念 IP地址IPADDR 计算机定位唯一标识 下层网络可以访问上层网络,但上层网络不能直接访问下层网络,如果要访问需要借助内网穿透 子网掩码NETMASK 划分网络地址与主机地址 默认网关GATEWAY 两个不同网络间的通讯 配置的方式 DHCP 自动获取Static 静态设置 IP分类 IP4 32位 256[0,255] IP6 128位 16进制 DNS 域名解析服务器 114.114.114.114 全国 8.8.8.8 全球
1.1.3 端口(Port)
请求首先访问端口,这个端口有一个默认监听程序,这个程序处理这个端口的所有请求一个端口只能被一个程序监听而一个程序可以监听多个端口一个端口默认 16位 [0,65535] 一般情况下 前1024都属于系统默认,尽量不要使用
1.1.4 虚拟机网络四种连接方式 host-onboy(主机模式) 真实网络和虚拟网络都是隔离的 bridged(桥接模式) 虚拟机和真实主机共享一个网络 NAT(网络地址转换模式) 给虚拟机构建一个单独的子网络 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUIqGDUp-1656229403014)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220609162906352.png)] 无网络
1.1.5 计算机软件
用来调度硬件设备 分类 应用软件 解决某些问题 操作系统 直接和硬件打交道,对于应用软件屏蔽了硬件差异
1.2 虚拟机安装与配置
安装VM安装虚拟机安装操作系统
1.2.1 更改系统配置
网络 查看自己的虚拟网卡地址 编辑–虚拟机网络编辑器–vmnet8 vi编辑器简单使用 操作文档光标位置dd 删除一行i 将文档变成可修改模式esc 退出编辑:wq 保存并退出 修改网络信息 vi /etc/sysconfig/network-scripts/ifcfg-ens33 --修改
ONBOOTyes
BOOTPROTOstatic //静态网络IP dhcp 动态获取网络IP
--添加
IPADDR192.168.58.100
NETMASK255.255.255.0
GATEWAY192.168.58.2
DNS1114.114.114.114
删除--UUID 重启网卡重新加载配置文件 ip addr IP地址systemctl restart network.service 重启ping www.baidu.comctrlc 终止命令的执行 防火墙 systemctl status firewalld (查看防火墙状态)
systemctl stop firewalld (本次服务内关闭防火墙)
systemctl disable firewalld(禁用防火墙服务)软件安装限制 操作系统对未知软件的安装有可能拒绝或者警告我们需要禁用这个功能
vi /etc/selinux/configSELINUXdisabled 修改为disabled关机 halt 直接拔掉电源poweroff 直接关闭机器shutdown -h now 马上关闭计算机 可以发消息 (推荐使用)reboot 重启虚拟机
1.2.2 快照与克隆 拍摄快照 记录当前虚拟机的状态 拍摄快照的时候一定要关机 转到 回到某一个历史快照的节点 克隆 复制某一个历史快照节点 克隆的方式 链接克隆 当前节点文件夹只存储差异性数据 相同数据存放在原始节点上 优点节省硬盘空间 缺点耦合性大 完整克隆 就是基于原始节点完全拷贝到新节点的文件夹中优点耦合性抵缺点硬盘空间使用大 推荐使用完整克隆
1.3 Linux的命令
1.3.1 命令学习法
Linux命令与参数之间必须用空格隔开 Linux命令是区分大小写的 命令帮助文档 help 内置命令帮助文档 man 外部命令帮助文档因为当前系统为minimal的very basic 没有man包需要手动安装man yum install man man-pages -y 修改Xshell字体颜色 PS1\[\e[36;40m\][\u\h \W]\[\e[0m\]\\$
echo PS1\[\e[36;40m\][\u\h \W]\[\e[0m\]\\$ ~/.bashrc
source ~/.bashrc1.3.2 常用命令
whereis 查询命令文件的位置
file 查看文件的类型
who 查看当前在线的用户
whoami 我是谁
pwd 我在那
uname -a 查看内核信息
echo 类似于 sout syso 打印语句
clear 清屏
history 历史命令1.3.3 特殊字符 . 点 如果文件的开始是.说明当前文件是一个隐藏文件. 指向当前目录…指向当前目录的上级目录 $ 说明这是一个变量 *星号 通配符 ~ 当前用户的家目录root用户家目录在系统根目录下其他用户的家目录在/home/用户名为家目录 空格 Linux的命令与参数用空格隔开 / 整个Linux的文件根目录 命令的参数 如果是单词 一般加–如果是字母或者缩写 一般加 -
1.4 Linux的文件系统
万事万物皆文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8slBcj2-1656229403015)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220610170044817.png)]
1.4.1 文件系统 Linux维护着一个树状结构的文件模型 只有一个根节点 ,他的名字叫做 /一个节点上可以有多个子节点 查找文件的方式 相对路径 以当前路径为基准点查找其他资源 绝对路径 以根路径为基准点查找其他资源 可随意挂载磁盘
1.42 Linux的文件操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1DBPntRV-1656229403016)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220610151744065.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00BK8ulz-1656229403016)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220610151854051.png)]
软连接与硬链接: 源文件连接着资源 软连接是连接的这个源文件名 源文件删了 软连接就指不到这个资源 硬链接是直接指这个资源 源文件删掉也不影响他的 调用
VI编辑器
1.4.3 读取文件信息 cat 从第一行开始显示文件内容 tac 从最后一行开始显示 more 与 less 分页查看文档内容快捷键 回车 下一行空格 下一页b 回退q 退出 head 从文章开始读取N行默认如果超过10行读取10行,否则读取现在行数head -5 profile tail 从文章末尾读取N行 head -3 profile | tail -1 利用管道只读取第N行管道的作用就相当于把前面的结果以参数的方式传递给后面的命令 读取新增数据 ping www.baidu.com baidu tail -F baidu 如果f: 它会监听指定inode的文件数据变化但是当文件被删除后即使创新创建inode也会发生变化于是监听失败 如果F 他会监听指定名字的文件,如果文件被删除后重新创建他会重新监听新文件的数据变化监听不受影响 find 查找指定的文件find 要查找的范围 -name 名字find /etc -name profile
1.4.4 VI和VIM编辑器
打开文件 正常打开 vi profile 打开文件并将光标置于第8行 vi 8 profile 打开最后一行 vi profile按n查找下一个按N查找上一个 打开指定搜索单词的位置 vi /if profile
三种模式 编辑模式 编辑模式中每一个按键都有其他的功能 G最后一行
gg 跳转到第一行
数字gg 跳转到第数字行
w 下个单词
数字w
dw 删除一个单词
3dw 删除三个单词
dd 删除一行
3dd 删除三行
u回退到前面的操作
.回退u执行的操作
yw 复制一个单词
3yw 复制三个单词
yy 复制一行
3yy复制三行
p粘贴
6p 粘贴6次
x 剪切
3x 剪切三个字符
r 替换然后输入一个字符替换
3r 替换三个
hjkl 方向键
ZZ 保存并退出
ctrls 锁屏 ctrlq 解锁输入模式 每一个按键按下什么就像文本中数据输入什么 末行命令行模式 我们可以直接在VI中输入特定的命令
set nu 设置行号
set nonu 取消行号
w 保存
q 退出
wq 保存并退出
q!强制退出但是不保存
如果上次异常退出会保留同名隐藏文件每次启动会给与提示
如果确定当前文件没问题请删除隐藏文件
/pattern
搜索指定的字符串
/usr n向下查找 N逆向查找
s/p1/p2/g
替换字符串
g 替换当前行所有 否则只替换当前行第一个
s/abc/lucky/g
查找指定行
3,8s/abc/lucky/g
替换全文
g/abc/s//lucky/g三种模式切换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bM6Bg97D-1656229403017)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220610155321103.png)]
1.4.5 计算机间的传输
Window–Linux lrzsz 需要手动安装 yum install lrzsz -y rz 将文件从window上传到Linux sz 文件 将文件从Linux传输到Window xftp 较为通用的文件传输方式
Linux–Linux scp 源数据地址(source) 目标数据地址(target) scp apache-tomcat-7.0.61.tar.gz root192.168.31.44:/opt
文件大小
分区信息 df -h
文件压缩 tar 主要针对的文件是 lucky.tar.gz 解压缩 tar -zx(解压)v(过程)f(文件) lucky.tar.gz 压缩 tar -zc(压缩)f(文件) tomcat.tar.gz(压缩后的名字) apache-tomcat-7.0.61(源文件)tar -zxf tomcat.tar.gz -C /opt/ -C 指定解压缩的文件目录
zip和unzip
安装 yum install zip unzip -y 压缩 zip -r tomcat.zip apache-tomcat-7.0.61 解压缩 unzip tomcat.zip
1.5 Linux的网络信息
1.5.1 主机名称
临时修改 hostname bdp 长久修改 vi /etc/hostname
1.5.2 DNS解析
域名解析服务可以将域名转为IP地址修改主机域名 vi /etc/hosts将来我们需要把所有的虚拟机都配置hosts文件192.168.31.101 bd1601192.168.31.102 bd1602
1.5.3 网络相关命令 ifconfig 查看当前网卡的配置信息这个命令属于 net-tools中的一个命令但是Centos7中minimal版并没有集成这个包所以7的时候需要自己手动安装如果没有ifconfig 可以使用ip addr 临时代替 netstat 查看当前网络的状态信息一个机器默认有65536个端口号[0,65535]这是一个逻辑的概念将来我们需要使用程序监听指定的端口等待别人的访问一个端口只能被一个程序所监听, 端口已经被占用netstat -anpnetstat -r 核心路由表 route ping 查看与目标IP地址是否能够连通 telnet 查看与目标IP的指定端口是否能够连通yum install telnet -ytelnet 192.168.31.44 22 curl restful 我们所有的资源在网络上中都有唯一的定那么我们可以通过这个唯一定位标识指定的资源
1.5.4 防火墙
保护用户资料与信息安全性的一种技术
#查看防火墙状态 systemctl status firewalld.service
#临时停止systemctl stop firewalld.service
#禁用防火墙开机启动 systemctl disable firewalld.servicefirewall-cmd --add-port80/tcp --permanent ##永久添加80端口开启一个端口的正确操作 # 添加 firewall-cmd --zonepublic --add-port80/tcp --permanent
#重新载入 firewall-cmd --reload
#查看firewall-cmd --zonepublic --query-port80/tcp
#删除 firewall-cmd --zonepublic --remove-port80/tcp --permanent1.5.5 加密算法
不可逆加密 利用md5算法加密后变不回来例如设置的密码 只能重置 不会告诉你原来设的密码是多少 对称加密 加密和解密使用相同的秘钥 生成密钥的算法公开、计算量小、加密速度快、加密效率高、密钥较短 一方密钥被窃取双方都影响 如果为每个客户都生成不同密钥则密钥数量巨大密钥管理有压力 非对称加密 生成一对密钥公钥加密私钥解密 安全性高 但加密速度慢 计算量大 效率低
1.5.6 主机间的相互免密钥 可以通过ssh命令免秘钥连接到其他的主机 如果是第一次建立连接需要输入yes 需要输入密码 生成密钥 ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa 如果你想免秘钥登录谁只需要把自己的公钥传递给对方主机即可 这个秘钥要放在 ~/.ssh/authorized_keys 将公钥传给指定主机 ssh-copy-id -i ~/.ssh/id_rsa.pub root192.168.88.101 免密钥传输文件 scp haoyu.txt root192.168.88.101:~ 有时候known_hosts 会阻断authorized_keys因为要输入 yes 解决方案1–本次 ssh -v -o GSSAPIAuthenticationno root192.168.88.201 解决方案2–所有 修改/etc/ssh/ssh_config文件的配置以后则不会再出现此问题 最后面添加 StrictHostKeyChecking no UserKnownHostsFile /dev/nul免密钥流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRVOzp6K-1656229403017)(D:\优极限\大数据\大数据课程\day04-CentOS软件安装文本编辑 Shell编程\day04-笔记\15-相互免秘钥.png)]
主机1生成密钥对将公钥发送给主机2主机2储存这个密钥 主机1给主机2发送请求主机2先验证ak文件检测是否有这个公钥然后随机生成个字符串用公钥加密返回给主机1主机1用私钥解密将结果发送给主机2主机2收到结果和自己生成的字符串对比
1.6 日期与时间
1.6.1 时间命令
date 查看当前系统时间
cal 查看日历
cal 2020 查看年
修改时间
date -s 11:11:11
date -s 2019-11-11
date -s 2019-11-11 11:11:111.6.2 日期自动同步
第一种:
首先安装时间同步的服务yum install ntp -y自动同步网络时间中心ntpdate cn.ntp.org.cn
第二种: 自动同步网络时间中心本地NTP服务 NTP 服务器 vi /etc/ntp.conf #权限控制
restrict default kod nomodify notrap nopeer noquery 拒绝IPV4用户
restrict -6 default kod nomodify notrap nopeer noquery 拒绝IPV6用户
restrict 210.72.145.44 授权国家授时中心服务器访问本地NTP
restrict 133.100.11.8 授权133.100.11.8访问本地NTP
restrict 127.0.0.1
restrict -6 ::1
restrict 192.168.88.2 mask 255.255.255.0 nomodify 本地网段授权访问
#源服务器
server cn.ntp.org.cn prefer 指定上级更新时间服务器优先使用这个地址
#差异分析
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys开启本地NTP服务器 systemctl start ntpd.service 同步时间 ntpdate 192.168.88.100
1.7用户-组-权限
用户新增用户 useradd 用户名 ll /home 查看创建的用户设置密码 passwd 用户名删除用户 userdel -r 用户名usermod -L luckyss 锁定用户名usermod -U luckyss 解锁用户名usermod -l luckyss luckyls 修改用户名
组创建组 groupadd 组名 lucky组名删除组 groupdel 组名修改组名字 groupmod -n 新组名 原组名修改用户的组 usermod -g lucky bdpboy (主组)usermod -G lucky bdpls (附属组)权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CMUscwde-1656229403017)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220611160133246.png)] 三组权限每组3个字母 权限RWX分别对应数字 4 2 1 r :读取权限w :写入权限x :执行权限-:没有权限 权限的UGO模型 修改权限 : chmod 741 (文件名) 或 chmod o-x (文件名)三组权限属主的权限属组的权限其他的权限所以说将来修改文件的权限 可以从rwx和ugo两个方面进行修改[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oWL3Avvz-1656229403018)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220613171609671.png)]
权限赋予
我们可以将管理用的权限分配给普通用户
文件位置在 vim /etc/sudoers
修改这个文件需要使用命令 visudo
修改 Line 99用户名 ALL(root) /sbin/useraddn1 ALL(root) /sbin/*
如何使用su 用户名 切用户 exit切回去sudo useradd springmvc1.8 管道与重定向
管道:将前面的命令结果作为参数传递给后面的命令重定向:改变数据输出的位置方向写出方式: 覆盖 追加写出类型: 1 标准输出 2 错误输出1.9 进程
进程信息
ps -ef UID PID PPID C STIME TTY TIME CMDUID 所属用户PID 当前进程编号PPID 当前进程编号的父进程编号
查看进程 ps -ef ps -ef | grep redis
杀死进程 kill -9 进程编号
后台进程 nohup ping www.baidu.com baidu 21
ps -aux 所有信息Linux的软件安装
环境变量
$PATH的配置文件在 /etc/profilewindow 路径与路径之间用;(分号)连接Linux路径与路径之间用:冒号连接Linux每次修改完成之后需要重新加载文件 source /etc/profile
软件安装的方式 解压就可以使用 使用安装包安装(window-exe Linux-rpm) 自己下载安装包使用统一的软件帮助我们安装通过源码安装 通过源码安装
RPM安装
RedHat Package Manager,它属于红帽的一种包管理方式
通过RPM命令安装软件
rpm -ivh jdk-7u67-linux-x64.rpm
可以查询软件
rpm -qa | grep jdk
rpm -q jdk
卸载
rpm -e jdk-1.7.0_67-fcs.x86_64
需要手动配置Java的环境变量
vim /etc/profileexport JAVA_HOME/usr/java/jdk1.7.0_67
export PATH$JAVA_HOME/bin:$PATH重新加载配置文件
source /etc/profile压缩包解压安装
解压文件
tar -zxf apache-tomcat-7.0.61.tar.gz
拷贝到/opt/bdp目录下
mkdir -p /opt/lucky
cp -r apache-tomcat-7.0.61 /opt/bdp
启动tomcat
cd /opt/bdp/apache-tomcat-7.0.61/bin/
./startup.shYUM安装
yum的作用
可以帮我们管理RPM包可以帮我们安装软件如果软件有其他依赖会帮我们安装依赖后在安装软件类似于Maven
yum命令
search 查询命令或者软件
info
查看包的信息
list / list jdk
查询安装的rpm包或者只查询某一周更换yum源
首先安装wget
yum install wget -y
将系统原始配置文件失效
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
使用Wget获取阿里yum源配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
清空以前yum源的缓存
yum clean all
获取阿里云的缓存
yum makecache安装Mysql
Mysql下载地址 https://downloads.mysql.com/archives/community/
#----------安装Mysql依赖【perl net-tools】
yum install perl net-tools -y
#----------卸载mariadb
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
#----------安装mysql
tar -xvf mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.18-1.el7.x86_64.rpm
#----------启动mysql
systemctl start mysqld
#----------查找密码并登陆Mysql
cat /var/log/mysqld.log | grep password
mysql -u root -p
#----------修改Mysql密码 8.0版本输入命令
set global validate_password.policyLOW;
set global validate_password.length6;
#更改加密方式
ALTER USER rootlocalhost IDENTIFIED BY 123456 PASSWORD EXPIRE NEVER;
#更新用户密码
ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456;
#刷新权限
FLUSH PRIVILEGES;
#----------修改Mysql密码 5.7版本输入命令
set global validate_password_policyLOW;
set global validate_password_length6;
alter user rootlocalhost identified by 123456;
#----------修改Mysql链接地址
use mysql;
update user set host% where user root;
commit;
exit;
systemctl restart mysqld;
#----------使用Navicat连接MysqlLinux三剑客
普通剑客
cut:
用指定的规则来切分文本cut -d’:’ -f1,2,3 passwd | grep bdp
sort: sort lucky 对文本中的行进行排序 sort -t’ ’ -k2 lucky 对每一行的数据进行切分按照第二列进行排序 sort -t’ ’ -k2 -r lucky 逆序 sort -t’ ’ -k2 -n lucky 按照数值大小进行排序,如果有字母字母在前
wc:
统计单词数量wc lucky4 15 79 lucky -| line-w word 以空格来分割单词-c char
三剑客
grep擅长查找功能sed擅长取行和替换。awk擅长取列
剑客一号: grep
可以对文本进行搜索同时搜索多个文件 从文档中查询指定的数据grep adm passwdgrep bdp passwd lucky 显示匹配的行号 grep -n bdp passwd 显示不匹配的忽略大小写 grep -nvi root passwd --colorauto 使用正则表达式匹配 grep -E “[1-9]” passwd --colorauto
剑客2号: sed
sed 是Stream Editor字符流编辑器的缩写简称流编辑器Sed软件从文件或管道中读取一行处理一行输出一行再读取一行再处理一行再输出一行…一次一行的设计使得sed软件性能很高vi命令打开文件是一次性将文件加载到内存了解即可 https://www.cnblogs.com/chensiqiqi/p/6382080.html 行的选择模式 10 第十行m,n -- 第m行到第n行 [m,n]m,n–第一行到第四行 [m,mn]m~n–从m行开始依次累加nm,$ --从m开始到最后一行/bdp/ --匹配到bdp的行/u1/,/u4/–从匹配u1到匹配u4 增 sed ‘2a luckyisgood’ passwdsed ‘2i luckyisgood’ passwd 打印到控制台 sed -i ‘2a luckyisgood’ passwd 直接修改到文件 删 sed ‘3,10d’ passwd 改 整行替换 sed ‘3,20c hahaha’ passwd sed ‘3~1c hehehe’ passwd 字符替换 sed ‘1,5s/root/lucky/g’ passwd sed ‘1,5s#/#-#g’ passwd
剑客3号: awk
它是一门语言了解 https://www.cnblogs.com/chensiqiqi/p/6481647.html
第二章 shell编程
Shell编程概述 什么时shell? shell就是一个用户根操作系统打交道的一个命令解释器 Kernel Linux内核主要是为了和硬件打交道 Shell两大主流 sh Bourne shellsh ,Solaris,hpux默认shellBourne again shellbash ,Linux系统默认shell csh C shell(csh)tc shell(tcsh) #! 声明 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序 #!/bin/bash
echo Hello World !Shell脚本执行
输入脚本的绝对路径或相对路径 /root/helloworld.sh./helloworld.sh执行的必须是一个可执行文件 bash或sh 脚本 sh helloworld.sh当脚本没有x权限时root和文件所有者通过该方式可以正常执行 在脚本的路径前再加. 或source source helloworld.sh 区别 第一种和第二种会新开一个bash不同bash中的变量无法共享第三种 是在同一个shell里面执行的 export : 可以将当前进程的变量传递给子进程去使用 将来配置profile的时候 所有的变量前必须加export
Shell基础入门
Shell变量 定义变量时变量名不加美元符号 命名只能使用英文字母数字和下划线首个字符不能以数字开头。中间不能有空格可以使用下划线_。不能使用标点符号。不能使用bash里的关键字可用help命令查看保留关键字 变量的类型 局部变量 局部变量在脚本或命令中定义仅在当前shell实例中效其他shell启动的程序不能访问局部变量。 环境变量 所有的程序包括shell启动的程序都能访问环境变量有些程序需要环境变量来保证其正常运行 Shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量有一部分是局部变量 # 变量的声明
namezhangsan
for file in ls /etc
或
for file in $(ls /etc)
# 变量的调用
echo $name
echo ${name}
for skill in Ada Coffe Action Java; do
echo I am good at ${skill}Script
done
# 只读变量 /bin/sh: NAME: This variable is read only. 也不能删除
urlhttps://www.google.com
readonly url
urlhttps://www.runoob.com
# 删除变量
unset nameShell字符串 字符串是shell编程中最常用最有用的数据类型字符串以用单引号也可以用双引号也可以不用引号。 单引号 单引号里的任何字符都会原样输出单引号字符串中的变是无效的单引号字串中不能出现单独一个的单引号但可成对出现作为字符串拼接使用。 双引号 双引号里可以有变量 双引号里可以出现转义字符 # 声明字符串
str1hello world 1
str2hello world 2
# 字符串拼接--双引号
namesunwukong
name1hello, $name !
name2hello, ${name} !
# 字符串拼接--单引号
passwd123456
passwd1hello, $passwd !
passwd2hello, ${passwd} !
echo $passwd2 # hello, ${passwd} !
# 字符串的长度
email123456qq.com
echo ${#email}
echo ${email:1:4}Shell数组 bash支持一维数组不支持多维数组并且没有限定数组的大小。 数组元素的下标由 0 开始编号。获取数组中的元素要利用下标下标可以是整数或算术表达式其值应大于或等于 0。 # 定义数组 括号来表示数组数组元素用空格符号分割开
数组名(值1 值2 ... 值n)
favs(足球 蓝球 乒乓球球 保龄球)
# 读取数组 ${数组名[下标]}
fav${favs[1]}
# 使用 符号可以获取数组中的所有元素
echo ${favs[]}
# 获取数组的长度
length1${#favs[]}
length2${#favs[*]}Shell注释
以 # 开头的行就是注释会被解释器忽略。通过每一行加一个 # 号设置多行注释
Shell参数传递
执行 Shell 脚本时向脚本传递参数脚本内获取参数的格式为$n。n 代表一个数字参数[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RIeukbpt-1656229403018)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220613162020827.png)]
Shell高级进阶
test 命令
Shell中的 test 命令用于检查某个条件是否成立它可以进行数值、字符和文件三个方面的测试。
Shell函数
linux shell 可以用户定义函数然后在shell脚本中可以随便调用。可以带function fun() 定义也可以直接fun() 定义,不带任何参数。参数返回可以显示加return 返回如果不加将以最后一条命令运行结果作为返回值。 return后跟数值n(0-255
系统任务设置
系统启动流程 启动计算机的硬件(BIOS) 读取时间选择对应的启动模式(USB HDD EFI 如果是Linux系统回去找/boot目录.引导这个系统启动 计算机系统开始启动,读取初始化配置文件 vim /etc/inittab启动时控制着计算机的运行级别 runlevel[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AR8YzaCK-1656229403018)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220613163143228.png)]id:3:initdefault: 默认runlevel为3以runlevel3开始启动对应的服务和组件 开始默认引导公共的组件或者服务 vim /etc/rc.d/rc.sysinit 开始加载对应runlevel的服务 vi /etc/rc3.d/ K:关机时需要关闭的服务S:启动时需要开启的服务数字代表了开启或者关闭的顺序所有的文件都是软链接链接的地址为 /etc/init.d 当启动完毕所有的服务也被加载完成 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFbSab67-1656229403019)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220613163336608.png)]
系统服务
我们可以使用chkconfig命令查看当前虚拟机的服务通过查看可以得知不同的级别对应到每一个服务确定本次开机自动启动开机结束后我们需要使用serviceCentos6Systemctl(Centos7)命令控制服务的开启或者关闭
开机自启动服务 rc.local 首先创建脚本存放的文件夹 mkdir -p /usr/local/scripts 在文件夹中创建脚本文件 vim hello.sh给予执行权限 去/etc/rc.d/rc.local文件中添加脚本的绝对路径 给予rc.local执行权限 修改系统时间 date -s ‘21-21-21’ 重启虚拟机 reboot chkconfig 创建开机自启动脚本文件 vim schoolntpdate.sh #!/bin/bash
#chkconfig: 2345 88 99
#description:auto_run
# 开机自启动同步时间
yum info ntp ntpdate cn.ntp.org.cn给其设置执行权限 chmod ux schoolntpdate.sh 将脚本拷贝到 /etc/init.d目录下 cp schoolntpdate.sh /etc/init.d/ 添加到服务 chkconfig --add /etc/init.d/schoolntpdate.sh 修改系统时间 date -s ‘21-21-21’ 重启服务器 reboot
定时任务 在系统服务中心crond负责周期任务 systemctl status crond.service 添加任务编辑当前用户的任务列表 crontab -e 编辑任务 星 星 星 星 星 command 分 时 日 月 周 命令 第1列表示分钟059 每分钟用*或者 */2表示 第2列表示小时0230表示0点 第3列表示日期131 第4列表示月份112 第5列标识号星期060表示星期天 第6列要运行的命令 表示任意时间都实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59 分 -表示区间是一个范围00 17-19 * * * cmd就是每天17,18,19点的整点执行命令 ,是分割时段30 3,19,21 * * * cmd就是每天凌晨3和晚上19,21点的半点时刻执行命令 /n表示分割可以看成除法/5 * * * * cmd每隔五分钟执行一次 30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */2 * * * /usr/local/etc/rc.d/lighttpd restart
每两小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间每隔一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache
--功能描述显示年月日时分秒
date %Y%m%d%H%M%S重启crontab使配置生效 systemctl restart crond.service 通过crontab -l 查看当前的定时任务 查看任务的历史 vim /var/spool/mail/root 清除任务 crontab -r
虚拟机初始化脚本
#!/bin/bash
## -bash: ./bdp.sh: /bin/bash^M: bad interpreter: No such file or directory
## vim或者vi的命令模式下输入命令 set fileformatunix 即可解决换行问题
## sed -i s/\r// init.sh
echo -e \e[1;31m【----------------------------------------在opt和var创建bdp文件夹】
\e[0m
sleep 1
mkdir -p /opt/bdp
mkdir -p /var/bdp
mkdir -p /usr/local/script
echo -e \e[1;31m【----------------------------------------禁用防火墙】\e[0m
sleep 1
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
echo -e \e[1;32m【----------------------------------------修改selinux】\e[0m
sleep 1
sed -i /^SELINUX/c SELINUXdisabled /etc/selinux/config
echo -e \e[1;32m【----------------------------------------安装wget】\e[0m
sleep 1
yum install wget -y
echo -e \e[1;33m【----------------------------------------修改yum源】\e[0m
sleep 1
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-
7.repo
yum clean all
yum makecache
echo -e \e[1;33m【----------------------------------------安装常用软件】\e[0m
yum install man man-pages ntp vim lrzsz zip unzip net-tools telnet perl -y
echo -e \e[1;34m【----------------------------------------同步系统时间】\e[0m
yum info ntp ntpdate cn.ntp.org.cn
echo -e \e[1;34m【----------------------------------------DNS域名配置】\e[0m
sleep 1
echo 192.168.88.100 basenode /etc/hosts
echo 192.168.88.101 node01 /etc/hosts
echo 192.168.88.102 node02 /etc/hosts
echo 192.168.88.103 node03 /etc/hosts
echo -e \e[1;34m【----------------------------------------安装JDK】\e[0m
sleep 1
rpm -ivh jdk-8u231-linux-x64.rpm
echo export JAVA_HOME/usr/java/jdk1.8.0_231-amd64 /etc/profile
echo export PATH$JAVA_HOME/bin:$PATH /etc/profile
source /etc/profile
echo -e \e[1;35m【----------------------------------------安装Tomcat】\e[0m
sleep 1
tar -zxf apache-tomcat-8.5.47.tar.gz
mv apache-tomcat-8.5.47 /opt/bdp/
echo -e \e[1;35m【----------------------------------------安装Mysql】\e[0m
sleep 1
rpm -e --nodeps rpm -qa | grep mariadb
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
systemctl start mysqld
systemctl enable mysqld
temppasswdgrep A temporary password /var/log/mysqld.log | awk { print
$NF}
mysql -uroot -p$temppasswd --connect-expired-password EOF
set global validate_password_policylow;
set global validate_password_length6;
alter user rootlocalhost identified by 123456;
use mysql;
update user set host% where user root;
commit;
quit
EOF
systemctl restart mysqld
echo -e \e[1;35m【----------------------------------------安装Nginx】\e[0m
sleep 1
echo -e \e[1;36m【----------------------------------------设置开机启动项】\e[0m
sleep 1
touch /usr/local/script/auto_ntpdate.sh
echo #!/bin/bash /usr/local/script/auto_ntpdate.sh
echo yum info ntp ntpdate cn.ntp.org.cn
/usr/local/script/auto_ntpdate.sh
chmod ux /usr/local/script/auto_ntpdate.sh
echo /usr/local/script/auto_ntpdate.sh /etc/rc.local
chmod ux /etc/rc.local
echo -e \e[1;36m【----------------------------------------设置定时任务更新时间】
\e[0m
echo -e \e[1;36m【----------------------------------------删除文件】\e[0m
sleep 1
rm -rf apache-tomcat-8.5.47.tar.gz
rm -rf jdk-8u231-linux-x64.rpm
rm -rf mysql*
rm -rf *.sh
echo -e \e[1;36m【----------------------------------------关闭计算器拍快照】
\e[0m
sleep 1
shutdown -h now虚拟机相互免密钥
##三台主机分别生成秘钥
【123】ssh-keygen -t rsa -P -f ~/.ssh/id_rsa
##host验证
【123】vim /etc/ssh/ssh_config 在最后添加
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
##将秘钥分别拷贝给自己和别人
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub rootnode01
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub rootnode02
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub rootnode03
123456
##关闭主机拍摄快照
power off第三章 Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器占有内存少并发能力强
使用场景
高并发场景
高并发通常是指通过设计保证系统能够同时并行处理很多请求。通俗来讲高并发是指在同一个时间点有很多用户同时的访问同一 API 接口或者 Url 地址。它经常会发生在有大活跃用户量用户高聚集的业务场景中。会给服务器和硬件环境带来很大的压力负载均衡(load Balance ) 将请求/数据【均匀】分摊到多个操作单元上执行负载均衡的关键在于【均匀】[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bvCNSAlb-1656229403019)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220614162523204.png)]
2.2. 正向代理
通过代理服务器来访问服务器的过程 就叫 正向代理。
反向代理
客户只需要发送请求到代理服务器代理服务器会将请求转发给内部的服务器去处理处理完毕之后会将结果返回给客户[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbED96oQ-1656229403019)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220614163330757.png)]
Nginx源码安装
解编安启
将安装包上传到Linux虚拟机解压并把Nginx存放到指定目录 tar -zxf nginx-1.8.1.tar.gz 需要安装nginx依赖的软件 yum install gcc pcre-devel zlib-devel openssl-devel -y 配置安装路径 ./configure --prefix/opt/bdp/nginx-1.8.1 开始编译并安装nginx make make install 开启Ngxin cd /opt/bdp/nginx-1.8.1/sbin./nginxhttp://192.168.88.100/
常用命令
关闭nginx服务
kill cat /usr/local/nginx/logs/nginx.pid
nginx -s reload 修改配置后重新加载生效
nginx -s reopen 重新打开日志文件
nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确
关闭nginx
nginx -s stop :快速停止nginx
quit 完整有序的停止nginx
其他的停止nginx 方式
ps -ef | grep nginx
kill -QUIT 主进程号 从容停止Nginx
kill -TERM 主进程号 快速停止Nginx
pkill -9 nginx 强制停止Nginx
启动nginx:
nginx -c /path/to/nginx.conf
平滑重启nginx
kill -HUP 主进程号安装目录
conf 配置文件 html 静态资源文件 sbin 可执行文件 logs 日志文件
Nginx负载均衡
集群搭建 节点分布 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNFarGFH-1656229403020)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220614164329656.png)] BaseNode修改配置文件 #user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 0;
upstream bdp {
server 192.168.88.101:8080;
server 192.168.88.102:8080;
server 192.168.88.103:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://bdp;
}
}
}Tomcat配置信息 vi /opt/bdp/apache-tomcat–8.5.47/webapps/ROOT/index.jsp % page pageEncodingUTF-8 contentTypetext/html; charsetUTF-8 %
!DOCTYPE html
html langen
head
meta charsetUTF-8 /
title斗鱼直播/title
link hreffavicon.ico relicon typeimage/x-icon /
link hreffavicon.ico relshortcut icon typeimage/x-icon
/
/head
body
h1welcome to 斗鱼直播/h1
h2Server:%request.getLocalAddr() %/h2
h2Port:%request.getLocalPort() %/h2
h2Client:%request.getRemoteAddr() %/h2
h2Session:%session.getId() %/h2
hr/
img src/static/img/qbl.jpg height200px /
/body
/html启动Tomcat和Nginx 访问Nginx会依次将Tomcat页面显示到也面
负载策略
请求轮询
依次转发给配置的服务器
增加权重 使用服务器权重还可以进一步影响nginx负载均衡算法谁的权重越大分发到的请求就越多。 说你行你就行不行也行 upstream bdpweight {
server 192.168.88.101:8080 weight2;
server 192.168.88.103:8080 weight1;
}最少连接数 在连接负载最少的情况下nginx会尽量避免将过多的请求分发给繁忙的应用程序服务器而是将新请求分发给不太繁忙的服务器避免服务器过载。 upstream bdpleast {
least_conn;
server 192.168.88.101:8080;
server 192.168.88.103:8080;
}IpHash 确保来自同一客户端的请求将始终定向到同一台服务器除非此服务器不可用 upstream bdphash {
ip_hash;
server 192.168.88.101:8080;
server 192.168.88.103:;
}资源静态化
图床
由外部服务器统一管理图片https://riyugo.com/
配置静态资源 body
h1 welcome to cluster/h1
h1 服务器地址 % request.getLocalAddr() % /h1
h1 客户端地址 % request.getRemoteAddr() % /h1
h1 Session的ID % session.getId() % /h1
img width200px src/static/qbl.jpg /
/body##在Nginx的html目录下创建一个static文件夹然后存放图片
location ^~ /static/ {
root html;
}单Linux搭建多Tomcat
拷贝多台
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTH2R7I5-1656229403020)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220614201003123.png)]
环境变量 设置并执行 source /etc/profile #tomcat8080
export CATALINA_HOME/opt/bdp/apache-tomcat-8080
export CATALINA_BASE/opt/bdp/apache-tomcat-8080
export TOMCAT_HOME/opt/bdp/apache-tomcat-8080#tomcat18080
export CATALINA_HOME18080/opt/bdp/apache-tomcat-18080
export CATALINA_BASE18080/opt/bdp/apache-tomcat-18080
export TOMCAT_HOME18080/opt/bdp/apache-tomcat-18080server.xml文件 vim apache-tomcat-18080/conf/server.xml 只需要修改tomcat18080即可8080保持不变 22--默认为8005》修改为18005
Server port18005 shutdownSHUTDOWN
69--默认为8080》修改为18080
Connector port18080 protocolHTTP/1.1 connectionTimeout20000
redirectPort8443 /
116-默认为8009》修改为18009
Connector port18009 protocolAJP/1.3 redirectPort8443 /catalina.sh脚本 vim apache-tomcat-18080/bin/catalina.sh 只需要修改Tomcat18080即可修改catalina.sh ####################113行开始添加
export CATALINA_BASE$CATALINA_BASE18080
export CATALINA_HOME$CATALINA_HOME18080
export TOMCAT_HOME$TOMCAT_HOME18080启动Tomcat
./apache-tomcat-8080/bin/startup.sh
./apache-tomcat-18080/bin/startup.sh虚拟主机
虚拟主机使用的是特殊的软硬件技术它把一台运行在因特网上的服务器主机分成多台“虚拟”的主机每台虚拟主机都可以是一个独立的网站可以具有独立的域名具有完整的Intemet服务器功能WWW、FTP、Email等同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看每一台虚拟主机和一台独立的主机完全一样。分类 1、基于域名的虚拟主机通过域名来区分虚拟主机2、基于端口的虚拟主机通过端口来区分虚拟主机
基于域名 修改Window的C:\Windows\System32\drivers\etchosts 文件 192.168.88.100 www.aaa8080.com
192.168.88.100 www.bbb18080.com修改Nginx配置文件
http {
upstream miaosha {
server 192.168.88.101:8080;
server 192.168.88.102:8080;
server 192.168.88.103:8080;
}
upstream fxhh {
server 192.168.88.101:18080;
server 192.168.88.102:18080;
server 192.168.88.103:18080;
}
server {
listen 80;
server_name www.miaosha.bdp.com;
location / {
proxy_pass http://miaosha;
}
}
server {
listen 80;
server_name www.fxhh.bdp.com;
location / {
proxy_pass http://fxhh;
}
}
}基于端口 修改Window的C:\Windows\System32\drivers\etchosts 文件 192.168.88.100 www.bdp.com修改Nginx配置文件 http {
upstream port12345 {
server 192.168.88.101:8080;
server 192.168.88.102:8080;
server 192.168.88.103:8080;
}
upstream port54321 {
server 192.168.88.101:18080;
server 192.168.88.102:18080;
server 192.168.88.103:18080;
}
server {
listen 12345;
server_name www.bdp.com;
location / {
proxy_pass http://port12345;
}
}
server {
listen 54321;
server_name www.bdp.com;
location / {
proxy_pass http://port54321;
}
}
}Session一致性 节点分布 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WuxNI2F-1656229403020)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220614202050540.png)] 内存数据库 安装数据库 yum install memcached -y 开启数据库服务 systemctl status memcached 查看状态systemctl start memcached 开启systemctl enable memcached 永久开启vim /etc/sysconfig/memcached[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EweIntjN-1656229403021)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220614202218962.png)] Tomcat 拷贝jar包到当前服务器lib目录下 要注意memcached的版本 如果一个机器有多个tomcat都需要session一致 配置tomcat/conf/server.xml 相同项目如果想共享session需要把jvmRoute命名致 如果你只有一个tomcat忽略此步骤 Engine nameCatalina defaultHostlocalhost jvmRoutejvm18080
/Engine后面有配置 tomcat/conf/context.xml Manager
classNamede.javakaffee.web.msm.MemcachedBackupSessionManager
memcachedNodesn1:192.168.88.100:11211
stickytrue
lockingModeauto
sessionBackupAsyncfalse
requestUriIgnorePattern.*\.(ico|png|gif|jpg|css|js)$
sessionBackupTimeout1000
transcoderFactoryClassde.javakaffee.web.msm.serializer.kryo.KryoT
ranscoderFactory /重启Tomcat服务器 访问发现同一个server是可以共享session的但是不同server因为涉及到跨域的问题 session还是不同的需要设置cookie的domain
第四章 高并发与一致算法
数据存储历史背景
所有的计算任务和数据存储都由一台计算机完成.单节点计算 单点故障性能瓶颈 IO瓶颈内存
磁盘阵列
Raid简介 Redundant Arrays of Independent Disks 独立磁盘冗余阵列 磁盘阵列是由很多块独立的磁盘组合成一个容量巨大的磁盘组将数据存放在多块磁盘能解决IO瓶颈的问题。磁盘阵列还能利用同位检查Parity Check的观念在数组中任意一个硬盘故障时仍可读出数据在数据重构时将数据经计算后重新置入新硬盘中- ### 条带化- 磁盘冲突- 大多数磁盘对IO操作有着次数限制一旦高并发的情况下超过最大限制剩余进程就会进入等待这也就是磁盘冲突
- 解决方案- 利用条带化技术将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去,实现了进程多访问### Raid0
Raid0:低成本高读写性能存储空间利用率100%但不提供数据冗余保护一旦数据丢失无法恢复。
- RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用如视频、音频存储、临时数据缓存空间等。
- ### Raid1
Raid1又称镜像磁盘将存储方式分为工作磁盘和镜像磁盘空间利用率50%写数据会有影响读速度没影响并且一旦工作磁盘丢失数据可以从镜像磁盘直接拷贝,不会影响用户工作
### raid2
Raid2:纠错海明码磁盘冗余阵列通过海明码进行数据的校验所以导致Raid2空间开销较大海明码位运算效率低
- 海明码是一种在原始数据中加入若干校验码来进行错误检测和纠正的编码技术其中第 2n 位 1,2, 4, 8, … 是校验码其他位置是数据码
- 海明码宽度和校验码计算- 如果是 4 位数据宽度需要 4 块数据磁盘和 3 块校验磁盘- 如果是 64 位数据宽度需要 64 块 数据磁盘和 7 块校验磁盘。
- 海明码的数据冗余开销太大而且 RAID2 的数据输出性能受阵列中最慢磁盘驱动器的限制。再者海明码是按位运算 RAID2 数据重建非常耗时。### Raid3
Raid3: 采用并行访问磁盘阵列专门一个磁盘用来做数据校验其余磁盘作为数据存储盘以位和字节交叉存储。RAID3 至少需要三块磁盘不同磁盘上同一带区的数据作 XOR 校验校验值写入校验盘中。 RAID3 完好时读性能与 RAID0 完全一致并行从多个磁盘条带读取数据性能非常高同时还提供了数据容错能力。 RAID3 写入数据时必须计算与所有同条带的校验值并将新校验值写入校验盘中。 一次写操作包含了写数据块、读取同条带的数据块、计算校验值、写入校验值等多个操作系统开销非常大性能较低。 如果 RAID3 中某一磁盘出现故障不会影响数据读取可以借助校验数据和其他完好数据重建数据
### Raid4
RAID4 与 RAID3 的原理大致相同区别在于条带化的方式不同。 RAID4 按照块的方式来组织数据写操作只涉及当前数据盘和校验盘两个盘多个 I/O 请求可以同时得到处理提高了系统性能。 RAID4 按块存储可以保证单块的完整性可以避免受到其他磁盘上同条带产生的不利影响。 RAID4 提供了非常好的读性能但单一的校验盘往往成为系统性能的瓶颈。
- 数据块- 数据块也称为存储块它包含为文件系统分配的其余空间。这些数据块的大小是在创建文件系统时确定的。- 缺省情况下为数据块分配以下两种大小8 KB 的逻辑块大小和 1 KB 的段大小 (fragmentsize)。### Raid5
RAID5 应该是目前最常见的 RAID 等级它的校验数据分布在阵列中的所有磁盘上而没有采用专门的校验磁盘,对于数据和校验数据它们的写操作可以同时发生在完全不同的磁盘上。 RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时并行操作量的能力也随之增长 RAID5 当一个数据盘损坏时系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据. 重建数据时 RAID5 的性能会受到较大的影响
### Raid6
RAID6 引入双重校验的概念它可以保护阵列中同时出现两个磁盘失效时阵列仍能够继续工作不会发生数据丢失。RAID6 不仅要支持数据的恢复还要支持校验数据的恢复因此实现代价很高控制器的设计也比其他等级更复杂、更昂贵。RAID6 思想最常见的实现方式是采用两个独立的校验算法假设称为 P 和 Q 校验数据可以分别存储在两个不同的校验盘上或者分散存储在所有成员磁盘中。RAID6 具有快速的读取性能、更高的容错能力。但是它的成本要高于 RAID5 许多写性能也较差并有设计和实施非常复杂。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m94J3c6m-1656229403021)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220617150035111.png)]
## CAP原则 鱼和熊掌不可兼得有得必有失CAP定理认为一个提供数据服务的存储系统无法同时满足数据一致性、数据可用性、分区容忍性。### 概念:- Consistency 一致性这个和数据库ACID的一致性类似但这里关 注的所有数据节点上的数据一致性和正 确性而数据库的ACID关注的是在一个事务内对数据的一些约束。 系统在执行过某项操作后仍然处于一致的状态。在分布式系统中更新操作执行成功后所有的 用户都应该读取到最新值。- Availability 可用性每一个操作总是能够在一定时间内返回结果。需要注意 “一定时间”和“返回结果”。 “一定时间”是指系统结果必须在给定时间内返回。 “返回结果”是指系统返回操作成功或失败的结果。- Partition Tolerance 分区容忍性是否可以对数据进行分区。这是考虑到性能和可伸缩性。- - ### 推导:- 如果要求对数据进行分区了就说明了必须节点之间必须进行通信涉及到通信就无法确保在有限的时间内完成指定的任务- 如果要求两个操作之间要完整的进行因为涉及到通信肯定存在某一个时刻只完成一部分的业务操作在通信完成的这一段时间内数据就是不一致性的。- 如果要求保证一致性那么就必须在通信完成这一段时间内保护数据使得任何访问这些数据的操作不可用。### 结论:- 在大型网站应用中数据规模总是快速扩张的因此可伸缩性即分区容忍性必不可少规模变大以后机器数量也会变得庞大这是网络和服务器故障会频繁出现要想保证应用可用就必须保证分布式处理系统的高可用性。- 在大型网站中通常会选择强化分布式存储系统的可用性和伸缩性在某种程度上放弃一致性## 数据的一致性 数据的一致性分为三种强一致性弱一致性最终一致性### 定义:1. 一些分布式系统通过复制数据来提高系统的可靠性和容错性并且将数据的不同的副本存放在不同的机器
2. 在数据有多分副本的情况下如果网络、服务器或者软件出现故障会导致部分副本写入成功部分副本写入失败。这就造成各个副本之间的数据不一致数据内容冲突。### 模型:- 强一致性- 要求无论更新操作是在哪一个副本执行之后所有的读操作都要能获得最新的数据。
- 弱一致性- 用户读到某一操作对系统特定数据的更新需要一段时间我们称这段时间为“不一致性窗口”。
- 最终一致性- 是弱一致性的一种特例保证用户最终能够读取到某操作对系统特定数据的更新。- 从客户端来看有可能暂时获取的不是最新的数据但是最终还是能访问到最新的- 从服务端来看数据存储并复制到分布到整个系统超过半数的节点以保证数据最终一致。### 最终一致性 最终一致性包含因果一致读己之所写一致性会话一致性单调读一致性单调写一致性- 因果一致- 如果进程A通知进程B它已更新了一个数据项那么进程B的后续访问将返回更新后的值且一次写入将保证取代前一次写入。- 与进程A无因果关系的进程C的访问遵守一般的最终一致性规则。- 查询微博和评论- - 读己之所写一致性- 进程A更新了一个数据项之后总是访问到更新后的值而不会看到旧值。这是因果一致性模型的一个特例。- 读自己的数据都从主服务器去读取读其他人的数据再从从服务器去读取- 发表微博与修改微博
- 会话一致性- 这是上一个模型的实用版本它把访问存储系统的进程放到会话的上下文中。只要会话还存在系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止就要建立新的会话而且系统的保证不会延续到新的会话。- 确保会话内访问的都是最新的
- 单调读一致性- 如果进程已经看到过数据对象的某个最新值那么任何后续访问都不会返回先前的值。- 不会读取最旧的数据
- 单调写一致性- 系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性就非常难以编程了。- 按照顺序完成数据的书写## Paxos算法- Paxos算法解决的问题是分布式一致性问题即一个分布式系统中的各个进程如何就某个值决议达成一致。
- 传统节点间通信存在着两种通讯模型共享内存Shared memory、消息传递Messages passingPaxos是一个**基于消息传递的一致性算法**。### 无主模型 算法描述Paxos描述了这样一个场景有一个叫做Paxos的小岛(Island)上面住了一批居民岛上面所有的事情由一些特殊的人决定他们叫做议员(Senator)。议员的总数(Senator Count)是确定的不能更改。岛上每次环境事务的变更都需要通过一个提议(Proposal)每个提议都有一个编号(PID)这个编号是一直增长的不能倒退。每个提议都需要超过半数((Senator Count)/2 1)的议员同意才能生效。每个议员只会同意大于当前编号的提议包括已生效的和未生效的。如果议员收到小于等于当前编号的提议他会拒绝并告知对方你的提议已经有人提过了。这里的当前编号是每个议员在自己记事本上面记录的编号他不断更新这个编号。整个议会不能保证所有议员记事本上的编号总是相同的。现在议会有一个目标保证所有的议员对于提议都能达成一致的看法。现在议会开始运作所有议员一开始记事本上面记录的编号都是0。有一个议员发了一个提议将电费设定为1元/度。他首先看了一下记事本嗯当前提议编号是0那么我的这个提议的编号就是1于是他给所有议员发消息1号提议设定电费1元/度。其他议员收到消息以后查了一下记事本哦当前提议编号是0这个提议可接受于是他记录下这个提议并回复我接受你的1号提议同时他在记事本上记录当前提议编号为1。发起提议的议员收到了超过半数的回复立即给所有人发通知1号提议生效收到的议员会修改他的记事本将1好提议由记录改成正式的法令当有人问他电费为多少时他会查看法令并告诉对方1元/度。现在看冲突的解决假设总共有三个议员S1-S3S1和S2同时发起了一个提议:1号提议设定电费。S1想设为1元/度, S2想设为2元/度。结果S3先收到了S1的提议于是他做了和前面同样的操作。紧接着他又收到了S2的提议结果他一查记事本咦这个提议的编号小于等于我的当前编号1于是他拒绝了这个提议对不起这个提议先前提过了。于是S2的提议被拒绝S1正式发布了提议: 1号提议生效。S2向S1或者S3打听并更新了1号法令的内容然后他可以选择继续发起2号提议。 通俗理解小岛分布式环境普通人客户端。议员就是集群节点提议就是一次修改请求当提议投票大于一半议员人数1,便通过。最终结果一致性- 无主集群模型- 人人都会发送指令,投票- 投票人数有可能导致分区(分不同阵营)- 6个节点 33对立- 类似于以前党争- 事务编号混乱每个节点都有可能有自己的提议- 提议的编号不能重复和小于到某个议员(ZK Server)那里询问(Get)某条法令的情况(ZNode的数据)议员毫不犹豫的拿出他的记事本(local storage)查阅法令并告诉他结果同时声明我的数据不一定是最新的。你想要最新的数据没问题等着等我找总统Sync一下再告诉你。情况二屁民乙(Client)到某个议员(ZK Server)那里要求政府归还欠他的一万元钱议员让他在办公室等着自己将问题反映给了总统总统询问所有议员的意见多数议员表示欠屁民的钱一定要还于是总统发表声明从国库中拿出一万元还债国库总资产由100万变成99万。屁民乙拿到钱回去了(Client函数返回)。情况三总统突然挂了议员接二连三的发现联系不上总统于是各自发表声明推选新的总统总统大选期间政府停业拒绝屁民的请求 通俗理解再原有基础上增加了一个总统议员没有提出法令的权利只有总统才能进行法令的提出权力议员只有对法令的投票权限并且最后结果也是有总统进行广播总统死掉则由剩余议员选举数据全的议员优先在是编号大的优先。- 有主模型- 只能有一个主发送指令发送提议- 单主会单点故障肯定有备用的方案- 重新选举- 切换到备用节点- 如果存在多个主就会脑裂
- 主要集群中节点数目高于1/21集群就可以正常运行## Raft算法### 简介 Raft 适用于一个管理日志一致性的协议相比于 Paxos 协议Raft 更易于理解和去实现它。Raft 将一致性算法分为了几个部分包括**领导选取**leader selection、**日志复制**logreplication、**安全**safety **Raft将系统中的角色分为领导者Leader、跟随者Follower和候选者**Candidate- Raft有一个明确的场景就是管理复制日志的一致性。- 每台机器保存一份日志日志来自于客户端的请求包含一系列的命令状态机会按顺序执行这些命令。### 角色分配:- Leader(领导者)**接受客户端请求并向Follower同步请求日志当日志同步到大多数节点上后告诉Follower提交日志**。
- Follower(跟从者)**接受并持久化Leader同步的日志在Leader告之日志可以提交之后提交日志**。
- Candidate(候选者)**Leader选举过程中的临时角色**。### Term(任期)Raft要求系统在任意时刻最多只有一个Leader正常工作期间只有Leader和Followers。Raft算法将时间分为一个个的**任期term**每一个term的开始都是Leader选举。在成功选举Leader之后Leader会在整个term内管理整个集群。如果Leader选举失败该term就会因为没有Leader而结束。- **Raft 算法将时间划分成为任意不同长度的任期term**。任期用连续的数字进行表示。**每一个任期的开始都是一次选举election一个或多个候选人会试图成为领导人**。如果一个候选人赢得了选举它就会在该任期的剩余时间担任领导人。在某些情况下选票会被瓜分有可能没有选出领导人那么将会开始另一个任期并且立刻开始下一次选举。**Raft 算法保证在给定的一个任期最多只有一个领导人**。### RPC- **远程RPC就是如何把数据传送给其他节点的一种行为.**- **RequestVote RPC候选人在选举期间发起**- **AppendEntries RPC领导人发起的一种心跳机制复制日志也在该命令中完成**- **InstallSnapshot RPC: 领导者使用该RPC来发送快照给太落后的追随者**### Leader(领导者)选举#### 选举过程- **Raft采用心跳机制触发Leader选举。当系统启动时所有节点初始化为Follower状态设置任期为0并启动计时器计时器超时后Follower节点转化为Candidate节点一旦转化为节点立即开始做以下几件事情**1增加自己的任期数2启动一个新的计时器3给自己投一票4向所有其他节点发送RequestVote RPC请求并等待其他节点回复。- **Follower将其当前term加一然后转换为Candidate(候选人)。它首先给自己投票并且给集群中的其他服务器发送 RequestVote RPC请求**。并等待其他节点回复.结果有以下三种情况- **赢得了多数的选票成功选举为Leader**- 收到了Leader的消息表示有其它服务器已经抢先当选了Leader- 没有服务器赢得多数的选票Leader选举失败等待选举时间**超时后发起下一次选举**。 简而言之leader选举的过程是1、增加term号2、给自己投票3、重置选举超时计时器4、发送请求投票的RPC给其它节点**。### 日志复制保证数据一致性- 主要用于保证节点的一致性这阶段所做的操作也是为了保证一致性与高可用性。
- 当Leader选举出来后便开始负责客户端的请求所有事务更新操作请求都必须先经过Leader处理
- 日志复制Log Replication就是为了保证执行相同的操作序列所做的工作。
- 在Raft中当接收到客户端的日志事务请求后先把该日志追加到本地的Log中
- 然后通过heartbeat把该Entry同步给其他FollowerFollower接收到日志后记录日志然后向Leader发送ACK
- 当Leader收到大多数n/21Follower的ACK信息后将该日志设置为已提交并追加到本地磁盘中
- 通知客户端并在下个heartbeat中Leader将通知所有的Follower将该日志存储在自己的本地磁盘中。
- #### 日志组成 **日志由有序编号log index的日志条目组成**。**每个日志条目包含它被创建时的任期号term和用于状态机执行的命令**。如果一个日志条目被复制到大多数服务器上就被认为可以提交commit了。
第五章 Zookeeper
ZAB协议用途
ZABZookeeper Atomic Broadcast 协议是为分布式协调服务,zookeeper专门设计的一种支持崩溃恢复的原子广播协议。实现分布式数据一致性的核心算法,ZAB借鉴Paxos算法ZAB协议的三个阶段【发现同步广播】 发现即要求zookeeper集群必须选择出一个leader进程同时leader会维护一个follower可用列表。将来客户端可以这follower中的节点进行通信。同步leader要负责将本身的数据与follower完成同步做到多副本存储。这样也是体现了CAP中CP。follower将队列中未处理完的请求消费完成后写入本地事物日志中。广播leader可以接受客户端新的proposal请求将新的proposal请求广播给所有的follower。 协议核心 定义了对于那些会改变ZooKeeper服务器数据状态的事务请求处理方式即所有事务请求必须由一个全局唯一的服务器来协调处理这样的服务器被称为Leader服务器而余下的其他服务器称为Follower服务器。Leader服务器负责将一个客户端事务请求转换成一个事务Proposal(提议)并将该Proposal分发给集群中所有的Follower服务器。之后Leader服务器需要等待所有的Follower服务器的反馈一旦超过半数的Follower服务器进行了正确的反馈后那么Leader就会再次向所有的Follower服务器分发Commit消息要求其将前一个Proposal进提交。 ZAB协议包含两种基本模式分别是 崩溃恢复之数据恢复 当整个集群正在启动时或者当leader节点出现网络中断、崩溃等情况时ZAB协议就 会进入恢复模式并选举产生新的leader当leader服务器选举出来后并且集群中有过 半的机器和该leader节点完成数据同步后同步指的是数据同步用来保证集群中过半 的机器能够和leader服务器的数据状态保持一致ZAB协议就会退出恢复模式。 消息广播之原子广播 当集群中已经有过半的Follower节点完成了和Leader状态同步以后那么整个集群就进 入了消息广播模式。这个时候在Leader节点正常工作时启动一台新的服务器加入到 集群那这个服务器会直接进入数据恢复模式和leader节点进行数据同步。同步完成 后即可正常对外提供非事务请求的处理。
Zookeeper角色分配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WRDWPk4R-1656229403021)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220616204029470.png)]
小岛——ZK Server Cluster : 分布式集群 集群中所有修改数据的指令必须由总统发出总统是由议员投票产生的无主–有主 总统(Leader): 发提议 广播 选举条件 首先按照事务zxid进行排序如果事务相同按照myid排序 议员(Senator)——ZK Server Learner :接受客户请求 查询直接返回结果有可能数据不一致写入数据先将数据写入到当前server 发送消息给总统总统将修改数据的命令发送给其他server其他server接受命令后开始修改数据修改完成后给总统返回成功的消息当总统发现超过半数的人都修改成功就认为修改成功了并将信息传递给接受请求的zkServer,zkServer将消息返回给客户端说明数据更新完成 学习者(Learner) 跟随者(Follower): 选举投票查询 拥有选举权,拥有投票权接受客户端的访问如果客户端执行写请求只是将请求转发给Leade 观察者(Observer): 只能查询 只可以为客户端提供数据的查询和访问如果客户端执行写请求只是将请求转发给Leader
搭建Zookeeper
首先将三台虚拟机切换到相互免秘钥快照keysfree
Zookeeper命令
一、zk服务命令
1. 启动ZK服务: bin/zkServer.sh start
2. 查看ZK服务状态: bin/zkServer.sh status
3. 停止ZK服务: bin/zkServer.sh stop
4. 重启ZK服务: bin/zkServer.sh restart
5. 连接服务器: zkCli.sh -server 127.0.0.1:2181
二、连接zk
Linux环境下
eg、zkCli.sh -server 127.0.0.1:2181
三、zk客户端命令
1.ls -- 查看某个目录包含的所有文件例如
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /
ls /path
2.ls2 -- 查看某个目录包含的所有文件与ls不同的是它查看到time、version等信息例如
[zk: 127.0.0.1:2181(CONNECTED) 1] ls2 /
3.create -- 创建znode并设置初始内容例如
[zk: 127.0.0.1:2181(CONNECTED) 1] create /test test
Created /test
创建一个新的 znode节点“ test ”以及与它关联的字符串
create /path data 默认创建持久节点
create -s /path data 创建顺序节点
create -e /path data 创建临时节点
create /parent/sub/path /data
4.get -- 获取znode的数据如下
[zk: 127.0.0.1:2181(CONNECTED) 1] get /test
get /path
get /path0000000018 访问顺序节点必须输入完整路径
5.set -- 修改znode内容例如
[zk: 127.0.0.1:2181(CONNECTED) 1] set /test ricky
set /path /data
6.delete -- 删除znode例如
[zk: 127.0.0.1:2181(CONNECTED) 1] delete /test
delete /path 删除没有子节点的节点
rmr /path 移除节点并且递归移除所有子节点
7.quit -- 退出客户端
8.help -- 帮助命令Zookeeper存储模型 整个Zookeeper就是一棵树. / 是他的根节点,我们可以通过唯一路径定位一个数据 所有的数据都是以节点形式存在,路径就是节点的Key,真实存放的数据就是Value
[zk: localhost:2181(CONNECTED) 10] get /yjx
666 当前节点的值
cZxid 0xf00000013
创建这个节点的事务idZXID是一个长度64位的数字
低32位是按照数字递增即每次客户端发起一个proposal,低32位的数字简单加1。
高32位是leader周期的epoch编号
ctime Mon Dec 09 17:33:06 CST 2019 创建时间
mZxid 0xf00000013 最后一次修改节点数据的事务ID
mtime Mon Dec 09 17:33:06 CST 2019 修改时间
pZxid 0xf00000014 子节点的最新事务ID
cversion 1 对此znode的子节点进行的更改次数
dataVersion 对此znode的数据所作的修改次数
aclVersion 对此znode的acl更改次数
ephemeralOwner 0x0 持久化节点0x16ee9fc0feb0001临时节点
dataLength 3 数据的长度
numChildren 1 子节点的数目节点的分类
持久化节点 默认创建的就是持久化节点 临时节点 create -e当前临时节点属于当前会话,当会话关闭的时候节点也会被随之删除,但是临时节点存放期间可以被所有的会话访问 序列化节点 create -s就是在名字后面加上一个有序的序列号可以防止地址冲突的出现
ZKServer的监听机制
watch: 监听一个数据的变化,当数据发生改变,就会将消息发给特定的客户端, 但是只发送一次 监听数据的方式:监听状态的stat 内容的get目录结构的ls。
//watch监听有不同的类型有监听状态的stat 内容的get目录结构的ls。
get /path [watch] NodeDataChanged
stat /path [watch] NodeDeleted
ls /path [watch] NodeChildrenChangedACL权限控制(了解)
ACL权限控制
ZK的节点有5种操作权限CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限
这5种权限简写为crwda这5种权限中delete是指对子节点的删除权限其它4种权限指对自身节点的操作
权限
身份的认证有4种方式
- world默认方式相当于全世界都能访问
- auth代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授
权用户)
- digest即用户名:密码这种方式认证这也是业务系统中最常用的
- ip使用Ip地址认证
schema
world:只有一个用户anyone,代表所有人默认
ip使用IP地址认证
auth使用已添加认证的用户认证
digest使用用户名密码 方式认证
id
world:只有一个idanyone
ip通常是一个ip地址或者地址段
auth:用户名
digest自定义
权限
create 简写为c,可以创建子节点
delete 简写为d 可以删除子节点
read 简写为r 可以读取节点数据及显示子节点列表
write 简写为w 可以设置节点数据
admin 简写为a 可以设置管理权限
查看ACL
getAcl /parent
设置ACL
setAcl /parent world:anyone:r
添加用户
addauth digest zhangsan:123456
addauth digest lisi:123456
设置权限
setAcl /parent auth:zhangsan:123456:r
setAcl /parent auth:lisi:123456:rcwd
退出当前用户
quit
后续访问 /parent路径需要先添加用户
addauth digest zhangsan:123456四字命令了解
yum install nc -y使用方式在shell终端输入echo 四字命令| nc node01 2181[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ak4cxN3V-1656229403022)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220616164442039.png)]
Java访问Zookeeper了解
第六章 排序算法与大数据思维
算法复杂度
时间复杂度 预估程序运行所要花费的时间花费的时间 每次执行花费的时间 * 程序执行次数 (频度) T(n) 空间复杂度 程序运行过程所需要占用内存的大小,并不是文件的大小 可以用空间来换取时间: 判断平年闰年缓存服务器就是典型的用空间来换时间长连接: 一次链接可以发送多次请求
十大排序算法
不值钱: 冒泡 从第一个与相邻的一个进行比较,大的向后移动,然后继续进行比较,直到没有任何交换的数据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocjnKprJ-1656229403022)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\冒泡排序.gif?lastModify1655370770)] 选择 假设第一个数字就是最大数字记录他的索引然后和后面的数字进行比较如果后面的数字大于最大数字重新记录新数字的索引直到最后一个数字然后将最大数字索引与最后一个数字进行交换[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UQZIOCG-1656229403023)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\选择排序.gif?lastModify1655371154)] 插入 假设原始数据是有序的,用第二个与左边的依次进行比较,找到合适的位置插入[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26obH3ux-1656229403023)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\插入排序.gif?lastModify1655371414)] 进阶型 希尔排序 将数据递归分组首先分为 长度/2组然后将第一个数字与1组进行插入排序经过第一次在整体排序后小的数字很快会被移动到前面重新将数据分组原来组/2小的数字很快就会被移动到前面[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBlv3tSV-1656229403023)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\希尔排序.gif?lastModify1655372660)] 堆排序 基于二叉树, 左边节点小于他,右边节点大于他[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iB3WWBZB-1656229403024)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\堆排序.gif?lastModify1655382296)] 常用型 快速排序 左右前后挖坑,找一个基准点和其他数字进行比较 左边大 右边小就进行交换 找到自己所在的位置 归并排序 拆分数组,一直两辆拆分,拆分后的数组继续两两拆分,最后将最近的两个进行合并 偏方型 计数排序桶排序 将数字按照范围进行分割然后对分割后的数据进行排序继续分割) 基数排序 按照地位(个,十,百…)先排序然后收集在按照高位排序然后再收集依次类推直到最高位
十大算法时间复杂度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o7RsZt35-1656229403024)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\image-20210312154241350.png?lastModify1655371518)]
大数据思维 分而治之 查重排序 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPLpqU87-1656229403024)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220616172916826.png)]