Ceph分布式存储集群搭建

一.Ceph分布式存储	
        (1)Ceph概念:Ceph是一种高性能、可扩展的分布式存储系统,它提供了对象存储、块存储和文件系统存储三种存储接口,Ceph的设计目标是提供无单点故障的、高性能的、可扩展的存储解决方案,同时能够降低存储成本。

		(2)常用分布式存储方案
			Lustre
			Hadoop
			FastDFS
			GlusterFS
			Ceph
		

		(3)Ceph集群(服务)的组成部分(可理解为5个服务)
		
			1)MON(Monitor)监视器,监控与地图
			负责监控Ceph集群的整体状态、配置信息和监控数据,为了高可用性,通常至少需要三台Monitor.
	
			2)MGR(Manager)管理器
			负责管理集群,包括集群状态监控、元数据管理、REST API接口等.高可用性至少两台Manager.
					
			3)OSD(Object Storage Daemon)
				负责存储数据和处理数据的复制、恢复和再平衡.
	
			4)MDS(Metadata Server)
				MDS用于支持Ceph文件系统 (CephFS),负责维护文件系统的元数据.
	
			5)RGW(RADOS Gateway)
				RGW是Ceph提供的对象存储,兼容S3和Swift协议.

二.Cephadm脚本
		安装ceph-common包,命令行可以补全
		2.Cephadm 命令: Cephadm 命令 --help
					
			cephadm bootstrap:初始化集群
			
			cephadm ls:列出主机上cephadm已知的守护程序实例。
					
			cephadm logs:打印守护程序容器的journald日志。
				
			cephadm join:将其他节点加入Ceph集群。

