ElasticSearch遷移至openGauss

Elasticsearch 作為一種高效的全文搜索引擎,廣泛應用于實時搜索、日志分析等場景。而 openGauss,作為一款企業級關系型數據庫,強調事務處理與數據一致性。那么,當這兩者的應用場景和技術架構發生交集時,如何實現它們之間的平滑遷移呢?

本文將探討 Elasticsearch 基礎數據數據遷移至 openGauss 的解決方案,在此,我們首先根據等價實例來看一下 Elasticsearch 和關系型數據庫(如 openGauss)的基礎數據結構:

關系型數據庫操作

CREATE?TABLE?products (? ? id?INT?PRIMARY?KEY,? ? name?VARCHAR(100),? ? price?DECIMAL(10,2));
INSERT?INTO?products?VALUES?(1,?'Laptop',?999.99);

Elasticsearch等價操作

PUT /products{??"mappings": {? ??"properties": {? ? ??"id": {?"type":?"integer"?},? ? ??"name": {?"type":?"text"?},? ? ??"price": {?"type":?"double"?}? ? }? }}
POST /products/_doc/1{??"id": 1,??"name":?"Laptop",??"price": 999.99}

數據組織層級

  • 關系型數據庫:

    Database → Table → Row/Column

  • Elasticsearch:

    6.x之前:Index → Type → Document (類似Database → Table → Row)

    7.x之后:Index → Document (Type被移除,強化了Index≈Table的對應關系)

Elasticsearch 概念

關系型數據庫(如openGauss)概念

說明

索引(Index)庫-表(Table)

對應關系

類型(Type)

(已棄用,7.x后無對應)

早期版本中類似表分區

文檔(Document)

行(Row)

一條記錄

字段(Field)

列(Column)

數據屬性

映射(Mapping)

表結構定義(Schema)

定義字段類型等

索引別名(Alias)

視圖(View)

虛擬索引/表

分片(Shard)

分區(Partition)

數據水平拆分

檢索方式

1、向量檢索

Elasticsearch 向量檢索

# 1. 創建包含向量字段的索引PUT /image_vectors{??"mappings": {? ??"properties": {? ? ??"image_name": {? ? ? ??"type":?"text"? ? ? },? ? ??"image_vector": {? ? ? ??"type":?"dense_vector",? ? ? ??"dims": 512? ? ? }? ? }? }}
# 2. 插入向量數據POST /image_vectors/_doc{??"image_name":?"sunset.jpg",??"image_vector": [0.12, 0.34, ..., 0.56] ?// 512維向量}
# 3. 精確向量檢索 (script_score)GET /image_vectors/_search{??"query": {? ??"script_score": {? ? ??"query": {"match_all": {}},? ? ??"script": {? ? ? ??"source":?"cosineSimilarity(params.query_vector, 'image_vector') + 1.0",? ? ? ??"params": {? ? ? ? ??"query_vector": [0.23, 0.45, ..., 0.67] ?// 查詢向量? ? ? ? }? ? ? }? ? }? }}
# 4. 近似最近鄰搜索 (kNN search)GET /image_vectors/_search{??"knn": {? ??"field":?"image_vector",? ??"query_vector": [0.23, 0.45, ..., 0.67],? ??"k": 10,? ??"num_candidates": 100? }}

openGauss 向量檢索(openGauss 從 7.0 版本開始支持向量檢索功能)

