OLTP和OLAP介紹
基本業務量到達分庫分表量級,則離不開數據大屏、推薦系統、畫像系統等搭建,需要搭建以上系統,則離不開海量數據進行存儲-分析-統計。
而海量數據下 TB、PB級別數據存儲,靠Mysql進行存儲-分析-統計無疑是災難。所以就需要用到使用OLAP數據處理技術。
什么是OLTP
全稱 OnLine Transaction Processing,聯機事務處理系統, 就是對數據的增刪改查等操作。
存儲的是業務數據,來記錄某類業務事件的發生,比如下單、支付、注冊、等等。
典型代表有Mysql、 Oracle等數據庫,對應的網站、系統應用后端數據庫。
針對事務進行操作,對響應時間要求高,面向前臺應用的,應用比較簡單,數據量相對較少,是GB級別的。
面向群體:業務人員
當數據積累到一定的程度,需要對過去發生的事情做一個總結分析時,就需要把過去一段時間內產生的數據拿出來進行統計分析,從中獲取想要的信息,為公司做決策提供支持,這個就是做OLAP了。
什么是OLAP
OnLine Analytical Processing,聯機分析處理系統。
存儲的是歷史數據,對應的風控平臺、BI平臺、數據可視化等系統。
OLAP是數據倉庫系統的主要應用,支持復雜的分析操作,側重決策,并且提供直觀易懂的查詢結果。
典型代表有 Hive、ClickHouse。
針對基于查詢的分析系統,基礎數據來源于生產系統中的操作數據,數據量非常大,常規是TB級別的。
面向群體:分析決策人員。
數據庫里面行存儲和列式存儲
什么是行存儲
傳統的OLTP關系型數據庫都是行存儲。
一行中的數據在存儲介質中以連續存儲形式存在。
適合隨機的增刪改查操作 或者 在行中選取所有屬性的查詢操作,結合索引提升性能。
缺點
查詢的全部記錄的某幾個字段,但由于這些字段在各行數據單元中,而整個行特別大(字段特別多),程序必須不斷讀取每一條的行記錄取對應的字段,使得讀取效率大大降低。
例子:找某個訂單的話,就很方便,訂單的全部信息都能獲取; 但找全部訂單總金額就需要遍歷多個數據。
order_id | total_amount |
1 | 10 |
2 | 20 |
3 | 30 |
什么是列式存儲
存儲結構化數據時,在底層的存儲介質上,數據是以列的方式來組織的。
存儲完若干條記錄的首個字段后,再存儲這些記錄的第二個字段,然后再第三個字段、第四個字段...
查詢時只有涉及到的列會被讀取,而不需要全表掃描,可以顯著減少IO消耗,并降低查詢響應時間。
例子:查詢全部成交額,只需要把訂單金額拿出來即可。
1 | 2 | 3 |
10 | 20 | 30 |
總結
描述的是底層存儲介質上,數據的組織形式,哪種組織對應哪種業務需求。
列存儲在聚合、統計等操作性能會優于行存儲。
列存儲將多行記錄的列連續存儲在一起,一列接著一列。
列式存儲是同個數據類型,會進行數據壓縮率更高,更省空間。
列存儲數據更新成本較高,一般適合讀多寫少的場景,適合 OLAP 分析型系統。
列式存儲ClickHouse介紹和應用場景說明
ClickHouse的由來和應用場景
俄羅斯Yandex在2016年開源,使用C++編寫的列式存儲數據庫,近幾年在OLAP領域大范圍應用。
官網:
https://clickhouse.com
GitHub:
https://github.com/ClickHouse/ClickHouse
?阿里云的ClickHouse 文檔:
https://www.aliyun.com/product/clickhouse
分析型數據庫管理系統基準測試
https://benchmark.clickhouse.com/#system=+lik|yL|gQ&type=-&machine=-ca2|gle|6ax|ae-|6ale|3al|gel&cluster_size=-&opensource=-&tuned=+n&metric=hot&queries=-
特點和應用場景
不依賴Hadoop 生態、安裝和維護簡單。
擅長對列的聚合、計數等統計操作性能強勁。
對列存儲和壓縮采用更好的算法,更節省成本。
拓展性強,在生產中經過實戰測試,從單服務器部署到具有數千個節點的集群的線性水平可擴展性。
具有企業級安全功能和故障安全機制,可防止數據因應用程序錯誤和人為錯誤而損壞。
支持主流的大部分SQL語法和函數。
吞吐能力強,官方測試支持,支持多種存儲引擎,滿足多數業務場景。
廣泛應用:互聯網電商、在線教育、金融等領域用,用戶行為數據記錄和分析,搭建數據可視化平臺。
Linux服務器Docker安裝
安裝并運行Docker
yum install docker-io -y
檢查安裝結果
docker info
運行Docker守護進程
systemctl start docker
停止Docker守護進程
systemctl stop docker
重啟Docker守護進程
systemctl restart docker
查看容器
docker ps
停止容器
docker stop 容器id
修改鏡像倉庫,改完重啟docker
vim /etc/docker/daemon.json
{
"debug":true,"experimental":true,
"registry-mirrors":["https://pb5bklzr.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]
}
查看信息
docker info
Docker部署ClickHouse
鏡像倉庫地址
https://hub.docker.com
安裝命令
docker run -d -e CLICKHOUSE_USER=admin -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=admin --name test_clickhouse --ulimit nofile=262144:262144 \
-p 8123:8123 -p 9000:9000 -p 9009:9009 --privileged=true \
-v /usr/local/clickhouse/log:/var/log/clickhouse-server \
-v /usr/local/clickhouse/data:/var/lib/clickhouse clickhouse/clickhouse-server
默認http端口是8123,tcp端口是9000, 同步端口9009
web可視化界面:http://你的ip:8123/play
命令
查看數據庫:SHOW DATABASES
查看某個庫下面的全部表:SHOW TABLES IN system
系統數據庫是 ClickHouse 存儲有關 ClickHouse 部署的詳細信息的地方
默認數據庫最初為空,用于執行未指定數據庫的命令
數據庫連接工具下載
https://dbeaver.io/download
創建ClickHouse數據庫和表
創建數據庫?
CREATE DATABASE test
創建表
CREATE TABLE clickstream (customer_id String, time_stamp Date, click_event_type String,page_code FixedString(20), source_id UInt64
)
ENGINE = MergeTree()
ORDER BY (time_stamp)
說明:
ClickHouse 有自己的數據類型,每個表都必須指定一個Engine引擎屬性來確定要創建的表的類型
引擎決定了數據的存儲方式和存儲位置、支持哪些查詢、對并發的支持。
數據類型說明
String類型替換來自其他數據庫的 VARCHAR、BLOB、CLOB 和其他類似字符串的數據類型。
UInt64是一個 64 位無符號整數。
日期是在 ClickHouse 中存儲日期的幾種方法之一。
如果知道列中所有字符串的精確長度,則使用FixedString( n )數據類型。
插入數據
INSERT INTO clickstream VALUES ('customer1', '2021-10-02', 'add_to_cart', 'home_enter', 568239 )
查詢數據
SELECT * FROM clickstream
數據類型和語法說明
數值類型(整形,浮點數,定點數)
整型
固定長度的整型,包括有符號整型或無符號整型 IntX X是位的意思,1Byte字節=8bit位
有符號整型范圍
Int8 — [-128 : 127]Int16 — [-32768 : 32767]
Int32 — [-2147483648 : 2147483647]
Int64 — [-9223372036854775808 : 9223372036854775807]
Int128 — [-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727]
Int256 — [-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967]
無符號整型范圍
UInt8 — [0 : 255]UInt16 — [0 : 65535]
UInt32 — [0 : 4294967295]
UInt64 — [0 : 18446744073709551615]
UInt128 — [0 : 340282366920938463463374607431768211455]
UInt256 — [0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935]
浮點型(存在精度損失問題)
建議盡可能以整型形式存儲數據
Float32 - mysql里面的float類型
Float64 - mysql里面的double類型
Decimal類型
需要要求更高的精度的數值運算,則需要使用定點數。
一般金額字段、匯率、利率等字段為了保證小數點精度,都使用 Decimal。
Clickhouse提供了Decimal32,Decimal64,Decimal128三種精度的定點數。
用Decimal(P,S)來定義:
P代表精度(Precise),表示總位數(整數部分 + 小數部分)
S代表規模(Scale),表示小數位數
例子:Decimal(10,2) 小數部分2位,整數部分 8位(10-2)
也可以使用Decimal32(S)、Decimal64(S)和Decimal128(S)的方式來表示
字符串類型
UUID
通用唯一標識符(UUID)是由一組32位數的16進制數字所構成,用于標識記錄
61f0c404-5cb3-11e7-907b-a6006ad3dba0
要生成UUID值,ClickHouse提供了 generateuidv4 函數。
如果在插入新記錄時未指定UUID列的值,則UUID值將用零填充
00000000-0000-0000-0000-000000000000