KunlunBase 功能體驗範例

KunlunDB發表於2022-11-24

1.資料庫的容量測試

sysbench oltp_point_select        \
      --tables=[共有幾張資料表]                   \
      --table-size=[每張資料表要灌的資料量,推薦至少為 10000000]           \
      --db-driver=[pgsql/mysql]             \
      --pgsql-host=[host]        \
      --pgsql-port=[port]             \
      --pgsql-user=[userNmae]         \
      --pgsql-password=[userPwd] \
      --pgsql-db=[dbName]           \
      prepare

2.寫入效能測試case

  • 當前sysbench關於寫入效能相關的測試case有 read_write、update_index、update_non_index、write_only、insert
  • 命令可以參考
sysbench oltp_${case} \
--tables=${tables} \
--table-size=${tb_size} \
--db-ps-mode=disable \
--db-driver=[pgsql/mysql] \
--pgsql-host=${host} \
--report-interval=[間隔s報告一次結果] \
--pgsql-port=${port} \
--pgsql-user=${user} \
--pgsql-password=${pwd} \
--pgsql-db=${db} \
--threads=${threads} \
--time=${tim} \
--rand-type=uniform 
run 

3.查詢效能 ,多表 join

  • 當前sysbench關於查詢效能相關的測試case有 read_only、point_select

    • 相關命令可以參考第二步
  • 當前版本sysbench並不支援多表join,因此我們需要自定義lua測試指令碼

    • 以下是簡單範例,可以根據需求自行修改
    • vim oltp_mutli_join.lua
require("oltp_common")

function thread_init()
drv = sysbench.sql.driver()
con = drv:connect()
end

function thread_done()
con:disconnect()
end

function event()
local tableNum1
local tableNum2
local rs

tableNum1 = math.random(1,sysbench.opt.tables)
tableNum2 = math.random(1,sysbench.opt.tables)

local table1 = "sbtest" .. tableNum1
local table2 = "sbtest" .. tableNum2

local id = math.random(1,sysbench.opt.table_size)

-- db_query("begin")
rs = db_query("SELECT a.k FROM " .. table1 .. " a left join " .. table2 .. " b ON a.id = b.id WHERE a.id= " .. id)
-- db_query("commit")

end
  • 在自定義指令碼中,必須要提供thread_init() thread_done() event()這三個函式

    • event()就是要執行的測試函式
    • sysbench.opt.tables 則是在執行指令碼時傳入的--tables 引數,sysbench.opt.table_size是--table_size引數。其它傳入的引數都可以透過sysbench.opt來獲取
    • db_query就是要執行的sql語句,在event()方法中,有一個db_query,則執行中TPS=QPS/1。有n個db_query,則執行中TPS=QPS/n
    • 不可以在自定義的lua指令碼里面使用print(),否則不會產生結果
  • 使用sysbench執行自定義lua指令碼
    image.png

4.資料庫的安全性

4.1 create user 和create role的區別

使用超級使用者先建立

create role u1;
create user u2;
\du
create database vito;
\c vito
create table t1(a int, b int);
create table t2(a int, b int);
create table t3(a int, b int);

image.png

u1是沒有登入的許可權,不能夠進行登入資料庫
image.png

在超級使用者中修改使用者u1登入許可權

ALTER ROLE u1 WITH LOGIN;

image.png

4.2 建立使用者和角色語法

CREATE USER/ROLE name [ [ WITH ] option [ ... ] ]  : 關鍵詞 USER,ROLE; name 使用者或角色名; 

where option can be:

      SUPERUSER | NOSUPERUSER      :超級許可權,擁有所有許可權,預設nosuperuser。
    | CREATEDB | NOCREATEDB        :建庫許可權,預設nocreatedb。
    | CREATEROLE | NOCREATEROLE    :建角色許可權,擁有建立、修改、刪除角色,預設nocreaterole。
    | LOGIN | NOLOGIN              :登入許可權,作為連線的使用者,預設nologin,除非是create user(預設登入)。
    | REPLICATION | NOREPLICATION  :複製許可權,用於物理或則邏輯複製(複製和刪除slots),預設是noreplication。
    | BYPASSRLS | NOBYPASSRLS      :安全策略RLS許可權,預設nobypassrls。
    | CONNECTION LIMIT connlimit   :限制使用者併發數,預設-1,不限制。正常連線會受限制,後臺連線和prepared事務不受限制。
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL :設定密碼,密碼僅用於有login屬性的使用者,不使用密碼身份驗證,則可以省略此選項。可以選擇將空密碼顯式寫為PASSWORD NULL。
    加密方法由配置引數password_encryption確定,密碼始終以加密方式儲存在系統目錄中。
    | VALID UNTIL 'timestamp'      :密碼有效期時間,不設定則用不失效。
    | IN ROLE role_name [, ...]    :新角色將立即新增為新成員。
    | IN GROUP role_name [, ...]   :同上
    | ROLE role_name [, ...]       :ROLE子句列出一個或多個現有角色,這些角色自動新增為新角色的成員。 (這實際上使新角色成為“組”)。
    | ADMIN role_name [, ...]      :與ROLE類似,但命名角色將新增到新角色WITH ADMIN OPTION,使他們有權將此角色的成員資格授予其他人。
    | USER role_name [, ...]       :同上
    | SYSID uid                    :被忽略,但是為向後相容性而存在。
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

