Linux

第一章 Linux

1.1 计算机硬件软件体系

  • 冯诺依曼 (数学家,计算机之父)

  • 冯诺依曼体系

  1. 计算机的指令和数据都是二进制存储,并且存放到一起
  2. 程序和指令都是顺序执行的
  3. 计算机硬件由输入,输出,存储,运算器与控制器组成
  • 输入设备

    比如:键盘,鼠标等.

  • 输出设备

    打印机输出,显示器输出等

  • 存储设备

    • RAM

      内存随机存储 速度快,容量小,掉电易失,逻辑IO

    • ROM

      硬盘只读内存空间 容量大,速度慢,长久保存,物理IO

  • CPU(中央处理器)

    • 控制器

      用来控制和指挥程序和数据的输入运行,以及处理运算结果

    • 运算器

      运行算数运算和逻辑运算,并将中间结果暂存到运算器中

1.1.1 硬盘的分类

  • 机械硬盘

    1. 半机械半电子的硬盘,数据是随机存储的,所以读取速度取决于 (转速 寻到时间) 转速7200转/分 100-200M/s

      寻道时间:找到对应的扇区

      2.每个扇区的大小都是相同的,当我们使用磁盘时,都是以扇区为单位分配空间

      3.特殊环境下,如果能保证数据读写的连续性硬盘性能会得到很大提升

  • 固态硬盘

    可以理解为多个U盘穿连在一起

    读写速度的区别

    1. 固态硬盘的读取速度普遍可以达到400M/s,写入速度也可以达到130M/s以上,
    2. 固态硬盘的读写速度是普通机械硬盘的3-5倍。

1.1.2 网络连接概念

  • IP地址IPADDR

    1. 计算机定位唯一标识

    2. 下层网络可以访问上层网络,但上层网络不能直接访问下层网络,如果要访问需要借助内网穿透

  • 子网掩码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)

  1. 请求首先访问端口,这个端口有一个默认监听程序,这个程序处理这个端口的所有请求
  2. 一个端口只能被一个程序监听而一个程序可以监听多个端口
  3. 一个端口默认 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 虚拟机安装与配置

  1. 安装VM
  2. 安装虚拟机
  3. 安装操作系统

1.2.1 更改系统配置

  • 网络
  1. 查看自己的虚拟网卡地址

    编辑–>虚拟机网络编辑器–>vmnet8

  2. vi编辑器简单使用

    • 操作文档
    • 光标位置
    • dd 删除一行
    • i 将文档变成可修改模式
    • esc 退出编辑
    • :wq 保存并退出
  3. 修改网络信息

    vi /etc/sysconfig/network-scripts/ifcfg-ens33

    --修改
    ONBOOT=yes
    BOOTPROTO=static //静态网络IP dhcp 动态获取网络IP
    --添加
    IPADDR=192.168.58.100
    NETMASK=255.255.255.0
    GATEWAY=192.168.58.2
    DNS1=114.114.114.114
    删除--UUID
    
    
  4. 重启网卡重新加载配置文件

    • ip addr IP地址
    • systemctl restart network.service 重启
    • ping www.baidu.com
    • ctrl+c 终止命令的执行
  • 防火墙

    systemctl status firewalld	(查看防火墙状态)
    systemctl stop firewalld (本次服务内关闭防火墙)
    systemctl disable firewalld(禁用防火墙服务)
    
  • 软件安装限制

    操作系统对未知软件的安装有可能拒绝或者警告,我们需要禁用这个功能

vi /etc/selinux/config
	SELINUX=disabled	修改为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 ~/.bashrc
      

1.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 保存并退出
      ctrl+s 锁屏 ctrl+q 解锁
      
  • 输入模式

  • 每一个按键按下什么,就像文本中数据输入什么

  • 末行(命令行)模式

    • 我们可以直接在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 [email protected]:/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 bd1601
    • 192.168.31.102 bd1602

