SRE

参考:








介绍

站点可靠性工程师(Site Reliability Engineers, SREs)位于软件工程和系统工程的交叉点。


课程Level:

  • 1xx: freshman
  • 2xx: sophomore
  • 3xx: junior
  • 4xx: senior


目前涵盖的SRE课程:

  • Level 101
    • Fundamentals Series
      • Linux Basics
      • Linux Networking
    • Python和Web
    • Data
      • Relational databases
      • NoSQL
      • Big Data
    • Systems Design
      • Scalability
      • Availability
      • Fault Tolerance
    • Metrics and Monitoring
    • Security
  • Level 102
    • Linux Intermediate
      • Package Management
      • Storage Media
      • Archiving and Backup
      • VIM
      • BASH
    • Linux Advanced
      • Containers and orchestration
      • System Calls and Signals
    • Networking
      • Security
      • Scale
      • RTT
      • Infrastructure Services
    • System Design
      • Large System Design
      • Scaling
      • Scaling Beyond the Data Center
      • Resiliency
    • System troubleshooting and performance improvements
    • CI/CD




基础系列

Fundamentals Series


Linux基础知识

Linux Basics: https://linkedin.github.io/school-of-sre/level101/linux_basics/intro/




本课程的期望

本课程分为三部分:

  • Linux操作系统基础
  • Linux基本命令
  • Linux系统管理




Linux介绍

内核(kernel)是一个操作系统最重要的部分,它执行进程管理,内存管理,文件系统管理等重要功能。

Windows操作系统基于Windows NT kernel。

Linux操作系统基于Linux Kernel(免费且开源)。基于Linux的操作系统包含Linux Kernel, GUI/CLI, system libraries, system utilities.

Linux是一个内核,而不是一个完整的操作系统。Linux Kenel与GNU相结合来创建完整的操作系统。因此,基于Linux的操作系统也成为GNU/Linux系统。




Linux发行版

Linux发行版是基于Linux内核和包管理系统的操作系统。软件通常是适配各个发行版的特定格式。

流行的Linux发行版:

  • Fedora
  • Ubuntu
  • Debian
  • Centos
  • Red Hat Enterprise Linux
  • Suse
  • Arch Linux


包管理 发行版 包管理
Debian Style(.deb) Debian, Ubuntu APT
RedHat style(.rpm) Federa, CentOS, RedHatEL YUM


linux架构图。

linux架构图

  • The Linux kernel is monolithic in nature.
  • System calls are used to interact with the Linux kernel space.
  • Kernel code can only be executed in the kernel mode. Non-kernel code is executed in the user mode.
  • Device drivers are used to communicate with the hardware devices.




Linux操作系统用例

广泛使用Linux内核操作系统的有:

  • Personal computers
  • Servers
  • Mobile phones
  • Embedded devices
  • Satellites
  • Network devices




Shell与Terminal

Shell是一个从用户处获取命令的程序,并将其提供给操作系统进行处理。Shell是CLI的示例。Bash是Linux服务器上最受欢迎的shell程序。

Terminal是一个打开窗口让你与Shell交互的程序。




命令行基础

docs: https://linkedin.github.io/school-of-sre/level101/linux_basics/command_line_basics/




命令

命令(command)是告诉操作系统执行特定工作的程序。程序在Linux中存储为文件。因此,命令也是存储在磁盘某处的文件。

使用--helpman来获取帮助信息。




文件系统组织

File System Organization

Linux文件系统具有分层(hierarchical)(或树形(tree-like))结构,最高级别的目录称位根目录/


特定目录的作用:

  • bin: The executable program of most commonly used commands reside in bin directory
  • sbin: This directory contains programs used for system administration.
  • home: This directory contains user related files and directories.
  • lib: This directory contains all the library files
  • etc: This directory contains all the system configuration files
  • proc: This directory contains files related to the running processes on the system
  • dev: This directory contains files related to devices on the system
  • mnt: This directory contains files related to mounted devices on the system
  • tmp: This directory is used to store temporary files on the system
  • usr: This directory is used to store application programs on the system




导航文件系统的命令

Commands for Navigating the File System

1
2
3
ls: list files and directories
pwd: print working directory
cd: change directory




操作文件的命令

Commands for Manipulating Files

1
2
3
4
5
touch: create new file
mkdir: create new directories
rm: delete files and directories
cp: copy files and directories
mv: move files and directories




