OceanBase與傳統數據庫對比
| 傳統集中式數據庫 | 以OceanBase為代表的分布式數據庫 | |
|---|---|---|
| 產品架構 | 經典的“單點集中式”架構,采用“全共享(share-everything)”架構。構建於高端的硬件基礎之上 | 原生的“分布式”數據庫,采用業內最嚴格的Paxos分布式一致性協議,基於普通PC硬件設計 |
| 數據可靠性和服務高可用性 | 1、利用高端硬件設備保證可靠性;2、采用“主從復制”,主節點故障的情況下,會有數據損失(RPO>0);不能自動恢復服務,恢復時間(RTO)通常以小時為單位計算 | 1、以普通PC硬件為基礎,利用Paxos分布式一致性協議保證數據可靠性;2、主節點故障情況下,Paxos可保證數據無損(RPO=0),並且自動選舉並恢復服務,服務恢復時間在30s內 |
| 擴展性 | 1、數據存儲只能在單點內實現縱向擴展,最終達到單點架構下的容量上限。2、計算節點通常無法擴容,少數模式(RAC、pureScale)可擴容,數量有限 | 1、數據節點和計算節點均可以在MPP架構下實現水平擴展;2、數據節點和計算節點均沒有數量限制,在網絡貸款足夠前提下,可以擴充至任意數目 |
| 應用場景 | 集中企業客戶的核心系統;無法應付互聯網業務場景 | 支付寶核心、網商銀行核心 |
| 使用成本 | 比較昂貴;需要支付高端基礎硬件費用、軟件授權費用、產品服務費用 | 相對較低;PC硬件、軟件授權、產品服務費用 |
1、產品簡介
核心特性
| 特性 | 說明 |
|---|---|
| 高擴展 | 1、水平擴展;2、按需在線擴容、縮容、不停服務;3、單機群突破100台服務器 |
| 高可用 | 1、基於Paxos協議,強一致性;2、少數副本故障,數據不丟,服務不停;3、RPO=0,RTO<30s |
| 多租戶 | 1、DBaas架構;2、資源隔離;3、自動負載均衡 |
| 高性能 | 1、峰值6100萬次/秒;2、單表最大3200億行;3、准內存處理性能 |
| 高兼容 | 1、Oracle/MySQL兩種兼容模式;2、降低業務遷移改造成本 |
| 高透明 | 1、全局一致性快照;2、全局索引;3、自動事務兩階段提交 |
2、基本概念
集群 - zone - OBserver - 租戶
- 一個集群有多個zone,給一個集群的機器打上相同tag,就屬於同一個zone;
- zone>=3(建議奇數);每個zone有且只有一份完整副本;每個zone存在一台OBserver作為 RootService總控服務
- OBserver相對獨立,有獨立的計算和存儲引擎
- 租戶:類似 “實例”
- 每個租戶有自己的資源池(CPU、內存)用戶名、密碼
- 租戶之間的數據嚴格隔離;租戶內可創建專屬的數據庫、表、執行DML操作
- 邏輯上類似於數據庫實例,但物理上租戶並沒有自己的專屬進程
- 使用OceanBase集群資源的第一個步驟
# 創建租戶步驟
# 1、創建“資源單元規格”,定義規格,不實際分配
create resource unit unit1
max_cpu = 4,
max_memory = 10737418240, -- 10GB
min_memory = 10737418240, -- 10GB
max_iops = 1000,
min_iops = 128,
max_session_num = 300,
max_disk_size = 21474836480 -- 20GB
;
# 2、創建“資源池”
create resource pool pool1
unit = 'unit1',
unit_num = 1,
zone_list = ('zone1', 'zone2', 'zone3')
;
<font color='red'>每個OBserver只能有一個 unit</font>;如果 unit_num > 1,每個zone內必須有對應數目的機器;
zone list一般與 zone個數保持一致;
# 3、創建租戶
create tenant mysql_tenant
resource_pool_list = ('pool1'),
primary_zone = 'zone1, zone2, zone3'
set ob_tcp_invited_nodes = '%', ob_compatibility_mode = 'mysql', recyclebin = off, ob_timestamp_service = 'GTS'
primary zone:指定主副本分配到zone的優先級,逗號兩側優先級相同,分號左側優先級高於右側
需要指定租戶類型是mysql還是oracle
# 檢查所有服務器狀態
select * from __all_server \G
# 查看集群中整體資源分配的情況
__all_virtual_server_stat
# 查看unit
select * from __all_unit_config;
# 查看已經分配的resource unit
select * from __all_unit;
# 將resource unit和具體的租戶對應起來
select * from __all_resource_pool;
日志
- observer.log:observer運行時的日志文件
- rootservice.log:observer上rootserver的日志文件
- election.log:observer上選舉模塊的日志文件
- OB proxy:/opt/xx/install/obproxy-
/log/obproxy. .log
開啟日志循環
enable_syslog_recycle = True;
max_syslog_file_count = ;
日志級別
默認 info,級別超過 warn,會自動生成files保留下來
syslog_level = [debug, trace, info(默認), warn, user_err, error]
3、安裝部署
- 需要對所有服務器和操作系統進行一系列的設置,使得服務器環境適合部署OceanBase
- 部署OCP,OCP部署完成后可以使用圖形化界面完成后續安裝部署
- 通過OCP來部署OceanBase集群
- 通過OCP來部署OB proxy
- 創建租戶,以及租戶內的數據庫、表等
- 根據業務需要部署OMS、ODC、備份恢復等其他組件
3.1 客戶端工具
白屏工具:OceanBase雲平台(OCP)、OceanBase開發者中心(ODC)
黑屏工具:OceanBase客戶端、MySQL客戶端
4、Paxos協議
| 分區 | 副本 |
|---|---|
| 1、當一個表很大,可以分為若干分區。根據行數據導分區的映射關系,分為hash分區、list分區、range分區; 2、每一個分區用不同維度再分為若干分區,稱為二級分區;3、分區是OceanBase數據架構的基本單元,是傳統數據庫的分區表在分布式系統上的實現 | 1、為數據安全和提供高可用的數據服務,每個分區的數據在物理上存儲多份,每一份叫做分區的一個副本;2、副本根據負載和特定的策略,由系統自動調度分散在多個server上。 |
| 1、全能型副本:2、日志型副本:3、只讀型副本: |
| 類型 | log | MemTable(內存增量數據) | SSTable(磁盤上靜態數據) | 數據安全 |
|---|---|---|---|---|
| 全能型 | 有,參與投票 | 有 | 有 | 高 |
| 日志型 | 有,參與投票 | 無 | 無 | 低 |
| 只讀型 | 有,不屬於paxos組,只是listener | 有 | 有 | 中 |
以分區為單位組建paxos協議組:每個分區都有多份副本(replica),自動建立paxos組,在分區級用多副本保證數據可靠性和服務高可用,數據管理更加靈活方便;自動選出誰是主,誰是從。
- Paxos組是以分區為單位的,不是以表、數據庫或租戶為單位的
- 組成員自動選舉主和從
- 副本會均勻分布在zone的機器上
- Paxos組成員通過redo-log多數派強同步,確保數據的持久化
- leader無需等待所有的follower的反饋,多數派完成同步即可向應用反饋成功
5、負載均衡
自動負載均衡和智能路由
一般情況下,副本以及主副本將被均勻打散到zone內各個服務器中,實現自動負載均衡
primary zone
| 配置 | 意義 | 說明 |
|---|---|---|
| (z1,z2,z3) | zone1=zone2=zon3 | 主副本均勻分布在各個機器 |
| (z1;z2;z3) | zone1>zone2>zon3 | 主副本只在zone1存在,zone2、zone3均是從副本 |
| (z1,z2;z3) | zone1=zone2>zon3 | 主副本均勻分布在zone1和zone2,zone3是從副本 |
租戶、database、table:可以指定各自的primary zone,不必和上一級對象的設置保持一致
table group
將多個表的相同分區ID的主副本聚集在一個ob server中,減少分布式事務引入的開銷
- 如果多個表的分區方式完全相同(分區類型、分區鍵個數、分區數量),可以在邏輯上將這些表歸屬到同一個table group中,以影響動態負載均衡的策略
- 同一個table group的所有表,分區ID相同的所有分區,他們的leader在同一個obsever上
- 如果負載均衡被打破(機器故障、擴容縮容等),table group中所有表回作為一個整體調整分區分布和leader分布
- 動態創建和刪除,並且對於上層應用完全透明
- 如果租戶的unit_num=1且primary_zone只有一個,不需要table group
6、OB Proxy
智能路由
- 對sql做基本解析,確定leader所在機器
- 反向代理,將請求路由至對應的leader;leader位置無法確定時隨機選擇OB server
- 輕量sql姐+快速轉發,保證高性能,單個OB Proxy每秒轉發百萬次請求
- ===
- 每個OB Proxy是一個“無狀態”的服務進程,不做數據持久化,對部署位置無要求
- OB Proxy不參與數據庫引擎的計算任務,不參與事務處理
- 多個OB Proxy之間無聯系,可通過F5/SLB組成負載均衡集群
- 不需要獨立服務器,可以與OBserver共用一台服務器
OB Proxy:簡單的sql parser解析出租戶名、數據庫名、表名、分區ID等
7、數據可靠及可用性
- 少數派故障時自動實現服務接管,保證服務高可用
- OB server進程異常后的處理策略
- 小於server_permanent_offline_time,進程終止時間不長,暫不做處理
- 大於server_permanent_offline_time,“臨時下線”,從其他zone的主副本中,將缺失的數據復制到本zone內剩余的機器上,以維持副本個數
OceanBase容災
- 同城三機房部署
- 三地五中心副本
- 同城兩機房“主-備”方案
- 兩個機放,做兩個集群,然后redolog同步
- 兩地三中心“主-備”方案
8、動態擴容縮容
購買資源 -> 追平數據 -> 切換服務 -> 縮容 -> 退回資源
擴容步驟:
- 為每個zone添加新的物理機器
- 在每台新添加的機器上,以正確的方式啟動observer服務
- 為每台新添加的observer進程執行alter system ad server;命令,將observer服務添加到集群中
- 執行alter resource pool poolname unit_num=xx;擴充資源池中的unit個數
- oceanbase自動啟動“rebalance”過程,將部分數據從舊的unit在線復制到新的unit上。
- 每個分區復制完成后,OceanBase自動將服務切換到新的unit上,並刪除舊unit中分區上的數據
確定是否復制完成?
查看__all_virtual_sys_task_status表,是否有comment like ‘%partition migration%’的任務
縮容步驟:
- 執行alter resource pool poolname unit_num=xx;縮減資源池中的unit個數
- OceanBase自動啟動“rebalance”過程,將一部分數據從待下線機器上的unit在線復制到同zone內其它機器的unit上
- 每個分區的數據復制完成后,OceanBase自動將服務切換到新的unit上,之后刪除待下線機器的unit分區上的數據
- 為每台要下線的機器執行alter system delete server;命令完成機器下線
- 手動終止已下線機器的observer進程,執行關機等操作
9、分布式事務、MVCC、事務隔離級別
ACID:
A(atomicity)原子性:依賴兩階段提交協議保證分布式事務的原子性
1. 第一階段:投票階段 協調者向所有參與者發送prepare請求與實務內容
2.第二階段:執行階段 如果所有參與者返回OK,協調者發送提交請求,參與者完成提交后返回給協調者,如果有一個參與者返回no,則需要回滾。
C(consistency)一致性:保證主鍵唯一等一致性約束;全局快照-單租戶GTS服務,1秒鍾能夠響應獲取全局時間戳次數超過200萬次;
I(Isolation)隔離性:采用MVCC進行並發控制,實現read-committed的隔離級別;所有修改的行加互斥鎖,實現寫-寫互斥;讀操作讀取特定快照版本的數據,讀寫互不阻塞
D(durability)持久性:redo_log使用paxos協議做多副本同步
事務並發問題:
1、臟讀:讀取了未提交的數據
2、不可重復讀:指的是同一事務內,不同時刻讀到的同一批數據可能是不一樣的(期間被別的事務更新數據)
3、幻讀:同一事務內,在操作過程中進行兩次查詢,第二次查詢的結果包含第一次查詢中未出現的數據或者缺少了第一次查詢中出現的數據(期間被別的事務插入或刪除了數據)
OceanBase兩種隔離級別:
1、read-committed:可以避免臟讀,但是存在不可重復讀和幻讀(默認)
2、serializable:可以避免臟讀、不可重復讀、幻讀,最嚴格的隔離級別,但會影響性能
10、SQL引擎
11、存儲引擎
准“內存數據庫”+ LSMTree存儲:有效解決隨機寫和寫放大問題
OceanBase把內存分為兩塊:(默認50%,參數那塊有講)
- 一塊是MemTable,用於寫;
- 在內存保存較長時間,當內存空間快滿時或達到某個固定的時間或人工觸發
- 內存臟數據合並,順序寫入SSD硬盤,避免隨機寫,提高性能
- 一塊是熱點緩存,用於讀
LSMTree存儲:減少磁盤碎片,提升壓縮能力
memstore -> mini freeze(dump操作) -> minor freeze(轉儲) -> major freeze(合並) -> sstable
多個mini freeze數據會異步合並,多個minor freeze 會實時合並
- 觸發mestore內存dump操作的閾值
- freeze_targger_percentage>70,內存寫滿70%
- 每一次dump之前,都會對memstore做一次freeze,產生新的版本號
- 轉儲時機
- 手工觸發:alter system minor freeze;
- mini freeze次數已滿;當次數達到minor_compact_trigger參數指定的次數時,自動觸發轉儲。值為0時關閉mini freeze,直接轉儲
- 合並(major freeze)時機
- 定時合並:有major_freeze_duty_time參數控制,默認“02:00”
- 手動觸發:alter system major freeze;
- 轉儲次數已滿:當轉儲次數已達到major_compact_trigger指定次數時,自動觸發合並,值為0時則關閉
- 支持輪換合並,多個zone按次序合並
LSMTree:高數據壓縮率,降低存儲要求
- 第一次壓縮:encoding,使用字典、RLE等算法對數據進行瘦身。
- 第二次壓縮:使用lz4等壓縮算法對encoding之后的數據再做一次瘦身;OceanBase支持snappy、lz4、lzo、zstd等壓縮算法
備份恢復
- 支持全量備份和增量備份:直接對存儲池呢個基線數據做全量備份,通過redo-log實現增量備份;可以在線實時進行全量及增量備份,對業務無影響
- 最小粒度為租戶:備份恢復最小粒度為租戶
- 全局范圍內保證數據一致性
- 支持數據庫上的任何操作:
- 支持多種備份介質:普通NFS、阿里雲對象存儲(OSS)
- 性能:備份速度達到網卡上限1G/s,恢復速度500MB/s
12、參數和變量
參數
參數管理
| 說明 | |
|---|---|
| 管理范圍 | 通過集群參數的設置可以控制集群的負載均衡、合並時間、合並方式、資源分配和模塊開關等功能 |
| 參數生效 | 參數分為動態生效和重啟生效兩類,大部分為動態生效 |
| 參數級別 | 1、OceanBase的集群參數分為集群級別和租戶級別,大部分為集群級別;2、如果同時存在集群級別和租戶級別參數,那么集群會覆蓋租戶參數 |
| 管理權限 | 1、系統租戶可以查看和設置所有其他租戶的參數;2、普通租戶只能設置自己租戶的參數 |
參數說明
系統租戶:
show parameters like 'sql_work_area' tenant=t1
sho parameters where edit_level='static_effective' and name='sql_work_area' tenant=t1
普通租戶: (需要到租戶內部才能修改)
show parameters like 'sql_work_area'
| 查詢結果 | |
|---|---|
| 列名 | 含義 |
| svr_ip | 機器IP |
| svr_port | 機器端口 |
| name | 配置項名 |
| value | 配置項值 |
| type | 配置項數據類型(number,string) |
| info | 配置項解釋 |
| section | 配置項分類 |
| scope | 配置項范圍(tenant 、 cluster) |
| source | 當前值來源(tenant、cluster、commandline、obadmin、file) |
| editable | 是否可以修改 |
| edit_level | dynamic_effective(動態修改)static_effective(重啟生效) |
常見OB系統配置項 P108
| 配置項 | 默認值 | 說明 |
|---|---|---|
| zone_merge_timeout | 3h | 單個zone合並的超時時間;取值范圍(1-正無窮) |
| freeze_trigger_percentage | 70 | 觸發合並時,memstore使用百分比;取值范圍(0,100) |
| enable_manual_merge | false | 是否開啟手動合並;True時,max_merge_duration_time才會有效;True時,則認為DBA關閉自動合並; |
| major_freeze_duty_time | 02:00 | 每日定時合並任務的啟動時間;取值范圍(00:00-24:00) |
| syslog_level | info | 日志級別:debug、trace、info、warn、error |
| enable_syslog_recycle | false | 是否打開舊日志開關;和max_syslog_file_count配合使用 |
| max_syslog_file_count | 0 | 指定最多同時存在多少個日志文件;每個日志文件占用256M空間;如果為0時,則不進行刪除 |
| trace_log_slow_query_watermark | 100ms | 打印trace.log慢查詢控制閾值;取值范圍[1,正無窮) |
| syslog_io_bandwidth_limit | 30MB | 系統日志IO帶寬限流 |
| enable_syslog_wf | true | 是否單獨保存warning以上日志級別的日志到文件中 |
| minor_freeze_times | 0 | 兩次合並之間的轉儲上限次數 |
| large_query_threshold | 100ms | 大查詢判斷條件;取值范圍[1,正無窮) |
| large_query_worker_percentage | 30 | 大查詢分配資源百分比;取值范圍[0,100] |
| memory_limit_percentage | 80 | 內存使用上限;取值范圍[10,90] |
| sql_audit_memory_limit | 3G | 開啟sql審計,sql審計內部表最大可用內存;默認3G,取值范圍[256M,正無窮) |
| server_permanent_offline_time | 3600s | 服務器永久下線時間;取值范圍[20s,正無窮) |
| enable_auto_leader_switch | true | 允許系統自動切主 |
| clog_sync_warn_threshold | 100ms | commitlog同步超過多長時間包warn日志;取值范圍[1ms,1000ms] |
| enable_sql_audit | true | 是否開啟sql審計功能; |
| sql_audit_memory_limit | 3G | 開啟sql審計,sql審計內部表最大可用內存;默認3G,取值范圍[256M,正無窮) |
變量variables
會話變量session、全局按量global
查看:
show variables;
show variables like '%%'
修改:
set @@session.
set @@global.
常見的OB系統變量variables
| 配置項 | 默認值 | 說明 | 屬性 |
|---|---|---|---|
| ob_query_timeout | 10000000 | 查詢超時時間 | global、session |
| ob_trx_timeout | 10000000 | 事務超時時間 | global、session |
| ob_read_consistency | strong | 讀一致性 | global、session |
| ob_enable_truncate_flashback | on | truncate table是否會進回收站受該參數控制 | global、session |
| lower_case_table_names | 1 | 是否大小寫敏感:1不敏感 0敏感 | global、session、readonly |
13、OCP、ODC、OMS工具
OCP(oceanbase cloud platform)
(集群管理、租戶管理、監控告警、性能診斷、備份恢復、導入導出)
- 支持高可用
- 最多可以同時管理500台主機
- 響應速度可達到秒級
需要安裝OCP agent
---核心功能: - 集群管理:提供全生命周期管理,包括安裝、運維、性能監控、配置、升級、刪除等功能
- 主機管理:提供添加主機、刪除主機、主機信息顯示等功能
- 租戶管理:租戶的創建、租戶結構拓撲圖、性能監控、會話管理、參數管理
- 告警管理:支持集群、租戶、主機等不同維度的告警。系統基於告警規則生成告警
- 備份恢復管理:支持集群、租戶級別的全量備份、增量備份、redo_log備份、完全恢復、不完全恢復等
- 用戶權限管理:通過對用戶和角色的管理確保系統安全
ODC(oceanbase developer center)
(連接管理、數據庫對象管理、sql工作台、存儲過程開發調試、導入導出)
客戶端、瀏覽器登錄
功能:
- 數據庫日常開發操作
- websql
- sql診斷
- 會話管理
- 數據導入導出
OMS()實時同步工具
數據實時同步 + 快速切換 + 回滾預案(去o方案)
- 支持多種類型數據源:mysql、oracle、db2
- 兼容性評估和改造:異構數據遷移OceanBase的對象兼容性評估和改寫建議
- 一站式交互:數據遷移全生命周期管理,數據遷移的創建、配置和監控都在管理界面上連貫操作完成,交互簡單
- 多重數據校驗:
