ClickHouse生產環境部署

PetterLiu發表於2024-08-08

背景

ClickHouse是一個面向分析型的開源列式資料庫管理系統,它主要應用於以下幾個場景:

資料倉儲和商業智慧分析:ClickHouse擅長處理大規模的資料,可以用於構建企業級的資料倉儲,支援複雜的OLAP查詢,可用實時數倉,適合各種商業分析和報表應用。
實時分析和監控:ClickHouse以毫秒級的響應時間處理大量資料,非常適合實時監控、異常檢測和故障預警等場景。
Web分析:ClickHouse可以採集和分析網站訪問日誌,計算各種指標如UV、PV、跳出率等,為網站運營提供資料支援。
使用者行為分析:精細化運營分析,日活,留存率分析,路徑分析,有序漏斗轉化率分析,Session 分析等。
物聯網資料分析:ClickHouse可以處理海量的感測器資料,用於分析裝置執行狀況、預測故障等。
廣告技術:ClickHouse可以處理廣告點選、展示等海量資料,為廣告最佳化和效果分析提供支援。
金融交易分析:ClickHouse可以處理交易資料,為金融市場分析提供實時計算能力,欺詐檢測,低延遲查詢對於識別任何欺詐活動和防止損失。
遊戲資料分析:ClickHouse可以收集和分析遊戲使用者行為資料,為遊戲運營和產品最佳化提供依據。
酒店管理行業:利用 ClickHouse 瞭解最新的預訂、定價、收入和物業績效資訊。製造商在 ClickHouse 資料庫的基礎上建立物流規劃系統。
媒體和娛樂公司:使用 ClickHouse 監控流媒體質量、管理廣告投放和推送個性化促銷資訊。
雲服務提供商: ClickHouse 的基礎上建立雲資源監控和網路分析。

它是一個資料庫: 資料庫既有儲存引擎,也有查詢引擎。ClickHouse 可以有效地從各種來源獲取資料,其查詢引擎可提供低延遲查詢響應。
它是一個 OLAP 資料庫: 線上分析處理(OLAP)資料庫不是為支援正常業務交易而設計的。它專門用於分析大量業務記錄,側重於讀取和計算,而較少用於寫入和事務處理。
它是一種面向列的 OLAP 資料庫: 面向列的儲存是分析型資料庫事實上的儲存格式,因為分析查詢會讀取大量記錄,但只對有限的列感興趣。在這種情況下,列式儲存比傳統的面向行儲存更有效。


部署架構

資料分片和複製是完全獨立的。分片是 ClickHouse 的自然組成部分,而複製則主要依賴於 Zookeeper,後者用於通知複製的狀態變化。

image

或者是

image


生產環境部署提示

提示1: 使用多個副本
在測試ClickHouse時,部署只有一個主機的配置是很自然的,因為可能不想使用額外的資源或承擔不必要的費用。在開發或測試環境中沒有什麼問題,但如果只想在生產環境中使用一個主機,這可能會有代價。如果發生故障,而只有一個副本和一個主機,就面臨著丟失所有資料的風險。 對於生產環境, 應該使用多個主機並在它們之間複製資料。這不僅可以確保主機失敗時資料仍然安全,還可以在多個主機上平衡使用者負載,從而使資源密集型查詢更快。

提示2: 不要吝惜RAM記憶體
ClickHouse很快,但其速度取決於可用資源,特別是RAM記憶體。在開發或測試環境中執行ClickHouse叢集時,即使使用最小RAM量也可以看到很好的效能,但當負載增加時可能會發生變化。在一個擁有大量同時讀寫操作的生產環境中,RAM不足會更加明顯。如果您的ClickHouse叢集沒有足夠的記憶體,它將更慢,執行復雜查詢也會花更長時間。 此外,當ClickHouse執行資源密集型操作時,它可能會與作業系統本身爭奪RAM,最終導致OOM、當機和資料丟失。ClickHouse的開發者建議使用至少16 GB的RAM來確保叢集穩定。您可以選擇更少的記憶體,但前提是您知道負載不會很高。