1.5.3 网络相关命令

  • ifconfig

    • 查看当前网卡的配置信息
    • 这个命令属于 net-tools中的一个命令,但是Centos7中minimal版并没有集成这个包
    • 所以7的时候需要自己手动安装
    • 如果没有ifconfig ,可以使用ip addr 临时代替
  • netstat

    • 查看当前网络的状态信息
    • 一个机器默认有65536个端口号[0,65535]
    • 这是一个逻辑的概念,将来我们需要使用程序监听指定的端口,等待别人的访问
    • 一个端口只能被一个程序所监听, 端口已经被占用
    • netstat -anp
    • netstat -r 核心路由表 == route
  • ping

    • 查看与目标IP地址是否能够连通
  • telnet

    • 查看与目标IP的指定端口是否能够连通
    • yum install telnet -y
    • telnet 192.168.31.44 22
  • curl

    • restful 我们所有的资源在网络上中都有唯一的定
    • 那么我们可以通过这个唯一定位标识指定的资源

1.5.4 防火墙

保护用户资料与信息安全性的一种技术

#查看防火墙状态 
	systemctl status firewalld.service 
#临时停止
  systemctl stop firewalld.service 
#禁用防火墙开机启动 
	systemctl disable firewalld.service
	
	firewall-cmd --add-port=80/tcp --permanent ##永久添加80端口
  • 开启一个端口的正确操作

    # 添加 
    	firewall-cmd --zone=public --add-port=80/tcp --permanent 
    #重新载入 
    	firewall-cmd --reload 
    #查看
    	firewall-cmd --zone=public --query-port=80/tcp
    #删除 
    	firewall-cmd --zone=public --remove-port=80/tcp --permanent
    

1.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 [email protected]

      • 免密钥传输文件 scp haoyu.txt [email protected]:~

  • 有时候known_hosts 会阻断authorized_keys因为要输入 yes

  • 解决方案1–本次

  • ssh -v -o GSSAPIAuthentication=no [email protected]

  • 解决方案2–所有

  • 修改/etc/ssh/ssh_config文件的配置,以后则不会再出现此问题

  • 最后面添加:

    StrictHostKeyChecking no 
    
    UserKnownHostsFile /dev/nul
    

免密钥流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRVOzp6K-1656229403017)(D:\优极限\大数据\大数据课程\day04-CentOS软件安装+文本编辑 + Shell编程\day04-笔记\15-相互免秘钥.png)]

  1. 主机1生成密钥对,将公钥发送给主机2
  2. 主机2储存这个密钥 主机1给主机2发送请求
  3. 主机2先验证ak文件,检测是否有这个公钥,然后随机生成个字符串用公钥加密返回给主机1
  4. 主机1用私钥解密将结果发送给主机2
  5. 主机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:11'

