debian怎么配置静态ip地址
336
2022-10-22
本文目录一览:
sapcechase0大神提供的这个MOD允许玩家和朋友在线上创建单独的游戏,然后一起愉快的玩耍。
MOD可以实现玩家之间经济、关系进度等内容的共享,美中不足的是,储存、技能和农舍内饰是分开的。
这个MOD虽然还不完美,有很多bug,不过也可以先救救急啦。
如果想要更佳的联机体验,各位还是需要等待官方推出联机系统。
使用MOD联机教程:
这款MOD的安装方法十分简单,只要将全部MOD文件放入游戏目录,然后运行StardewModdingAPI.exe即可。
具体的联机方法是:
1、房主可以创建新角色或载入现有的,弹出两个窗口都点确认,然后耐心等待。(游戏看起来会像死机了,但并没有,耐心等就好。)
2、其他玩家等待房主完成上一步,然后创建新角色或载入现有的,弹出的第一个窗口选“否”,输入房主的IP地址并确认,再弹出窗口选确认。
3、房主会看到XX玩家接入游戏的消息。如果还想加入新玩家,房主需要点击“否”然后等待,等所有人到齐之后就可以选“是”然后进入游戏了。
注意:所有玩家都必须安装MOD和SMAPI才能游戏。既可以在局域网中游戏,也可以由房主创建开放站点允许其他电脑接入。
本文详细介绍了Openstack的网络原理和实现,主要内容包括:Neutron的网络架构及网络模型还有neutron虚拟化的实现和对二三层网桥的理解。
一、Neutron概述
Neutron是一个用Python写的分布式软件项目,用来实现OpenStack中的虚拟网络服务,实现软件定义网络。Neutron北向有自己的REST API,中间有自己的业务逻辑层,有自己的DB和进程之间通讯的消息机制。同时Neutron常见的进程包括Neutron-server和Neutron-agent,分布式部署在不同的操作系统。
OpenStack发展至今,已经经历了20个版本。虽然版本一直在更替,发展的项目也越来越多,但是Neutron作为OpenStack三大核心之一,它的地位是不会动摇的。只不过当初的Neutron也只是Nova项目的一个模块而已,到F版本正式从中剥离,成为一个正式的项目。
从Nova-Network起步,经过Quantum,多年的积累Neutron在网络各个方面都取得了长足的发展。其主要的功能为:
(1)支持多租户隔离
(2)支持多种网络类型同时使用
(3)支持隧道技术(VXLAN、GRE)
(4)支持路由转发、SNAT、DNAT技术
(5)支持Floating IP和安全组
多平面租户私有网络
图中同时有VXLAN和VLAN两种网络,两种网络之间互相隔离。租户A和B各自独占一个网络,并且通过自己的路由器连接到了外部网络。路由器为租户的每个虚拟机提供了Float IP,完成vm和外网之间的互相访问。
二、Neutron架构及网络模型
1、Neutron架构
Neutron-sever可以理解为类似于nova-api那样的一个专门用来接收API调用的组件,负责将不同的api发送到不同Neutron plugin。
Neutron-plugin可以理解为不同网络功能实现的入口,接收server发来的API,向database完成一些注册信息。然后将具体要执行的业务操作和参数通知给对应的agent来执行。
Agent就是plugin在设备上的代理,接受相应的plugin通知的业务操作和参数,并转换为具体的命令行操作。
总得来说,server负责交互接收请求,plugin操作数据库,agent负责具体的网络创建。
2、Neutron架构之Neutron-Server
(1)Neutron-server的本质是一个Python Web Server Gateway Interface(WSGI),是一个Web框架。
(2)Neutron-server接收两种请求:
REST API请求:接收REST API请求,并将REST API分发到对应的Plugin(L3RouterPlugin)。
RPC请求:接收Plugin agent请求,分发到对应的Plugin(NeutronL3agent)。
3、Neutron架构之Neutron-Plugin
Neutron-plugin分为Core-plugin和Service-plugin。
Core-plugin:ML2负责管理二层网络,ML2主要包括Network、Subnet、Port三类核心资源,对三类资源进行操作的REST API是原生支持的。
Service-plugin:实现L3-L7网络,包括Router、Firewall、VPN。
4、Neutron架构之Neutron-Agent
(1)Neutron-agent配置的业务对象是部署在每一个网络节点或者计算节点的网元。
(2)网元区分为PNF和VNF:
PNF:物理网络功能,指传统的路由器、交换机等硬件设备
VNF:虚拟网络功能,通过软件实现的网络功能(二层交换、三层路由等)
(3)Neutron-agent三层架构如下图:
Neutron-agent架构分为三层,北向为Neutron-server提供RPC接口,供Neutron server调用,南向通过CLI协议栈对Neutron VNF进行配置。在中间会进行两种模型的转换,从RPC模型转换为CLI模型。
5、Neutron架构之通信原理
(1)Neutron是OpenStack的核心组件,官网给出Neutron的定义是NaaS。
(2)Naas有两层含义:
对外接口:Neutron为Network等网络资源提供了RESTful API、CLI、GUI等模型。
内部实现:利用Linux原生或者开源的虚拟网络功能,加上硬件网络,构建网络。
Neutron接收到API请求后,交由模块WSGI进行初步的处理,然后这个模块通过Python API调用neutron的Plugin。Plugin做了相应的处理后,通过RPC调用Neutron的Agent组件,agent再通过某种协议对虚拟网络功能进行配置。其中承载RPC通信的是AMQP server,在部署中常用的开源软件就是RabbitMQ
6、Neutron架构之控制节点网络模型
控制节点没有实现具体的网络功能,它对各种虚拟设备做管理配合的工作。
(1)Neutron:Neutron-server核心组件。
(2)API/CLI:Neutron进程通过API/CLI接口接收请求。
(3)OVS Agent:Neutron通过RPC协议与agent通信。
控制节点部署着各种服务和Neutron-server,Neutron-server通过api/cli接口接收请求信息,通过RPC和Agent进行交互。Agent再调用ovs/linuxbridge等网络设备创建网络。
7、Neutron架构之计算节点网络模型
(1)qbr:Linux Bridge网桥
(2)br-int:OVS网桥
(3)br-tun:OVS隧道网桥
(4)VXLAN封装:网络类型的转变
8、Neutron架构之网络节点网络模型
网络节点部署了Router、DHCP Server服务,网桥连接物理网卡。
(1)Router:路由转发
(2)DHCP: 提供DNS、DHCP等服务。
(3)br-ex: 连接物理网口,连接外网
三、Neutron虚拟化实现功能及设备介绍
1、Neutron虚拟化实现功能
Neutron提供的网络虚拟化能力包括:
(1)二层到七层网络的虚拟化:L2(virtual Switch)、L3(virtual Router 和 LB)、L47(virtual Firewall )等
(2)网络连通性:二层网络和三层网络
(3)租户隔离性
(4)网络安全性
(5)网络拓展性
(6)REST API
(7)更高级的服务,包括 LBaaS,FWaaS,VPNaaS 等
2、Neutron虚拟化功能之二层网络
(1)按照用户权限创建网络:
Provider network:管理员创建,映射租户网络到物理网络
Tenant network:租户创建的普通网络
External network:物理网络
(2)按照网络类型:
Flat network:所有租户网络在一个网络中
Local network:只允许在服务器内通信,不通外网
VLAN network:基于物理VLAN实现的虚拟网络
VXLAN network:基于VXLAN实现的虚拟网络
3、Neutron虚拟化实现功能之租户隔离
Neutron是一个支持多租户的系统,所以租户隔离是Neutron必须要支持的特性。
(1)租户隔离三种含义:管理面隔离、数据面的隔离、故障面的隔离。
(2)不同层次租户网络的隔离性
租户与租户之间三层隔离
同一租户不同网络之间二层隔离
同一租户同一网络不同子网二层隔离
(3)计算节点的 br-int 上,Neutron 为每个虚机连接 OVS 的 access port 分配了内部的 VLAN Tag。这种 Tag 限制了网络流量只能在 Tenant Network 之内。
(4)计算节点的 br-tun 上,Neutron 将内部的 VLAN Tag 转化为 VXLAN Tunnel ID,然后转发到网络节点。
(5)网络节点的 br-tun 上,Neutron 将 VXLAN Tunnel ID 转发了一一对应的 内部 VLAN Tag,使得 网络流被不同的服务处理。
(6)网络节点的 br-int 上连接的 DHCP 和 L3 agent 使用 Linux Network Namespace 进行隔离。
4、Neutron虚拟化实现功能之租户网络安全
除了租户隔离以外 Neutron还提供数据网络与外部网络的隔离性。
(1)默认情况下,所有虚拟机通过外网的流量全部走网络节点的L3 agent。在这里,内部的固定IP被转化为外部的浮动IP地址
(1)Neutron还利用Linux iptables特性,实现其Security Group特性,从而保证访问虚机的安全性
(3)Neutron利用网络控制节点上的Network Namespace中的iptables,实现了进出租户网络的网络防火墙,从而保证了进出租户网络的安全性。
5、Neutron虚拟化设备
(1)端口:Port代表虚拟网络交换机上的一个虚拟交换机端口
虚拟机的网卡连接到Port上就会拥有MAC地址和IP地址
(2)虚拟交换机:Neutron默认采用开源的Openvswitch,
同时还支持Linux Bridge
(3)虚拟路由器VR:
路由功能
一个VR只属于一个租户,租户可以有多个VR
一个VR可以有若干个子网
VR之间采用Namespace隔离
四、Neutron网桥及二三层网络理解
1、Neutron-Local-Bridge
仅用于测试;网桥没有与物理网卡相连VM不通外网。
图中创建了两个local network,分别有其对应的qbr网桥。Vm123的虚拟网卡通过tap连接到qbr网桥上。其中2和3属于同一个network可以通信,1属于另一个网络不能和23进行通信。并且qbr网桥不连物理网卡,所以说local网络虚拟机只能同网络通信,不能连通外网。
2、Neutron-Flat-Bridge
Linux Bridge直接与物联网卡相连
每个Flat独占一个物理网卡
配置文件添加响应mapping
Flat网络是在local网络的基础上实现不同宿主机之间的二层互联,但是每个flat network都会占用一个宿主机的物理接口。其中qbr1对应的flatnetwork 连接 eth1 qbr2,两个网络的虚机在物理二层可以互联。其它跟local network类似。
3、Neutron-VLAN-Bridge
在基于linux bridge的vlan网络中,eht1物理网卡上创建了两个vlan接口,1.1连接到qbr1网桥,1.2连接到了qbr2网桥。在这种情况下vm通过eth1.1或者eth1.2发送到eth1的包会被打上各自的vlan id。此时vm2和vm3属于同一个network所以是互通的,vm与vm2和vm3不通。
4、Neutron-VXLAN-Bridge
这个是以Linux bridge作agent的Vxlan网络:
Vxlan网络比Vxlan网络多了个VXLAN隧道,在Openstack中创建好内部网络和实例后,agent就会在计算节点和网络节点创建一对vxlan vtep.组成隧道的两个端点。
Vxlan连接在eth0网口。在网络节点多了两个组件dhcp 和router,他们分别通过一对veth与qbr网桥连接在一起,多个dhcp和路由之间使用namesapce隔离,当vm产生ping包时,发往linux 网桥qbr1,通过网桥在vxlan12上封装数据包,数据通过eth0网卡出计算节点到网络节点的eth0,在vxlan12解包。到达路由器之后经过nat地址转换,从eth1出去访问外网,由租户网络到运营商网络再到外部网络。
5、Neutron-VLAN-OVS
与Linux bridge不同,openvswitch 不是通过eth1.1 eth1.2这样的vlan接口来隔离不同的vlan,而是通过openvswitch的流表规则来指定如何对进出br-int的数据进行转发,实现不同vlan的隔离。
图中计算节点的所有虚拟机都连接在int网桥上,虚拟机分为两个网络。Int网桥会对到来的数据包根据network的不同打上vlan id号,然后转发到eth网桥,eth网桥直连物理网络。这时候流量就从计算节点到了网络节点。
网络节点的ehx int网桥的功能相似,多了一个ex网桥,这个网桥是管理提前创建好的,和物理网卡相连,ex网桥和int网桥之间通过一对patch-port相连,虚拟机的流量到达int网桥后经过路由到ex网桥。
6、Neutron-VXLAN-OVS
Vxlan的模型和vlan的模型十分相似,从表面上来看,他俩相比只有一个不同,vlan对应的是ethx网桥,而vxlan对应的是tun网桥。
在这里ethx和tun都是ovs网桥,所以说两者的差别不是实现组件的差别而是组件所执行功能的差别,ethx执行的是普通二层交换机的功能,tun执行的是vxlan中的vtep的功能,图中俩tun对应的接口ip就是vxlan的隧道终结点ip。所以说虚机的数据包在到达tun网桥之前是打的是vlan tag,而到达tun之后会发生网络类型的转换,从vlan封装为vxlan然后到达网络节点。而之前的vlan类型的网络,虚机数据包的类型一直都是vlan。
7、物理的二层与虚拟的二层(VLAN模式)
(1)物理的二层指的是:物理网络是二层网络,基于以太网协议的广播方式进行通信。
(2)虚拟的二层指的是:Neutron实现的虚拟网络也是二层网络(openstack的vm机所用的网络必须是大二层),也是基于以太网协议的广播方式进行通信,但毫无疑问的是该虚拟网络是依赖于物理的二层网络。
(3)物理二层+虚拟二层的典型代表:VLAN网络模式。
8、物理的三层与虚拟的二层(GRE模式与VXLAN模式)
(1)物理三层指的是:物理网络是三层网络,基于IP路由的方式进行通信。
(2)虚拟的二层指的是:Neutron实现的虚拟网络仍然是二层网络(openstack的vm机所用的网络必须是大二层),仍然是基于以太网的广播方式进行通信,但毫无疑问的是该虚拟机网络是依赖于物理的三层网络,这点有点类似于VPN的概念,根本原理就是将私网的包封装起来,最终打上隧道的ip地址传输。
(3)物理三层+虚拟二层的典型代表:GRE模式与VXLAN模式。
比如我的文件 /Doctrine/Common/IsolatedClassLoader.php 这样子的一个类文件,那么你的namespace命名就必须声明称这样:
声明:namespace \Doctrine\Common\
调用:\Doctrine\Common\IsolatedClassLoader
其中,Doctrine 表示一个模块目录 Vendor name, common就是namesapce, IsolatedClassLoader是class name。这样一看就知道这个文件的目录层次,一目了然。
GFS的诞生来源于google日益增长的数据量的处理需求,它是一个可扩展的分布式文件系统,用于大型分布式数据密集型应用,在廉价的通用硬件上运行时提供容错机制,并且可以为大量客户端提供较高的聚合性能。
它的设计由当前和预期的应用负载(当时的)和技术环境驱动,与以前的文件系统的假设有着明显不同,因此gfs在设计上有几个不同的points:
当前已部署多个集群用于不同目的,最大的拥有1000多个存储节点,超过300TB的存储服务,并且有数百个客户端连续不断地高负载请求。
前面提到一些对应用负载和技术环境的观察,现在更详细地进行阐述:
虽然GFS不能提供像POSIX标准的API,但它提供一个相似的文件系统接口。文件在目录中按层次结构组织,并以路径名作为标识。支持create、delete、open、close、read and write files。
gfs支持快照和record append操作。快照以低代价创建文件副本或者目录树,record append支持多个客户端并发地写文件,保证每个独立客户端append的原子性。
一个gfs集群包含一个master和多个chunkservers,chunkserver被多个客户端访问,如图1所示。每一个都是普通linux机器上运行的用户态服务进程。资源允许的情况下,客户端可以和chunkserver部署在同一台机器上。
文件被划分为固定大小的块。每个chunk由一个独一无二的64位大小的chunk handle所标识,chunk handle在chunk被创建时由master分配。每个chunk的副本分布在多个机器上,系统默认为三副本模式,用户也可以为不同namespace的文件指定不同级别的副本。
master包含文件系统的所有元信息。包含namespace、访问控制权限信息、文件到chunks的映射、当前chunks的位置信息。也控制着全局的活动,像chunk租约管理、gc、chunk迁移等。master通过心跳的方式与每个chunkserver交流来发送它的指令和收集状态。
客户端与master的交互涉及元信息操作,所有数据操作直接与chunkserver交互。gfs不提供POSIX标准API,因此不需要挂接到linux的vnode层。
客户端和chunkserver都不缓存文件数据。大多数应用传输大文件,客户端缓存收益很低。chunks作为本地的文件存储,linux系统有自己的buffer cache,chunkserver不需要再增加缓存。
单master简化了系统的设计,但是会有单点的瓶颈问题,这是必须要解决的。客户端不会从master读写数据文件,客户端请求master它需要的交互的chunkserver信息,并且将其缓存一段时间,后续的操作直接与chunkservers交互。
客户端会发送请求给离它最近的一个副本。实际上,客户端通常会向master请求多个chunk的信息,以减少未来与maser交互的代价。
chunk size定为64MB,相比普通的文件系统的block size更大。每个chunk副本以linux文件的形式存在chunkserver上,仅根据需要来扩展。使用lazy space allocation的方式避免空间浪费。
large chunk size有以下几个优点:
但是large chunk size with lazy space allocation也有其缺点:单个文件可能包含很少数量的chunks,或许只有一个,当许多客户端访问相同文件时这些chunks成为热点。但由于目标应用大多是顺序的读多个large chunk文件,热点并不是主要的问题。
然而GFS第一次用于批处理队列系统时确实出现了热点问题,数百个客户端同时访问一个单chunk文件,存储这个文件的几个chunkserver超负荷运转,当时通过错开应用的启动时间避免了这个问题,一个潜在、长期的解决方法是允许客户端从其它客户端读取数据。
master保存三种类型的元数据:
所有元数据都保存在内存中 。对于元数据的内存操作是很快的,后台任务周期巡检整个状态也是比较简单高效的。周期巡检用于实现chunk gc、在chunkserver故障时重新构造副本、chunk迁移以平衡多个chunkserver的负载和disk usage。
虽然系统的容量受master内存大小的限制,但这并不是一个严重的问题,64MB的chunk只需要不到64byte大小的元信息,如果一定需要更大的文件系统,那么增加内存的代价相比为可靠性、性能和灵活性等付出的代价是较小的。
前两种类型的元数据通过写日志来保证持久化,并且会复制日志到远程机器上。master不需要将chunks的位置信息持久化,而是在master启动和新的chunkserver加入集群时向每个chunkserver询问它的位置信息,之后通过心跳信息监控chunk位置变更信息。chunkserver作为最后一关是确切知道自己本地有没有哪些chunk的,因此维护一个一致性的视图是没有必要的。
operation log 包含元数据的变更记录, 它是GFS的核心 ,它不仅仅是唯一的元数据持久化记录,也表明了并发操作的逻辑时间线。文件、chunks和它们的版本都是由逻辑时间线唯一标识。元数据变更记录在持久化之前对客户端是不可见的,而且日志被复制到多个远程的机器,只有相应的记录在本地和远程都持久化到硬盘了才可以回复客户端。master使用批处理log的方式提高系统的吞吐。
master通过回放日志来恢复文件系统的状态,为提高恢复速度需要保持log量足够小。当log增长超过特定大小时,master会checkpoint它的状态,以加速恢复提高可用性。构建checkpoint可能需要花费一段时间,因此master以一种不delay后续变化的方式来组织内部状态,先switch到一个新的日志文件,使用独立的线程创建checkpoint,新的checkpoint包含了所有switch之前的变化。几百万个文件的集群在一分钟内可以完成,完成后将同时被写入本地和远程。恢复只需要最新的checkpoint和之后的日志文件,旧的checkpoints和日志文件可以完全删除。
GFS使用一个宽松的一致性模型,这种模型可以很好地支持分布式应用程序,而且实现起来简单有效。
file namesapce变化(例如文件创建)是原子的,使用namespace锁。
master的operation log定义了这些操作的全局顺序。
数据变化后文件region的状态取决于变化的类型,是否成功、失败或者是并发的。Table1做了总结。如果所有客户端都能看到相同的数据,无论它们读的是哪个副本,则这个file region是一致的。
数据变化有两种:writes或者record appends。write是指从应用指定offset处开始写数据,record append指即使存在并发冲突,数据也要被原子地append到文件至少一次,但offset是由GFS选定。
GFS保证在一系列成功的mutations后,file region是defined,通过下面两点来保证:
过期的副本将不会再涉及到任何mutation,master也不会将其位置信息回应给客户端,不久后将会被gc。但客户端缓存的信息可能包含过期的副本,缓存失效存在一个时间窗口,文件再次打开也会清除该文件的所有chunk信息。由于大多数文件是append-only,过期的副本通常返回的是过早的结尾???而不是过期的数据。
介绍客户端、master和chunkserver之间如何交互来实现数据变化、原子追加写和快照的。
使用租约的方式维护多个副本间一致的mutation order。master授权租约给副本中的一个,称之为primary。primary为chunk的mutaions选择一个顺序,所有副本都按照这个顺序apply。
租约机制最小化了master的管理overhead。租约初始的超时时间是60s,如果chunk一直在变化过程中,primary可以申请续租。这些授权和续租请求由master和chunkserver之间的心跳信息携带。master也可以尝试撤销租约,即使它与primary失去了联系,也可以等租约过期后安全地授权给另外一个副本。
在Figure2中,跟随着写入控制流展示了处理过程:
如果一个写请求比较大或者超出了chunk边界,GFS客户端将它拆为多个写操作,但是多个操作可能与其它客户端并发交叉写入,因此共享的fie region最终可能包含多个不同客户端的碎片,这会造成 一致性模型 中所描述的file region处于consistent but undefined状态。
数据以pipline的机制在chunkserver链上线性传输,而控制流是从客户端到primary再到所有的其它副本。分离数据流和控制流可以更高效地使用网络。可以带来以下好处:
GFS提供原子的append operaton叫作 record append 。传统的write中,客户端指定offset,并发写相同region时不是serializable,最终region可能包含多个客户端的碎片数据。而对于record append,客户端仅指定数据,GFS保证至少一次成功的原子append,offset由GFS选定,与Unix的O_APPEND模式相似。
多个客户端并发操作相同文件是比较重的。如果处理传统的write,客户端需要额外复杂和昂贵的同步逻辑,像分布式锁。而record append仅需要primary增加一点额外的逻辑:primary检查是否并发append数据的chunk会超出max size,如果会超出则将chunk填充到max size,并且告诉所有二级副本同样操作,然后回应客户端指出这个操作应该选择另一个chunk重试;大多数情况下记录是在max size内的,primary将数据append到自己的副本,并告诉所有二级副本按照确切的offset写数据,最后回应给客户端。
如果中间出现错误,客户端重试,相同chunk的副本可能包含不同的数据,可能包含相同的记录或者一部分相同,GFS不保证bytewise identical,仅仅保证数据至少有一次被成功地原子写入。从report success逻辑可以容易得出,数据必须是在某个chunk的所有副本上以相同的offset写入。在此之后,所有副本都与记录end一样长,即使后面不同的副本成为primary,任何将来的记录也将分配到更高的offset或者不同的chunk。根据上述的一致性保证,成功的record append的region是defined和一致的,而中间的region是不一致的(undefined)。GFS的应用可以处理这种不一致的region(2.7.2)。
snapshot 操作拷贝一份文件或者目录树,几乎是实时的,同时最大程度减少对正在进行中的mutation的干扰。
像AFS一样,使用标准的COW技术实现snapshot。当master接收到一个snapshot请求,首先将所有涉及到chunks的租约撤销,这保证了这些chunks后续的write将会先请求master查找租约持有者,master会创建一个新的副本来回应。
租约被撤销或者过期后,master将这个操作记录日志到disk。新创建的snapshot引用元数据相同的chunks。
当snapshot操作完成后,客户端第一次要写chunk C,发送请求给master查询持有租约者,master察觉到chunk C的引用大于1,则让每个含有当前chunk副本的chunkserver创建一个新的chunk叫作C',所有创建都使用本地的副本,相比100Mb的网络本地速度大约是三倍速度。master授权租约给新的chunk C'中的一个并且回复给客户端,之后正常地写chunk。整个过程对客户端是透明的。
master执行所有的namespace操作。另外,它管理整个系统的chunk副本:
接下来,详细探讨这些细节。
许多master操作可能花费较长一段时间,比如snapshot操作需要撤销相关的所有chunks的租约。因此为了不delay其它master操作,在namesapce的regions上使用locks来确保串行化。
GFS没有按目录列出该目录中所有文件的结构,也不支持文件和目录的别名(unix中的硬链和软链)。GFS将完整的路径名到元数据的映射表作为它的逻辑namespace。使用前缀压缩,这个表可以有效保存在内存中。namespace tree中的每个节点都有一个关联的读写锁。
每个master操作在运行前都会获取一组锁。如果涉及到/d1/d2/../dn/leaf,它将获取目录名称/d1、/d1/d2、...、/d1/d2/.../dn上的读锁,完整路径/d1/d2/../dn/leaf的读锁或者写锁。leaf可以是文件或者目录。
创建文件不需要对父级目录加锁,因为没有"目录"的概念不会修改它,而加读锁是防止它被删除、重命名或者snapshot。这种锁机制的好处是允许相同目录下并发的mutations。
一个GFS集群通常具有分布在多个机架上的数百个chunkserver,这些chunkserver也会被相同或者不同机架的数百个客户端访问。不同机架上的两台计算机之间的通信可能会跨越一个或者多个网络交换机。另外进出机架的带宽可能小于机架内所有计算机的总带宽。多级分布式对如何分发数据以实现可伸缩性、可靠性和可用性提出了独特的挑战。
副本放置策略有两个目的:最大化数据可靠性和可用性,最大化网络带宽利用率。不仅要在多台机器上放置,还要在多个racks上,即使整个racks损坏也可以确保部分副本保持可用。也可以利用多个racks的总带宽。
chunk副本创建有三个原因:
当master创建新的chunk时,根据几个因素考虑如何放置新的副本:
当chunk可用副本的数量低于用户指定时,master会重新复制。可能发生在几种情况:
需要重新复制的chunk根据以下几个因素确定优先级:
master限制集群和每一个chunkserver内的活跃的clone数量,另外chunkserver通过限制其对源chunkserver的读请求来限制在每个clone操作上花费的带宽。
master会定期重新平衡副本:检查当前副本的分布,迁移副本以获得更好的磁盘空间利用率和负载平衡。同样通过此过程,master逐渐填充一个新的chunkserver。另外,master通常更倾向于移除具有低磁盘利用率chunkservers上的副本,以平衡空间使用。
当文件被删除时,master记录日志,但不会立即回收资源,而是将文件重命名为包含删除时间戳标记的隐藏名称。如果这些文件存在时间超过三天(时间可配置),master巡检时会将其删除。在此之前,仍然可以用特殊名称来读取文件,并且可以重命名为正常名称来取消删除。当从namesapce中删除隐藏文件时,其内存元数据将被删除,这有效切断了所有chunk的连接,在对chunk namespace的扫描中,master识别出孤立的chunk并清除元数据。在心跳信息中,每个chunkserver报告其拥有的chunks子集,而master将回应不在存在于master元数据中的所有的chunk的标识。chunkserver可以自由删除此类chunk的副本。
这种gc机制相比立即删除有以下几个优点:
这种机制主要的缺点是当存储空间紧张时,延迟有时会影响用户的使用,重复创建和删除临时文件的应用可能无法立即重用存储。如果删除的文件再次被明确删除,GFS将通过加快存储回收来解决这些问题。还允许用户将不同的复制和回收策略应用于不同的namespace的不同部分中。
如果一个chunkserver故障或者chunk丢失了mutations,这个chunk副本可能是过期的。对于每个chunk,master都维护了一个chunk版本号。
当master授权租约给一个chunk时,这个chunk的版本号增加1,如果一个副本当前不可用了,则其版本号将不会领先。当chunkserver重新启动并报告其chunks集合和相关联的版本号时,master将检测到该chunkserver上具有过期的副本。如果master看到的版本号大于它记录的版本号,则认为在授权租约时失败了,因此将较高的版本号更新。
master在常规gc中删除旧的副本。另一个保护措施,在master回应客户端哪个chunk持有租约或者clone操作中chunkserver从另一个chunkserver读取chunk时会包含chunk的最新版本号。客户端或者chunkserver在执行操作时会验证版本号。
这个系统最大的挑战之一是处理经常故障的组件。组件的质量和数量造成的问题会超出预期,组件故障可能造成系统不可能,甚至数据错误。接下来讨论GFS如何应对这些挑战,还有系统如何诊断不可避免问题。
使用两个简单有效的方式保证系统的高可用:快速恢复和复制。
master和chunkserver的恢复都是秒级别的。
master维护每个chunk的副本数量,当chunkserver下线或者checksum检测出错误副本时,master会通过已有副本来复制。尽管复制提供了很好的解决方式,但仍在探索其它形式的跨服务器冗余方案,例如奇偶校验或者纠删码,以适应不断增长的只读存储需求。在非常松耦合的系统中实现这些更复杂的冗余方案更具有挑战性。
master的操作日志和checkpoint会被复制到多台机器上,状态的变化只有在本地和所有副本上都持久化以后才可以commit。master进程负责所有的mutations以及后台任务,当它宕机时可以很快重启,如果机器或者磁盘故障,GFS的外部监控将使用日志在其它节点重启新的master进程。在master宕机时,master的备节点只提供只读服务,它们不与master保持强一致,可能会落后于master,通常在1/4秒内。它们保证了那些不介意读到过期数据的应用的高可用读。类似于chunk的primary机制,master的备按照相同的序列应用日志。与master一样,在启动时从每个chunkserver拉取chunks的位置信息,与它们频繁交换握手消息来监控其状态。
每个chunkserver使用checksum来检测存储数据的损坏。数据损坏的chunk可以通过其它的副本来恢复,但是通过副本间比较来检验数据是不切实际的。正常的副本也不是完全一样的,如前文所讲,原子的append并不能保证完全一样的副本。因此每个chunkserver会维护自己的checksum。
每个chunk分为多个64kb的blocks,每个block包含一个32位的checksum,与其它元数据一样,checksum保存在内存中,依靠log持久化,与用户数据分离。
对于读,chunkserver在返回数据给请求者前先检测checksum,确保不会将出错的数据传输给其它chunkservers或者客户端。如果数据是坏的,chunkserver将错误返回给请求者并报告给master,请求者将会去读其它副本, master将会根据其它副本重新克隆一份。当新的副本创建以后,master指示chunkserver将错误的副本删除。checksum的计算不涉及I/O,对读的影响比较小,客户端通常尝试使用对齐block边界读来减少overhead。
为append写是做了checksum计算上的优化的,因为append写是主要的负载(相比于overwrite)。GFS只增量地更新最后部分block的checksum,为新的block的计算新的checksum。这样即使block已经损坏,新的checksum将与存储的数据不会匹配,下次读时将会与正常一样被检测出来。
如果一个写请求要写一个chunk中已存在的region,必要要先检验region的第一个和最后一个block的checksum,然后再重写,最后计算新的checksums。因为第一个和最后一个block可能含有不被重写的内容,如果这部分数据是损坏的,则新的checksum将包含错误的数据。
在idle时,checkserver可以扫描并检查不活跃的chunks,可以检测到冷chunks的错误,一旦错误被检测到,master可以创建一个新的副本。
GFS在设计上与传统文件系统有很多不同,这些点是基于对当时应用负载和技术环境的观察所重新设计,将组件故障看作平常的事件而非异常,为大文件的读取和追加写做优化,扩展和放宽了标准的文件系统接口以改善整个系统。通过监控、复制以及快速恢复能力提供容错能力,使用checksum机制来校验数据的正确性。通过将控制流和数据流分离,数据直接在chunkservers、客户端之间传输,为许多并发的各种任务的读取和写入提供了高吞吐量。大chunk size和租约机制使得master的操作足够轻量化,使得这样一个简单中心化的master不会成为瓶颈。
GFS成功地满足了google的存储需求,作为研究、开发和数据处理的存储平台广泛地应用于google内部。
常见错误描述:
Apple Mach-O Linker Error这类错误的错误信息最后一行通常如下:
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang failed with exit code 1
发生这种错误的原因通常是因为项目中存在同名类造成链接错误。
有可能是你存在两个类名称都一样,也可能是因为你在不同的.m文件中定义了同样的const变量。
这类错误需要自己看错误信息中给出的大长串路径,从中找出你的那个重名类或者变量名称,以此来定位错误位置。
Kubernetes DNS-Based Service Discovery · GitHub
DNS for Services and Pods | Kubernetes
Kubernetes DNS 在 cluster 内部署 DNS Pod 和 Service ,kubelet会告知容器DNS服务IP,来解析DNS names。
Cluster内的每个Service (包括DNS server)会被分配一个 DNS name。默认,客户端Pod的serch list包含该Pod的namespace和cluster的默认domain。
DNS查询会根据不同的namespace返回不同的结果。DNS查询不指定namespace,那么就使用该pod的namespace;指定namesapce,才可以跨namespace查询。
可以通过Pod的 /etc/resolv.conf 文件扩展查询。该文件由Kubelet设置。比如,仅查询 data 将被扩展为 data.test.cluster.local 。 search 参数也可以用来扩展查询。更多DNS查询参见 the resolv.conf manual page.
总之,在 test namespace 内的pod,可以成功的解析 data.prod or data.prod.svc.cluster.local 。
哪些对象拥有 DNS records?
如下章节详细描述了支持的DNS record 的类型和分层。The following sections detail the supported DNS record types and layout that is supported. Any other layout or names or queries that happen to work are considered implementation details and are subject to change without warning. 最新的设置文档参见 Kubernetes DNS-Based Service Discovery
"Normal" ( not headless ) Services 指派 DNS A or AAAA record,name 格式 my-svc.my-namespace.svc.cluster-domain.example 。这备解析为该Service的cluster IP。
**"Headless" **( without a cluster IP ) Services 也备指派 DNS A or AAAA record,name 格式 my-svc.my-namespace.svc.cluster-domain.example 。不同于 normal Services,其解析为select的一组Pods的IP。Clients 被期望使用标准round-robin的方式消费这组集合。
SRV Records are created for named ports that are part of normal or Headless Services . For each named port, the SRV record would have the form _my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example . For a regular service, this resolves to the port number and the domain name: my-svc.my-namespace.svc.cluster-domain.example . For a headless service, this resolves to multiple answers, one for each pod that is backing the service, and contains the port number and the domain name of the pod of the form auto-generated-name.my-svc.my-namespace.svc.cluster-domain.example
有时,我们不需要负载均衡,也不需要配置Service IP。这种情况,我们可以创建"headless" Services,通过给cluster IP (.spec.clusterIP)显示指定"None"。
你可以使用headless Service来跟其他服务发现机制交互,不需要绑定到Kubernetes方案。
Headless Services,没有分配 cluster IP ,kube-proxy 不负责这些 Services, 平台上没有负载均衡或代理处理。DNS的自动配置,依赖于Service是否定义了selectors:
定义了selectors的headless Services,endpoints controller 在API 创建 Endpoints 记录,配置DNS返回A记录 (IP addresses) 直接指向 Service 后的 Pods 。
没有定义selectors的headless Services,endpoints controller 不创建 Endpoints 记录。DNS系统通过如下查找、配置:
pod 在 DNS 的name通常如下:In general a pod has the following DNS resolution:
pod-ip-address.my-namespace.pod.cluster-domain.example .
比如,在 default namespace的某个Pod,IP地址 172.17.0.3,cluster 的 domain name 是 cluster.local ,那么该Pod的DNS name是:
172-17-0-3.default.pod.cluster.local .
Deployment 创建的 pods,或Service 发布的 DaemonSet ,DNS解析如下:
pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example
Pod创建好后,它的hostname就被设置为Pod的 metadata.name 值。
Pod 的 spec 有一个可选项 hostname ,用于指定 Pod 的 hostname。指派后,优先与Pod 的 name 作为 pod 的 hostname。比如,配置Pod的 hostname 为 " my-host ",该 Pod 的hostname 将被设置为 " my-host "。
Pod spec 还有个可选项 subdomain ,用于指定subdomain。比如,某 Pod 设置 hostname 为 " foo ", subdomain 为" bar ",namespace " my-namespace ",那么完全域名(FQDN) 就是 foo.bar.my-namespace.svc.cluster-domain.example 。
如果在同一 namespace 内,存在一个 headless service ,与某pod的subdomain名相同,集群的DNS仍然返回Pod FQDN 的 A or AAAA record。
比如,Pod 的 hostname 是 "busybox-1" , subdomain 是 "default-subdomain",同时名为 "default-subdomain" 的 headless Service 在同一个namespace中,该 pod 将识别它自己的FQDN 为 busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example 。DNS 为该name提供 A or AAAA record ,指向该 Pod 的 IP。Pod "busybox1" 和 "busybox2" 都可以拥有唯一的 A or AAAA records。
Endpoints 对象指派 hostname 以 endpoint addresses,以及它的 IP。
FEATURE STATE: Kubernetes v1.20 [beta]
当Pod被配置为可以拥有FQDN,它的 hostname就成了缩写的hostname。比如,如果某Pod的FQDN是 busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example ,那么该Pod默认的hostname就是 busybox-1 并且 hostname --fqdn 命令返回FQDN。
当你在Pod spec 设置 setHostnameAsFQDN: true ,kubelet 就会将该 Pod's FQDN 写入到该Pod namespace的into the hostname for that Pod's namespace. 这样,hostname 和 hostname --fqdn 都将返回 Pod 的 FQDN。
可以给每个pod设置DNS policies。Kubernetes 现在支持如下pod-specific DNS policies。这些 policies 设置在Pod Spec的 dnsPolicy 配置项。
Pod 的 DNS Config 提供了更多DNS控制手段。
dnsConfig 可选配置项可以与任意 dnsPolicy 搭配使用。但是,如果 dnsPolicy 设置为 " None ",那么 dnsConfig 配置项必须被指定。
如下是 dnsConfig 配置项的可定义属性:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~