提示3:三思而後行-選擇表引擎
ClickHouse支援幾種具有不同特性的表引擎,但MergeTree引擎很可能是理想的選擇。專門的表是為特定用途而設計的,但它們也有一些可能不太明顯的侷限性。Log Family引擎可能看起來適合日誌,但它們不支援複製,並且資料庫大小有限制。MergeTree家族的表引擎是預設選擇,它們提供了ClickHouse所知名的核心資料功能。除非您確定需要不同的表引擎, 否則使用MergeTree家族的引擎就可以覆蓋大多數用例。

MergeTree結構

image


  • ReplacingMergeTree: 會根據主鍵進行去重,但是這是後臺合併時才會去重,無法控制合併時機,儘管可以用 OPTIMIZE … FINAL 語句來強制合併執行,但是由於效能原因一般不會使用。
  • CollapsingMergeTree: 非同步的刪除(摺疊)這些除了特定列 Sign 有 1 和 -1 的值以外,其餘所有欄位的值都相等的成對的行。沒有成對的行會被保留。
  • VersionedCollapsingMergeTree: 類似於 CollapsingMergeTree, 多了 Version 列,支援多執行緒亂序插入的場景,相比之下, CollapsingMergeTree 只允許嚴格連續插入。
  • AggregatingMergeTree: 做增量資料的聚合統計,包括物化檢視的資料聚。
  • ReplicatedXXXMergeTree: 使得以上 MergeTree 家族擁有副本機制,保證高可用,用於生產環境

提示4:主鍵不要超過三列
ClickHouse中的主鍵與傳統資料庫中的主鍵作用不同。它們不保證唯一性,而是定義了資料的儲存和檢索方式。如果將所有列都用作主鍵,可能會獲得更快的查詢速度。但ClickHouse的效能不僅取決於讀取資料,也取決於寫入資料。當主鍵包含許多列時,向叢集寫入資料會減慢整個速度。ClickHouse中主鍵的最佳大小是兩個或三個列,這樣既可以更快地進行查詢,又不會減慢資料插入速度。選擇列時,請考慮將要進行的請求,選擇經常用於過濾條件的列。

提示5:避免小量插入
當在ClickHouse中插入資料時,它首先會將此資料儲存到磁碟上的一個部分。然後它會對這些資料進行排序、合併,並在後臺將其插入到資料庫的合適位置。如果頻繁插入小塊資料,ClickHouse將為每個小插入建立一個部分,這將減慢整個叢集的速度,可能會遇到"太多部分"的錯誤。要高效地插入資料,請以大塊的方式新增資料,並避免每秒傳送多個插入語句。ClickHouse可以以很高的速度(每秒100K行也可以)插入大量資料,但這應該是一個批次插入,而不是多個較小的插入。 如果的資料來源很小,可以考慮使用外部系統(如託管的Kafka)來製作資料批次。ClickHouse與Kafka整合良好,可以有效地從中消費資料。

提示6:考慮如何刪除重複資料
ClickHouse中的主鍵不能確保資料的唯一性。與其他資料庫不同,如果在ClickHouse中插入重複資料,它將被原樣新增。因此,最好的選擇是在插入資料之前確保資料是唯一的。可以在像Apache Kafka這樣的流處理應用程式中完成。如果做不到這一點,在執行查詢時也有辦法處理重複資料。一種選擇是使用argMax僅選擇最新版本的重複行。您也可以使用ReplacingMergeTree引擎,它會根據設計刪除重複條目。最後,可以執行`OPTIMIZE TABLE ... FINAL`來合併資料部分,但這是一個資源密集型操作,只應在知道它不會影響叢集效能的情況下執行。

提示7:不要為每個列建立索引
與主鍵一樣,可能想使用多個索引來提高效能。當使用與索引匹配的過濾器查詢資料時,這可能是有用的。但整體上它不會幫助您加快查詢速度。與此同時,肯定會遇到這種策略的缺點。多個索引會顯著減慢資料插入,因為ClickHouse需要將資料寫入正確的位置,然後更新索引。 當想在生產叢集中建立索引時,請選擇與主鍵相關的列。

image

ClickHouse 的主鍵索引採用的是稀疏索引,將每列資料按照 index granularity(預設8192行)進行劃分。稀疏索引的好處是條目相對稠密索引較少,能夠將其載入到記憶體,而且對插入時建立索引的成本相對較小。
ClickHouse 資料按列進行儲存,每一列都有對應的 mrk 標記檔案,bin 檔案。mrk 檔案與主鍵索引對齊,主要用於記錄資料在 bin 檔案中的偏移量資訊。


