提交 6a868df1 编写于 作者: G guide

[refractor]重构Linux部分内容

上级 57969876
......@@ -30,7 +30,7 @@
> 关于内核多插一嘴:内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,决定着系统的性能和稳定性。是连接应用程序和硬件的桥梁。
> 内核就是操作系统背后黑盒的核心。
![操作系统分内核与外壳](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/a72a930ca61bc2b424bb900c94c063cf.png)
![操作系统分内核与外壳](images/操作系统内核和外核.png)
### 1.2 系统调用
......
点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
<!-- MarkdownTOC -->
- [一 从认识操作系统开始](#一-从认识操作系统开始)
- [1.1 操作系统简介](#11-操作系统简介)
- [1.2 操作系统简单分类](#12-操作系统简单分类)
- [二 初探Linux](#二-初探linux)
- [2.1 Linux简介](#21-linux简介)
- [2.2 Linux诞生简介](#22-linux诞生简介)
- [2.3 Linux的分类](#23-linux的分类)
- [三 Linux文件系统概览](#三-linux文件系统概览)
- [3.1 Linux文件系统简介](#31-linux文件系统简介)
- [3.2 文件类型与目录结构](#32-文件类型与目录结构)
- [四 Linux基本命令](#四-linux基本命令)
- [4.1 目录切换命令](#41-目录切换命令)
- [4.2 目录的操作命令(增删改查)](#42-目录的操作命令增删改查)
- [4.3 文件的操作命令(增删改查)](#43-文件的操作命令增删改查)
- [4.4 压缩文件的操作命令](#44-压缩文件的操作命令)
- [4.5 Linux的权限命令](#45-linux的权限命令)
- [4.6 Linux 用户管理](#46-linux-用户管理)
- [4.7 Linux系统用户组的管理](#47-linux系统用户组的管理)
- [4.8 其他常用命令](#48-其他常用命令)
<!-- /MarkdownTOC -->
推荐一个Github开源的Linux学习指南(Java工程师向):<https://github.com/judasn/Linux-Tutorial>
> 学习Linux之前,我们先来简单的认识一下操作系统。
## 从认识操作系统开始
## 从认识操作系统开始
### 1.1 操作系统简介
### 操作系统简介
我通过以下四点介绍什么是操作系统:
- **操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石;**
- **操作系统本质上是运行在计算机上的软件程序 ;**
- **为用户提供一个与系统交互的操作界面 ;**
- **操作系统分内核与外壳(我们可以把外壳理解成围绕着内核的应用程序,而内核就是能操作硬件的程序)。**
1. **操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机系统的Linux与基石;**
2. **操作系统本质上是运行在计算机上的软件程序 ;**
3. **操作系统为用户提供一个与系统交互的操作界面 ;**
4. **操作系统分Linux与外壳(我们可以把外壳理解成围绕着Linux的应用程序,而Linux就是能操作硬件的程序)。**
![操作系统分内核与外壳](https://user-gold-cdn.xitu.io/2018/7/3/1645ee3dc5cf626e?w=862&h=637&f=png&s=23899)
### 1.2 操作系统简单分类
> Linux(Kernel)在后文会提到。
1. **Windows:** 目前最流行的个人桌面操作系统 ,不做多的介绍,大家都清楚。
2. **Unix:** 最早的多用户、多任务操作系统 .按照操作系统的分类,属于分时操作系统。Unix 大多被用在服务器、工作站,现在也有用在个人计算机上。它在创建互联网、计算机网络或客户端/服务器模型方面发挥着非常重要的作用。
![Unix](https://user-gold-cdn.xitu.io/2018/7/3/1645ee83f036846d?w=1075&h=475&f=png&s=914462)
3. **Linux:** Linux是一套免费使用和自由传播的类Unix操作系统.Linux存在着许多不同的Linux版本,但它们都使用了 **Linux内核** 。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
![操作系统分Linux与外壳](images/操作系统Linux和外核.png)
![Linux](https://user-gold-cdn.xitu.io/2018/7/3/1645eeb8e843f29d?w=426&h=240&f=png&s=32650)
### 操作系统简单分类
#### Windows
### 1.3 操作系统的内核
目前最流行的个人桌面操作系统 ,不做多的介绍,大家都清楚。界面简单易操作,软件生态非常好。
**图源:
[简书](https://www.jianshu.com/p/85e931636f27) (如有侵权,请联系俺,俺会立刻删除)**
*玩玩电脑游戏还是必须要有 Windows 的,所以我现在是一台Windows用于玩游戏,一台Mac 用于平时日常开发和学习使用。*
操作系统的内核是操作系统的核心部分。
它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。
#### Unix
我们常说的Linux,其实是指基于Linux内核开发的操作系统。
常见的Linux系统发行版有:Debian,RedHat,Ubuntu,Suse,Centeos等等。
最早的多用户、多任务操作系统 。按照操作系统的分类,属于分时操作系统。Unix 大多被用在服务器、工作站,现在也有用在个人计算机上。它在创建互联网、计算机网络或客户端/服务器模型方面发挥着非常重要的作用。
### 操作系统的用户态与内核态
目前这款操作系统已经逐渐逐渐退出操作系统的舞台。
unix与linux的体系架构:分为用户态与内核态。
用户态与内核态是操作系统对执行权限进行分级后的不同的运行模式。
![Unix](images/操作系统简单分类.png)
![用户态与内核态](../../media/pictures/linux/用户态与内核态.png)
#### Linux
#### 为什么要有用户态与内核态?
在cpu的所有指令中,有些指令是非常危险的,如果使用不当,将会造成系统崩溃等后果。
为了避免这种情况发生,cpu将指令划分为**特权级(内核态)指令****非特权级(用户态)指令。**
**Linux是一套免费使用、开源的类Unix操作系统。** Linux存在着许多不同的Linux版本,但它们都使用了 **LinuxLinux**
**对于那些危险的指令只允许内核及其相关模块调用,对于那些不会造成危险的指令,就允许用户应用程序调用。**
严格来讲,Linux这个词本身只表示LinuxLinux,在 GNU/Linux 系统中,Linux 实际就是Linux组件,而该系统的其余部分主要是由 GNU 工程编写和提供的程序组成。单独的 Linux Linux并不能成为一个可以正常工作的操作系统。
* 内核态(核心态,特权态): **内核态是操作系统内核运行的模式。**
内核态控制计算机的硬件资源,如硬件设备,文件系统等等,并为上层应用程序提供执行环境。
> 很多人更倾向使用 “GNU/Linux” 一词来表达人们通常所说的 “Linux”。
* 用户态: **用户态是用户应用程序运行的状态。**
应用程序必须依托于内核态运行,因此用户态的态的操作权限比内核态是要低的,
如磁盘,文件等,访问操作都是受限的。
![Linux](images/Linux-Logo.png)
* 系统调用: 系统调用是操作系统为应用程序提供能够访问到内核态的资源的接口。
#### Mac OS
#### 用户态切换到内核态的几种方式
* 系统调用: 系统调用是用户态主动要求切换到内核态的一种方式,
用户应用程序通过操作系统调用内核为上层应用程序开放的接口来执行程序。
苹果自家的操作系统,编程体验和 Linux相当,但是界面、软件生态以及用户体验各方面都要比 Linux 操作系统更好。
* 异常: 当cpu在执行用户态的应用程序时,发生了某些不可知的异常。
于是当前用户态的应用进程切换到处理此异常的内核的程序中去。
### 操作系统的Linux(Kernel)
* 硬件设备的中断: 当硬件设备完成用户请求后,会向cpu发出相应的中断信号,
这时cpu会暂停执行下一条即将要执行的指令,转而去执行与中断信号对应的应用程序,
如果先前执行的指令是用户态下程序的指令,那么这个转换过程也是用户态到内核台的转换。
我们先来看看维基百科对于Linux的解释,我觉得总结的非常好!
#### 物理内存RAM(Random Access Memory 随机存储器)
物理内存是计算机的实际内存大小,它直接与CPU交换数据,也被称为主存。
> **Linux**(英语:Kernel,又称核心)在计算机科学中是一个用来管理软件发出的数据I/O(输入与输出)要求的电脑程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及电脑中其他电子组件进行处理,是现代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由Linux决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以Linux通常提供一种硬件抽象的方法,来完成这些操作。有了这个,通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。
>
> 严格地说,Linux并不是计算机系统中必要的组成部分。有些程序可以直接地被调入计算机中执行;这样的设计,说明了设计者不希望提供任何硬件抽象和操作系统的支持;它常见于早期计算机系统的设计中。但随着电脑技术的发展,最终,一些辅助性程序,例如程序加载器和调试器,被设计到机器Linux当中,或者写入在只读记忆体里。这些变化发生时,操作系统Linux的概念就渐渐明晰起来了!
#### 虚拟内存(Virtual Memory)
**虚拟内存是操作系统为了更高效率使用物理内存的一种概念,它是对物理内存的抽象。**
windows上的虚拟内存和Linux上的swap交换空间都是虚拟内存的一种实现技术。
简单概括两点:
#### Swap交换空间
简单理解: 当某个应用程序所需的内存空间不够了,
那么系统会判断当前物理内存是否还有足够的空闲可以分配给应用程序。
如果有,则应用程序直接进入内存运行;如果没有,系统就根据某种算法(如:LRU)挂起一个进程,
将挂起的进程交换到虚拟内存Swap中等待,并将应用程序调入内存执行。
虚拟内存是被虚拟出来的,可以使用硬盘(不仅仅是硬盘)来作为虚拟内存。
1. 操作系统的Linux(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。
2. 操作系统的Linux是连接应用程序和硬件的桥梁,决定着操作系统的性能和稳定性。
这就是为什么当我们运行一个所需内存比我们计算机内存还大的程序时,仍然可以正常运行,并感受不到内存的限制的原因。
### 中央处理器(CPU,Central Processing Unit)
## 二 初探Linux
简单概括三点:
### 2.1 Linux简介
1. CPU 是一台计算机的运算核心(Core)+控制核心( Control Unit),可以称得上是计算机的大脑。
2. CPU 主要包括两个部分,即控制器、运算器。
3. CPU的根本任务就是执行指令,对计算机来说最终都是一串由“0”和“1”组成的序列。
我们上面已经介绍到了Linux,我们这里只强调三点。
- **类Unix系统:** Linux是一种自由、开放源码的类似Unix的操作系统
- **Linux内核:** 严格来说,Linux这个词本身只表示Linux内核
- **Linux之父:** 一个编程领域的传奇式人物。他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者,是当今世界最著名的电脑程序员、黑客之一。他还发起了Git这个开源项目,并为主要的开发者
很多人容易无法区分操作系统的Linux(Kernel)和中央处理器(CPU),你可以简单从下面两点来区别:
1. 操作系统的Linux(Kernel)属于操作系统层面,而CPU属于硬件。
2. CPU 主要提供运算,处理各种指令的能力。Linux(Kernel)主要负责系统管理比如内存管理,它屏蔽了对硬件的操作
![Linux](https://user-gold-cdn.xitu.io/2018/7/3/1645ef0a5a4f137f?w=270&h=376&f=png&s=193487)
<img src="https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/1200px-Kernel_Layout.svg.png" alt="Kernel (operating system) - Wikipedia" style="zoom:50%;" />
### 2.2 Linux诞生简介
### 系统调用
- 1991年,芬兰的业余计算机爱好者Linus Torvalds编写了一款类似Minix的系统(基于微内核架构的类Unix操作系统)被ftp管理员命名为Linux 加入到自由软件基金的GNU计划中;
- Linux以一只可爱的企鹅作为标志,象征着敢作敢为、热爱生活。
介绍系统调用之前,我们先来了解一下用户态和系统态。
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
### 2.3 Linux的分类
1. **用户态(user mode)** : 用户态运行的进程或可以直接读取用户程序的数据。
2. **系统态(kernel mode)**: 可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。
**Linux根据原生程度,分为两种:**
说了用户态和系统态之后,那么什么是系统调用呢?
1. **内核版本:** Linux不是一个操作系统,严格来讲,Linux只是一个操作系统中的内核。内核是什么?内核建立了计算机软件与硬件之间通讯的平台,内核提供系统服务,比如文件管理、虚拟内存、设备I/O等;
2. **发行版本:** 一些组织或公司在内核版基础上进行二次开发而重新发行的版本。Linux发行版本有很多种(ubuntu和CentOS用的都很多,初学建议选择CentOS),如下图所示:
![Linux发行版本](https://user-gold-cdn.xitu.io/2018/7/3/1645efa7048fd018?w=548&h=274&f=png&s=99213)
我们运行的程序基本都是运行在用户态,如果我们调用操作系统提供的系统态级别的子功能咋办呢?那就需要系统调用了!
也就是说在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
## 三 Linux文件系统概览
这些系统调用按功能大致可分为如下几类:
### 3.1 Linux文件系统简介
- 设备管理。完成设备的请求或释放,以及设备启动等功能。
- 文件管理。完成文件的读、写、创建及删除等功能。
- 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
- 进程通信。完成进程之间的消息传递或信号传递等功能。
- 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
**在Linux操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。**
## 初探Linux
也就是说在LINUX系统中有一个重要的概念:**一切都是文件**。其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。
### Linux简介
我们上面已经介绍到了Linux,我们这里只强调三点。
- **类Unix系统** : Linux是一种自由、开放源码的类似Unix的操作系统
- **Linux 本质是指 Linux Linux** : 严格来讲,Linux这个词本身只表示LinuxLinux,在 GNU/Linux 系统中,Linux 实际就是Linux组件,而该系统的其余部分主要是由 GNU 工程编写和提供的程序组成。单独的 Linux Linux并不能成为一个可以正常工作的操作系统。
- **Linux之父** : 一个编程领域的传奇式人物,真大佬!我辈崇拜敬仰之楷模。他是 **LinuxLinux** 的最早作者,随后发起了这个开源项目,担任LinuxLinux的首要架构师与项目协调者。他还发起了Git这个开源项目,并为主要的开发者。
### 3.2 Inode
inode是linux/unix文件系统和硬盘存储的基础,如果理解了inode,
将会对我们学习如何将复杂的概念抽象成简单概念有重大帮助。
![Linux](images/Linux之父.png)
#### Inode是什么?有什么作用?
文件存储在硬盘上,硬盘的最小存储单位是扇区(Sector),每个扇区存储512字节(0.5kb)。
操作系统读取硬盘的数据时,不会一个扇区一个扇区的读取,这样做效率较低,而是**一次读取多个扇区,
即一次读取一个块(block)。块由多个扇区组成,是文件读取的最小单位,块的最常见的大小是4kb,
约为8个连续的扇区组成。文件数据存储在块中,**
但还需要一个空间来存储文件的元信息metadata,如文件拥有者,创建时间,权限,大小等。
这种**存储文件元信息的区域就叫inode,译为索引节点。 每个文件都有一个inode,存储文件的元信息。
使用 stat 命令可以查看文件的inode信息。每个inode都有一个号码,
Linux/Unix操作系统不使用文件名来区分文件,而是使用inode号码区分不同的文件。**
### Linux诞生
**inode也需要消耗硬盘空间,所以在格式化硬盘的时候,操作系统会将硬盘分为2个区域,
一个区域存放文件数据,另一个区域存放inode所包含的信息,
存放inode的区域被称为inode table。**
1989年,Linus Torvalds进入芬兰陆军新地区旅,服11个月的国家义务兵役,军衔为少尉,主要服务于计算机部门,任务是弹道计算。服役期间,购买了安德鲁·斯图尔特·塔能鲍姆所著的教科书及minix源代码,开始研究操作系统。1990年,他退伍后回到大学,开始接触Unix。
文件的inode信息:
> **Minix** 是一个迷你版本的类Unix操作系统,由塔能鲍姆教授为了教学之用而创作,采用微核心设计。它启发了LinuxLinux的创作。
![文件inode信息](../../media/pictures/linux/文件inode信息.png)
1991年,Linus Torvalds 开源了Linux Linux。Linux以一只可爱的企鹅作为标志,象征着敢作敢为、热爱生活。
![OPINION: Make the switch to a Linux operating system | Opinion ...](images/Linux-Logo.png)
### 3.3 文件类型与目录结构
### 常见Linux发行版本有哪些?
**Linux支持很多文件类型,其中非常重要的文件类型有:
普通文件,目录文件,链接文件,设备文件,管道文件,Socket套接字文件等。
Linus Torvalds 开源的只是 Linux Linux,我们上面也提到了操作系统Linux的作用。一些组织或厂商将 Linux Linux与各种软件和文档包装起来,并提供系统安装界面和系统配置、设定与管理工具,就构成了 Linux 的发行版本。
![文件类型](https://camo.githubusercontent.com/3d2c05419cb1f93fae15869cfc541c2bb3d5674b/68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f372f332f313634356631613764363464656631613f773d39303126683d35343726663d706e6726733d3732363932)
> Linux主要负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。
- 普通文件: 普通文件是指txt,html,pdf等等的这样应用层面的文件类型,
用户可以根据访问权限对普通文件进行访问,修改和删除。
Linux 的发行版本可以大体分为两类:
- 目录文件: 目录也是一种文件,打开目录实际上是打开目录文件
目录文件包含了它目录下的所有文件名以及指向这些文件的指针
- 商业公司维护的发行版本,以著名的 Red Hat 为代表,比较典型的有 CentOS
- 社区组织维护的发行版本,以 Debian 为代表,比较典型的有 Ubuntu、Debian
![目录文件](../../media/pictures/linux/目录文件.png)
对于初学者学习 Linux ,推荐选择 CentOS 。
- 链接文件: 链接文件分为符号链接(软链接)文件和硬链接文件
- 硬链接(Hard Link):硬链接的文件拥有相同的inode,因为操作系统是靠inode来区分文件的,
2个inode相同的文件,就代表它们是一个文件。
删除一个文件并不会对其他拥有相同inode的文件产生影响,只有当inode相同的所有文件被删除了,
这个文件才会被删除。换言之,你建立一个文件的硬链接,这个文件和硬链接它们的inode是相同的,
无论你删除的是硬链接还是源文件,都不会对彼此造成影响,除非你把硬链接和源文件都删除,
这个文件才被删除。
## Linux文件系统概览
- 符号链接(软链接)(Symbolic Link): 符号链接类似于Windows上的快捷方式,它保存了源文件的路径。
当符号链接被删除时,并不会影响源文件。但是当源文件被删除时,符号链接就找不到源文件了。
### Linux文件系统简介
软链接和硬链接:
**在Linux操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。** 也就是说在Linux系统中有一个重要的概念:**一切都是文件**
![软链接和硬链接](../../media/pictures/linux/软链接和硬链接.png)
其实这是UNIX哲学的一个体现,在UNIX系统中,把一切资源都看作是文件,Linux 的文件系统也是借鉴UNIX文件系统而来。
- 设备文件
设备文件分为块设备文件和字符设备文件,设备文件一般存于/dev目录下。
### inode
**inode是linux/unix文件系统和硬盘存储的基础。那么,inode是什么?有什么作用呢?**
- 字符设备文件: **字符设备是依照先后顺序被存取数据的设备,通常不支持随机存取,
此类设备可以按字节/字符来读取数据,** 如键盘,串口等等
文件存储在硬盘上,硬盘的最小存储单位是扇区(Sector),每个扇区存储512字节(0.5kb)。操作系统读取硬盘的数据时,不会一个扇区一个扇区的读取,这样做效率较低,而是一次读取多个扇区,即一次读取一个块(block)。块由多个扇区组成,是文件读取的最小单位,块的最常见的大小是4kb,约为8个连续的扇区组成。文件数据存储在块中, 但还需要一个空间来存储文件的 **元信息metadata**,如文件拥有者,创建时间,权限,大小等。这种 **存储文件元信息的区域就叫inode**,译为索引节点。 每个文件都有一个inode,存储文件的元信息。
使用 `stat` 命令可以查看文件的inode信息。每个inode都有一个号码,Linux/Unix 操作系统不使用文件名来区分文件,而是使用inode号码区分不同的文件
- 块设备文件: **块设备是可以被随机存取数据的设备,应用程序可以访问块设备上任何一块位置。
块设备以块的方式读取数据,在windows下也称为簇,块设备不支持字符的方式寻址。**
如硬盘,软盘,光碟等等。
**总结:**
**字符设备与块设备最根本的区别就是它们是否可以被随机访问。**
如键盘,当我们在键盘上敲下一个单词: "word"的时候,
那么系统肯定是需要按照顺序来进行读取word的字节流(字符流)的,随机访问在此时是没有意义的。
- **inode** :记录文件的属性信息,可以使用stat命令查看inode信息。
- **block** :实际文件的内容,如果一个文件大于一个块时候,那么将占用多个block,但是一个块只能存放一个文件。(因为数据是由inode指向的,如果有两个文件的数据存放在同一个块中,就会乱套了)
- 管道文件: 管道文件一般用于进程间通信,使用mkfifo命令可以创建一个管道文件。
![文件inode信息](images/文件inode信息.png)
- Socket套接字文件: 套接字文件被用于网络进程之间的通信,既可以使2台不同的机器进行通信,也可以用于本机的Socket网络程序。
### Linux文件类型
Linux支持很多文件类型,其中非常重要的文件类型有: **普通文件****目录文件****链接文件****设备文件****管道文件****Socket套接字文件**等。
- **普通文件(-)** : 用于存储信息和数据, Linux用户可以根据访问权限对普通文件进行查看、更改和删除。比如:图片、声音、PDF、text、视频、源代码等等。
- **目录文件(d,directory file)** :目录也是文件的一种,用于表示和管理系统中的文件,目录文件中包含一些文件名和子目录名。打开目录事实上就是打开目录文件。
- **符号链接文件(l,symbolic link)** :保留了指向文件的地址而不是文件本身。
- **字符设备(c,char)** :用来访问字符设备比如硬盘。
- **设备文件(b,block)** : 用来访问块设备比如硬盘、软盘。
- **管道文件(p,pipe)** : 一种特殊类型的文件,用于进程之间的通信。
- **套接字(s,socket)** :用于进程间的网络通信,也可以用于本机之间的非网络通信。
### Linux目录树
......@@ -223,7 +174,7 @@ Linux/Unix操作系统不使用文件名来区分文件,而是使用inode号
**Linux的目录结构如下:**
Linux文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:
![Linux的目录结构](https://user-gold-cdn.xitu.io/2018/7/3/1645f1c65676caf6?w=823&h=315&f=png&s=15226)
![Linux的目录结构](images/Linux目录树.png)
**常见目录说明:**
......@@ -244,12 +195,12 @@ Linux文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是
- **/lost+found:** 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。
## Linux基本命令
## Linux基本命令
下面只是给出了一些比较常用的命令。推荐一个Linux命令快查网站,非常不错,大家如果遗忘某些命令或者对某些命令不理解都可以在这里得到解决。
Linux命令大全:[http://man.linuxde.net/](http://man.linuxde.net/)
### 4.1 目录切换命令
### 目录切换命令
- **`cd usr`:** 切换到该目录下usr目录
- **`cd ..(或cd../)`:** 切换到上一层目录
......@@ -257,99 +208,63 @@ Linux命令大全:[http://man.linuxde.net/](http://man.linuxde.net/)
- **`cd ~`:** 切换到用户主目录
- **`cd -`:** 切换到上一个操作所在目录
### 4.2 目录的操作命令(增删改查)
### 目录的操作命令(增删改查)
1. **`mkdir 目录名称`:** 增加目录
2. **`ls或者ll`**(ll是ls -l的别名,ll命令可以看到该目录下的所有目录和文件的详细信息):查看目录信息
3. **`find 目录 参数`:** 寻找目录(查)
示例:
- 列出当前目录及子目录下所有文件和文件夹: `find .`
- 在`/home`目录下查找以.txt结尾的文件名:`find /home -name "*.txt"`
- 同上,但忽略大小写: `find /home -iname "*.txt"`
- 当前目录及子目录下查找所有以.txt和.pdf结尾的文件:`find . \( -name "*.txt" -o -name "*.pdf" \)`或`find . -name "*.txt" -o -name "*.pdf" `
4. **`mv 目录名称 新目录名称`:** 修改目录的名称(改)
注意:mv的语法不仅可以对目录进行重命名而且也可以对各种文件,压缩包等进行 重命名的操作。mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。后面会介绍到mv命令的另一个用法。
5. **`mv 目录名称 目录的新位置`:** 移动目录的位置---剪切(改)
注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作。另外mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。
6. **`cp -r 目录名称 目录拷贝的目标位置`:** 拷贝目录(改),-r代表递归拷贝
注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不 用写-r递归
7. **`rm [-rf] 目录`:** 删除目录(删)
注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文件,都直接使用`rm -rf` 目录/文件/压缩包
- **`mkdir 目录名称`:** 增加目录。
- **`ls/ll`**(ll是ls -l的别名,ll命令可以看到该目录下的所有目录和文件的详细信息):查看目录信息。
- **`find 目录 参数`:** 寻找目录(查)。示例:①列出当前目录及子目录下所有文件和文件夹: `find .`;②在`/home`目录下查找以.txt结尾的文件名:`find /home -name "*.txt"` ,忽略大小写: `find /home -iname "*.txt"` ;③当前目录及子目录下查找所有以.txt和.pdf结尾的文件:`find . \( -name "*.txt" -o -name "*.pdf" \)``find . -name "*.txt" -o -name "*.pdf" `
- **`mv 目录名称 新目录名称`:** 修改目录的名称(改)。注意:mv的语法不仅可以对目录进行重命名而且也可以对各种文件,压缩包等进行 重命名的操作。mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。后面会介绍到mv命令的另一个用法。
- **`mv 目录名称 目录的新位置`:** 移动目录的位置---剪切(改)。注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作。另外mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。
- **`cp -r 目录名称 目录拷贝的目标位置`:** 拷贝目录(改),-r代表递归拷贝 。注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不 用写-r递归。
- **`rm [-rf] 目录` :** 删除目录(删)。注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文件,都直接使用`rm -rf` 目录/文件/压缩包。
### 4.3 文件的操作命令(增删改查)
1. **`touch 文件名称`:** 文件的创建(增)
2. **`cat/more/less/tail 文件名称`** 文件的查看(查)
- **`cat`:** 查看显示文件内容
- **`more`:** 可以显示百分比,回车可以向下一行, 空格可以向下一页,q可以退出查看
- **`less`:** 可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
- **`tail-10` :** 查看文件的后10行,Ctrl+C结束
注意:命令 tail -f 文件 可以对某个文件进行动态监控,例如tomcat的日志文件, 会随着程序的运行,日志会变化,可以使用tail -f catalina-2016-11-11.log 监控 文 件的变化
3. **`vim 文件`:** 修改文件的内容(改)
### 文件的操作命令(增删改查)
vim编辑器是Linux中的强大组件,是vi编辑器的加强版,vim编辑器的命令和快捷方式有很多,但此处不一一阐述,大家也无需研究的很透彻,使用vim编辑修改文件的方式基本会使用就可以了。
- **`touch 文件名称`:** 文件的创建(增)。
- **`cat/more/less/tail 文件名称`** :文件的查看(查) 。命令 `tail -f 文件` 可以对某个文件进行动态监控,例如tomcat的日志文件, 会随着程序的运行,日志会变化,可以使用 `tail -f catalina-2016-11-11.log` 监控 文 件的变化 。
- **`vim 文件`:** 修改文件的内容(改)。vim编辑器是Linux中的强大组件,是vi编辑器的加强版,vim编辑器的命令和快捷方式有很多,但此处不一一阐述,大家也无需研究的很透彻,使用vim编辑修改文件的方式基本会使用就可以了。在实际开发中,使用vim编辑器主要作用就是修改配置文件,下面是一般步骤: `vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q!` (输入wq代表写入内容并退出,即保存;输入q!代表强制退出不保存)。
- **`rm -rf 文件`:** 删除文件(删)。
**在实际开发中,使用vim编辑器主要作用就是修改配置文件,下面是一般步骤:**
vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q! (输入wq代表写入内容并退出,即保存;输入q!代表强制退出不保存。)
4. **`rm -rf 文件`:** 删除文件(删)
同目录删除:熟记 `rm -rf` 文件 即可
### 4.4 压缩文件的操作命令
### 压缩文件的操作命令
**1)打包并压缩文件:**
Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。
而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。
命令:**`tar -zcvf 打包压缩后的文件名 要打包压缩的文件`**
其中:
z:调用gzip压缩命令进行压缩
Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。
命令:`tar -zcvf 打包压缩后的文件名 要打包压缩的文件` ,其中:
c:打包文件
v:显示运行过程
f:指定文件名
比如:假如test目录下有三个文件分别是:aaa.txt bbb.txt ccc.txt,如果我们要打包test目录并指定压缩后的压缩包名称为test.tar.gz可以使用命令:**`tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt`或:`tar -zcvf test.tar.gz /test/`**
- z:调用gzip压缩命令进行压缩
- c:打包文件
- v:显示运行过程
- f:指定文件名
比如:假如test目录下有三个文件分别是:aaa.txt bbb.txt ccc.txt,如果我们要打包test目录并指定压缩后的压缩包名称为test.tar.gz可以使用命令:**`tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt` 或 `tar -zcvf test.tar.gz /test/`**
**2)解压压缩包:**
命令:tar [-xvf] 压缩文件
命令:`tar [-xvf] 压缩文件``
其中:x:代表解压
示例:
1 将/test下的test.tar.gz解压到当前目录下可以使用命令:**`tar -xvf test.tar.gz`**
- 将 /test 下的 test.tar.gz 解压到当前目录下可以使用命令:**`tar -xvf test.tar.gz`**
- 将 /test 下的 test.tar.gz解压到根目录/usr下:**`tar -xvf test.tar.gz -C /usr`**(- C代表指定解压的位置)
2 将/test下的test.tar.gz解压到根目录/usr下:**`tar -xvf test.tar.gz -C /usr`**(- C代表指定解压的位置)
### Linux的权限命令
### 4.5 Linux的权限命令
操作系统中每个文件都拥有特定的权限、所属用户和所属组。权限是操作系统用来限制资源访问的机制,在Linux中权限一般分为读(readable)、写(writable)和执行(excutable),分为三组。分别对应文件的属主(owner),属组(group)和其他用户(other),通过这样的机制来限制哪些用户、哪些组可以对特定的文件进行什么样的操作。
操作系统中每个文件都拥有特定的权限、所属用户和所属组。权限是操作系统用来限制资源访问的机制,在Linux中权限一般分为读(readable)、写(writable)和执行(excutable),分为三组。分别对应文件的属主(owner),属组(group)和其他用户(other),通过这样的机制来限制哪些用户、哪些组可以对特定的文件进行什么样的操作。通过 **`ls -l`** 命令我们可以 查看某个目录下的文件或目录的权限
通过 **`ls -l`** 命令我们可以 查看某个目录下的文件或目录的权限
示例:在随意某个目录下`ls -l`
![](https://user-gold-cdn.xitu.io/2018/7/5/1646955be781daaa?w=589&h=228&f=png&s=16360)
![](images/Linux权限命令.png)
第一列的内容的信息解释如下:
![](https://user-gold-cdn.xitu.io/2018/7/5/16469565b6951791?w=489&h=209&f=png&s=39791)
![](images/Linux权限解读.png)
> 下面将详细讲解文件的类型、Linux中权限以及文件有所有者、所在组、其它组具体是什么?
......@@ -360,7 +275,6 @@ Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.g
- -: 代表文件
- l: 代表软链接(可以认为是window中的快捷方式)
**Linux中权限分为以下几种:**
- r:代表权限是可读,r也可以用数字4表示
......@@ -387,37 +301,23 @@ Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.g
|w | 可以创建和删除目录下文件 |
| x | 可以使用cd进入目录 |
需要注意的是: **超级用户可以无视普通用户的权限,即使文件目录权限是000,依旧可以访问。**
**需要注意的是超级用户可以无视普通用户的权限,即使文件目录权限是000,依旧可以访问。**
**在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念。**
- **所有者**
一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者,用ls ‐ahl命令可以看到文件的所有者 也可以使用chown 用户名 文件名来修改文件的所有者 。
- **文件所在组**
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组 用ls ‐ahl命令可以看到文件的所有组 也可以使用chgrp 组名 文件名来修改文件所在的组。
- **其它组**
除开文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组
- **所有者(u)** :一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者,用 `ls ‐ahl` 命令可以看到文件的所有者 也可以使用chown 用户名 文件名来修改文件的所有者 。
- **文件所在组(g)** :当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组用 `ls ‐ahl`命令可以看到文件的所有组也可以使用chgrp 组名 文件名来修改文件所在的组。
- **其它组(o)** :除开文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组。
> 我们再来看看如何修改文件/目录的权限。
**修改文件/目录的权限的命令:`chmod`**
示例:修改/test下的aaa.txt的权限为属主有全部权限,属主所在的组有读写权限,
其他用户只有读的权限
**`chmod u=rwx,g=rw,o=r aaa.txt`**
示例:修改/test下的aaa.txt的权限为文件所有者有全部权限,文件所有者所在的组有读写权限,其他用户只有读的权限。
**`chmod -R u=rwx,g=rwx,o=rwx ./log`** // 递归给log目录下的所有文件授权
![](https://user-gold-cdn.xitu.io/2018/7/5/164697447dc6ecac?w=525&h=246&f=png&s=12362)
上述示例还可以使用数字表示:
chmod 764 aaa.txt
**`chmod u=rwx,g=rw,o=r aaa.txt`** 或者 **`chmod 764 aaa.txt`**
![](images/修改文件权限.png)
**补充一个比较常用的东西:**
......@@ -429,13 +329,14 @@ chmod 764 aaa.txt
4. 如果想看看是否添加成功,命令是:`chkconfig --list`
### 4.6 Linux 用户管理
### Linux 用户管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
**Linux用户管理相关命令:**
- `useradd 选项 用户名`:添加用户账号
- `userdel 选项 用户名`:删除用户帐号
- `usermod 选项 用户名`:修改帐号
......@@ -443,16 +344,16 @@ Linux系统是一个多用户多任务的分时操作系统,任何一个要使
- `passwd -S 用户名` :显示用户账号密码信息
- `passwd -d 用户名`: 清除用户密码
useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
`useradd` 命令用于Linux中创建的新的系统用户。`useradd`可用来建立用户帐号。帐号建好之后,再用`passwd`设定帐号的密码.而可用`userdel`删除帐号。使用`useradd`指令所建立的帐号,实际上是保存在 `/etc/passwd`文本文件中。
passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
`passwd`命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
### 4.7 Linux系统用户组的管理
### Linux系统用户组的管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对`/etc/group`文件的更新。
**Linux系统用户组的管理相关命令:**
- `groupadd 选项 用户组` :增加一个新的用户组
......@@ -460,7 +361,7 @@ passwd命令用于设置用户的认证信息,包括用户密码、密码过
- `groupmod 选项 用户组` : 修改用户组的属性
### 4.8 其他常用命令
### 其他常用命令
- **`pwd`:** 显示当前所在位置
......@@ -482,7 +383,7 @@ passwd命令用于设置用户的认证信息,包括用户密码、密码过
- 查看当前系统的端口使用:netstat -an
- **net-tools 和 iproute2 :**
`net-tools`起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持`iproute2`。linux ip命令类似于ifconfig,但功能更强大,旨在替代它。更多详情请阅读[如何在Linux中使用IP命令和示例](https://linoxide.com/linux-command/use-ip-command-linux)
`net-tools`起源于BSD的TCP/IP工具箱,后来成为老版本LinuxLinux中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持`iproute2`。linux ip命令类似于ifconfig,但功能更强大,旨在替代它。更多详情请阅读[如何在Linux中使用IP命令和示例](https://linoxide.com/linux-command/use-ip-command-linux)
- **`shutdown`:** `shutdown -h now`: 指定现在立即关机;`shutdown +5 "System will shutdown after 5 minutes"`:指定5分钟后关机,同时送出警告信息给登入用户。
......@@ -492,7 +393,7 @@ passwd命令用于设置用户的认证信息,包括用户密码、密码过
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
**《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java面试突击"** 即可免费领取!
**《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V3.0 PDF 版本[公众号](#公众号)后台回复 **"Java面试突击"** 即可免费领取!
**Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
......
......@@ -58,7 +58,7 @@
正式介绍 ZooKeeper 之前,我们先来看看 ZooKeeper 的由来,还挺有意思的。
下面这段内容摘自《从 Paxos 到 ZooKeeper 》第四章第一节,推荐大家阅读下:
下面这段内容摘自《从 Paxos 到 ZooKeeper 》第四章第一节,推荐大家阅读下:
> ZooKeeper 最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。
>
......@@ -105,9 +105,9 @@ _破音:拿出小本本,下面的内容非常重要哦!_
### 3.1. Data model(数据模型)
ZooKeeper 数据模型采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以是数字、字符串或者是二级制序列。并且。每个节点还可以拥有 N 个子结点,最上层是根节点以“/”来代表。每个数据节点在 ZooKeeper 中被称为 **znode **,它是 ZooKeeper 中数据的最小单元。并且,每个 znode 都一个唯一的路径标识。
ZooKeeper 数据模型采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以是数字、字符串或者是二级制序列。并且。每个节点还可以拥有 N 个子节点,最上层是根节点以“/”来代表。每个数据节点在 ZooKeeper 中被称为 **znode**,它是 ZooKeeper 中数据的最小单元。并且,每个 znode 都一个唯一的路径标识。
强调一句:**ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,所以不要放比较大的数据在 znode 上,ZooKeeper 给出的上线是每个结点的数据大小最大是 1M。**
强调一句:**ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,所以不要放比较大的数据在 znode 上,ZooKeeper 给出的上是每个结点的数据大小最大是 1M。**
从下图可以更直观地看出:ZooKeeper 节点路径标识方式和 Unix 文件系统路径非常相似,都是由一系列使用斜杠"/"进行分割的路径表示,开发人员可以向这个节点中写人数据,也可以在节点下面创建子节点。这些操作我们后面都会介绍到。
......@@ -115,14 +115,14 @@ ZooKeeper 数据模型采用层次化的多叉树形结构,每个节点上都
### 3.2. znode(数据节点)
介绍了 ZooKeeper 树形数据模型之后,我们知道每个数据节点在 ZooKeeper 中被称为 **znode **,它是 ZooKeeper 中数据的最小单元。你要存放的数据就放在上面,是你使用 ZooKeeper 过程中经常需要解除到的一个概念。
介绍了 ZooKeeper 树形数据模型之后,我们知道每个数据节点在 ZooKeeper 中被称为 **znode**,它是 ZooKeeper 中数据的最小单元。你要存放的数据就放在上面,是你使用 ZooKeeper 过程中经常需要接触到的一个概念。
#### 3.2.1. znode 4种类型
我们通常是将 znode 分为 4 大类:
- **持久(PERSISTENT)节点** :一旦创建就一直存在即使 ZooKeeper 集群宕机,直到将其删除。
- **临时(EPHEMERAL)节点** :临时节点的生命周期是与 **客户端会话(session)** 绑定的,**会话消失则节点消失** 。并且,临时节点 **只能做叶子节点** ,不能创建子节点。
- **临时(EPHEMERAL)节点** :临时节点的生命周期是与 **客户端会话(session)** 绑定的,**会话消失则节点消失** 。并且,**临时节点只能做叶子节点** ,不能创建子节点。
- **持久顺序(PERSISTENT_SEQUENTIAL)节点** :除了具有持久(PERSISTENT)节点的特性之外, 子节点的名称还具有顺序性。比如 `/node1/app0000000001``/node1/app0000000002`
- **临时顺序(EPHEMERAL_SEQUENTIAL)节点** :除了具备临时(EPHEMERAL)节点的特性之外,子节点的名称还具有顺序性。
......@@ -173,7 +173,7 @@ Stat 类中包含了一个数据节点的所有状态信息的字段,包括事
### 3.3. 版本(version)
在前面我们已经提到,ZooKeeper 的每个 znode 上都会存储数据,对应于每个 znode,ZooKeeper 都会为其维护一个叫作 **Stat** 的数据结构,Stat 中记录了这个 znode 的三个数据版本:
在前面我们已经提到,对应于每个 znode,ZooKeeper 都会为其维护一个叫作 **Stat** 的数据结构,Stat 中记录了这个 znode 的三个相关的版本:
- **dataVersion** :当前 znode 节点的版本号
- **cversion** : 当前 znode 子节点的版本
......@@ -277,10 +277,10 @@ ZAB(ZooKeeper Atomic Broadcast 原子广播) 协议是为分布式协调服
ZAB 协议包括两种基本的模式,分别是
- **崩溃恢复** :当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进恢复模式并选举产生新的Leader服务器。当选举产生了新的 Leader 服务器,同时集群中已经有过半的机器与该Leader服务器完成了状态同步之后,ZAB协议就会退出恢复模式。其中,**所谓的状态同步是指数据同步,用来保证集群中存在过半的机器能够和Leader服务器的数据状态保持一致**
- **消息广播****当集群中已经有过半的Follower服务器完成了和Leader服务器的状态同步,那么整个服务框架就可以进人消息广播模式了。** 当一台同样遵守ZAB协议的服务器启动后加人到集群中时,如果此时集群中已经存在一个Leader服务器在负责进行消息广播,那么新加人的服务器就会自觉地进人数据恢复模式:找到Leader所在的服务器,并与其进行数据同步,然后一起参与到消息广播流程中去。
- **崩溃恢复** :当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进恢复模式并选举产生新的Leader服务器。当选举产生了新的 Leader 服务器,同时集群中已经有过半的机器与该Leader服务器完成了状态同步之后,ZAB协议就会退出恢复模式。其中,**所谓的状态同步是指数据同步,用来保证集群中存在过半的机器能够和Leader服务器的数据状态保持一致**
- **消息广播****当集群中已经有过半的Follower服务器完成了和Leader服务器的状态同步,那么整个服务框架就可以进入消息广播模式了。** 当一台同样遵守ZAB协议的服务器启动后加入到集群中时,如果此时集群中已经存在一个Leader服务器在负责进行消息广播,那么新加入的服务器就会自觉地进入数据恢复模式:找到Leader所在的服务器,并与其进行数据同步,然后一起参与到消息广播流程中去。
关于 **ZAB 协议&Paxos算法** 需要讲和理解的东西太多了,说实话,笔主到现在不太清楚这俩兄弟的具体原理和实现过程。推荐阅读下面两篇文章:
关于 **ZAB 协议&Paxos算法** 需要讲和理解的东西太多了,具体可以看下面这两篇文章:
- [图解 Paxos 一致性协议](http://codemacro.com/2014/10/15/explain-poxos/)
- [Zookeeper ZAB 协议分析](https://dbaplus.cn/news-141-1875-1.html)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册