三.ceph集群搭建				
	1.Ceph搭建,实验环境准备
		虚拟机准备:所有主机至少2G内存,关闭防火墙和SELinux
		ceph1-->192.168.88.11-->额外3块硬盘
		ceph2-->192.168.88.12-->额外3块硬盘
		ceph3-->192.168.88.13-->额外3块硬盘
		client-->192.168.88.10

	2.ceph搭建前置准备工作

		(1)配置所有节点主机名解析
		   # 192.168.88.240必须解析为quay.io!!!:公开的域名,存放ceph的镜像文件
			[root@pubserver ceph]# vim 01_update_hosts.yml
			---
			- name: update hosts
			  hosts: all
			  tasks:
			    - name: add host resolv     #修改/etc/hosts文件添加主机名映射
			      blockinfile:
			        path: /etc/hosts
			        block: |
			          192.168.88.10 client
			          192.168.88.11 ceph1
			          192.168.88.12 ceph2
			          192.168.88.13 ceph3
			          192.168.88.240  quay.io :公开的域名,存放ceph的镜像文件(这里做的假的)
		  (2)配置yum仓库和时间同步服务 
			1)服务端:
				 yum -y install chrony
				 vim /etc/chrony.conf
					...
					 25 allow 192.168.88.0/24   #允许88网段主机同步时间
					 26  
					 27 # Serve time even if not synchronized to a time source.
					 28 local stratum 10        #向下10层同步时间
				...
				 systemctl enable chronyd            #设置服务开机自启动
				 systemctl restart chronyd           #重启chronyd服务
			2)客户端
				通过ansible使用时间系统角色配置
				yum list | grep roles  #查看系统角色包
		
	3.ceph集群的搭建镜像准备工作

		(1)ceph节点安装podman或docker,lvm2软件
			---
			- name: install pkgs
			hosts: ceph
			tasks:
			   - name: install pkgs    #安装必备软件
			     yum:
			       name: python39,podman,lvm2
				 state: present

		(2)搭建私有ceph镜像仓库

			1)scp上传相关的镜像包到控制机
		
				5个镜像文件+2个软件包
				altermanager_v0.23.0.tar :告警模块镜像
				ceph-grafana_8.3.5.tar :监控和可视化Ceph集群的性能和状态镜像 
				prometheus_v2.33.4.tar:系统监控和警报工具包镜像
				node-exporter_v1.3.1.tar:采集到机器的CPU、内存、磁盘等信息镜像        
				ceph_v17.tar : Ceph 分布式存储的镜像,包括5大服务
				cephadm #ceph的操作工具
			#Docker Distribution 是 Docker 的一个工具包,用于打包、运输、存储和发送 Docker 镜像
				docker-distribution-2.6.2-2.git48294d9.el7.x86_64.rpm  
		
			2)调整私有仓库端口:这里是教学环境为了可以成功下载镜像
			#安装软件包
			yum -y localinstall docker-distribution-2.6.2-2.git48294d9.el7.x86_64.rpm 
			#调整端口
			[root@pubserver ~]#vim /etc/docker-distribution/registry/config.yml 
				version: 0.1
				log:
				  fields:
				    service: registry
				storage:
				    cache:
				        layerinfo: inmemory
				    filesystem:
				        rootdirectory: /var/lib/registry
				http:
				    addr: :80       #端口由5000调整为80,必须调整,否则后续下载镜像时会有报错
			systemctl enable docker-distribution.service --now
			curl http://localhost/v2/_catalog
			{"repositories":[]}     #查看本地仓库的镜像,此时仓库为空

			3)控制机配置域名解析,模拟官方网站
				vim /etc/hosts
				192.168.88.240 quay.io
			
			4)配置私有仓库地址
				vim /etc/containers/registries.conf
				tail -3 /etc/containers/registries.conf
				[[registry]]
				location = "quay.io"    #指定了容器仓库的地址,这里的实验映射到本机
				insecure = true         #可以使用http协议


			5)控制机导入Ceph相关镜像到本地
				其导入到本地的Podman镜像库中,导入成功后,用户就可以在Podman中看到这个镜像.
				[root@pubserver ceph-server]# for i in *.tar    
				> do
				> podman load -i $i
				> done
			
			6)将镜像推送到私有,远程仓库
				podman push命令用于将镜像推送到远程仓库,以便其他用户可以下载和使用。
				[root@pubserver ceph-server]#podman push quay.io/ceph/ceph:v17 
				podman push quay.io/ceph/ceph-grafana:8.3.5 
				podman push quay.io/prometheus/prometheus:v2.33.4
				podman push quay.io/prometheus/node-exporter:v1.3.1
				podman push quay.io/prometheus/alertmanager:v0.23.0 
				验证私有仓库中Ceph镜像保存情况
				[root@pubserver ceph-server]# curl http://quay.io/v2/_catalog
			
			7)配置Ceph节点机器使用私有镜像仓库地址
				---
				- name: config private registry
				  hosts: ceph
				  tasks:
				    - name: add quay.io #配置私有registry仓库
				      blockinfile:
				        path: /etc/containers/registries.conf
				        block: |
				          [[registry]]
				          location = "quay.io"
				          insecure = true
				 建议搭建Ceph集群前临时撤掉Ceph节点网关,禁止Ceph节点连接公网,防止去公网拉取镜像
         			 ansible ceph -m shell -a "route del default gw 192.168.88.254"

	4.ceph集群搭建步骤流程
	Ceph在使用过程中是无中心化结构,但搭建过程中选择集群某一个节点作为初始化管理节点,然后扩容其他节点
		
		1)利用cephadm脚本初始化ceph集群
		
		[root@ceph1 ~]# ./cephadm bootstrap \	           #初始化集群 
			> --mon-ip 192.168.88.11 \                  #指定初始化节点IP地址
			> --initial-dashboard-password=123456 \     #指定dashboard面板密码
			> --dashboard-password-noupdate             #不更新dashboard面板密码

		2)同步ceph密钥
		Ceph 集群通常由多个节点组成,包括监视器(MON)、对象存储守护进程(OSD)和管理器(MGR)等
		通过将 Ceph 公钥同步到所有节点,可以简化管理员通过 SSH 登录到这些节点的过程,无需每次输入密码。
			ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph1 #-f强制 
		
		3)扩容ceph集群
			ceph orch host add ceph2 192.168.88.12  #将ceph2加入集群
				
		4)绑定OSD服务
			ceph orch daemon add osd ceph1:/dev/vdb #绑定单个硬盘
			ceph orch apply osd --all-available-device #OSD绑定所有可用状态硬盘

		5)确认集群状态
			ceph -s

	5.ceph orch 集群服务管理的命令。

		ceph orch ls:列出Ceph 集群中运行的服务。

		ceph orch ps:查看Ceph集群所有的容器,列出 Ceph 集群中运行的状态,健康状态、运行节点等信息

		ceph orch device ls:列出所有Ceph集群节点上的可用存储设备

		ceph orch ps --daemon-type=mon  #3个容器

		ceph orch host ls :要列出与集群关联的所有主机

		ceph orch host add <hostname> [<ip>] [<label1> ...]:将新主机添加到 Ceph 集群中

		ceph orch apply:配置应用于 Ceph 集群,用于部署新服务、更新或删除服务。如 osd、mon、mgr等

		ceph orch rm:此命令用于从 Ceph 集群中删除服务

		ceph orch upgrade:将 Ceph 集群升级到新版本

		ceph orch service restart:重启指定的服务(如 OSD 等)

		ceph orch daemon add:在指定的主机上添加一个新的守护进程实例。

		ceph orch daemon rm:从指定的主机上删除一个守护进程实例(守护进程:osd,mon,等)。

		ceph orch device ls|osd create:此命令用于查看存储设备列表或创建 OSD。

	6.Ceph集群相关容器的命令
	
		1、集群管理命令
		
			查看集群健康状态
				ceph -s:显示集群的简要状态和健康状况。
				ceph health detail:显示集群健康状态的详细信息。
	
			显示集群的容量和使用情况
				ceph df
			
		2、监视器(MON)管理命令
		
			查看MON状态信息
				ceph mon stat:显示MON的状态信息,包括集群中的MON节点、选举状态等。
			
			查看MON的选举状态
				ceph quorum_status:显示MON的选举状态和仲裁信息。
			
			查看MON的映射信息
				ceph mon dump:输出MON的映射信息。
			
			删除MON节点
				ceph mon remove <mon-name>:从集群中删除指定的MON节点。
	
			
		4、对象存储守护进程(OSD)管理命令

			查看OSD状态
				ceph osd stat:显示OSD的简要状态信息。
			
			查看OSD树形结构
				ceph osd tree:以树形结构显示OSD的层级关系。
			
			查看OSD磁盘使用情况
				ceph osd df:显示OSD的磁盘使用情况。
			
			将OSD设置为down状态
				ceph osd down <osd-id>:将指定的OSD设置为down状态。
			
			将OSD重新加入集群
				ceph osd in <osd-id>:将之前设置为down的OSD重新加入集群。
			
			将OSD踢出集群
				ceph osd out <osd-id>:将指定的OSD踢出集群。
			
	
		4、存储池(Pool)管理命令
		
			列出所有存储池
				ceph osd pool ls:列出集群中的所有存储池。
			
			查看存储池详细信息
				ceph osd pool ls detail:列出存储池的详细信息。
			
			创建存储池
				ceph osd pool create <pool-name>:创建新的存储池。
			
			删除存储池
				ceph osd pool delete <pool-name> :删除指定的存储池。
			
			设置存储池副本数
				ceph osd pool set <pool-name> size <replica-count>:设置存储池的副本数。
			
			获取存储池副本数
				ceph osd pool get <pool-name> size:获取存储池的副本数。
			
			设置存储池配额
				ceph osd pool set-quota <pool-name> :设置存储池的对象数或容量配额。
			
			重命名存储池
				ceph osd pool rename <old-pool-name> <new-pool-name>:重命名指定的存储池。
		
		
		5、Placement Groups(PG)管理命令
		
			列出所有PG
				ceph pg ls:列出集群中的所有PG。
			
			查看PG的副本分布
				ceph pg map <pg-id>:查看指定PG的副本分布在哪些OSD上。
			
			执行PG修复
				ceph pg repair <pg-id>:尝试修复指定的PG。
			
			执行数据一致性校验
				ceph pg scrub <pg-id> 或 deep-scrub <pg-id>:执行数据一致性校验或深度校验。
	
			
		6、元数据服务器(MDS)管理命令
			查看MDS状态
				ceph mds stat:显示MDS的状态信息
	
			查看MDS的映射信息
				ceph mds dump:输出MDS的映射信息。
	
			删除MDS节点
				ceph mds rm <mds-id> <mds-name>:从集群中删除指定的MDS节点。
	
		7、其他常用命令
		
			查看Ceph日志
				ceph-conf --name <daemon-name> --show-config-value log_file:查看指定守护进程的日志文件路径。
			启动或停止Ceph服务
				systemctl start/stop/restart ceph.target。