#?1.?創建包含向量字段的表
-- 創建表CREATE?TABLE?image_vectors (? id SERIAL?PRIMARY?KEY,? image_name TEXT,? image_vector VECTOR(512) ?-- 512維向量);#2.?插入向量數據INSERT?INTO?image_vectors (image_name, image_vector)?VALUES?('sunset.jpg',?'[0.12, 0.34, ..., 0.56]');
#?3.?精確向量檢索 (余弦相似度)-- 使用余弦相似度SELECT?id, image_name,?? ? ? ?1?-?(image_vector?<=>?'[0.23, 0.45, ..., 0.67]')?AS?cosine_similarityFROM?image_vectorsORDER?BY?cosine_similarity?DESCLIMIT?10;
#?4.?近似最近鄰搜索 (使用IVFFLAT索引)-- 創建IVFFLAT索引CREATE?INDEX idx_image_vector?ON?image_vectors?USING?IVFFLAT(image_vector)?WITH?(lists?=?100);
-- 近似最近鄰查詢SELECT?id, image_name,?? ? ? ?image_vector?<=>?'[0.23, 0.45, ..., 0.67]'?AS?distanceFROM?image_vectorsORDER?BY?distanceLIMIT?10;
2、全文檢索

es全文檢索 相當于 openGauss的LIKE和正則表達式

??????????????

# es 全文檢索GET /products/_search{??"query": {? ??"match": {? ? ??"description":?"search term"? ? }? }}
# openGauss 模糊查詢SELECT?* FROM products?WHERE?description LIKE?'%search term%';
# openGauss 正則表達式匹配SELECT?* FROM logs?WHERE?message ~?'error|warning';

因此,根據數據層級及檢索方式分析,遷移時將es的索引遷移到openGauss的一張表里。

環境準備

  • 已部署7.3 及以上(支持向量)版本的ElasticSearch實例

  • 已部署7.0.0-RC1 及以上版本(支持向量)的openGauss實例

  • 已安裝3.8 及以上版本的Python環境

  • 已安裝涉及的Python庫

pip3 install psycopg2pip3 install requests?pip3 install pyOpenSSL
#如果安裝失敗,可以考慮在一個新的虛擬環境中重新安裝所需的庫,執行以下命令:python3 -m venv venvsource?venv/bin/activatepip install requests pyOpenSSL

前置條件

遠程連接權限:

openGauss端:

???????

#修改openGauss配置文件。將遷移腳本所在機器IP地址加入白名單,修改openGauss監聽地址。# 執行以下命令gs_guc?set?-D {DATADIR} -c?" listen_addresses = '\*'"
gs_guc?set?-D {DATADIR} -h?"host all all x.x.x.x/32 sha256"
# 修改完畢后重啟openGauss。
gs_ctl restart -D {DATADIR}

elasticsearch端:

???????

vim?/path/to/your_elasticsearch/config/elasticsearch.yml#修改network.hostnetwork.host:?0.0.0.0

openGauss端創建普通用戶(賦權)、遷移的目標數據庫:

???????

?create?user?mig_test identified?by?'Simple@123';
?grant?all?privileges?to?mig_test;
?create?database es_to_og?with?owner mig_test;

遷移操作

1、根據本地部署的elasticsearch與openGauss對腳本進行配置修改,需要修改的內容如下:

???????

# Elasticsearch 配置信息es_url?=?'http://ip:port'??# Elasticsearch 服務器地址es_index?=?'your_es_index'??# Elasticsearch 索引名
# openGauss 配置信息db_host?=?'127.0.0.1'? ?# openGauss服務器地址db_port?=?5432? ? ? ? ??# openGauss 端口號db_name?=?'your_opengauss_db'?# 遷移到openGauss的數據庫名稱db_user?=?'user_name'? ??# 連接openGauss的普通用戶db_password?=?'xxxxxx'? ?# 連接openGauss的用戶密碼

elasticsearchToOpenGauss.py遷移腳本如下:

???????