生產環境部署示例-四節點代理叢集

部署架構

4 個 ClickHouse 例項利用 3 個專用 ClickHouse Keepers 和 CH 代理負載均衡器
2 個具有複製的分片:
跨分片 01 的 clickhouse-01 和 clickhouse-03
跨分片 02 的 clickhouse-02 和 clickhouse-04

image

https://github.com/ClickHouse/examples/blob/main/docker-compose-recipes/recipes/cluster_2S_2R_ch_proxy/docker-compose.yaml

version: '3.8'
services:
clickhouse-01:
image: "clickhouse/clickhouse-server:${CHVER:-latest}"
user: "101:101"
container_name: clickhouse-01
hostname: clickhouse-01
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.1
volumes:
- ${PWD}/fs/volumes/clickhouse-01/etc/clickhouse-server/config.d/config.xml:/etc/clickhouse-server/config.d/config.xml
- ${PWD}/fs/volumes/clickhouse-01/etc/clickhouse-server/users.d/users.xml:/etc/clickhouse-server/users.d/users.xml
ports:
- "127.0.0.1:8123:8123"
- "127.0.0.1:9000:9000"
depends_on:
- clickhouse-keeper-01
- clickhouse-keeper-02
- clickhouse-keeper-03
clickhouse-02:
image: "clickhouse/clickhouse-server:${CHVER:-latest}"
user: "101:101"
container_name: clickhouse-02
hostname: clickhouse-02
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.2
volumes:
- ${PWD}/fs/volumes/clickhouse-02/etc/clickhouse-server/config.d/config.xml:/etc/clickhouse-server/config.d/config.xml
- ${PWD}/fs/volumes/clickhouse-02/etc/clickhouse-server/users.d/users.xml:/etc/clickhouse-server/users.d/users.xml
ports:
- "127.0.0.1:8124:8123"
- "127.0.0.1:9001:9000"
depends_on:
- clickhouse-keeper-01
- clickhouse-keeper-02
- clickhouse-keeper-03
clickhouse-03:
image: "clickhouse/clickhouse-server:${CHVER:-latest}"
user: "101:101"
container_name: clickhouse-03
hostname: clickhouse-03
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.3
volumes:
- ${PWD}/fs/volumes/clickhouse-03/etc/clickhouse-server/config.d/config.xml:/etc/clickhouse-server/config.d/config.xml
- ${PWD}/fs/volumes/clickhouse-03/etc/clickhouse-server/users.d/users.xml:/etc/clickhouse-server/users.d/users.xml
ports:
- "127.0.0.1:8125:8123"
- "127.0.0.1:9002:9000"
depends_on:
- clickhouse-keeper-01
- clickhouse-keeper-02
- clickhouse-keeper-03
clickhouse-04:
image: "clickhouse/clickhouse-server:${CHVER:-latest}"
user: "101:101"
container_name: clickhouse-04
hostname: clickhouse-04
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.4
volumes:
- ${PWD}/fs/volumes/clickhouse-04/etc/clickhouse-server/config.d/config.xml:/etc/clickhouse-server/config.d/config.xml
- ${PWD}/fs/volumes/clickhouse-04/etc/clickhouse-server/users.d/users.xml:/etc/clickhouse-server/users.d/users.xml
ports:
- "127.0.0.1:8126:8123"
- "127.0.0.1:9003:9000"
depends_on:
- clickhouse-keeper-01
- clickhouse-keeper-02
- clickhouse-keeper-03
clickhouse-keeper-01:
image: "clickhouse/clickhouse-keeper:${CHKVER:-latest-alpine}"
user: "101:101"
container_name: clickhouse-keeper-01
hostname: clickhouse-keeper-01
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.5
volumes:
- ${PWD}/fs/volumes/clickhouse-keeper-01/etc/clickhouse-keeper/keeper_config.xml:/etc/clickhouse-keeper/keeper_config.xml
ports:
- "127.0.0.1:9181:9181"
clickhouse-keeper-02:
image: "clickhouse/clickhouse-keeper:${CHKVER:-latest-alpine}"
user: "101:101"
container_name: clickhouse-keeper-02
hostname: clickhouse-keeper-02
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.6
volumes:
- ${PWD}/fs/volumes/clickhouse-keeper-02/etc/clickhouse-keeper/keeper_config.xml:/etc/clickhouse-keeper/keeper_config.xml
ports:
- "127.0.0.1:9182:9181"
clickhouse-keeper-03:
image: "clickhouse/clickhouse-keeper:${CHKVER:-latest-alpine}"
user: "101:101"
container_name: clickhouse-keeper-03
hostname: clickhouse-keeper-03
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.7
volumes:
- ${PWD}/fs/volumes/clickhouse-keeper-03/etc/clickhouse-keeper/keeper_config.xml:/etc/clickhouse-keeper/keeper_config.xml
ports:
- "127.0.0.1:9183:9181"
ch-proxy:
image: contentsquareplatform/chproxy:v1.26.4
platform: linux/amd64
container_name: ch-proxy
hostname: ch-proxy
networks:
cluster_2S_2R_ch_proxy:
ipv4_address: 192.168.9.10
ports:
- "127.0.0.1:443:443"
- "127.0.0.1:80:80"
volumes:
- ${PWD}/fs/volumes/ch-proxy/config/config.yml:/opt/config.yml
depends_on:
- clickhouse-01
- clickhouse-02
- clickhouse-03
- clickhouse-04
command: [-config, /opt/config.yml]