一.Ceph分布式存储

(1)Ceph概念:Ceph是一种高性能、可扩展的分布式存储系统,它提供了对象存储、块存储和文件系统存储三种存储接口,Ceph的设计目标是提供无单点故障的、高性能的、可扩展的存储解决方案,同时能够降低存储成本。

(2)常用分布式存储方案

Lustre

Hadoop

FastDFS

GlusterFS

Ceph

(3)Ceph集群(服务)的组成部分(可理解为5个服务)

1)MON(Monitor)监视器,监控与地图

负责监控Ceph集群的整体状态、配置信息和监控数据,为了高可用性,通常至少需要三台Monitor.

2)MGR(Manager)管理器

负责管理集群,包括集群状态监控、元数据管理、REST API接口等.高可用性至少两台Manager.

3)OSD(Object Storage Daemon)

负责存储数据和处理数据的复制、恢复和再平衡.

4)MDS(Metadata Server)

MDS用于支持Ceph文件系统 (CephFS),负责维护文件系统的元数据.

5)RGW(RADOS Gateway)

RGW是Ceph提供的对象存储,兼容S3和Swift协议.

二.Cephadm脚本

安装ceph-common包,命令行可以补全

2.Cephadm 命令: Cephadm 命令 --help

cephadm bootstrap:初始化集群