import?requestsimport?psycopg2import?jsonimport?refrom?typing?import?List,?Dict,?Any,?Optional,?Union
# Elasticsearch 配置信息es_url =?'http://192.168.0.114:9200'??# Elasticsearch 服務器地址es_index =?'my_dynamic_index'??# Elasticsearch 索引名
# openGauss 配置信息db_host =?'192.168.0.219'? ?# openGauss服務器地址db_port =?15620? ? ? ? ??# openGauss 端口號db_name =?'es_to_og'?# 遷移到openGauss的數據庫名稱db_user =?'mig_test'? ??# 連接openGauss的普通用戶db_password =?'xxxxxx'? ?# 連接openGauss的用戶密碼
RESERVED_KEYWORDS = {? ??"select",?"insert",?"update",?"delete",?"drop",?"table",?"from",?"where",?"group",? ??"by",?"having",?"order",?"limit",?"join",?"inner",?"left",?"right",?"full",?"union",? ??"all",?"distinct",?"as",?"on",?"and",?"or",?"not",?"null",?"true",?"false",?"case",? ??"when",?"then",?"else",?"end",?"exists",?"like",?"in",?"between",?"is",?"like",? ??"references",?"foreign",?"primary",?"key",?"unique",?"check",?"default",?"constraint",? ??"index",?"unique",?"varchar",?"text",?"int",?"bigint",?"smallint",?"boolean",?"timestamp"}
# 從 Elasticsearch 獲取數據def?fetch_data_from_es():? ? query = {? ? ? ??"query": {? ? ? ? ? ??"match_all": {}? ? ? ? },? ? ? ??"_source":?True??# 獲取所有字段? ? }? ? response = requests.get(f'{es_url}/{es_index}/_search', json=query)? ??if?response.status_code ==?200:? ? ? ??return?response.json()['hits']['hits']? ??else:? ? ? ??raise?Exception(f"Failed to fetch data from Elasticsearch:?{response.status_code},?{response.text}")# 獲取索引映射信息def?fetch_mapping(es_url, es_index):? ? response = requests.get(f'{es_url}/{es_index}/_mapping')? ??if?response.status_code ==?200:? ? ? ??return?response.json()? ??else:? ? ? ??raise?Exception(f"Failed to fetch mapping:?{response.status_code},?{response.text}")def?get_field_type(es_url:?str, es_index:?str, field_name:?str) ->?str:? ??""" 獲取 Elasticsearch 字段的類型 """? ? mappings = fetch_mapping(es_url, es_index)? ??print(f"Field name:?{field_name}")? ??print(f"map:?{mappings}")? ??# 獲取 properties 字段? ? properties = mappings.get(es_index, {}).get('mappings', {}).get('properties', {})? ??# 遍歷并查找字段的類型? ? field_type =?'text'??# 默認類型為 'text'? ??if?field_name?in?properties:? ? ? ? field_type = properties[field_name].get('type',?'text')? ??elif?'fields'?in?properties.get(field_name, {}):? ? ? ??# 如果字段有子字段(比如 keyword),獲取 'keyword' 類型? ? ? ? field_type = properties[field_name]['fields'].get('keyword', {}).get('type',?'text')? ??return?field_type
def?convert_dict_to_jsonb(value):? ??# 如果 value 是字典類型,遞歸調用該函數處理其中的每個元素? ??if?isinstance(value,?dict):? ? ? ??return?json.dumps({k: convert_dict_to_jsonb(v)?for?k, v?in?value.items()})? ??# 如果 value 是列表類型,遞歸處理其中的每個元素? ??elif?isinstance(value,?list):? ? ? ??return?json.dumps([convert_dict_to_jsonb(v)?for?v?in?value])? ??# 如果是其他類型(如字符串、數字),直接返回該值? ??else:? ? ? ??return?value
# 映射 Elasticsearch 數據類型到 openGauss 類型def?map_to_opengauss_type(es_type:?str, dim:?Optional[int] =?None) ->?str:? ??"""Map Elasticsearch types to openGauss types"""? ??if?isinstance(es_type, (dict,?list)): ?# 如果 es_type 是字典類型,則需要特殊處理? ? ? ??return?'JSONB'? ? type_map = {? ? ? ??"long":?"BIGINT", ?# 大整數? ? ? ??"integer":?"INTEGER", ?# 整數? ? ? ??"short":?"SMALLINT", ?# 小整數? ? ? ??"byte":?"SMALLINT", ?# 小字節? ? ? ??"float":?"REAL", ?# 浮點數? ? ? ??"double":?"DOUBLE PRECISION", ?# 雙精度浮點數? ? ? ??"boolean":?"BOOLEAN", ?# 布爾值? ? ? ??"keyword":?"VARCHAR", ?# 關鍵字(字符串類型)? ? ? ??"text":?"TEXT", ?# 長文本? ? ? ??"date":?"TIMESTAMP", ?# 日期類型? ? ? ??"binary":?"BYTEA", ?# 二進制數據? ? ? ??"geo_point":?"POINT", ?# 地理坐標(經緯度)? ? ? ??"geo_shape":?"GEOMETRY", ?# 復雜地理形狀? ? ? ??"nested":?"JSONB", ?# 嵌套對象? ? ? ??"object":?"JSONB", ?# 對象? ? ? ??"ip":?"INET", ?# IP 地址? ? ? ??"scaled_float":?"REAL", ?# 擴展浮動類型(帶縮放的浮動)? ? ? ??"float_vector":?f"VECTOR({dim})"?if?dim?else?"VECTOR", ?# 浮動向量類型? ? ? ??"dense_vector":?f"VECTOR({dim})"?if?dim?else?"VECTOR", ?# 稠密向量類型? ? ? ??"binary_vector":?f"BIT({dim})"?if?dim?else?"BIT", ?# 二進制向量類型? ? ? ??"half_float":?"REAL", ?# 半精度浮動? ? ? ??"unsigned_long":?"BIGINT", ?# 無符號長整數? ? ? ??"date_nanos":?"TIMESTAMP", ?# 高精度日期時間? ? ? ??"alias":?"TEXT", ?# 別名(通常是字段的別名)? ? }
? ??# 如果 es_type 在映射表中,直接返回映射后的類型? ??if?es_type?in?type_map:? ? ? ??print(f"es_type:{es_type}?----- og_type:?{type_map[es_type]}")? ? ? ??return?type_map[es_type]? ??else:? ? ? ??print(f"Warning: Unsupported Elasticsearch type '{es_type}', defaulting to 'TEXT'")? ? ? ??return?'TEXT'??# 默認使用 TEXT 類型# 函數:將非法字符替換為下劃線def?sanitize_name(field_name:?str) ->?str:? ??"""處理字段名,確保不會與保留字沖突,且將非字母數字字符替換為下劃線"""? ??# 將所有非字母數字字符替換為下劃線? ? sanitized_name = re.sub(r'[^a-zA-Z0-9_]',?'_', field_name)
? ??# 如果是保留字,則加雙引號? ??if?sanitized_name.lower()?in?RESERVED_KEYWORDS:? ? ? ??return?f'"{sanitized_name}"'
? ??return?sanitized_name# 創建 openGauss 表def?create_table_in_opengauss(es_url, es_index, table_name):? ? columns_definition = ['id VARCHAR PRIMARY KEY'] ?# 增加 id 主鍵字段? ? seen_fields =?set() ?# 用于記錄已經處理過的字段名
? ??# 獲取 properties 字段? ? properties = fetch_mapping(es_url, es_index).get(es_index, {}).get('mappings', {}).get('properties', {})
? ??# 遍歷每個字段? ??for?field, field_info?in?properties.items():? ? ? ??# 如果該字段已經處理過,跳過? ? ? ??if?field?in?seen_fields:? ? ? ? ? ??continue? ? ? ??# 獲取字段的類型? ? ? ? es_type = field_info.get('type',?'text')? ? ? ? dim = field_info.get('dims',?0)?if?isinstance(field_info,?dict)?else?0? ? ? ? field_type = map_to_opengauss_type(es_type, dim)? ? ? ? sanitized_field_name = sanitize_name(field)? ? ? ? seen_fields.add(field)? ? ? ? columns_definition.append(f"{sanitized_field_name}?{field_type}")? ??# 生成表創建 SQL? ? columns_str =?", ".join(columns_definition)? ? create_table_sql =?f"DROP TABLE IF EXISTS?{sanitize_name(table_name)}; CREATE TABLE?{sanitize_name(table_name)}?({columns_str});"? ??try:? ? ? ??# 建立數據庫連接并執行創建表 SQL? ? ? ? connection = psycopg2.connect(? ? ? ? ? ? host=db_host,? ? ? ? ? ? port=db_port,? ? ? ? ? ? dbname=db_name,? ? ? ? ? ? user=db_user,? ? ? ? ? ? password=db_password? ? ? ? )? ? ? ? cursor = connection.cursor()? ? ? ? cursor.execute(create_table_sql)? ? ? ? connection.commit()? ? ? ??print(f"Table?{sanitize_name(table_name)}?created successfully.")? ??except?Exception?as?e:? ? ? ??print(f"Error while creating table?{sanitize_name(table_name)}:?{e}")? ??finally:? ? ? ??if?connection:? ? ? ? ? ? cursor.close()? ? ? ? ? ? connection.close()
# 將數據插入到 openGauss 表中def?insert_data_to_opengauss(table_name, es_source, es_id):? ??try:? ? ? ??# 建立數據庫連接? ? ? ? connection = psycopg2.connect(? ? ? ? ? ? host=db_host,? ? ? ? ? ? port=db_port,? ? ? ? ? ? dbname=db_name,? ? ? ? ? ? user=db_user,? ? ? ? ? ? password=db_password? ? ? ? )? ? ? ? cursor = connection.cursor()
? ? ? ??# 動態生成插入 SQL 語句? ? ? ? sanitized_columns = ['id'] + [sanitize_name(col)?for?col?in?es_source.keys()] ?# 清理列名? ? ? ? values = [es_id]
? ? ? ??# 處理每一列的數據類型,必要時進行轉換? ? ? ??for?column?in?es_source:? ? ? ? ? ? value = es_source[column]? ? ? ? ? ??if?isinstance(value, (dict,?list)):? ? ? ? ? ? ? ??# 如果是字典類型,轉換為 JSONB? ? ? ? ? ? ? ? value = convert_dict_to_jsonb(value)? ? ? ? ? ? values.append(value)
? ? ? ? columns_str =?', '.join(sanitized_columns)? ? ? ? values_str =?', '.join(['%s'] *?len(values))
? ? ? ? insert_sql =?f"INSERT INTO?{sanitize_name(table_name)}?({columns_str}) VALUES ({values_str})"? ? ? ? cursor.execute(insert_sql, values)
? ? ? ??# 提交事務? ? ? ? connection.commit()
? ??except?Exception?as?e:? ? ? ??print(f"Error while inserting data into?{table_name}:?{e}")? ??finally:? ? ? ??if?connection:? ? ? ? ? ? cursor.close()? ? ? ? ? ? connection.close()
# 主函數def?main():? ??try:? ? ? ? es_data = fetch_data_from_es()? ? ? ? table_name = es_index ?# 可以使用索引名作為表名
? ? ? ? create_table_in_opengauss(es_url, es_index, table_name)? ? ? ??for?record?in?es_data:? ? ? ? ? ? es_source = record['_source'] ?# 獲取 Elasticsearch 文檔中的數據? ? ? ? ? ? es_id = record['_id']? ? ? ? ? ? insert_data_to_opengauss(table_name, es_source, es_id)? ? ? ??print(f"Successfully inserted data into table?{table_name}.")? ??except?Exception?as?e:? ? ? ??print(f"Migration failed:?{e}")if?__name__ ==?"__main__":? ? main()