networks:
cluster_2S_2R_ch_proxy:
driver: bridge
ipam:
config:
- subnet: 192.168.9.0/24
gateway: 192.168.9.254

  1. 網路 cluster_2S_2R_ch_proxy

    • 使用 bridge 驅動,有一個子網 192.168.9.0/24,閘道器 192.168.9.254
  2. 容器:

    • clickhouse-01 (192.168.9.1)
    • clickhouse-02 (192.168.9.2)
    • clickhouse-03 (192.168.9.3)
    • clickhouse-04 (192.168.9.4)
    • clickhouse-keeper-01 (192.168.9.5)
    • clickhouse-keeper-02 (192.168.9.6)
    • clickhouse-keeper-03 (192.168.9.7)
    • ch-proxy (192.168.9.10)
  3. 依賴關係:

    • clickhouse-01, clickhouse-02, clickhouse-03, clickhouse-04 都依賴 clickhouse-keeper-01, clickhouse-keeper-02, clickhouse-keeper-03
    • ch-proxy 依賴 clickhouse-01, clickhouse-02, clickhouse-03, clickhouse-04
  4. 埠對映:

    • clickhouse-01, clickhouse-02, clickhouse-03, clickhouse-04 都有 8123 和 9000 埠對映到本地的相應埠
    • clickhouse-keeper-01, clickhouse-keeper-02, clickhouse-keeper-03 的 9181 埠對映到本地的相應埠
    • ch-proxy 的 443 和 80 埠對映到本地的相應埠
  5. 卷掛載:

    • 每個 clickhouse 容器掛載了 config.xmlusers.xml 檔案
    • 每個 clickhouse-keeper 容器掛載了 keeper_config.xml 檔案
    • ch-proxy 容器掛載了 config.yml 檔案


以下是 採用 Keeper 的 ClickHouse 架構

image

當資料庫叢集節點之間需要強一致性時,ClickHouse 會廣泛使用 Keeper,最值得注意的是支援儲存後設資料、複製、備份、訪問控制、任務排程以及用於從 Apache Kafka 和 AWS S3 提取資料的高度一致的鍵值儲存。
Keeper 依賴於 Raft 共識演算法,而 ZooKeeper 則使用 ZAB。儘管 ZAB 是一個更成熟的選擇(至少從 2008 年開始開發),但該團隊選擇了 Raft,因為它相對簡單,並且使用 C++ 庫整合起來很容易。


單機版生產環境部署

image

用於設定生產就緒的獨立 ClickHouse 例項。它還包括由 Prometheus 和 Grafana 組成的監控堆疊,用於實時效能跟蹤。此外,還整合了 MinIO,以實現 ClickHouse 資料的高效備份。這種全面的設定可確保強大且可靠的資料管理環境。