cephadm ls:列出主机上cephadm已知的守护程序实例。

cephadm logs:打印守护程序容器的journald日志。

cephadm join:将其他节点加入Ceph集群。

三.ceph集群搭建

1.Ceph搭建,实验环境准备

虚拟机准备:所有主机至少2G内存,关闭防火墙和SELinux

ceph1-->192.168.88.11-->额外3块硬盘

ceph2-->192.168.88.12-->额外3块硬盘

ceph3-->192.168.88.13-->额外3块硬盘

client-->192.168.88.10

2.ceph搭建前置准备工作

(1)配置所有节点主机名解析

192.168.88.240必须解析为quay.io!!!:公开的域名,存放ceph的镜像文件

[root@pubserver ceph]# vim 01_update_hosts.yml


  • name: update hosts

hosts: all

tasks:

  • name: add host resolv #修改/etc/hosts文件添加主机名映射

blockinfile:

path: /etc/hosts

block: |

192.168.88.10 client

192.168.88.11 ceph1

192.168.88.12 ceph2

192.168.88.13 ceph3

192.168.88.240 quay.io :公开的域名,存放ceph的镜像文件(这里做的假的)

(2)配置yum仓库和时间同步服务

1)服务端:

yum -y install chrony

vim /etc/chrony.conf

...

25 allow 192.168.88.0/24 #允许88网段主机同步时间

26

27 # Serve time even if not synchronized to a time source.

28 local stratum 10 #向下10层同步时间

...

systemctl enable chronyd #设置服务开机自启动

systemctl restart chronyd #重启chronyd服务

2)客户端

通过ansible使用时间系统角色配置

yum list | grep roles #查看系统角色包

3.ceph集群的搭建镜像准备工作

(1)ceph节点安装podman或docker,lvm2软件


  • name: install pkgs

hosts: ceph

tasks:

  • name: install pkgs #安装必备软件

yum:

name: python39,podman,lvm2

state: present

(2)搭建私有ceph镜像仓库

1)scp上传相关的镜像包到控制机

5个镜像文件+2个软件包

altermanager_v0.23.0.tar :告警模块镜像

ceph-grafana_8.3.5.tar :监控和可视化Ceph集群的性能和状态镜像

prometheus_v2.33.4.tar:系统监控和警报工具包镜像

node-exporter_v1.3.1.tar:采集到机器的CPU、内存、磁盘等信息镜像

ceph_v17.tar : Ceph 分布式存储的镜像,包括5大服务

cephadm #ceph的操作工具

#Docker Distribution 是 Docker 的一个工具包,用于打包、运输、存储和发送 Docker 镜像

docker-distribution-2.6.2-2.git48294d9.el7.x86_64.rpm

2)调整私有仓库端口:这里是教学环境为了可以成功下载镜像

#安装软件包

yum -y localinstall docker-distribution-2.6.2-2.git48294d9.el7.x86_64.rpm

#调整端口

[root@pubserver ~]#vim /etc/docker-distribution/registry/config.yml

version: 0.1

log:

fields:

service: registry

storage:

cache:

layerinfo: inmemory

filesystem:

rootdirectory: /var/lib/registry

http:

addr: :80 #端口由5000调整为80,必须调整,否则后续下载镜像时会有报错

systemctl enable docker-distribution.service --now

curl http://localhost/v2/_catalog

{"repositories":[]} #查看本地仓库的镜像,此时仓库为空

3)控制机配置域名解析,模拟官方网站

vim /etc/hosts

192.168.88.240 quay.io

4)配置私有仓库地址

vim /etc/containers/registries.conf

tail -3 /etc/containers/registries.conf

[[registry]]

location = "quay.io" #指定了容器仓库的地址,这里的实验映射到本机

insecure = true #可以使用http协议

5)控制机导入Ceph相关镜像到本地

其导入到本地的Podman镜像库中,导入成功后,用户就可以在Podman中看到这个镜像.

[root@pubserver ceph-server]# for i in *.tar

> do

> podman load -i $i

> done

6)将镜像推送到私有,远程仓库

podman push命令用于将镜像推送到远程仓库,以便其他用户可以下载和使用。

[root@pubserver ceph-server]#podman push quay.io/ceph/ceph:v17

podman push quay.io/ceph/ceph-grafana:8.3.5

podman push quay.io/prometheus/prometheus:v2.33.4

podman push quay.io/prometheus/node-exporter:v1.3.1

podman push quay.io/prometheus/alertmanager:v0.23.0

验证私有仓库中Ceph镜像保存情况

[root@pubserver ceph-server]# curl http://quay.io/v2/_catalog

7)配置Ceph节点机器使用私有镜像仓库地址


  • name: config private registry

hosts: ceph

tasks:

  • name: add quay.io #配置私有registry仓库

blockinfile:

path: /etc/containers/registries.conf

block: |

[[registry]]

location = "quay.io"

insecure = true

建议搭建Ceph集群前临时撤掉Ceph节点网关,禁止Ceph节点连接公网,防止去公网拉取镜像

ansible ceph -m shell -a "route del default gw 192.168.88.254"

4.ceph集群搭建步骤流程

Ceph在使用过程中是无中心化结构,但搭建过程中选择集群某一个节点作为初始化管理节点,然后扩容其他节点

1)利用cephadm脚本初始化ceph集群

[root@ceph1 ~]# ./cephadm bootstrap \ #初始化集群

> --mon-ip 192.168.88.11 \ #指定初始化节点IP地址

> --initial-dashboard-password=123456 \ #指定dashboard面板密码

> --dashboard-password-noupdate #不更新dashboard面板密码

2)同步ceph密钥

Ceph 集群通常由多个节点组成,包括监视器(MON)、对象存储守护进程(OSD)和管理器(MGR)等

通过将 Ceph 公钥同步到所有节点,可以简化管理员通过 SSH 登录到这些节点的过程,无需每次输入密码。

ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph1 #-f强制

3)扩容ceph集群

ceph orch host add ceph2 192.168.88.12 #将ceph2加入集群

4)绑定OSD服务

ceph orch daemon add osd ceph1:/dev/vdb #绑定单个硬盘

ceph orch apply osd --all-available-device #OSD绑定所有可用状态硬盘

5)确认集群状态

ceph -s

5.ceph orch 集群服务管理的命令。

ceph orch ls:列出Ceph 集群中运行的服务。

ceph orch ps:查看Ceph集群所有的容器,列出 Ceph 集群中运行的状态,健康状态、运行节点等信息

ceph orch device ls:列出所有Ceph集群节点上的可用存储设备

ceph orch ps --daemon-type=mon #3个容器

ceph orch host ls :要列出与集群关联的所有主机

ceph orch host add <hostname> [<ip>] [<label1> ...]:将新主机添加到 Ceph 集群中

ceph orch apply:配置应用于 Ceph 集群,用于部署新服务、更新或删除服务。如 osd、mon、mgr等

ceph orch rm:此命令用于从 Ceph 集群中删除服务

ceph orch upgrade:将 Ceph 集群升级到新版本

ceph orch service restart:重启指定的服务(如 OSD 等)

ceph orch daemon add:在指定的主机上添加一个新的守护进程实例。

ceph orch daemon rm:从指定的主机上删除一个守护进程实例(守护进程:osd,mon,等)。