2、執行腳本

python3 ./elasticsearchToOpenGauss.py

3、openGauss端查看數據???????

#切換到遷移目標數據庫openGauss=# \c es_to_og
#查看遷移的表es_to_og=# \d
#查看表結構es_to_og=# \d my_dynamic_index
#查看表數據es_to_og=# select c

圖片

-END-

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81970.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

品優購項目(HTML\CSS)

項目效果可訪問 http://zhousunyu.3vdo.club 查看 主頁 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

因泰立科技:鐳眸T51激光雷達,打造智能門控新生態

在高端門控行業&#xff0c;安全與效率是永恒的追求。如今&#xff0c;隨著科技的飛速發展&#xff0c;激光雷達與TOF相機技術的融合&#xff0c;為門控系統帶來了前所未有的智能感知能力&#xff0c;開啟了精準守護的新時代。因泰立科技的鐳眸T51激光雷達&#xff0c;作為這一…

MyBatisPlus--快速入門

MyBatisPlus介紹 從名字中就可以感覺到MybatisPlus與MyBatis之間的淵源&#xff0c;而MyBatis是一個非常流行的持久層框架&#xff0c;主要來做數據庫的增刪改查&#xff0c;而MyBatisPlus這種命名方式讓人不得不往MyBatis的升級版去聯想&#xff0c;事實也確實如此&#xff0…

