Rust 程序设计语言 简体中文版 1.85.0
这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有三个重要的细节需要注 意。 首先,println! 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 println(没有 !)。我们将在第二十章详细讨论宏。现在你只需记住,当看到符号 ! 的时候,就意味着调用 的是宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。 16/562Rust 程序设计语言 简体中文版 如果程序的开头没有使用 use std::io; 引入 io 库,我们仍可以通过把函数调用写成 std::io::stdin 来使用该函数。stdin 函数返回一个 std::io::Stdin 的实例,这是一种代表 终端标准输入句柄的类型。 接下来,代码中的 .read_line(&mut guess) 调用了标准输入句柄上的 read_line 方法,以获 取用户输入。我们还将 &mut guess read_line(&mut guess).expect("Failed to read line"); 不过,过长的代码行难以阅读,所以最好拆开来写。通常来说,当使用 .method_name() 语法 调用方法时引入换行符和空格将长的代码行拆开是明智的。现在来看看这行代码干了什么。 之前提到了 read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型为 Result 的值。Result0 码力 | 562 页 | 3.23 MB | 9 天前3TiDB中文技术文档
启动时,将一些权限检查的表加载到内存,之后使用缓存的数据来验证权限。系统会周期性的将授权表从数据 库同步到缓存,生效则是由同步的周期决定,目前这个值设定的是5分钟。 修改了授权表,如果需要立即生效,可以手动调用: 连接验证 请求验证 生效时机 TiDB 访问权限管理 - 52 - 本文档使用 书栈(BookStack.CN) 构建 1. flush privileges; 一些使用频率偏低的权限当前版本的实现中还未做检查,比如 有两种 方式可以使用 Prepared 语句: 大多数 MySQL Driver 都支持 Prepared 语句,比如 MySQL Connector/C。这种方式可以通过 Binary 协 议直接调用 Prepared 语句 API。 通过 PREPARE , EXECUTE 以及 DEALLOCATE PREPARE 这三个语句也可以实现 Prepared 语句,这种方式不如 第 address_info JSON, 5. KEY (address_info) 6. ); 这并非是因为技术上无法支持,而是因为对 JSON 的直接比较,本身就是没有意义的 —— 尽管我们可以人为地约定 一些比较规则,比如 ARRAY 比所有的 OBJECT 都大 —— 但是这并没有什么用处。因此,正如 MySQL 5.7 所做 使用生成列对 JSON 建索引 JSON 支持 - 162 - 本文档使用0 码力 | 444 页 | 4.89 MB | 5 月前3Service Mesh结合容器云平台的思考和实践
Eureka Server Service 1 Service 2 Ribbon 注册 业务服务 配置中心 启动获取 Monitor Turbine K8S流量 SC流量 同集群调用微服务 Spring Cloud管理平台基于Kubernetes的Spring Cloud实现 Devops: Experience Auto Scaling & Self Healing Resilience Hardware,Storage,Networking Spring Cloud Kubernetes + Spring Cloud 看起来很美背后 • 功能上的重叠 • 服务降级 • 细粒度的鉴权(服务间的调用) • RPC支持 • 跨语言的问题 • …云平台微服务演进之Service Mesh云平台微服务演进之Service Mesh Pilot Envoy • 服务发现 • Envoy生命周期管理 pilot-agent有三种运行模式。根据role.Type变量定义,类型为model.Proxy,定义在context.go文件中,允许的3个取值范围为: i. "sidecar" 默认值,可以在启动pilot-agent,调用proxy命令时覆盖。Sidecar type is used for sidecar proxies in the application containers. ii. "ingress" Ingress0 码力 | 28 页 | 3.09 MB | 5 月前3Service Mesh的实践分享
• 升级困难 • 复杂代码嵌入对客户端进程影响大服务化体系2.0 - Service Mesh雏形 • 物理机、sidecar • Local & Remote,主与备 • 轻量级客户端、本地调用 • Local Proxy负责服务治理与 远程通信 • Remote Proxy负责备份和非 主流流量 JavaApp Local Proxy OSP Server Service Registry 响应(目前还没有生成HTTP sdk) 应用侵入性 侵入性大。复杂客户端会给 应用造成负担,包括资源占 用、依赖冲突等等 侵入性小。SDK只有简单的寻址和序列化/ 反序列化的功能 无侵入性。应用自行调用 运维难度 难度大。客户端的问题会对 应用直接产生影响,耦合太 重 难度小。Sidecar故障可以将流量临时切到 remote proxy解决 难度小。集群通过LVS接入,单 台机故障可以下线 Proxy自动切换流量到Remote proxy,应用无感知,能轻易实 现滚动升级 • 临时排查Local Proxy问题,可立马切走流量而不影响业务代码埋点 vs. Mixer • 性能考虑 • 调用链埋点的影响必须足够小 • 鉴权需要同步进行,调用Mixer代 价大 • Mixer的中央节点问题 • 传统基于日志收集的tracing方 案足够成熟 • 内部实现一套可插拔的鉴权框 架也能接受混合部署 vs. 绑定K8s0 码力 | 30 页 | 4.80 MB | 5 月前3严选 ServiceMesh 实践
控制面:Consul 管理后台5/24 服务治理能力 – 基于严选第一代ServiceMesh(cNginx) 类型 功能 能力提供方 服务调用方(Client) 服务提供方(Server) 服务注册与发现 注册发现:基于 Consul √ 调用控制 协议支持:HTTP 1.X/2.X,可扩展至 TCP √ 路由控制:提供简单的路由能力 √ 负载均衡:支持 RR、权重、一致性 Hash l,Galley10/24 功能视角 - 服务治理能力 – 基于Istio+Envoy 类型 功能 能力提供方 服务调用方(Client) 服务提供方(Server) 服务注册与发现 注册发现:云外基于 Consul,云内基于 K8s 默认的 ETCD √ 调用控制 协议支持:HTTP 1.X/2.X,GRPC,WebSocket,Dubbo, Thrift √ 路由控制:静态路由、动态路由、流量染色、分流控制等 Service Mesh 的 优势 灰度引流 • 服务间调用灰度引流 • 外域调用灰度引流 • 平滑迁移是 Service Mesh 在混合云架构落地的关键17/24 平滑迁移 • 边缘网关支持跨 LDC 访问 • 兜底路由:云内云外互备 • 访问控制(如白名单能力) • 灰度引流使架构透明化 • 服务间调用灰度引流 • 外域调用灰度引流18/24 API 网关 • 整体基于 Envoy+Pilot0 码力 | 25 页 | 2.07 MB | 5 月前3Curve核心组件之snapshotclone
高可用,克隆任务中断自动拉起继续克隆快照克隆服务器架构 • 基于brpc提供restful API的对外http接口 HttpService: • Serivce层面区分上层请求为同步接口调用,还是异步接口调用, 同步接口调用直接调用Core层接口实现功能,异步接口创建Task, 并交由TaskManager调度。 SnapshotService & CloneService: • 任务管理层负责调度 SnapshotTaskManager & CloneTaskManager: • 快照克隆核心模块,负责向下调用DataStore,MetaStore等底层 模块,实现快照和克隆的具体功能。 SnapshotCore & CloneCore:快照克隆服务器架构 • SnapshotDataStore负责管理快照转储的数据块,通过调用 S3Adaptor(一个封装了s3 client的接口层)与S3交互,存取s3 中的对象。 SnapshotDataStore: • SnapshotCloneMetaStore负责管理快照和克隆任务等元数据, 通过调用etcdclient,与etcd存储交互,存取etcd中的快照和克隆 元数据。 SnapshotCloneMetaStore: • CurveClient封装了Client接口,负责与MDS和ChunkServer交互。 CurveClient:0 码力 | 23 页 | 1.32 MB | 5 月前3BRPC与UCX集成指南
1 用UCX实现BRPC对RDMA的支持 徐逸锋2 BRPC简介 ●BRPC是Curve的基础通讯框架 ●支持远程过程调用 –C++ –TCP传输 –bthread协程(m:n调度,减少基于内核的下文切换 ,减少cache miss) ●多协议支持 –baidu_std,http,grpc… ●protobuf3 BRPC简介 ●Client/Server架构 ●使用Protobuf定义协议文件 ●Socket对象引用计数,多个Channel可以共享一个Socket对象 ●往SocketMap里调用Insert,要么返回已经存在的Socket对象(引用计数加一),要么创建一 个新的12 BRPC EventDispatcher ●是socket事件分发的中心 ●使用epoll和边沿触发 ●提供监视一个fd是否可读写,并调用对应socket对象的成员函数1314 Socket 输入事件处理15 Socket 是socket文件句柄 –void (*on_edge_triggered_events)(Socket*) ●可读事件的回调函数16 Server创建Socket Listener 把系统调用创建的listen socket fd传给Socket::Create,获得一个Socket对象17 Socket Listener::OnNewConnections Listener 获得一个socket0 码力 | 66 页 | 16.29 MB | 5 月前3CurveFS Client 概要设计
构,缓存之; 判断inode结构中,对应请求[off, size]位置的空间是否有分配:如果未分配或只有部分分配空间,则调用空间分配器分配空间,并根据空间分配器返回结果,修改inode结构(包括file length); inode修改需要持久化到底层并修改本地cache; 调用curve client接口,写curve卷对应[offset,len] 数据。 (这里涉及到一个问题,是否从fuse (这里涉及到一个问题,是否从fuse下来的请求是4k对齐的,如果不是,那么这里还需要修改为read merge write,即读出未对齐缺少的部分,然后整个[offset,len] 调用curve client写); 修改inode结构,如果上述区域存在先前未写过的区域,则需要去掉unwritten,具体方式根据inode结构而定;inode修改需要持久化到底层并修改本地cache;© XXX Page 6 of 11 read ip等信息,然后从metaserver获取inode结构,缓存之; 根据inode结构,拆分unwritten/未分配的区域与写过的区域,未写过的区域填0,其他区域继续读取 根据inode结构中信息,调用curve client接口,读取对应的[offset, len]数据。(这里同样要考虑4k对齐的问题,如果不对齐,则需要读取对齐的区域,然后去掉多读的部分)(读写可以做数据缓存, 当前先不考虑)。0 码力 | 11 页 | 487.92 KB | 5 月前3Open Flags 调研
*pathname, const struct open_how *how, size_t size); open系统调用会打开pathname指定的文件(如果不存在,如果携带O_CREAT flag则会创建),返回一个文件描述符fd(该fd是进程打开文件描述符表的index),在后续系统调用(read(2)、write(2)、lseek(2)、fcntl(2) etc.)中指向这个打开的文件。打开的文件描述符记录中保存着文件的offset files_struct 类型的 files 字段,里面有个保存了当前进程所有已打开文件 描述符的数组,而通过 fd 就可以找到具体的文件描述符:© XXX Page 3 of 23 open & openat 系统调用的区别:如果pathname是绝对路径,则dirfd参数没用。如果pathname是相对路径,并且dirfd的值不是AT_FDCWD,则pathname的参照物是相对于dirfd指向的目录,而不是进程的当前工作目录;反之,如 time(进程uid=文件uid或者进程在它的user namespace有CAP_FOWNER, 而文件的uid在这个namespace中有一个映射)。 O_NOATIME : 在进程执行exec系统调用时关闭此打开的文件描述符,防止父进程泄露打开的文件给子进程。 O_CLOEXEC O_PATH: 使用 O_PATH 将不会真正打开一个文件,而只是准备好该文件的文件描述符,而且如果使用该标志位的0 码力 | 23 页 | 524.47 KB | 5 月前3curvefs client删除文件和目录功能设计
use_reply_create时增加1 当内核移除其inode cache时,会调用forget,此时lookup count需要减nlookup(forget的参数) 当umount时,所有lookup count减至0 不应该完全依赖forget接口去实现inode的移除,因为forget接口可能不会被内核调用(例如client崩溃) 相关调研 moosefs moosefs 未对接forget 会崩溃,也可能下线了,永远不再起来。所以实际的内存和外存中的inode的删除机制,必须是在metaserver中实现的。client端只是 进行nlink-1的操作。 不能完全依赖forget接口的调用来移除inode,因为client可能会崩溃,也可能下线。所以实际移除inode只能依赖于metaserver,两种方式:chubaofs的简单粗暴放7天就删,或者moosefs使用session机 client端后续的open只在本地将open num++ client端在close过程中,首先会去open num–, 当发现open num==0时,也就是所有的open都已经close了,此时调用close on metaserver close on metaserver的过程,将移除内存中的session。© XXX Page 12 of 15© XXX Page 13 of 150 码力 | 15 页 | 325.42 KB | 5 月前3
共 53 条
- 1
- 2
- 3
- 4
- 5
- 6