查看文件的命令

Commands for Viewing Files

1
2
3
4
5
cat: concatenate files and print on the standard output
head: output the first part of files
tail: output the last part of files
more: file perusal filter for crt viewing
less: opposite of more




echo命令

1
echo: display a line of text




文本处理命令

Text Processing Commands

1
2
3
grep: print lines matching a pattern
sed: stream editor for filtering and transforming text
sort: sort lines of text files




IO重定向

每个打开的文件都会分配文件描述符(file descriptor)。文件描述符是系统中打开的文件的唯一标识符。

有三个默认的文件打开:stdin, stdout, stderr

Everything is a file in linux.

1
2
`>`: 重定向操作符
`|`: 管道符




服务器管理

Server Administration: https://linkedin.github.io/school-of-sre/level101/linux_basics/linux_server_administration/




多用户操作系统

Multi-User Operating Systems

Linux操作系统本质上是多用户,因为它允许多个用户同时访问系统。多个用户通过SSH远程登录并。

由于Linux支持多个用户,我们需要一种方法可以保护用户彼此。用户不应该能够访问和修改其它用户。




用户和组管理

User/Group Management

  • Users in Linux has an associated user ID called UID attached to them.
  • Users also has a home directory and a login shell associated with them.
  • A group is a collection of one or more users. A group makes it easier to share permissions among a group of users.
  • Each group has a group ID called GID associated with it.
  • root user or superuser is the most privileged user with unrestricted access to all the resources on the system. It has UID 0


1
2
3
4
5
6
7
id: print real and effective user and group IDs
whoami: print effective userid

#用户和组相关联的重要文件
/etc/passwd: Stores the user name, the uid, the gid, the home directory, the login shell etc
/etc/shadow: Stores the password associated with the users
/etc/group: Stores information about different groups on the system




用户管理相关命令

Important commands for managing users

1
2
3
4
5
6
7
useradd: Creates a new user

passwd: Adds or modifies passwords for a user

usermod: Modifies attributes of an user

userdel: Deletes an user
1
2
3
4
cat /etc/shadow

apache:!!:18759::::::
"!!" in an account entry in shadow means the account of an user has been created, but not yet given a password.




组管理相关命令

Important commands for managing groups

1
2
3
4
groupadd: Creates a new group
groupmod: Modifies attributes of a group
groupdel: Deletes a group
gpasswd: Modifies password for group




成为超级用户

Becoming a Superuser

1
2
sudo: The sudo command allows a user to run commands with the security privileges of the root user
su: switch users in Linux




文件权限

File Permissions

Linux系统上,每个文件和目录都分配了对应属主(owner)、组(group)、其他人(other)的对应权限。


文件权限的一些命令:

1
2
3
chmod: modify files and directories permissions
chown: change the owner of files or directories
chgrp: change the group ownership of files or directories




SSH命令

ssh命令用于登录远程系统,传输文件,执行命令等。


使用SSH进行无密码认证(Passwordless Authentication Using SSH)。

在远程主机上执行命令。

在主机之间传输文件。




包管理

Package Management

包管理是系统上安装和管理软件的进程。

  • yum(dnf)
  • apt




进程管理

Process Management

1
2
ps: know the information of a process or list of processes
top: show information about Linux processes running on the system in real time




内存管理

Memory Management

1
2
free: display the memory usage of the system
vmstat: display the memory usage along with additional information about io and cpu usage




检测磁盘

Checking Disk Space

1
2
3
4
df(disk free): display the free and available space for each mounted file system
du(disk usage): display disk usage of files and directories on the system

fdisk: manipulate disk partition table




Daemons

以后台进程运行的程序称位daemon。通常来讲,守护进程名称会以d结尾,如sshd, httpd等。我们无法与守护进程进行交互,因为它们在后台运行。




Systemd

systemd是Linux操作系统上的系统和服务管理程序。systemd units是Systemd的构成组件。这些单元由配置文件表示(/usr/lib/systemd/system)。

service units以.service文件扩展结尾。systemctl命令用于管理由systemd管理的服务。




Logs

1
2
/var/log/
dmesg: kernel logs






Git


git基础知识

git: https://linkedin.github.io/school-of-sre/level101/git/git-basics/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建一个git仓库
git init

# 一个空的git仓库
# 所有信息都在.git目录下
ls .git/
branches config description HEAD hooks info objects refs

git status

git add