ceph orch device ls|osd create:此命令用于查看存储设备列表或创建 OSD。

6.Ceph集群相关容器的命令

1、集群管理命令

查看集群健康状态

ceph -s:显示集群的简要状态和健康状况。

ceph health detail:显示集群健康状态的详细信息。

显示集群的容量和使用情况

ceph df

2、监视器(MON)管理命令

查看MON状态信息

ceph mon stat:显示MON的状态信息,包括集群中的MON节点、选举状态等。

查看MON的选举状态

ceph quorum_status:显示MON的选举状态和仲裁信息。

查看MON的映射信息

ceph mon dump:输出MON的映射信息。

删除MON节点

ceph mon remove <mon-name>:从集群中删除指定的MON节点。

4、对象存储守护进程(OSD)管理命令

查看OSD状态

ceph osd stat:显示OSD的简要状态信息。

查看OSD树形结构

ceph osd tree:以树形结构显示OSD的层级关系。

查看OSD磁盘使用情况

ceph osd df:显示OSD的磁盘使用情况。

将OSD设置为down状态

ceph osd down <osd-id>:将指定的OSD设置为down状态。

将OSD重新加入集群

ceph osd in <osd-id>:将之前设置为down的OSD重新加入集群。

将OSD踢出集群

ceph osd out <osd-id>:将指定的OSD踢出集群。

4、存储池(Pool)管理命令

列出所有存储池

ceph osd pool ls:列出集群中的所有存储池。

查看存储池详细信息

ceph osd pool ls detail:列出存储池的详细信息。

创建存储池

ceph osd pool create <pool-name>:创建新的存储池。

删除存储池

ceph osd pool delete <pool-name> :删除指定的存储池。

设置存储池副本数

ceph osd pool set <pool-name> size <replica-count>:设置存储池的副本数。

获取存储池副本数

ceph osd pool get <pool-name> size:获取存储池的副本数。

设置存储池配额

ceph osd pool set-quota <pool-name> :设置存储池的对象数或容量配额。

重命名存储池

ceph osd pool rename <old-pool-name> <new-pool-name>:重命名指定的存储池。

5、Placement Groups(PG)管理命令

列出所有PG

ceph pg ls:列出集群中的所有PG。

查看PG的副本分布

ceph pg map <pg-id>:查看指定PG的副本分布在哪些OSD上。

执行PG修复

ceph pg repair <pg-id>:尝试修复指定的PG。

执行数据一致性校验

ceph pg scrub <pg-id> 或 deep-scrub <pg-id>:执行数据一致性校验或深度校验。

6、元数据服务器(MDS)管理命令

查看MDS状态

ceph mds stat:显示MDS的状态信息

查看MDS的映射信息

ceph mds dump:输出MDS的映射信息。

删除MDS节点

ceph mds rm <mds-id> <mds-name>:从集群中删除指定的MDS节点。

7、其他常用命令

查看Ceph日志

ceph-conf --name <daemon-name> --show-config-value log_file:查看指定守护进程的日志文件路径。

启动或停止Ceph服务

systemctl start/stop/restart ceph.target。

相关推荐
ChoSeitaku40 分钟前
12.重复内容去重|添加日志|部署服务到Linux上(C++)
linux·c++·windows
一颗小树x1 小时前
Llama 3.1 本地电脑部署 Linux系统 【轻松简易】
linux·llama·本地部署·3.1
Java Fans1 小时前
微信小程序——访问服务器媒体文件的实现步骤
服务器·微信小程序·小程序
yourkin6661 小时前
HTTPS(下)
服务器·网络协议·https
KingDol_MIni1 小时前
Spring Boot 集成 T-io 实现客户端服务器通信
java·服务器·spring boot
Struggle Sheep2 小时前
linux安装redis
linux·运维·redis
周周的奇妙编程2 小时前
基于腾讯云大模型知识引擎×DeepSeek构建八字、六爻赛博算卦娱乐应用
云计算·腾讯云·娱乐
神一样的老师3 小时前
超越云计算:计算连续体中的无服务器函数
服务器
ITPUB-微风3 小时前
美团MTSQL特性解析:技术深度与应用广度的完美结合
java·服务器·开发语言
butteringing3 小时前
BuildFarm Worker 简要分析
linux·软件构建·bazel·re api