其中role_specification可以是:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]

4.3 許可權示例

建立database

登入u2進行建立資料庫d1,目前使用者u2沒有建立的許可權會失敗
psql postgres://u2@192.168.0.126:8888/postgres

\c
SELECT session_user, current_user;
create database d1;

image.png

使用超級使用者授權u2可以在資料庫中建立schema

alter user u2 createdb;

授權後切換到u2賬戶下再次進行建立

create database d1;

image.png

建立schema

使用者u2進入到不屬於自己的資料庫 進行建立schema,會失敗
先用超級使用者建立個資料庫d2,使用者u2在d2資料庫中進行建立schema(s1);
image.png

使用超級使用者授權使用者u2可以在資料庫d2中建立schema(s1);

grant create on database d2 to u2;

授權之後再次進行建立s1;
image.png

單表/所有表授權

使用u1賬戶進行登入psql postgres://u1@192.168.0.126:8888/vito
由於沒有表的許可權,進行的增刪改查都會失敗
image.png

超級使用者進行賦予許可權,因為只為t1表的許可權賦予u1,所以表t2,t3依然失敗

grant select,insert,update,delete on t1 to u1;
#GRANT

image.png

向所有表賦予許可權,表t2,t3都獲得了許可權

grant select,insert,update,delete on all tables in schema public to u1;

image.png

列授權

使用超級使用者建立t4表,並且回收t4表中的insert許可權,為t4表中的id與name賦予許可權,age欄位是沒有許可權的

create table t4(id int, name varchar(10), age int);
insert into t4 values (1,'zhangsan',18),(2,'lisi',13),(3,'wangwu',16);


# 收回t4表中的insert許可權
REVOKE insert on public.t4 from u1;

# 賦予t4列id和name的insert許可權
grant insert (id,name) on public.t4 to u1;
insert into t4 values (4,'liuliu');

#沒有給插入的age列賦予許可權,失敗
insert into t4 values (5,'shibai',19);

image.png
非超級使用者不能刪除非自己Owner的database,schema,table

使用者u1在資料庫vito中刪除屬於使用者abc的表t1,這是失敗的
image.png

使用u1使用者刪除表t1,需要更改表t1的owner

ALTER table t1 OWNER TO u1; 

image.png

5.資料庫高可靠性、備份恢復

預置條件:建立一個rbr叢集

5.1 kill 掉儲存節點的主,其被自動拉起。

5.1.1. 後設資料下查詢儲存節點的主:
image.png
根據member_state為source,得知 192.168.0.132 51401 即為主。

5.1.2. 在132機器上ps 檢視相關的程式資訊:
image.png

5.1.3. 然後kill掉其程式:
image.png

5.1.4. 一分鐘左右後,再ps檢查其程式:
image.png
發現其被自動拉起。

5.1.5. 連線mysql,檢查mysql的主備關係:
image.png

5.1.6. 在 192.168.0.132 51401 主上, show slave hosts;
image.png

在 192.168.0.132 51403 備上, show slave status;
image.png

另一個備機192.168.0.132 51405 上, show slave status;
image.png
主備關係正常。

5.2 連續3次kill 掉儲存節點的主,觸發其主備切換。

5.2.1. 後設資料下查詢儲存節點的主:
image.png
根據member_state為source,得知 192.168.0.132 51401 即為主。

5.2.2. 在132機器上ps 檢視相關的程式資訊:
image.png

5.2.3. 然後kill掉其程式:
image.png

5.2.4. 一分鐘左右後,再ps檢查其程式:
image.png
發現其被自動拉起。

5.2.5. 連續3次重複步驟3,kill掉儲存節點的主,觸發了儲存節點的主備切換

檢查clustermgr的日誌:
image.png
且在後設資料表的rbr_consfailover中看到這樣的資訊:
image.png

5.3 kill 掉後設資料叢集的主,其重新選舉主,且原主會被自動拉起