# Commit is a snapshot of the repo
git commit -m

git log --oneline --graph

git cat-file -p commit-id

ls .git/objects/xx/xxxx

# 版本控制
git checkout

cat .git/HEAD
echo commit-id > .git/refs/heads/master

All commits are stored as a tree like data structure internally by git. That means there can be two or more children commits of a given commit.

Everything in git is an object.




分支

Working With Branches: https://linkedin.github.io/school-of-sre/level101/git/branches/

在同一个仓库中,不同的功能同时并行工作,使用分支。

在内部,git只是一颗提交树。分支名称(人类可读)是指向树中那些提交的指针。我们使用各种git命令来处理树结构和引用。git相应地修改我们仓库的内容。

如果仓库中有很多分支,那么分支合并可能会出现很多合并提交信息。这样,与单一的开发历史相比,看起来很难看。所以,让我们来看看另外的方法(rebase)。

1
2
3
4
5
6
7
8
9
git branch

git checkout -b

git checkout

git merge
git rebase
git merge --rebase




钩子

github and hooks: https://linkedin.github.io/school-of-sre/level101/git/github-hooks/

git还有一个很好的特性叫做钩子(hooks)。钩子基本上是脚本,当某个事件发生时会被调用。

钩子的名称是解释性的。当你想在某个事件发生时做某些事情,这些钩子很有用。

1
2
3
4
5
6
7
8
9
10
git remote

git pull

git push

# hooks
ls .git/hooks/
applypatch-msg.sample fsmonitor-watchman.sample pre-applypatch.sample pre-push.sample pre-receive.sample update.sample
commit-msg.sample post-update.sample pre-commit.sample pre-rebase.sample prepare-commit-msg.sample






Linux网络


网络基础

Linux Networking Fundamentals: https://linkedin.github.io/school-of-sre/level101/linux_networking/intro/

当你在浏览器中访问linkedin.com时,会发生什么?本课程遵循TCP/IP协议栈的流程。

更具体地说,涵盖了:

  • 应用层协议: DNS, HTTP
  • 传输层协议: UDP, TCP
  • 网络层协议: IP
  • 数据链路层协议




DNS

dns: https://linkedin.github.io/school-of-sre/level101/linux_networking/dns/

域名是网站的简单人类可读的名称。互联网只能理解IP地址,但由于记忆不想关的号码不实用,因此使用域名。这些域名被DNS基础架构转换为IP地址。

当在浏览器打开www.linkedin.com时,浏览器尝试讲域名转换为IP地址,这个过程被称为DNS解析。

1
2
3
4
5
域名解析 -> 查看本地缓存 -有> 返回ip
-无> 请求DNS服务器 -> 返回ip

www.linked.com -> . -> .com -> linkedin.com
. root domain
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Linux操作系统文件
/etc/nsswitch.conf

/etc/hosts

/etc/resolv.conf

# 命令
nslookup

dig

dig linkedin.com
linkedin.com. 33 IN A 13.107.42.14

域名解析结果有五个字段:

  • 第一个字段:请求
  • 第二个字段:TTL
  • 第三个字段:信息类别
  • 第四个字段:记录类型
    • A: IPv4
    • AAAA: IPv6
    • NS: authoritative nameserver
    • TXT
    • PTR
    • MX
    • CNAME: 别名
  • 第五个字段: 响应


Applications in SRE role

SRE可以从DNS获取的一些常见的解决方案:

  • 自己的DNS基础架构
  • DNS可用于服务发现
  • 云服务商CDN服务商提供的DNS
  • 在分布式系统中,DNS可用于使客户端将IP地址更靠近其位置,以提供更快的响应
  • DNS验证和欺骗(https, dnssec)
  • 陈旧的DNS缓存可能会是一个问题
  • DNS负载均衡和服务发现也必须了解TTL,并且只有在等待TTL后才能从池中删除、更改DNS记录




UDP

udp: https://linkedin.github.io/school-of-sre/level101/linux_networking/udp/

UDP是一个传输层协议。DNS是一个运行在UDP之上的应用层协议。

