【雲服務】分佈式數據庫OceanBase 使用動畫

OceanBase是一個支持海量數據的通用高性能分佈式數據庫系統,兼容MySQL絕大部分常用用法,目標是儘可能的兼容Oracle常用用法。實現了數千億條記錄、數百TB數據上的跨行跨表事務,由淘寶核心系統研發部、運維、DBA、廣告、應用研發等部門共同完成。在設計和實現OceanBase的時候暫時摒棄了不緊急的DBMS的功能,例如臨時表,視圖(view),研發團隊把有限的資源集中到關鍵點上,當前 OceanBase主要解決數據更新一致性、高性能的跨表讀事務、範圍查詢、join、數據全量及增量dump、批量數據導入。

連接OceanBase

     OceanBase 支持MySQL協議,支持JDBC接口。用戶可以使用mysql客戶端工具連接OceanBase,應用使用jdbc for mysql驅動連接OceanBase。

示例:mysql命令行連接oceanbase的sys租戶



 

  • mysql常用管理命令1


查看database列表,查看錶列表以及查看錶的數據




 

  • 查看OB租戶元數據庫的命令


OceanBase租戶裏會多一個默認的數據庫(oceanbase),裏面有部分元數據庫視圖,方便了解租戶所在集羣信息。OceanBase sys租戶裏元數據視圖會更多更全。

  • OB常用的mysql命令1


OceanBase 1.4分區表用法

業務數據做水平拆分,有如下幾種方案

  • 分庫分表:通過分佈式數據庫中間件做分庫分表拆分和路由等。如DRDS,MyCat,TDSQL等。
  • 分區:Oracle 12c的sharding, OceanBase 1.0及以後的版本
  • 存儲級別切片,對應用透明。如Google的Spanner,PingCap的TiDB


OceanBase的分區策略支持hash/list/range,以及支持二級分區(hash+hash,hash+range,key+key,range+range等)。詳細用法請參見OceanBase官網 文檔裏 的OB分區表用法 。

無論是分庫分表,還是分區的方案,都會面臨一個問題,就是當一個Query 要取不同機器(節點)上的數據的時候,如果保證取出來的數據是一致的(指來自於同一個時間點或版本)。
分庫分表方案解決不了這個問題, OB1.4也不能解決這個問題。OB2.0 新增全局時間服務,能提供全局一致性快照讀功能,所以解決了這個問題。

這裏演示一下 OB1.4 裏規避這個跨節點讀的方案(弱一致讀)


 

SELECT @@version;
drop table if exists t_parttable;
create table t_parttable(
    id bigint not null primary key,
    name varchar(50) not NULL,
      KEY name_ind(NAME) LOCAL
) DEFAULT CHARSET=utf8mb4 partition by hash(mod(id,1000)) partitions 8;
insert into t_parttable(id, name) values(1,'a'),(2,'A'),(3,'b'),(4,'B'),(5,'c'),(6,'C'),(7,'d'),(8,'D');
set session ob_query_timeout=1000000; select * from t_parttable where name='a';
explain select * from t_parttable where name='a';
select /*+read_consistency(weak)*/ * from t_parttable where name='a';
select * from t_parttable partition(p1);
select * from t_parttable partition(p2);



該問題,在OceanBase 2.0後版本已經解了

OB租戶負載均衡歷史查看

OB作爲一個分佈式數據庫,至少包含3個節點。其負載均衡的原理跟傳統負載均衡的原理大不一樣。
傳統負載均衡設備(F5)或軟件(LVS,SLB等)都是通過在某一協議層作爲流量入口然後分配流量給後端不同的節點,從而去改變後端節點的壓力。
OceanBase的負載均衡是自己通過調整每個節點(ObServer)裏的數據(Partition)分佈,從而間接改變打到各個節點(ObServer)上的流量,從而改變各個節點的壓力。

示例演示:租戶視角查看負載均衡歷史。
這裏是新建了一個分區表(8個分區),在插入數據後,觸發了負載均衡機制,把8個分區分散到多個節點上。

 

# 查看分區表的數據
SHOW CREATE TABLE db_bin.t_parttable;
SELECT /*+read_consistency(weak)*/ * FROM db_bin.t_parttable ORDER BY id ;
# 查看租戶的資源單元(Unit)分佈
SELECT tenant_name, unit_id,zone,svr_ip,max_cpu,round(max_memory/1024/1024/1024) max_mem_gb FROM gv$unit;
# 查看租戶的負載均衡歷史
SELECT str_to_date(h.gmt_create,'%Y-%m-%d %h:%i:%s') gmt_create, h.zone, t.database_name, t.tablegroup_name, t.table_name, t.part_num,h.partition_id,h.data_size, h.data_src_ip,  h.dest_unit_id, h.dest_ip, h.result_code, h.COMMENT , h.rs_svr_ip
FROM gv$unit_load_balance_event_history h JOIN gv$TABLE t ON (h.table_id=t.table_id)
WHERE t.table_name NOT LIKE '%recycle%' AND t.database_name='db_bin'
ORDER BY gmt_create DESC LIMIT 100;

 