1.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/useradd
	n1 ALL=(root) /sbin/*
如何使用
	su 用户名   切用户 exit切回去
	sudo useradd  springmvc

1.8 管道与重定向

管道:
	将前面的命令结果作为参数传递给后面的命令
	
重定向:
	改变数据输出的位置,方向
	写出方式: > 覆盖	>> 追加
	写出类型: 1 标准输出	2 错误输出

1.9 进程

进程信息

  • ps -ef
    • UID PID PPID C STIME TTY TIME CMD
    • UID 所属用户
    • PID 当前进程编号
    • PPID 当前进程编号的父进程编号
查看进程	ps -ef     ps -ef | grep redis
杀死进程	kill -9 进程编号
后台进程	nohup ping www.baidu.com >> baidu 2>&1 &
ps -aux 	所有信息

Linux的软件安装

环境变量

  • $PATH的配置文件在 /etc/profile
  • window 路径与路径之间用;(分号)连接
  • 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/profile

export 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.sh

YUM安装

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.policy=LOW;
set global validate_password.length=6;
#更改加密方式
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
#更新用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
#刷新权限
FLUSH PRIVILEGES;
#----------修改Mysql密码 5.7版本输入命令:
set global validate_password_policy=LOW;
set global validate_password_length=6;
alter user root@localhost identified by '123456';
#----------修改Mysql链接地址
use mysql;
update user set host='%' where user = 'root';
commit;
exit;
systemctl restart mysqld;
#----------使用Navicat连接Mysql

Linux三剑客

普通剑客

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 lucky
  • 4 15 79 lucky
    • -| line
    • -w word 以空格来分割单词
    • -c char

三剑客

grep擅长查找功能,sed擅长取行和替换。awk擅长取列

剑客一号: grep
  • 可以对文本进行搜索
  • 同时搜索多个文件
    • 从文档中查询指定的数据
    • grep adm passwd
    • grep bdp passwd lucky
  • 显示匹配的行号
    • grep -n bdp passwd
  • 显示不匹配的忽略大小写
    • grep -nvi root passwd --color=auto
  • 使用正则表达式匹配
    • grep -E “[1-9]+” passwd --color=auto
剑客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,m+n]
    • m~n–>从m行开始,依次累加n
    • m,$ -->从m开始到最后一行
    • /bdp/ -->匹配到bdp的行
    • /u1/,/u4/–>从匹配u1到匹配u4
    • sed ‘2a luckyisgood’ passwd
    • sed ‘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 shell(sh) ,Solaris,hpux默认shell
      • Bourne again shell(bash) ,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变量中有一部分是环境变量,有一部分是局部变量
  • # 变量的声明
    name="zhangsan"
    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. 也不能删除
    url="https://www.google.com"
    readonly url
    url="https://www.runoob.com"
    # 删除变量
    unset name
    

Shell字符串

  • 字符串是shell编程中最常用最有用的数据类型,字符串以用单引号,也可以用双引号,也可以不用引号。

  • 单引号

    • 单引号里的任何字符都会原样输出,单引号字符串中的变是无效的;
    • 单引号字串中不能出现单独一个的单引号,但可成对出现,作为字符串拼接使用。
  • 双引号

    • 双引号里可以有变量

    • 双引号里可以出现转义字符

    • # 声明字符串
      str1="hello world 1"
      str2='hello world 2'
      # 字符串拼接--双引号
      name='sunwukong'
      name1="hello, "$name" !"
      name2="hello, ${name} !"
      # 字符串拼接--单引号
      passwd='123456'
      passwd1='hello, '$passwd' !'
      passwd2='hello, ${passwd} !'
      echo $passwd2 # hello, ${passwd} !
      # 字符串的长度
      email="[email protected]"
      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
    • 以runlevel=3开始启动对应的服务和组件
  • 开始默认引导公共的组件或者服务

    • 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命令查看当前虚拟机的服务
  • 通过查看可以得知不同的级别对应到每一个服务确定本次开机自动启动
  • 开机结束后,我们需要使用service(Centos6)Systemctl(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 u+x 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列表示分钟0~59 每分钟用*或者 */2表示
      第2列表示小时0~23(0表示0点)
      第3列表示日期1~31

      第4列表示月份1~12
      第5列标识号星期0~6(0表示星期天)
      第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 fileformat=unix 即可解决换行问题
## 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 SELINUX=disabled' /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
temppasswd=`grep "A temporary password" /var/log/mysqld.log | awk '{ print
$NF}'`
mysql -uroot -p$temppasswd --connect-expired-password << EOF
set global validate_password_policy=low;
set global validate_password_length=6;
alter user root@localhost 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 u+x /usr/local/script/auto_ntpdate.sh
echo '/usr/local/script/auto_ntpdate.sh' >> /etc/rc.local
chmod u+x /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 root@node01
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03
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
    • ./nginx
    • http://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 pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
      
      
      
      
      斗鱼直播
      
      
      
      
      

      welcome to 斗鱼直播

      Server:<%=request.getLocalAddr() %>

      Port:<%=request.getLocalPort() %>

      Client:<%=request.getRemoteAddr() %>

      Session:<%=session.getId() %>


  • 启动Tomcat和Nginx

    • 访问Nginx,会依次将Tomcat页面显示到也面

负载策略

请求轮询

  • 依次转发给配置的服务器

增加权重

  • 使用服务器权重,还可以进一步影响nginx负载均衡算法,谁的权重越大,分发到的请求就越多。

  • 说你行你就行不行也行

  • upstream bdpweight {
    server 192.168.88.101:8080 weight=2;
    server 192.168.88.103:8080 weight=1;
    }
    