redis持久化策略

RDB 是通過生成數據快照來實現持久化的&#xff0c;相當于給內存中的數據拍一張"照片"保存到磁盤上。AOF 記錄所有寫操作命令&#xff0c;以Redis協議格式追加到文件末尾。 RDB 在滿足特定條件時觸發內存快照&#xff0c;生成新的RDB文件替換舊文件 AOF 先寫入內…

Spring Boot中使用@JsonAnyGetter和@JsonAnySetter處理動態JSON屬性

Spring Boot 中使用 @JsonAnyGetter 和 @JsonAnySetter 處理動態 JSON 屬性 在實際的后端開發中,尤其是使用 Spring Boot 構建 API 時,我們經常會遇到需要處理動態 JSON 屬性的場景。例如,前端傳遞過來的 JSON 數據結構不固定,或者業務需求變更頻繁,導致實體類無法預先定…

拉取gitlab項目

一、下載nvm管理node 先下載配置好nvm,再用nvm下載node 下載鏈接&#xff1a;開始 下載nvm - nvm中文官網 情況&#xff1a;npm i 下載依賴緩慢&#xff0c;可能是node版本不對&#xff0c;可能node版本太高 可能得問題&#xff1a;使用nvm 下載低版本的node時&#xff0c;…

【解決辦法】ubuntu重啟不起來,輸入用戶名和密碼進不去,又重新返回登錄頁。