传输层确保DNS请求到达DNS服务端,并确保响应到达DNS客户端。当客户端进行DNS请求时,在填充必要的应用程序有效应用载荷(application payload)后,它通过sendto系统调用将有效应用载荷传递给内核。内核选择一个大于1024的随机端口作为源端口,DNS服务器端口(默认53)作为目的端口,并发送包到更低的层。当DNS服务端的内核接收到这个包,它检查它的端口号,并且数据包队列到DNS程序的应用缓冲取(application buffer),该过程调用recvfrom系统调用并读取数据包。这个内核的过程被称为多路复用(multiplexing)和多路分用(demultiplexing)。多路复用和多路分解有传输层完成。

  • 多路复用:从多个应用程序组合数据包到相同的底层
  • 多路分用:将数据包从单个下层分离到多个应用程序

UDP是最简单的传输层协议之一,它只有多路复用和多路分用。另一个常见的传输层协议是TCP,它是可靠的通信、流量控制、拥塞控制。UDP旨在轻便,处理略微开销的通信。所以UDP在多路复用和分用之外不做任何事。




HTTP

HTTP: https://linkedin.github.io/school-of-sre/level101/linux_networking/http/

Linked的html页面是由浏览器渲染的HTTP协议提供的。浏览器给前面解析的IP服务器发送HTTP请求。请求包含方法、路径和参数等。

HTTP is called stateless protocol. HTTP是不安全的,使用HTTPS。

HTTPS必须提供客户端和服务段直接的数据的服务器标识和加密。服务器管理员必须生成私有公钥对和证书请求。该证书请求必须由证书机构签名,证书机构将证书请求转换为证书。证书有关于服务器的详细信息(如域名,过期时间等)。私钥是服务器的秘密,丢失私钥就失去了服务器的提供的信任。

当客户端连接,客户端发送HELLO。服务器将其证书发送给客户端。如果证书未过期,客户端检查证书的有效性,如果它由受信任的机构签名,并且证书中的主机名与服务器相同。这个验证过程确保服务器的正确性,避免网络钓鱼。一旦验证,客户端通过协商与服务器的公钥加密协商,客户端通过服务器协商对称密钥和密码。除了具有私钥的服务器之外,没有人可以理解这些数据。一旦协商完成,对称密钥和算法将用于进一步加密,这可以仅由客户端和服务端从其上解密,因为只有它们知道对称密钥和算法。




TCP

TCP: https://linkedin.github.io/school-of-sre/level101/linux_networking/tcp/

TCP是一种传输层协议,它保证了可靠性、流量控制和拥塞控制。通过使用序列号保证可靠的交付。

TCP连接通过三次握手建立。客户端发送带有计划使用的起始序列号的SYN包,服务器确认SYN包并以其序列号发送SYN包。一旦客户端确认了SYN数据包,就建立了连接。一旦有关方收到该序列的确认,从此处传输的每个数据包被认为是可靠的。

TCP通过四次挥手断开连接。关闭连接时,客户端、服务端调用close syscall。假设客户端想要断开连接。客户端的内核将发送FIN包给服务器。服务器的内核无法关闭连接,知道服务器应用程序调用close syscall。一旦服务器应用程序调用close,服务器同样发送一个FIN包,客户端进入时间等待状态(2MSS, 120s),以便在该时间段中重复使用此套接字以防止由于杂散陈旧数据包引起的认证TCP状态损坏。




路由

IP Routing and Data Link Layer: https://linkedin.github.io/school-of-sre/level101/linux_networking/ipr/

我们将挖掘离开客户端的数据包到达服务器,反之亦然。当数据包到达IP层时,传输层填充源端口和目的端口。IP网络层填充目标IP,然后查找路由表上对应的路由。

路由表中0.0.0.0的网关,意味着不需要网络层hop来发送数据包。源和目的都在同一个网络中。内核必须弄清楚目的地的MAC并适当地填充源和目的MAC,并将数据包发送出来,以便它到达目的地而没有中间的任何一层跳跃。








Python和Web








数据


关系型数据库

Relational Databases


关键概念

Key Concepts: https://linkedin.github.io/school-of-sre/level101/databases_sql/concepts/

  • 关系型数据库用于存储数据。即使是文件也可用于存储数据。但关系型数据库设计具有特定的目标:
    • 效率
    • 易于访问和管理
    • 有组织的
    • 处理数据直接的关系(表示为表)
  • 事务(Transaction): 可以包含多个语句的工作单位,一起执行
  • ACID属性
    • 原子性(Atomicity): 每个事务都是原子的(完成成功或完全失败)
    • 一致性(Consistency):事务仅导致有效状态
    • 隔绝性(Isolation):每个事务都在并发系统内安全地单独执行
    • 持久性(Durability):保证已提交的事务将永久存在
  • CRUD操作
    • Create
    • Read
    • Update
    • Delete
  • 查询的四种类型
    • DDL(definition)
    • DML(manipulation)
    • DCL(control)
    • TCL(transactions)
  • 约束(Constraint):可以存储的数据的规则
  • 索引(Index):大多数索引使用B+tree结构
  • 联结(Join):多表关联
  • 访问控制(Access control)