示例docker-compose.yaml

version: '3'

services:
clickhouse:
container_name: clickhouse
image: clickhouse/clickhouse-server:23.8
restart: always
ports:
- 8123:8123 # http
- 9000:9000 # native protocol
- 9363:9363 # metrics server
volumes:
- clickhouse-data:/var/lib/clickhouse/
- clickhouse-logs:/var/log/clickhouse-server/
- ./config_files/clickhouse/etc/clickhouse-server:/etc/clickhouse-server
cap_add:
- SYS_NICE
- NET_ADMIN
- IPC_LOCK
ulimits:
nofile:
soft: 262144
hard: 262144
depends_on:
- minio
- minio-bucket-creator

prometheus:
container_name: prometheus
image: prom/prometheus:v2.37.9
restart: always
ports:
- 9090:9090
volumes:
- ./config_files/prometheus/:/etc/prometheus/
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yaml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
depends_on:
- minio-prometheus-monitoring-cluster
- minio-prometheus-monitoring-node
- minio-prometheus-monitoring-bucket

grafana:
container_name: grafana
image: grafana/grafana:10.0.3-ubuntu
ports:
- 3000:3000
volumes:
- grafana_data:/var/lib/grafana
- ./config_files/grafana/etc/grafana/provisioning/dashboards/:/etc/grafana/provisioning/dashboards/
- ./config_files/grafana/etc/grafana/provisioning/datasources/:/etc/grafana/provisioning/datasources/
- ./config_files/grafana/var/lib/grafana/dashboards/:/var/lib/grafana/dashboards/
# uncomment the following line, if you don't have access to grafana.com plugins and download a plugin manually (read README.md file)
- ./config_files/grafana/var/lib/grafana/plugins/:/var/lib/grafana/plugins/
depends_on:
- prometheus

minio:
container_name: minio
image: minio/minio:RELEASE.2023-09-07T02-05-02Z
restart: always
env_file:
- .env
ports:
- 9001:9001
- 9002:9002
volumes:
- minio_data:/var/lib/minio/data
command: minio server /var/lib/minio/data --address 0.0.0.0:9002 --console-address ":9001"

minio-bucket-creator:
container_name: minio-bucket-creator
image: minio/mc:RELEASE.2023-09-13T23-08-58Z
env_file:
- .env
entrypoint: >
/bin/bash -c "
/usr/bin/mc alias set myminio http://minio:9002 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD;
/usr/bin/mc mb myminio/${MINIO_CLICKHOUSE_BACKUP_BUCKET:-clickhouse};
/usr/bin/mc anonymous set public myminio/${MINIO_CLICKHOUSE_BACKUP_BUCKET:-clickhouse};
exit 0;
"
depends_on:
- minio

minio-prometheus-monitoring-cluster:
container_name: minio-prometheus-monitoring-cluster
image: minio/mc:RELEASE.2023-09-13T23-08-58Z
env_file:
- .env
volumes:
- ./config_files/prometheus/templates/prometheus.yaml:/home/prometheus-template.yaml:ro
- ./config_files/prometheus/prometheus.yaml:/home/prometheus.yaml
entrypoint: >
/bin/bash -c "
cp /home/prometheus-template.yaml /home/prometheus.yaml;
/usr/bin/mc alias set myminio http://minio:9002 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD > /dev/null;
/usr/bin/mc admin prometheus generate myminio cluster | sed '1d' | awk '{print \" \" $0}' >> /home/prometheus.yaml;
"
depends_on:
- minio

minio-prometheus-monitoring-node:
container_name: minio-prometheus-monitoring-node
image: minio/mc:RELEASE.2023-09-13T23-08-58Z
env_file:
- .env
volumes:
- ./config_files/prometheus/prometheus.yaml:/home/prometheus.yaml
entrypoint: >
/bin/bash -c "
/usr/bin/mc alias set myminio http://minio:9002 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD > /dev/null;
/usr/bin/mc admin prometheus generate myminio node | sed '1d' | awk '{print \" \" $0}' >> /home/prometheus.yaml;
"
depends_on:
- minio
- minio-prometheus-monitoring-cluster