項目場景&#xff1a; ubuntu重啟不起來&#xff0c;輸入用戶名和密碼進不去&#xff0c;又重新返回登錄頁。 問題描述 在華碩天選一代筆記本上面安裝了ubuntu22.04.5桌面版&#xff0c;但是重啟以后出現&#xff0c;輸入了用戶名和密碼&#xff0c;等待一會還讓輸入用戶名和…

# 云端大模型:智能時代的新引擎

云端大模型&#xff1a;智能時代的新引擎 在人工智能技術的迅猛發展中&#xff0c;云端大模型扮演著至關重要的角色。它們不僅推動了技術的邊界&#xff0c;也為各行各業帶來了前所未有的機遇。本文將結合一系列圖片和代碼示例&#xff0c;深入探討云端大模型的功能、應用及其…

(1)pytest簡介和環境準備

1. pytest簡介 pytest是python的一種單元測試框架&#xff0c;與python自帶的unittest測試框架類似&#xff0c;但是比unittest框架使用起來更簡潔&#xff0c;效率更高。根據pytest的官方網站介紹&#xff0c;它具有如下特點&#xff1a; 非常容易上手&#xff0c;入門簡單&a…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.5 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.5 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖。 dataframe <-data.frame( wrapc(17,20,12,9,…

線程池的詳細知識(含有工廠模式)

前言 下午學習了線程池的知識。重點探究了ThreadPoolExecutor里面的各種參數的含義。我詳細了解了這部分的知識。其中有一個參數涉及工廠模式&#xff0c;我將這一部分知識分享給大家~ 線程池的詳細介紹(含工廠模式) 結語 分享到此結束啦。byebye~

嵌入式開發學習(第二階段 C語言筆記)

內存操作 我們對于內存操作需要依賴于string.h頭文件中相關的函數庫。 內存操作函數 內存填充 頭文件&#xff1a;#include <string.h> 函數原型&#xff1a; void* memset(void *s,int c,size_t n)函數功能&#xff1a;將內存塊s的前n個字節填充為c&#xff0c;一般…

C++學習-入門到精通【9】面向對象編程:繼承

C學習-入門到精通【9】面向對象編程&#xff1a;繼承 目錄 C學習-入門到精通【9】面向對象編程&#xff1a;繼承一、基類與派生類CommunityMember類的繼承層次結構如何定義一個派生類呢 二、基類和派生類間的關系1.創建并使用類CommissionEmployee2.不使用繼承創建類BasePlusCo…

黑馬k8s(十七)

一&#xff1a;高級存儲 1.高級存儲-pv和pvc介紹 2.高級存儲-pv 3.高級存儲-pvc 最后一個改成5gi pvc3是沒有來綁定成功的 pv3沒有綁定 刪除pod、和pvc&#xff0c;觀察狀態&#xff1a; 4.高級存儲-pc和pvc的生命周期 二&#xff1a;配置存儲 1.配置存儲-ConfigMap 2.配…

cf每日刷題c++

目錄 Simple Repetition&#xff08;1000&#xff09; Fashionable Array&#xff08;800&#xff09; Kevin and Arithmetic(800) Permutation Warm-Up(800) Game of Mathletes(900) LRC and VIP(800) Simple Repetition&#xff08;1000&#xff09; https://codeforc…

歷年中國科學技術大學計算機保研上機真題

2025中國科學技術大學計算機保研上機真題 2024中國科學技術大學計算機保研上機真題 2023中國科學技術大學計算機保研上機真題 在線測評鏈接&#xff1a;https://pgcode.cn/school?classification1 拆分數字 題目描述 給定一個數字&#xff0c;拆分成若干個數字之和&#xff…

PHP學習筆記(十一)

類常量 可以把在類中始終保持不變的值定義為常量&#xff0c;類常量的默認可見性是public。 接口中也可以定義常量。 可以用一個變量來動態調用類&#xff0c;但該變量的值不能為關鍵字 需要注意的是類常量只為每個類分配一次&#xff0c;而不是為每個類的實例分配。 特殊的…

Nginx 性能優化全解析:從進程到安全的深度實踐

一、進程優化&#xff1a;釋放硬件性能潛力 Nginx 通過多工作進程處理請求&#xff0c;合理配置進程參數能充分利用 CPU 資源&#xff0c;避免資源浪費。 1.1 worker_processes 參數詳解 worker_processes用于設置 Nginx 工作進程的數量&#xff0c;它直接影響 Nginx 對 CP…

中國移動咪咕助力第五屆全國人工智能大賽“AI+數智創新”專項賽道開展

第五屆全國人工智能大賽由鵬城實驗室主辦&#xff0c;新一代人工智能產業技術創新戰略聯盟承辦&#xff0c;華為、中國移動、鵬城實驗室科教基金會等單位協辦&#xff0c;廣東省人工智能與機器人學會支持。 大賽發布“AI圖像編碼”、“AI增強視頻質量評價”、“AI數智創新”三大…

《 PyTorch 2.3革新:torch.compile自動生成CUDA優化內核全解》

CUDA作為NVIDIA推出的并行計算平臺和編程模型&#xff0c;為GPU計算提供了強大的支持&#xff0c;但手動優化CUDA代碼不僅需要深厚的專業知識&#xff0c;而且過程繁瑣、耗時費力&#xff0c;torch.compile的出現&#xff0c;猶如一道曙光&#xff0c;為解決這一困境帶來了全新…