YashanDB數據庫是全面自主設計研發,支持集中式、分布式和共享存儲部署架構以及混合負載場景的超融合數據庫。本文簡要介紹了YashanDB的特性和部署架構,并部署1主1備的測試環境,驗證數據庫訪問操作、主備切換高可用過程,以了解。
1、YashanDB基本介紹
崖山數據庫系統YashanDB是一種新型的數據庫管理系統,由深圳計算科學研究院自主設計研發。它在經典數據庫理論的基礎上,融入了原創的有界計算理論、近似計算理論、并行可擴展理論和跨模融合計算理論。YashanDB在部署模式上支持單機/主備、共享集群、分布式等多種部署方式,覆蓋OLTP/HTAP/OLAP交易和分析混合負載場景,支持大規模并發事務處理和混合事務-分析處理、在線實時分析、海量數據查詢加速以及異構數據融合處理場景。
1.1 YashanDB數據庫核心特性
YashanDB數據庫是全面自研的國產數據庫,滿足實時性和高并發下的性能和穩定性要求,同時具備主流的信創改造生態,符合應用遷移的標準。主要有以下特性:
- 全面兼容主流的Oracle數據庫和MySQL數據庫的語法、語義,應用無需大量改造,可以完成低成本的平滑遷移;
- 兼容適配主流的信創軟硬件生態,包括芯片、操作系統和中間件等,并且內核代碼自主可控,實現自主知識產權的核心競爭力;
- 基于NUMA架構設計并行計算框架,實現高性能低成本的性能要求;
- 提供金融級的高可用容災能力,實現多種部署模式和多中心多活的高可用部署架構;
- 多種存儲引擎架構支持混合負載和實時分析等融合數據處理
1.2 YashanDB數據庫部署架構
YashanDB在部署架構上分為單實例的主備部署、分布式部署以及共享集群的部署模式,部署架構如下圖所示:
- 單實例主備部署:1主多備的主備部署模式,主備實例部署在不同的主機上采用本地存儲,主備節點之間通過日志同步的方式進行數據同步。主節點故障時自動切換到備節點,保證服務的高可用。
- 分布式部署:基于Shared-nothing架構,由多個實例節點組成(包括MN節點、CN節點和DN節點),這些節點部署在不同的機器上
- 共享集群部署:基于聚合內存的技術實現集群數據庫各實例之間協同數據頁的讀寫訪問以及各種非數據類的并發控制。共享集群在部署上是多實例多活的架構,多個數據庫實例并發的讀寫同一份共享數據。在管理組件上多了YCS和YFS,分別對集群數據的高可用和集群的文件系統進行管理。
三種部署模式分別適用于不同的場景,各自特性如下:
- 單實例主備架構:集中式數據庫處理類型,基于高性能的服務器和存儲滿足高并發的聯機類業務處理,同時1主多備的架構保證了系統的高可用。不過受限于單臺服務器的處理性能和存儲限制,適用于非大并發大數據量存儲的應用。
- 分布式架構:原生的分布式數據庫架構,支持在線交易和實時數據分析混合交易,適用于海量數據分析以及數據倉庫類應用
- 共享集群架構:對標Oracle RAC的部署架構,滿足核心業務場景的高性能、高可靠以及擴展性要求。適用于核心業務場景的國產化替換。
1.3 YashanDB數據庫內核架構
YashanDB數據庫的內存架構如圖,主要包括以下部分:
- 私有內存區域:包括SQL執行區以及SQL算子使用的虛擬內存,這部分內存區域在各個線程運行時分配使用,釋放后才能被其它線程使用
- 共享內存區域:包括SQL緩存、日志緩存等內存共享池和全局緩存、全局鎖和全局隊列等全局共享資源池、數據緩存區域以及有界加速緩存
- 工作線程:處理客戶端連接請求的線程,可以為會話專有模式或共享模式
- 后臺線程:寫日志、寫數據和checkpoint等數據庫后臺的工作線程。
對于分布式架構,還有MDS元數據管理、CMS分布式集群管理和GTS分布式全局時間管理等線程;對于共享存儲架構,還有共享集群間的同步消息處理、GRC全局資源訪問控制、GLS全局鎖服務和GCS全局緩存服務等專有線程。
2、YashanDB主備部署實踐
2.1 環境準備
2.1.1 主備集群服務器信息
1)YashanDB數據庫1主1備部署服務器信息如下:
IP |
操作系統 |
CPU |
內存 |
YashanDB版本 |
角色 |
192.168.112.121 |
centos_7.4_x86_64 |
1核 |
2G |
23.1.1.100 |
主節點 |
192.168.112.122 |
Centos_7.4_x86_64 |
1核 |
2G |
23.1.1.100 |
備節點 |
2)安裝默認端口
3)關閉防火墻
##關閉防火墻
# systemctl stop firewalld
##關閉開機自啟
# systemctl disable firewalld
##檢查防火墻狀態
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
4)開啟SSH服務
##檢查ssh服務
# systemctl start sshd.service
##檢查ssh服務
# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-11-23 09:13:12 CST; 1h 38min ago
Docs: man:sshd(8)
man:sshd_config(5)
2.1.2 創建用戶yashan并加入sudoer中
##1、創建用戶
# useradd -d /home/yashan -m yashan
# passwd yashan
##2、配置sudoers
# chmod +w /etc/sudoers
#在/etc/sudoers添加內容
yashan ALL=(ALL) NOPASSWD:ALL
# chmod -w /etc/sudoers
##3、查看用戶
# id yashan
uid=1002(yashan) gid=1002(yashan) groups=1002(yashan)
2.1.3 安裝目錄規劃
所有安裝YashanDB的實例節點上必須規劃的兩個目錄:
- HOME目錄:YashanDB的產品目錄,包含YashanDB所提供的命令、數據庫運行所需的庫及各關鍵組件。該目錄由yashan用戶執行安裝部署時輸入的install-path參數根據一定規則生成并創建。
- DATA目錄:YashanDB的數據目錄,包含數據庫的各類系統數據文件、日志文件和配置文件,用戶數據也缺省存儲在該目錄下。但對于共享集群,所有的數據文件和redo文件均需保存在共享存儲上,DATA目錄將只用于存儲實例運行相關的配置文件、日志文件等數據。該目錄由yashan用戶執行安裝部署時輸入的data-path參數根據一定規則生成并創建。
2.2 主備節點安裝
2.2.1 安裝包和配置文件
1)解壓安裝包
# tar -xzvf yashandb-personal-23.1.1.100-linux-x86_64.tar.gz -C /usr/local/yashandb/install
2)在主備節點創建安裝目錄
#mkdir /usr/local/yashandb
3)執行yasboot package命令生成配置文件
#cd /usr/local/yashandb/install
#./bin/yasboot package se gen --cluster yashandb -u yashan -p xxxx --ip 192.168.112.121,192.168.112.122 --port 22 --install-path /usr/local/yashandb/yasdb_home --data-path /usr/local/yashandb/yasdb_data --begin-port 1688 --node 2
192.168.112.121
ip:192.168.112.121 cpu cores is less than 2
ip:192.168.112.121 memroy is less than 4096MB
192.168.112.122
ip:192.168.112.122 cpu cores is less than 2
ip:192.168.112.122 memroy is less than 4096MB
hostid | group | node_type | node_name | listen_addr | replication_addr | data_path
-------------------------------------------------------------------------------------------------------------------------
host0001 | dbg1 | db | 1-1 | 192.168.112.121:1688 | 192.168.112.121:1689 | /usr/local/yashandb/yasdb_data
----------+-------+-----------+-----------+----------------------+----------------------+--------------------------------
host0002 | dbg1 | db | 1-2 | 192.168.112.122:1688 | 192.168.112.122:1689 | /usr/local/yashandb/yasdb_data
----------+-------+-----------+-----------+----------------------+----------------------+--------------------------------
Generate config success
- --cluster指定為要部署的數據庫集群名稱,該名稱也將作為集群中所有節點上初始創建數據庫的名稱(database name)
- -u和-p,指定創建的用戶yashan和密碼
- --port指定SSH服務端口,一般為22
- --install-path指定數據庫安裝路徑,指定為/usr/local/yashandb/yasdb_home
- --data-path指定數據存放目錄,指定為/usr/local/yashandb/yasdb_data
- --begin-port指定數據庫監聽端口,默認1688
- --node指定主備節點總數量,1主1備設置為2
4)上一步驟執行完畢后,當前目錄下將生成yashandb.toml和hosts.toml兩個配置文件,yashandb.toml為數據庫集群的配置文件,hosts.toml為主機的配置文件。根據需要調整配置項,比如RUN_LOG_FILE_PATH和SLOW_LOG_FILE_PATH。
cluster = "yashandb"
create_simple_schema = false
uuid = "655eb2496767a825e8dda1d6c4da4d4e"
yas_type = "SE"
[[group]]
group_type = "db"
name = "dbg1"
[group.config]
CHARACTER_SET = "utf8"
ISARCHIVELOG = true
REDO_FILE_NUM = 4
REDO_FILE_SIZE = "128M"
[group.create_sql]
[[group.node]]
data_path = "/usr/local/yashandb/yasdb_data"
hostid = "host0001"
role = 1
[group.node.config]
LISTEN_ADDR = "192.168.112.121:1688"
REPLICATION_ADDR = "192.168.112.121:1689"
RUN_LOG_FILE_PATH = "/usr/local/yashandb/yasdb_home/yashandb/log/yashandb/db-1-1/run"
RUN_LOG_LEVEL = "INFO"
SLOW_LOG_FILE_PATH = "/usr/local/yashandb/yasdb_home/yashandb/log/yashandb/db-1-1/slow"
[[group.node]]
data_path = "/usr/local/yashandb/yasdb_data"
hostid = "host0002"
role = 2
[group.node.config]
LISTEN_ADDR = "192.168.112.122:1688"
REPLICATION_ADDR = "192.168.112.122:1689"
RUN_LOG_FILE_PATH = "/usr/local/yashandb/yasdb_home/yashandb/log/yashandb/db-1-2/run"
RUN_LOG_LEVEL = "INFO"
SLOW_LOG_FILE_PATH = "/usr/local/yashandb/yasdb_home/yashandb/log/yashandb/db-1-2/slow"
2.2.2 執行安裝
使用以下命令執行安裝
#./bin/yasboot package install -t hosts.toml -i /usr/local/src/yashandb-personal-23.1.1.100-linux-x86_64.tar.gz -f
checking install package...
install version: yashandb 23.1.1.100
host0001 100% [====================================================================] 6s
host0002 100% [====================================================================] 6s
update host to yasom...
注:指定參數-f不強制校驗環境是否滿足部署條件,否則會提示:
192.168.112.121
ip:192.168.112.121 cpu cores is less than 2
ip:192.168.112.121 memroy is less than 4096MB
2.2.3 數據庫部署
1)執行部署命令
$ ./bin/yasboot cluster deploy -t yashandb.toml
type | uuid | name | hostid | index | status | return_code | progress | cost
------------------------------------------------------------------------------------------------------------
task | 3190567c61c193bc | DeployYasdbCluster | - | yashandb | SUCCESS | 0 | 100 | 59
------+------------------+--------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS
2)生效環境變量
#部署命令成功執行后將會在$YASDB_HOME目錄下的conf文件夾中生成<<集群名稱>>.bashrc環境變量文件
$ cd /usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/conf
# 如~/.bashrc中已存在YashanDB相關的環境變量,將其清除
$ cat yashandb.bashrc >> ~/.bashrc
$ source ~/.bashrc
3)開機后啟動命令
yashoot process yasom start -c yashandb
yasboot process yasagent start -c yashandb
yasboot cluster start -c yashandb
2.2.4 修改sys用戶口令
通過yasboot工具設置集群內所有節點sys用戶的密碼
#./bin/yasboot cluster password set -n xxxx -c yashandb
type | uuid | name | hostid | index | status | return_code | progress | cost
----------------------------------------------------------------------------------------------------------
task | ce83dacc3c2e4246 | YasdbPasswordSet | - | yashandb | SUCCESS | 0 | 100 | 2
------+------------------+------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS
2.2.5 驗證安裝
1)查看數據庫狀態
$ ./bin/yasboot cluster status -c yashandb -d
hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path
----------------------------------------------------------------------------------------------------------------------------------------------------------
host0001 | db | 1-1:1 | 16119 | open | normal | primary | 192.168.112.121:1688 | /usr/local/yashandb/yasdb_data/db-1-1
----------+-----------+--------+-------+-----------------+-----------------+---------------+----------------------+---------------------------------------
host0002 | db | 1-2:2 | 15363 | open | normal | standby | 192.168.112.122:1688 | /usr/local/yashandb/yasdb_data/db-1-2
----------+-----------+--------+-------+-----------------+-----------------+---------------+----------------------+---------------------------------------
2)連接實例查看狀態
$ ./bin/yasboot sql -d [email protected]:1688
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
please input password: xxxx
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
SQL> SELECT STATUS FROM V$INSTANCE;
SELECT STATUS FROM V$INSTANCE;
STATUS
-------------
OPEN
1 row fetched.
SQL> SELECT database_name FROM v$database;
SELECT database_name FROM v$database;
DATABASE_NAME
----------------------------------------------------------------
yashandb
1 row fetched.
2.2.6 創建用戶及授權
1)創建用戶并授權
SQL> create user yasuser01 identified by "YashanDB01";
create user yasuser01 identified by "YashanDB01";
Succeed.
SQL> grant DBA to yasuser01;
grant DBA to yasuser01;
2)切換用戶登錄
#./bin/yasboot sql -d [email protected]:1688
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
SQL> SELECT database_name FROM v$database;
SELECT database_name FROM v$database;
DATABASE_NAME
----------------------------------------------------------------
yashandb
2.3 數據庫訪問操作
2.3.1 數據庫表操作
1)創建表空間
SQL> create tablespace ts01;
create tablespace ts01;
#刪除表空間
SQL> drop tablespace ts01;
刪除表空間默認會保留文件,如果再創建相同的表空間名稱時,會提示文件已經存在,但是在備節點觀察時該文件已經刪除了。
YAS-02044 file '/usr/local/yashandb/yasdb_data/db-1-1/dbfiles/TS010' already exists
在刪除表空間時指定刪除文件datafiles
SQL> drop tablespace ts02 including contents and datafiles;
drop tablespace ts02 including contents and datafiles;
2)創建表和索引
##1、創建表tb01,表空間為TS01
create table if not exists tb01(
id int NOT NULL,
c1 int NOT NULL DEFAULT '0',
c2 char(120) NOT NULL DEFAULT '',
c3 char(60) NOT NULL DEFAULT '')
TABLESPACE TS01;
##查看創建的表
SQL> SELECT TABLE_NAME,TABLE_TYPE FROM USER_TABLES;
TABLE_NAME TABLE_TYPE
---------------------------------------------------------------- ----------
TB01 HEAP
##2、創建索引
SQL> create unique index uniq_ix01 on tb01(id);
SQL> create index ix_c1 on tb01(c1);
##查看索引
SQL> SELECT * FROM USER_INDEXES;
INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE UNIQUENESS COMPRESSION PREFIX_LENGTH TABLESPACE_NAME INI_TRANS MAX_TRANS PCT_FREE LOGGING BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY STATUS NUM_ROWS SAMPLE_SIZE LAST_ANALYZED PARTITIONED TEMPORARY GENERATED VISIBILITY DATABASE_MAINTAINED CONSTRAINT_INDEX
---------------------------------------------------------------- ----------------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- --------------------------------------------- ---------- ----------- ------------- ---------------------------------------------------------------- ------------ ------------ ------------ ------- ------------ --------------------- --------------------- ----------------------- ----------------------- --------- --------------------- --------------------- -------------------------------- ----------- --------- --------- ------------- ------------------- ----------------
IX_C1 NORMAL YASUSER01 TB01 TABLE N DISABLED 0 USERS 2 255 8 Y VALID N N N VISIBLE N N
UNIQ_IX01 NORMAL YASUSER01 TB01 TABLE Y DISABLED 0 USERS 2 255 8 Y VALID N N N VISIBLE N N
2 rows fetched.
2.3.2 數據導入導出
1)從mysql數據庫中導出表數據為csv格式
mysql> SELECT * INTO OUTFILE '/tmp/sbtest.sbtest1.csv'
-> FIELDS TERMINATED BY ','
-> ENCLOSED BY '"'
-> LINES TERMINATED BY 'n'
-> FROM sbtest1 where id<10000;
Query OK, 9999 rows affected (0.09 sec)
2)使用yasldr工具將csv格式數據導入到表里
#./yasldr yasuser01/xxxx batch_size=4032 control_text="'LOAD DATA OPTIONS(DEGREE_OF_PARALLELISM=2) INFILE '/tmp/sbtest.sbtest1.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' AppEND INTO TABLE tb01(id,c1,c2,c3) '"
YashanDB Loader Personal Edition Release 23.1.1.100 x86_64 0e623bd
9999 rows successfully loaded.
Check /tmp/sbtest.sbtest1.log for more info.
[YASLDR] execute succeeded
導入的命令項有多個:
- BATCH_SIZE:每批次的CSV數據行數,默認4032,范圍[1,65535]。
- MODE:導入方式,包括BASIC方式和BATCH方式,默認BATCH方式。
登錄到表中查看數據情況
SQL> select count(1) from tb01 ;
COUNT(1)
---------------------
9999
1 row fetched.
3)使用exp和imp導出和導入到新表
#1、使用exp命令將yasuser01用戶下所有數據導出至export. yasuser01.data文件中
[yashan@tango-DB01 ~]$ exp yasuser01/YashanDB01 FILE=export.yasuser01.dat OWNER=yasuser01
YashanDB Export Personal Edition Release 23.1.1.100 x86_64 0e623bd
export terminated successfully
[yashan@tango-DB01 ~]$ ll
total 1892
-rw-r----- 1 yashan yashan 1936736 Nov 23 19:54 export.yasuser01.dat
#2、使用imp命令將導出數據導入到yasuser02中
[yashan@tango-DB01 ~]$ imp yasuser02/YashanDB02 FILE=export.yasuser01.dat FROMUSER=yasuser01 TOUSER=yasuser02
YashanDB Import Personal Edition Release 23.1.1.100 x86_64 0e623bd
import terminated successfully
##查看表數據情況
SQL> SELECT table_name FROM USER_TABLES;
TABLE_NAME
----------------------------------------------------------------
TB01
1 row fetched.
SQL> select count(1) from tb01;
COUNT(1)
---------------------
9999
1 row fetched.
- FROMUSER模式用于導入指定用戶下的對象及數據,包括用戶下所有元數據、表數據以及用戶權限等
- TOUSER命令用于更換導入的用戶,將導入對象的OWNER更換成TOUSER指定的用戶
3、系統高可用驗證
3.1主備切換驗證
3.1.1 主節點故障
在1主1備的部署架構下,不同于1主多備的Raft協議自動選舉,主節點故障通過yasom仲裁,默認是不開啟的。
1)使用命令開啟election
[yashan@tango-DB01 ~]$ yasboot
election enable on
-c yashandb
result: Succeed
查看仲裁選舉的參數配置
[yashan@tango-DB01 ~]$ yasboot election config show -c yashandb
Protection Mode: MAXIMUM PROTECTION
Members:
[1-1:1] - Primary database
[1-2:2] - Physical standby database
Transport Lag: 0 seconds
Apply Lag: 0 seconds
Apply Rate: 11.85 MByte/s
Properties:
FailoverThreshold = 9
FailoverAutoReinstate = false
ZeroDataLossMode = true
Automatic Failover: Enabled in Zero Data Loss Mode
默認是最大保護模式,表示redo log同步到備節點后,事務才提交。
- FailoverThreshold:備機心跳超時時間,到達該時間后,yasom將執行failover切換流程
- FailoverAutoReinstate:是否啟用自動腦裂修復,啟用后如果備機發送腦裂處于Need REPAIR狀態,yasom將嘗試自動修復
- ZeroDataLossMode:是否啟用零丟失模式,啟用后主備設置為最大保護模式,當主庫宕機后備機會自動failover;當備庫異常時主庫降級為最大可用模式,并禁止自動failover,直到備庫恢復同步。
另外通過以下命令修改配置
$ yasboot election enable off -c yashandb
$ yasboot election config set -k FailoverThreshold -v 2 -c yashandb
$ yasboot election enable on -c yashandb
$ yasboot election config show -c yashandb
2)檢查主備集群的狀態
[yashan@tango-DB01 ~]$ yasboot cluster status -c yashandb -d
hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path
----------------------------------------------------------------------------------------------------------------------------------------------------------
host0001 | db | 1-1:1 | 16119 | open | normal | primary | 192.168.112.121:1688 | /usr/local/yashandb/yasdb_data/db-1-1
----------+-----------+--------+-------+-----------------+-----------------+---------------+----------------------+---------------------------------------
host0002 | db | 1-2:2 | 15363 | open | normal | standby | 192.168.112.122:1688 | /usr/local/yashandb/yasdb_data/db-1-2
----------+-----------+--------+-------+-----------------+-----------------+---------------+----------------------+---------------------------------------
3)模擬主節點故障,kill主節點進程
[yashan@tango-DB01 ~]$ ps -fu $USER
UID PID PPID C STIME TTY TIME CMD
yashan 1874 1 0 11:14 ? 00:00:10 /usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/bin/yasom -c yashandb -l 192.168.112.121:1675 -d
yashan 1952 1 0 11:16 ? 00:01:17 /usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/bin/yasagent -c yashandb -l 192.168.112.121:1676 -d
yashan 95091 1 7 16:23 ? 00:01:47 /usr/local/yashandb/yasdb_home/yashandb/23.1.1.100/bin/yasdb open -D /usr/local/yashandb/yasdb_data/db-1-1
[yashan@tango-DB01 ~]$ kill -9 95091
查看yasom.log日志,能看到failover切換信息
2023-11-25 16:47:38 DEBUG [yasom] replication.go:188 process replication event: failover
2023-11-25 16:47:38 INFO [yasom] task.go:24 call yasagent api success: NodeAPI.ExecSQL, get result: {"connection":"DISCONNECTED","status":"NORMAL","time_since_last_msg":
"2"}
2023-11-25 16:47:38 ERROR [yasom] task.go:21 call yasagent api failed: NodeAPI.ExecSQL, err: YAS-00402 failed to connect socket, errno 111, error message "Connection refu
sed"
2023-11-25 16:47:38 INFO [yasom] task.go:24 call yasagent api success: NodeAPI.ExecSQL, get result: {"database_role":"STANDBY","status":"NORMAL","switchover_status":"NOT
ALLOWED"}
2023-11-25 16:47:38 INFO [yasom] replication.go:231 execute failover sql command on node 1-2:2, next reset id is 1
2023-11-25 16:47:40 INFO [yasom] task.go:24 call yasagent api success: NodeAPI.ExecSQL, get result: {}
2023-11-25 16:47:40 INFO
[yasom] replication.go:246 failover succeeds
4)查看主備狀態,備節點已經升級為主節點
[yashan@tango-DB02 ~]$ yasboot cluster status -c yashandb -d
hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path
---------------------------------------------------------------------------------------------------------------------------------------------------------
host0001 | db | 1-1:1 | off | - | - | - | 192.168.112.121:1688 | /usr/local/yashandb/yasdb_data/db-1-1
----------+-----------+--------+------+-----------------+-----------------+---------------+----------------------+---------------------------------------
host0002 | db | 1-2:2 | 4410 | open | normal | primary | 192.168.112.122:1688 | /usr/local/yashandb/yasdb_data/db-1-2
----------+-----------+--------+------+-----------------+-----------------+---------------+----------------------+---------------------------------------
重啟原來的主節點后,主備關系正常
[yashan@tango-DB02 ~]$ yasboot cluster status -c yashandb -d
hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path
-----------------------------------------------------------------------------------------------------------------------------------------------------------
host0001 | db | 1-1:1 | 102613 | open | normal | standby | 192.168.112.121:1688 | /usr/local/yashandb/yasdb_data/db-1-1
----------+-----------+--------+--------+-----------------+-----------------+---------------+----------------------+---------------------------------------
host0002 | db | 1-2:2 | 4410 | open | normal | primary | 192.168.112.122:1688 | /usr/local/yashandb/yasdb_data/db-1-2
----------+-----------+--------+--------+-----------------+-----------------+---------------+----------------------+---------------------------------------
3.1.2 手動主備切換
1)登錄備機,檢查主備機同步狀態,確認主備機同步無異常
SQL> SELECT database_id,database_name,log_mode,open_mode,database_role FROM V$DATABASE;
DATABASE_ID DATABASE_NAME LOG_MODE OPEN_MODE DATABASE_ROLE
--------------------- ---------------------------------------------------------------- ----------------- ----------------- -----------------
2888093870 yashandb ARCHIVELOG READ_ONLY STANDBY
2)確認備機同步狀態正常
SQL> SELECT connection, status, peer_addr, transport_lag, apply_lag FROM V$REPLICATION_STATUS;
CONNECTION STATUS PEER_ADDR TRANSPORT_LAG APPLY_LAG
----------------- ----------------- ---------------------------------------------------------------- ------------- ------------
CONNECTED NORMAL 192.168.112.121:1689 0 0
3)在備機執行switchover切換操作,此時主機的所有事務中斷,且switchover執行過程中,客戶端無法連接主機。
SQL>
alter database switchover;
切換完成后,查看主備機的角色是否發生變化
[yashan@tango-DB01 ~]$ yasboot cluster status -c yashandb -d
hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path
----------------------------------------------------------------------------------------------------------------------------------------------------------
host0001 | db | 1-1:1 | 39926 | open | normal | standby | 192.168.112.121:1688 | /usr/local/yashandb/yasdb_data/db-1-1
----------+-----------+--------+-------+-----------------+-----------------+---------------+----------------------+---------------------------------------
host0002 | db | 1-2:2 | 38096 | open | normal | primary | 192.168.112.122:1688 | /usr/local/yashandb/yasdb_data/db-1-2
----------+-----------+--------+-------+-----------------+-----------------+---------------+----------------------+---------------------------------------
4)也可以使用yaboot命令執行主備切換
[yashan@tango-DB01 ~]$
yasboot node switchover -c yashandb -n 1-1
|key |value
|-----------------------------------------------+------
|clusterName |yashandb
|the group type of input node is |db
|the group name of input node is |dbg1
|the role of input node is |standby
|the primary node name of input node's group is |1-2
Switchover need primary node and selected node all are open and normal
Are you sure you want to switchover node 1-1 to primary: [yashandb][yes/no]: yes
type | uuid | name | hostid | index | status | return_code | progress | cost
-------------------------------------------------------------------------------------------------------------
task | 839275bfbfccf242 | SwitchoverYasdbCluster | - | dbg1 | SUCCESS | 0 | 100 | 2
------+------------------+------------------------+--------+-------+---------+-------------+----------+------
task completed, status: SUCCESS
其中參數-n為要升主的節點ID(例如1-1,可以通過cluster status命令查看,不需要冒號及后面的數字)。檢查主備節點狀態,確認已經發生了切換。
3.2 表的閃回操作
YashanDB提供的閃回功能,當用戶誤操作等原因導致表的數據被刪除,使用閃回功能可以查看過去的數據狀態,并在時間上倒回指定時間點的數據,無需從備份中恢復數據。注:該功能只對行存表(HEAP表)有效
3.2.1 delete操作閃回
#1、刪除表tb01數據
SQL> delete from tb01 where id<100;
99 rows affected.
SQL> select count(1) from tb01 ;
COUNT(1)
---------------------
9900
1 row fetched.
#2、開啟row movement
SQL> ALTER TABLE tb01 ENABLE ROW MOVEMENT;
Succeed.
#3、表數據閃回(通過時間戳閃回)
SQL> FLASHBACK TABLE tb01 TO TIMESTAMP TO_TIMESTAMP('2023/11/23 20:18:00','yyyy/mm/dd hh24:mi:ss');
FLASHBACK TABLE tb01 TO TIMESTAMP TO_TIMESTAMP('2023/11/23 20:18:00','yyyy/mm/dd hh24:mi:ss');
Succeed.
#4、查看數據返回正常
SQL> select count(1) from tb01 ;
COUNT(1)
---------------------
9999
1 row fetched.
3.2.2 drop表操作閃回
#1、開啟了回收站ALTER SYSTEM SET RECYCLEBIN_ENABLED=ON;
#2、刪除表
SQL> drop table tb01 ;
#3、查詢回收站是否存在TB01表
SQL> SELECT object_name FROM DBA_RECYCLEBIN WHERE original_name = 'TB01';
OBJECT_NAME
----------------------------------------------------------------
BIN$2260
#4、表結構及表數據閃回
SQL> FLASHBACK TABLE "BIN$2260" TO BEFORE DROP;
#5、表和索引已恢復
SQL> SELECT table_name FROM USER_TABLES;
TABLE_NAME
----------------------------------------------------------------
TB01
SQL> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'TB01';
INDEX_NAME
----------------------------------------------------------------
UNIQ_IX01
IX_C1
3.2.3 truncate表閃回
#1、開啟了回收站ALTER SYSTEM SET RECYCLEBIN_ENABLED=ON;
#2、TRUNCATE表操作
SQL> truncate table tb01;
#3、查詢回收站是否存在TB01表
SQL> SELECT object_name FROM DBA_RECYCLEBIN WHERE original_name = 'TB01';
OBJECT_NAME
----------------------------------------------------------------
TB01
#4、表結構及表數據閃回
SQL> FLASHBACK TABLE "TB01" TO BEFORE TRUNCATE;
#5、表數據已恢復
SQL> select count(1) from tb01;
COUNT(1)
---------------------
9999
4、總結
本文簡要介紹了YashanDB的特性以及部署架構,并測試部署了1主1備的環境進行功能性驗證。總結下來有以下幾點:
- 文檔還是挺全的,根據文檔一步步能夠搭建好環境使用。受限于個人體驗版,只能部署單實例的主備環境,沒法體驗分布式以及共享集群的架構
- 作為一個新數據庫,對用戶來說有個學習和適應的過程,一些命令和SQL語句和MySQL或Oracle等還是有些差異,可能和Oracle更接近。
- 生態的建設上還在慢慢完善,比如對Python/ target=_blank class=infotextkey>Python或Go等語言的支持,主流的開發框架的支持等。還有和主流的信創操作系統的適配性和穩定性,需要進一步測試驗證。尤其是在一眾國產數據庫產品中建立領先優勢,還是有一定的挑戰性的。
- 在架構上主備集群的可用性通過yasom檢測的,如果這臺服務器宕機后主備切換是沒有自動實現的,在高可用切換這一塊有優化的空間。像OpenGauss在后續版本增加CM實現切換功能,也可以參考GoldenDB管理節點對數據節點的高可用管理。
- 在運維功能實現上,數據庫運維管理平臺,對服務器的納管和一鍵部署、監控指標和客戶的現有流程對接、CMDB元數據模型和告警接入等,還是有很多客戶化落地的細節。