冯诺依曼 (数学家,计算机之父)
冯诺依曼体系
输入设备
比如:键盘,鼠标等.
输出设备
打印机输出,显示器输出等
存储设备
RAM
内存随机存储 速度快,容量小,掉电易失,逻辑IO
ROM
硬盘只读内存空间 容量大,速度慢,长久保存,物理IO
CPU(中央处理器)
控制器
用来控制和指挥程序和数据的输入运行,以及处理运算结果
运算器
运行算数运算和逻辑运算,并将中间结果暂存到运算器中
机械硬盘
半机械半电子的硬盘,数据是随机存储的,所以读取速度取决于 (转速 寻到时间) 转速7200转/分 100-200M/s
寻道时间:找到对应的扇区
2.每个扇区的大小都是相同的,当我们使用磁盘时,都是以扇区为单位分配空间
3.特殊环境下,如果能保证数据读写的连续性硬盘性能会得到很大提升
固态硬盘
可以理解为多个U盘穿连在一起
读写速度的区别
IP地址IPADDR
计算机定位唯一标识
下层网络可以访问上层网络,但上层网络不能直接访问下层网络,如果要访问需要借助内网穿透
子网掩码NETMASK
划分网络地址与主机地址
默认网关GATEWAY
两个不同网络间的通讯
配置的方式
IP分类
DNS
域名解析服务器
114.114.114.114 全国
8.8.8.8 全球
host-onboy(主机模式)
真实网络和虚拟网络都是隔离的
bridged(桥接模式)
虚拟机和真实主机共享一个网络
NAT(网络地址转换模式)
给虚拟机构建一个单独的子网络
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUIqGDUp-1656229403014)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220609162906352.png)]
无网络
用来调度硬件设备
分类
应用软件
解决某些问题
操作系统
直接和硬件打交道,对于应用软件屏蔽了硬件差异
查看自己的虚拟网卡地址
编辑–>虚拟机网络编辑器–>vmnet8
vi编辑器简单使用
修改网络信息
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
重启网卡重新加载配置文件
防火墙
systemctl status firewalld (查看防火墙状态)
systemctl stop firewalld (本次服务内关闭防火墙)
systemctl disable firewalld(禁用防火墙服务)
软件安装限制
操作系统对未知软件的安装有可能拒绝或者警告,我们需要禁用这个功能
vi /etc/selinux/config
SELINUX=disabled 修改为disabled
拍摄快照
记录当前虚拟机的状态
拍摄快照的时候一定要关机
转到
克隆
克隆的方式
链接克隆
当前节点文件夹只存储差异性数据 相同数据存放在原始节点上
优点:节省硬盘空间
缺点:耦合性大
完整克隆
Linux命令与参数之间必须用空格隔开 Linux命令是区分大小写的
命令帮助文档
修改Xshell字体颜色
PS1='\[\e[36;40m\][\u@\h \W]\[\e[0m\]\\$ '
echo "PS1='\[\e[36;40m\][\u@\h \W]\[\e[0m\]\\$ '" >> ~/.bashrc
source ~/.bashrc
whereis 查询命令文件的位置
file 查看文件的类型
who 查看当前在线的用户
whoami 我是谁
pwd 我在那
uname -a 查看内核信息
echo 类似于 sout syso ,打印语句
clear 清屏
history 历史命令
. 点
$
*星号
~
空格
/
命令的参数
万事万物皆文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8slBcj2-1656229403015)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220610170044817.png)]
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)]
软连接与硬链接: 源文件连接着资源 软连接是连接的这个源文件名 源文件删了 软连接就指不到这个资源
硬链接是直接指这个资源 源文件删掉也不影响他的 调用
cat
tac
more 与 less
head
tail
从文章末尾读取N行
head -3 profile | tail -1
读取新增数据
ping www.baidu.com >>baidu
tail -F baidu
如果f:
如果F
find
打开文件
正常打开
打开文件,并将光标置于第8行
打开最后一行
打开指定搜索单词的位置
三种模式
编辑模式
编辑模式中,每一个按键都有其他的功能
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 解锁
输入模式
每一个按键按下什么,就像文本中数据输入什么
末行(命令行)模式
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)]
Window–Linux
lrzsz
需要手动安装
rz
sz 文件
xftp
Linux–Linux
scp 源数据地址(source) 目标数据地址(target)
scp apache-tomcat-7.0.61.tar.gz [email protected]:/opt
文件大小
文件压缩
tar
解压缩
压缩
zip和unzip
ifconfig
netstat
ping
telnet
curl
保护用户资料与信息安全性的一种技术
#查看防火墙状态
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
不可逆加密:
利用md5算法加密后变不回来,例如设置的密码 只能重置 不会告诉你原来设的密码是多少
对称加密:
加密和解密使用相同的秘钥 生成密钥的算法公开、计算量小、加密速度快、加密效率高、密钥较短
一方密钥被窃取,双方都影响 如果为每个客户都生成不同密钥,则密钥数量巨大,密钥管理有压力
非对称加密:
生成一对密钥,公钥加密,私钥解密 安全性高 但加密速度慢 计算量大 效率低
可以通过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)]
date 查看当前系统时间
cal 查看日历
cal 2020 查看年
修改时间
date -s 11:11:11
date -s 2019-11-11
date -s '2019-11-11 11:11:11'
第一种:
第二种:
自动同步网络时间中心本地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
用户:
新增用户 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
权限的UGO模型
权限赋予
我们可以将管理用的权限分配给普通用户
文件位置在 vim /etc/sudoers
修改这个文件需要使用命令 visudo
修改 Line 99
用户名 ALL=(root) /sbin/useradd
n1 ALL=(root) /sbin/*
如何使用
su 用户名 切用户 exit切回去
sudo useradd springmvc
管道:
将前面的命令结果作为参数传递给后面的命令
重定向:
改变数据输出的位置,方向
写出方式: > 覆盖 >> 追加
写出类型: 1 标准输出 2 错误输出
查看进程 ps -ef ps -ef | grep redis
杀死进程 kill -9 进程编号
后台进程 nohup ping www.baidu.com >> baidu 2>&1 &
ps -aux 所有信息
解压就可以使用
使用安装包安装(window-exe Linux-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
search 查询命令或者软件
info
查看包的信息
list / list jdk
查询安装的rpm包,或者只查询某一周
首先安装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依赖【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
cut:
sort:
sort lucky
sort -t’ ’ -k2 lucky
sort -t’ ’ -k2 -r lucky
sort -t’ ’ -k2 -n lucky
wc:
grep擅长查找功能,sed擅长取行和替换。awk擅长取列
什么时shell?
shell就是一个用户根操作系统打交道的一个命令解释器
Kernel
Linux内核主要是为了和硬件打交道
Shell两大主流:
#! 声明
告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
#!/bin/bash
echo "Hello World !"
定义变量时,变量名不加美元符号
变量的类型
# 变量的声明
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编程中最常用最有用的数据类型,字符串以用单引号,也可以用双引号,也可以不用引号。
单引号
双引号
双引号里可以有变量
双引号里可以出现转义字符
# 声明字符串
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}
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
# 定义数组 括号来表示数组,数组元素用"空格"符号分割开
数组名=(值1 值2 ... 值n)
favs=("足球" "蓝球" "乒乓球球" "保龄球")
# 读取数组 ${数组名[下标]}
fav=${favs[1]}
# 使用 @ 符号可以获取数组中的所有元素
echo ${favs[@]}
# 获取数组的长度
length1=${#favs[@]}
length2=${#favs[*]}
启动计算机的硬件(BIOS)
如果是Linux系统,回去找/boot目录.引导这个系统启动
计算机系统开始启动,读取初始化配置文件
开始默认引导公共的组件或者服务
开始加载对应runlevel的服务
当启动完毕,所有的服务也被加载完成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFbSab67-1656229403019)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220613163336608.png)]
rc.local
chkconfig
创建开机自启动脚本文件
vim schoolntpdate.sh
#!/bin/bash
#chkconfig: 2345 88 99
#description:auto_run
# 开机自启动同步时间
yum info ntp && ntpdate cn.ntp.org.cn
给其设置执行权限
将脚本拷贝到 /etc/init.d目录下
添加到服务
修改系统时间
重启服务器
在系统服务中心,crond负责周期任务
添加任务,编辑当前用户的任务列表
编辑任务
星 星 星 星 星 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,使配置生效
通过crontab -l
查看任务的历史
清除任务
#!/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服务
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 主进程号
节点分布
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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负载均衡算法,谁的权重越大,分发到的请求就越多。
说你行你就行不行也行
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;
}
确保来自同一客户端的请求将始终定向到同一台服务器,除非此服务器不可用
upstream bdphash {
ip_hash;
server 192.168.88.101:8080;
server 192.168.88.103:;
}
welcome to cluster
服务器地址: <%= request.getLocalAddr() %>
客户端地址: <%= request.getRemoteAddr() %>
Session的ID : <%= session.getId() %>
##在Nginx的html目录下创建一个static文件夹,然后存放图片
location ^~ /static/ {
root html;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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
vim apache-tomcat-18080/conf/server.xml
只需要修改tomcat18080即可,8080保持不变
22--默认为8005--》修改为18005
69--默认为8080--》修改为18080
116-默认为8009--》修改为18009
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
./apache-tomcat-8080/bin/startup.sh
./apache-tomcat-18080/bin/startup.sh
修改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;
}
}
}
节点分布
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WuxNI2F-1656229403020)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220614202050540.png)]
内存数据库
Tomcat
拷贝jar包到当前服务器lib目录下
如果一个机器有多个tomcat都需要session一致
配置tomcat/conf/server.xml
相同项目如果想共享session,需要把jvmRoute命名致
如果你只有一个tomcat,忽略此步骤
后面有
配置 tomcat/conf/context.xml
重启Tomcat服务器
访问发现同一个server是可以共享session的,但是不同server因为涉及到跨域的问题
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
## 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)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WRDWPk4R-1656229403021)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220616204029470.png)]
一、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就是一棵树. / 是他的根节点,我们可以通过唯一路径定位一个数据
所有的数据都是以节点形式存在,路径就是节点的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 子节点的数目
watch:
监听一个数据的变化,当数据发生改变,就会将消息发给特定的客户端, 但是只发送一次
监听数据的方式:监听状态的stat ,内容的get,目录结构的ls。
//watch监听有不同的类型,有监听状态的stat ,内容的get,目录结构的ls。
get /path [watch] NodeDataChanged
stat /path [watch] NodeDeleted
ls /path [watch] NodeChildrenChanged
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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]