最少连接数

  • 在连接负载最少的情况下,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/

配置静态资源

  • 
    

    welcome to cluster

    服务器地址: <%= request.getLocalAddr() %>

    客户端地址: <%= request.getRemoteAddr() %>

    Session的ID : <%= session.getId() %>

  • ##在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-18080
    

server.xml文件

  • vim apache-tomcat-18080/conf/server.xml

  • 只需要修改tomcat18080即可,8080保持不变

  • 22--默认为8005--》修改为18005
    
    69--默认为8080--》修改为18080
    
    116-默认为8009--》修改为18009
    
    

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,忽略此步骤

      • 
        后面有
        
    • 配置 tomcat/conf/context.xml

      • 
        
      • 重启Tomcat服务器

    • 访问发现同一个server是可以共享session的,但是不同server因为涉及到跨域的问题

      • session还是不同的,需要设置cookie的domain

第四章 高并发与一致算法

数据存储历史背景

  • 所有的计算任务和数据存储都由一台计算机完成.
  • 单节点计算
    • 单点故障
    • 性能瓶颈
      • IO瓶颈
      • 内存

磁盘阵列

Raid简介

  • Redundant Arrays of Independent Disks( 独立磁盘冗余阵列

  • 	磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,将数据存放在多块磁盘能解决IO瓶颈的问题。
    	磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中
    
  
- ![img](https://img-blog.csdnimg.cn/1935a9234533416b8c2146f91416cced.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5q-P5pel5bCP5paw,size_20,color_FFFFFF,t_70,g_se,x_16)

### 条带化

- 磁盘冲突
  - 大多数磁盘对IO操作有着次数限制,一旦高并发的情况下,超过最大限制,剩余进程就会进入等待,这也就是磁盘冲突
- 解决方案
  - 利用条带化技术将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去,实现了进程多访问
  
### Raid0

Raid0:低成本,高读写性能,存储空间利用率100%,但不提供数据冗余保护,一旦数据丢失无法恢复。

- RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用,如视频、音频存储、临时数据缓存空间等。
- ![image-20220615142156663](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615142156663.png)

### Raid1

Raid1:又称镜像磁盘,将存储方式分为工作磁盘和镜像磁盘,空间利用率50%,写数据会有影响,读速度没影响,并且一旦工作磁盘丢失数据,可以从镜像磁盘直接拷贝,不会影响用户工作

![image-20220615142740177](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615142740177.png)



### raid2

Raid2:纠错海明码磁盘冗余阵列,通过海明码进行数据的校验,所以导致Raid2空间开销较大,海明码位运算,效率低

- 海明码是一种在原始数据中加入若干校验码来进行错误检测和纠正的编码技术,其中第 2n 位( 1,2, 4, 8, … )是校验码,其他位置是数据码
- 海明码宽度和校验码计算
  - 如果是 4 位数据宽度需要 4 块数据磁盘和 3 块校验磁盘
  - 如果是 64 位数据宽度需要 64 块 数据磁盘和 7 块校验磁盘。
- 海明码的数据冗余开销太大,而且 RAID2 的数据输出性能受阵列中最慢磁盘驱动器的限制。再者,海明码是按位运算, RAID2 数据重建非常耗时。
  


![image-20220615142801275](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615142801275.png)



### Raid3

Raid3: 采用并行访问磁盘阵列,专门一个磁盘用来做数据校验,其余磁盘作为数据存储盘,以位和字节交叉存储。RAID3 至少需要三块磁盘,不同磁盘上同一带区的数据作 XOR 校验,校验值写入校验盘中。
RAID3 完好时读性能与 RAID0 完全一致,并行从多个磁盘条带读取数据,性能非常高,同时还提供了数据容错能力。
RAID3 写入数据时,必须计算与所有同条带的校验值,并将新校验值写入校验盘中。
一次写操作包含了写数据块、读取同条带的数据块、计算校验值、写入校验值等多个操作,系统开销非常大,性能较低。
如果 RAID3 中某一磁盘出现故障,不会影响数据读取,可以借助校验数据和其他完好数据重建数据

![image-20220615142819350](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615142819350.png)



### Raid4

RAID4 与 RAID3 的原理大致相同,区别在于条带化的方式不同。
RAID4 按照块的方式来组织数据,写操作只涉及当前数据盘和校验盘两个盘,多个 I/O 请求可以同时得到处理,提高了系统性能。
RAID4 按块存储可以保证单块的完整性,可以避免受到其他磁盘上同条带产生的不利影响。
RAID4 提供了非常好的读性能,但单一的校验盘往往成为系统性能的瓶颈。

- 数据块
  - 数据块也称为存储块,它包含为文件系统分配的其余空间。这些数据块的大小是在创建文件系统时确定的。
  - 缺省情况下,为数据块分配以下两种大小:8 KB 的逻辑块大小和 1 KB 的段大小 (fragmentsize)。

![image-20220615142831798](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615142831798.png)



### Raid5

RAID5 应该是目前最常见的 RAID 等级,它的校验数据分布在阵列中的所有磁盘上,而没有采用专门的校验磁盘,对于数据和校验数据,它们的写操作可以同时发生在完全不同的磁盘上。
RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时,并行操作量的能力也随之增长
RAID5 当一个数据盘损坏时,系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据.
重建数据时, RAID5 的性能会受到较大的影响

![image-20220615142845848](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615142845848.png)



### 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:

  > 分区容忍性,是否可以对数据进行分区。这是考虑到性能和可伸缩性。

- ![image-20220615145059634](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615145059634.png)

- ![img](https://img-blog.csdnimg.cn/71f5603f58724a44a2cb96d5d4246b8c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5q-P5pel5bCP5paw,size_20,color_FFFFFF,t_70,g_se,x_16)



### 推导:

- >  如果要求对数据进行分区了,就说明了必须节点之间必须进行通信,涉及到通信,就无法确保在有限的时间内完成指定的任务

- >   如果要求两个操作之间要完整的进行,因为涉及到通信,肯定存在某一个时刻只完成一部分的业务操作,在通信完成的这一段时间内,数据就是不一致性的。

- >  如果要求保证一致性,那么就必须在通信完成这一段时间内保护数据,使得任何访问这些数据的操作不可用。

### 结论:

- >  	在大型网站应用中,数据规模总是快速扩张的,因此可伸缩性即分区容忍性必不可少,规模变大以后,机器数量也会变得庞大,这是网络和服务器故障会频繁出现,要想保证应用可用,就必须保证分布式处理系统的高可用性。

- > 在大型网站中,通常会选择强化分布式存储系统的可用性和伸缩性,在某种程度上放弃一致性



## 数据的一致性

> 数据的一致性分为三种:强一致性,弱一致性,最终一致性

### 定义:

1. 一些分布式系统通过复制数据来提高系统的可靠性和容错性,并且将数据的不同的副本存放在不同的机器
2. 在数据有多分副本的情况下,如果网络、服务器或者软件出现故障,会导致部分副本写入成功,部分副本写入失败。这就造成各个副本之间的数据不一致,数据内容冲突。

### 模型:

- 强一致性
  - 要求无论更新操作是在哪一个副本执行,之后所有的读操作都要能获得最新的数据。
- 弱一致性
  - 用户读到某一操作对系统特定数据的更新需要一段时间,我们称这段时间为“不一致性窗口”。
- 最终一致性
  - 是弱一致性的一种特例,保证用户最终能够读取到某操作对系统特定数据的更新。
  - 从客户端来看,有可能暂时获取的不是最新的数据,但是最终还是能访问到最新的
  - 从服务端来看,数据存储并复制到分布到整个系统超过半数的节点,以保证数据最终一致。



### 最终一致性

> 最终一致性包含:因果一致,读己之所写一致性,会话一致性,单调读一致性,单调写一致性

- 因果一致
  - 如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。
  - 与进程A无因果关系的进程C的访问,遵守一般的最终一致性规则。
  - 查询微博和评论
  - ![image-20220615151759407](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615151759407.png)



- 读己之所写一致性
  - 进程A更新了一个数据项之后,总是访问到更新后的值而不会看到旧值。这是因果一致性模型的一个特例。
  - 读自己的数据都从主服务器去读取,读其他人的数据再从从服务器去读取
  - 发表微博与修改微博
- 会话一致性
  - 这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。
  - 确保会话内访问的都是最新的
- 单调读一致性
  - 如果进程已经看到过数据对象的某个最新值,那么任何后续访问都不会返回先前的值。
  - 不会读取最旧的数据
- 单调写一致性
  - 系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性,就非常难以编程了。
  - 按照顺序完成数据的书写



## Paxos算法

- Paxos算法解决的问题是分布式一致性问题,即一个分布式系统中的各个进程如何就某个值(决议)达成一致。
- 传统节点间通信存在着两种通讯模型:共享内存(Shared memory)、消息传递(Messages passing),Paxos是一个**基于消息传递的一致性算法**。

### 无主模型

> 算法描述
> 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-S3,S1和S2同时发起了一个提议:1号提议,设定电费。S1想设为1元/度, S2想设为2元/度。结果S3先收到了S1的提议,于是他做了和前面同样的操作。紧接着他又收到了S2的提议,结果他一查记事本,咦,这个提议的编号小于等于我的当前编号1,于是他拒绝了这个提议:对不起,这个提议先前提过了。于是S2的提议被拒绝,S1正式发布了提议: 1号提议生效。S2向S1或者S3打听并更新了1号法令的内容,然后他可以选择继续发起2号提议。



> 通俗理解:小岛:分布式环境,普通人:客户端。议员就是集群节点,提议就是一次修改请求,当提议投票大于一半议员人数+1,便通过。最终结果一致性

- 无主集群模型
  - 人人都会发送指令,投票
    - 投票人数有可能导致分区(分不同阵营),
      - 6个节点 33对立
      - 类似于以前党争
    - 事务编号混乱,每个节点都有可能有自己的提议
      - 提议的编号不能重复和小于

![img](https://img-blog.csdnimg.cn/cc639ceb26524068a876e6b388ad5095.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5q-P5pel5bCP5paw,size_20,color_FFFFFF,t_70,g_se,x_16)

![image-20220615153535477](C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220615153535477.png



### 有主模型

> 如果Paxos岛上的议员人人平等,在某种情况下会由于提议的冲突而产生一个“活锁”(所谓活锁我的理解是大家都没有死,都在动,但是一直解决不了冲突问题)。Paxos的作者在所有议员中设立一个总统,只有总统有权发出提议,如果议员有自己的提议,必须发给总统并由总统来提出。
> 情况一:屁民甲(Client)到某个议员(ZK Server)那里询问(Get)某条法令的情况(ZNode的数据),议员毫不犹豫的拿出他的记事本(local storage),查阅法令并告诉他结果,同时声明:我的数据不一定是最新的。你想要最新的数据?没问题,等着,等我找总统Sync一下再告诉你。
> 情况二:屁民乙(Client)到某个议员(ZK Server)那里要求政府归还欠他的一万元钱,议员让他在办公室等着,自己将问题反映给了总统,总统询问所有议员的意见,多数议员表示欠屁民的钱一定要还,于是总统发表声明,从国库中拿出一万元还债,国库总资产由100万变成99万。屁民乙拿到钱回去了(Client函数返回)。
> 情况三:总统突然挂了,议员接二连三的发现联系不上总统,于是各自发表声明,推选新的总统,总统大选期间政府停业,拒绝屁民的请求



> 通俗理解:再原有基础上增加了一个总统,议员没有提出法令的权利,只有总统才能进行法令的提出权力,议员只有对法令的投票权限,并且最后结果也是有总统进行广播,总统死掉则由剩余议员选举,数据全的议员优先,在是编号大的优先。

- 有主模型
  - 只能有一个主发送指令,发送提议
  - 单主会单点故障,肯定有备用的方案
    - 重新选举
    - 切换到备用节点
  - 如果存在多个主就会脑裂
- 主要集群中节点数目高于1/2+1,集群就可以正常运行

![img](https://img-blog.csdnimg.cn/92477c32c2cf4395afc81ae2c6784814.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5q-P5pel5bCP5paw,size_20,color_FFFFFF,t_70,g_se,x_16)



## Raft算法

### 简介

> ​		Raft 适用于一个管理日志一致性的协议,相比于 Paxos 协议Raft 更易于理解和去实现它。
> Raft 将一致性算法分为了几个部分,包括**领导选取**(leader selection)、**日志复制**(log
> replication)、**安全**(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同步给其他Follower,Follower接收到日志后记录日志然后向Leader发送ACK
- 当Leader收到大多数(n/2+1)Follower的ACK信息后将该日志设置为已提交并追加到本地磁盘中
- 通知客户端并在下个heartbeat中Leader将通知所有的Follower将该日志存储在自己的本地磁盘中。
- 

![](D:\优极限\大数据\大数据课程\day05-Nginx与一致性算法\02.高并发与一致性算法\004_reference\05-Raft.jpg)

#### 日志组成

> **日志由有序编号(log index)的日志条目组成**。**每个日志条目包含它被创建时的任期号(term)和用于状态机执行的命令**。如果一个日志条目被复制到大多数服务器上,就被认为可以提交(commit)了。

![img](https://img-blog.csdnimg.cn/20190810105900139.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhYWlrdWFpY2h1YW4=,size_16,color_FFFFFF,t_70)








第五章 Zookeeper

ZAB协议用途

  • ZAB(Zookeeper 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
创建这个节点的事务id,ZXID是一个长度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] NodeChildrenChanged

ACL权限控制(了解)

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:只有一个id,anyone
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?lastModify=1655370770)]
    • 选择
      • 假设第一个数字就是最大数字,记录他的索引
      • 然后和后面的数字进行比较,如果后面的数字大于最大数字,重新记录新数字的索引
      • 直到最后一个数字,然后将最大数字索引与最后一个数字进行交换
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UQZIOCG-1656229403023)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\选择排序.gif?lastModify=1655371154)]
    • 插入
      • 假设原始数据是有序的,用第二个与左边的依次进行比较,找到合适的位置插入
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26obH3ux-1656229403023)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\插入排序.gif?lastModify=1655371414)]
  • 进阶型
    • 希尔排序
      • 将数据递归分组,首先分为 长度/2组
      • 然后将第一个数字与1组进行插入排序,经过第一次在整体排序后,小的数字很快会被移动到前面
      • 重新将数据分组,原来组/2
      • 小的数字很快就会被移动到前面
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBlv3tSV-1656229403023)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\希尔排序.gif?lastModify=1655372660)]
    • 堆排序
      • 基于二叉树, 左边节点小于他,右边节点大于他
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iB3WWBZB-1656229403024)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\堆排序.gif?lastModify=1655382296)]
  • 常用型
    • 快速排序
      • 左右前后挖坑,找一个基准点和其他数字进行比较 左边大 右边小就进行交换 找到自己所在的位置
    • 归并排序
      • 拆分数组,一直两辆拆分,拆分后的数组继续两两拆分,最后将最近的两个进行合并
  • 偏方型
    • 计数排序
    • 桶排序
      • 将数字按照范围进行分割
      • 然后对分割后的数据进行排序(继续分割)
    • 基数排序
      • 按照地位(个,十,百…)先排序,然后收集,在按照高位排序,然后再收集,依次类推,直到最高位

十大算法时间复杂度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o7RsZt35-1656229403024)(file://D:\优极限\大数据课程\day06-Zookeeper与排序算法\02.排序算法与大数据思维\006_document\02.排序算法与大数据思维.assets\image-20210312154241350.png?lastModify=1655371518)]

大数据思维

  • 分而治之

    • 查重
    • 排序
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPLpqU87-1656229403024)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220616172916826.png)]

你可能感兴趣的:(服务器,linux,网络)