minio-prometheus-monitoring-bucket:
container_name: minio-prometheus-monitoring-bucket
image: minio/mc:RELEASE.2023-09-13T23-08-58Z
env_file:
- .env
volumes:
- ./config_files/prometheus/prometheus.yaml:/home/prometheus.yaml
entrypoint: >
/bin/bash -c "
/usr/bin/mc alias set myminio http://minio:9002 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD > /dev/null;
/usr/bin/mc admin prometheus generate myminio bucket | sed '1d' | awk '{print \" \" $0}' >> /home/prometheus.yaml;
"
depends_on:
- minio
- minio-prometheus-monitoring-cluster
- minio-prometheus-monitoring-node

volumes:
clickhouse-data:
clickhouse-logs:
prometheus_data:
grafana_data:
minio_data:


阿里雲-雲資料庫 ClickHouse 社群相容版

雲資料庫 ClickHouse 社群相容版節點和節點完全對等,每一個節點都可以承載查詢請求和寫入請求,以及後臺資料的計算和操作。

每個雲資料庫 ClickHouse 社群相容版叢集包含1個或多個分片(Shard),每個分片內部包含1個或多個副本(Replica)。

所有節點都部署在阿里雲彈性計算伺服器ECS之上,底層採用高可靠的雲盤作為持久化儲存介質

image


兩地雙中心部署架構

image


CH叢集應用案例

某國內電商公司Data Management Platform, 主要用於對人群進行圈選,畫像分析,廣告投放。隨著精細化自動營銷的慢慢發展,主要是透過聚合商家全域資料流量(其中包括使用者資料,使用者行為資料等)來進行行為分析,畫像分析,自動化營銷。

DMP架構

資料分片:提到了CH叢集分片,這通常意味著資料被分割成多個部分,分佈在不同的伺服器或節點上,以提高處理效率和可擴充套件性。

實時與離線處理:系統支援實時寫入和離線寫入,這表明架構設計了處理不同資料流的能力,能夠適應不同的業務場景。

Spark與Flink任務:提到了Spark任務和Flink/FlinkSQL任務,這表明系統使用了這兩種流行的大資料處理框架來處理資料。

點陣圖索引:提到了點陣圖本地表和標籤使用者點陣圖表,點陣圖索引是一種高效的資料結構,用於快速檢索和儲存大量資料。

使用者ID雜湊處理:使用者ID透過Hash處理,這有助於保護使用者隱私,同時也可以減少資料儲存的需求。

Kafka訊息佇列:使用Kafka作為訊息佇列,這有助於實現資料的非同步處理和解耦。

HTTP呼叫與自定義外掛:系統支援透過HTTP呼叫自定義CH外掛,這提供了靈活性,允許根據需要擴充套件或修改系統功能。

安全與效能最佳化:提到了Rate Limiter(限流器)、Security(安全)、Customer Plugins(自定義外掛)、Circuit Breaker(斷路器)和Routing(路由),這些都是系統效能和安全性的重要保障。

API閘道器:使用Proxy(如Apisix)作為API閘道器,這有助於管理API請求,提供負載均衡、服務發現等功能。

資料轉換:使用者行為資料結果需要轉換成bitmap和標籤點陣圖結果,這表明系統需要進行資料格式的轉換以適應不同的查詢需求。

多節點處理:提到了CH Shard1、CH Shard2、CH ShardN,這表明系統設計了多節點處理能力,以支援大規模的資料和高併發請求。




今天先到這兒,希望對AIGC,雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 專案管理, 產品管理,資訊保安,團隊建設 有參考作用 , 您可能感興趣的文章:
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
影片直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續整合/CD
網際網路電商購物車架構演變案例
網際網路業務場景下訊息佇列架構
網際網路高效研發團隊管理演進之一
訊息系統架構設計演進
網際網路電商搜尋架構演化之一
企業資訊化與軟體工程的迷思
企業專案化管理介紹
軟體專案成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共享
高效能的團隊建設
專案管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
網際網路資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之效能實時度量系統演變

如有想了解更多軟體設計與架構, 系統IT,企業資訊化, 團隊管理 資訊,請關注我的微信訂閱號:

image_thumb2_thumb_thumb_thumb_thumb[1]

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。 該文章也同時釋出在我的獨立部落格中-Petter Liu Blog。

相關文章