5.3.1. 後設資料下查詢儲存節點的主
image.png
根據MEMBER_ROLE為PRIMARY,得知 192.168.0.140 59301 即為主。

5.3.2. 在140機器上ps 檢視相關的程式資訊:
image.png

5.3.3. 然後kill掉其程式:
image.png

5.3.4. 此時在後設資料表中檢查後設資料叢集的資訊:
image.png

發現 192.168.0.132 59301成為新的後設資料叢集的主,且 192.168.0.140 59301不在表中。

檢查clustermgr的日誌,有如下資訊:
image.png

5.3.5. 一分鐘左右後,再到192.168.0.140上ps檢查其程式
image.png
192.168.0.140 59301被重新拉起

5.3.6. 再次到後設資料表中檢查後設資料叢集的資訊:
image.png
192.168.0.140 59301加入到後設資料叢集中,且降為SECONDARY。

5.4 kill 掉計算節點,其被自動拉起。

5.4.1. 後設資料下查詢計算節點的資訊:
image.png
得知 192.168.0.132 51701 即為計算節點。

5.4.2. 在132機器上ps 檢視相關的程式資訊:
image.png

5.4.3. 然後kill掉其程式:
image.png

5.4.4. 一分鐘左右後,再ps檢查其程式:
image.png
發現其被自動拉起。

5.4.5. 連線pg,檢查資料是否能正常讀寫:
image.png
pg讀寫正常。

5.5 kill 掉clustermgr的主,其會進行主備切換。

5.5.1. 後設資料下查詢clustermgr的主:
image.png
根據member_state為source,得知 192.168.0.140 59011 即為主。

5.5.2. 在140機器上ps檢視clustermgr的程式資訊:
image.png

5.5.3. 進入~kunlun-cluster-manager-1.0.1/bin下,停掉clustermgr:
image.png

5.5.4. 再到後設資料表中檢查clustermgr的主備資訊:
image.png

5.5.5. 發現clustermgr的主由原來的 192.168.0.140 59011切換到 192.168.0.129 59011上去了。
image.png

5.5.6. 再到 192.168.0.140 59011上啟動clustermgr,clustermgr啟動成功:
image.png
但是clustermgr的主仍然是 192.168.0.129 59011。

5.6 備份恢復

5.6.1. 建立rbr叢集:
image.png

此叢集作為源叢集;
叢集建立成功後,連線計算節點,如:
psql postgres://abc:abc@192.168.0.129:51701/postgres
建立t1111表並寫入資料。
image.png

5.6.2. 發起備份操作:(需保證hdfs server已啟動)
image.png

hdfs下記錄恢復的時間,如:2022-08-23 13:52
image.png

5.6.3. 建立另一個叢集:
規格需與步驟1中的叢集一致,參考步驟1,作為目標叢集。

5.6.4. 發起恢復操作:
image.png

5.6.5. 恢復成功後,連結步驟3中叢集的計算節點,如:
psql postgres://abc:abc@192.168.0.129:59701/postgres
t1111表會同步到目標叢集中。

點選閱讀原文

 推薦閱讀

KunlunBase架構介紹
KunlunBase技術優勢介紹
KunlunBase技術特點介紹
PostgreSQL vs MySQL TPC-H 測試
Kunlun-Storage vs PostgreSQL OLTP 測試

END

崑崙資料庫是一個HTAP NewSQL分散式資料庫管理系統,可以滿足使用者對海量關係資料的儲存管理和利用的全方位需求。
應用開發者和DBA的使用崑崙資料庫的體驗與單機MySQL和單機PostgreSQL幾乎完全相同,因為首先崑崙資料庫支援PostgreSQL和MySQL雙協議,支援標準SQL:2011的 DML 語法和功能以及PostgreSQL和MySQL對標準 SQL的擴充套件。同時,崑崙資料庫叢集支援水平彈性擴容,資料自動拆分,分散式事務處理和分散式查詢處理,健壯的容錯容災能力,完善直觀的監測分析告警能力,叢集資料備份和恢復等 常用的DBA 資料管理和操作。所有這些功能無需任何應用系統側的編碼工作,也無需DBA人工介入,不停服不影響業務正常執行。
崑崙資料庫具備全面的OLAP 資料分析能力,透過了TPC-H和TPC-DS標準測試集,可以實時分析最新的業務資料,幫助使用者發掘出資料的價值。崑崙資料庫支援公有云和私有云環境的部署,可以與docker,k8s等雲基礎設施無縫協作,可以輕鬆搭建雲資料庫服務。
請訪問 http://www.kunlunbase.com/ 獲取更多資訊並且下載崑崙資料庫軟體、文件和資料。
KunlunBase專案已開源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb

相關文章