OB sys租戶查看集羣使用信息

OceanBase作爲一款通用的分佈式關係型數據庫,跟其他同行產品相比,有一個獨特的地方,就是支持多租戶,即支持集羣資源(CPU/MEM/DISK等)的做租戶管理。
OceanBase集羣,至少是三節點。OceanBase把三個節點的機器資源能力聚合成一個大的資源池,然後做二次資源管理和分配。爲每個租戶分配一個特定規格的小的資源池,並且隨時可以動態調整。
租戶對於業務開發來說就是一個體的實例,只是開發不需要關注這個實例在哪個節點上。租戶的使用體驗類似於
MySQL (默認,以後還支持Oracle兼容模式的租戶)。
假設OceanBase集羣已經搭建好了,在創建租戶之前,先清點一下現有集羣的資源使用狀況。下面是示例

# 查看集羣節點資源使用情況
SELECT svr_ip, s.zone, s.cpu_total, s.cpu_assigned, s.cpu_assigned_percent, round(s.mem_total/1024/1024/1024) mem_total_gb, round(s.mem_assigned/1024/1024/1024) mem_ass_gb, s.mem_assigned_percent
FROM __all_virtual_server_stat s
ORDER BY zone,svr_ip;
# 查看資源單元規格定義
SELECT NAME, max_cpu, min_cpu, round(max_memory/1024/1024/1024) max_mem_gb , round(min_memory/1024/1024/1024) min_mem_gb FROM __all_unit_config ORDER BY unit_config_id LIMIT 10;
# 查看已有租戶及其資源池信息
SELECT t.tenant_name, p.name pool_name, c.name config_name, p.unit_count, p.zone_list, t.`locality`
FROM __all_resource_pool p JOIN __all_unit_config c ON (p.unit_config_id=c.unit_config_Id)
  LEFT JOIN __all_tenant t ON (p.tenant_id=t.tenant_id)
WHERE p.NAME IN ('yq_Pool','app_pool')  ORDER BY p.resource_pool_id;

OceanBase租戶創建(很簡單)

 清點了OceanBase集羣資源使用情況後,選定一個規格,就可以快速創建出一個租戶(demo_t)


示例:OB1.4下創建租戶(2步)

# 清理已經創建的同名租戶
DROP tenant IF EXISTS demo_t;
DROP resource pool demo_pool;
# 創建新的資源池(Resource Pool)
CREATE resource pool demo_pool unit='S0_unit_config', unit_num=2;
# 創建租戶
CREATE tenant IF NOT EXISTS demo_t resource_pool_list=('demo_pool') SET VARIABLES ob_tcp_invited_nodes='%';
# 查看已有租戶及其資源池信息
SELECT now() cur_time, str_to_date(t.gmt_create,'%Y-%m-%d %h:%i:%s') gmt_create,  t.tenant_name, p.name pool_name, c.name config_name, p.unit_count, p.zone_list, t.`locality`
FROM __all_resource_pool p JOIN __all_unit_config c ON (p.unit_config_id=c.unit_config_Id)
  LEFT JOIN __all_tenant t ON (p.tenant_id=t.tenant_id)
WHERE p.NAME IN ('demo_pool')  ORDER BY p.resource_pool_id;

退出當前sys租戶,重新登錄新建租戶 ,用戶名是:root@demo_t#集羣名,密碼默認是空。 登錄後新建Database,並創建賬戶訪問DB。

OceanBase裏索引創建特徵

OceanBase裏創建索引稍微有點特殊,開發和運維需要留意一下。

  1. 如果是在create table裏帶上了索引(包括唯一索引,也就是唯一性約束),是立即生效的。
  2. OB 1.x 版本里在表存在的情況下新建的索引(包括唯一索引),命令立即返回,但是索引不是立即生效。需要等到OB集羣發起大合併之後纔會生效。其中唯一索引需要等待兩次大合併。所以運維建索引後需要安排1-2次大合併操作。
  3. OB 2.x 版本里在表存在的情況下新建的索引(包括唯一索引),命令立即返回,索引也不是立即生效,但是索引開始後臺異步創建,創建時間取決於數據量。

示例如下:

1. OB 1.x 版本的索引


2. OB 2.x版本的索引


2019年春季低價服務器( 最低1元/日起  )活動進行中,如有需要的請點擊以下鏈接:
阿里雲內購
騰訊雲內購

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章