流行的数据库系统

  • 商业版
    • Oracle
    • MS SQL Server
    • IBM DB2
  • 开源版
    • MySQL
    • MariaDB
    • PostgreSQL




MySQL




InnoDB




备份和还原

Backup and Recovery




MySQL副本

MySQL Replication




查询语句




查询优化

Query Performance: https://linkedin.github.io/school-of-sre/level101/databases_sql/query_performance/

查询性能是关系型数据库一个非常重要的方面。重要任务是识别慢查询,并尝试通过重写它们或在涉及的表中创建适当的索引来提高其性能。




NoSQL

通常,术语NoSQL数据库指的是任何非关系型数据库。术语NoSQL(non SQL)指的是not only SQL。无论那种方式,大多数人都同意NoSQL数据库是存储关系表以外格式的数据库。

常见的误解是NoSQL数据库或非关系型数据库不会很好地存储关系数据。NoSQL数据库可以存储关系数据,只是与关系型数据库不同地存储。实际上,与SQL数据库相比,许多查找在NoSQL数据库中的建模关系更容易,因为相关数据不必在表之间拆分。

随着敏捷开发的兴起,NoSQL数据库专注于伸缩(scaling),高性能,同时允许频繁地应用更改,并轻松地进行编程。

NoSQL数据库的类型:

  • 文档型(Document):存储在文档中的数据(BSON)类似与JSON对象。每个文档包含一组键值对。值通常可以是各种类型:字符串、数字、布尔、数组和对象,它们通常与开发人员对齐的结构与代码一起使用。有点包括直观的数据模型和灵活模式。由于值类型很宽泛和强大的查询语言,文档数据库非常适合各种用例,可用作通用数据库。它可以快速和无限的横向扩展。
    • MongoDB
    • Couchbase
  • 键值对(Key-Value):简单的键值数据库。它非常适合你需要存储大量数据但不需要执行复杂查询来检索它的情况。
    • Redis
    • DynamoDB
  • 宽列(Wide-column):数据存储在表、行和动态的列中。宽列存储提供了对关系数据库的大量灵活性,因为每行都不需要具有相同的列。宽列存储通常用于用户配置文件和数据的网络数据。
    • HBase
    • Cassandra
  • 图(Graph):数据存储在节点(node)和边缘(edge)中。节点通常存储有关人员、地方和事物的信息,而边缘存储节点之间的关系的信息。
    • Neo4j


比较

类型 性能 扩展性 灵活性 复杂性 功能性
k-v high high high none Variable
document high Variable(high) high low Variable(low)
Column DB high high moderate low minimal
Graph Variable Variable high high Graph theory


SQL和NoSQL的不同之处

SQL数据库 NoSQL数据库
数据存储模型 具有固定行和列的表 Document: JSON文档
K-V: 键值对
Wide-column:具有行和动态列的表
Graph:节点和边缘
首要目标 一般用途 Document:一般用途
K-V:具有简单查询的大量数据
Wide-column:具有可预测查询模式的大量数据
Graph:在关联的数据之间分析和遍历关系
模式(Schema) 严格且生硬(Rigid) 灵活
扩展性 垂直 水平
多记录ACID事务 支持 大多数不支持,MongoDB支持
联结 通常需要 通常不需要
数据到对象映射 需要ORM(object-relational mapping) 大多不需要


优点

  • 灵活的数据模型
  • 水平伸缩
  • 快速查询
  • 开发者生产力




关键概念

Key Concepts: https://linkedin.github.io/school-of-sre/level101/databases_nosql/key_concepts/




大数据

Big Data








系统设计

Systems Design

如何学习设计系统?

随着软件和硬件系统具有多种可移动部件,我们需要考虑这些部件如何生长,其失败模式,其依赖关系,如何影响用户和业务。

没有一蹴而就的方法,我们只有通过设计和迭代来学习设计系统。


可扩展性

Scalability: https://linkedin.github.io/school-of-sre/level101/systems_design/scalability/