【雲原生】Docker部署資料庫的持久化

語言: CN / TW / HK

目錄

資料庫持久化啟動

資料持久化驗證


 

在上一篇基於docker的安裝中,我們使用enmotech的最新映象完成了安裝和啟動。容器部署非常方便,解除安裝更是簡單。但是這個特點如同一柄雙刃劍,帶來便利的同時,也會有一些缺點。容器一旦刪除,容器內的所有資料和配置都會丟失。即使重新執行一個新的容器,得到的不過是一個嶄新的初始狀態的資料庫。

所以,對於資料庫這種需要持久化的資料來說,還需要看下如何才能防止因為容器的刪除或損壞導致資料的丟失。在openGauss資料庫中,通過指定相關引數來實現此功能。

資料庫持久化啟動

我們本次持久化測試的環境基於上一篇在docker部署openGauss。我們先把上次啟動的容器例項刪掉。

[[email protected] docker]# docker ps -a 
CONTAINER ID   IMAGE                      COMMAND                  CREATED      STATUS      PORTS      NAMES 
573ea1edffb8   enmotech/opengauss:3.0.0   "entrypoint.sh gauss…"   3 days ago   Up 3 days   5432/tcp   opengauss 
[[email protected] docker]# docker stop 573ea1edffb8 
573ea1edffb8 
[[email protected] docker]# docker rm 573ea1edffb8 
573ea1edffb8


以下命令使用原opengauss映象啟動一個容器:

docker run --name opengauss --privileged=true -d -e [email protected] -v /enmotech/opengauss:/var/lib/opengauss -p 15432:5432  enmotech/opengauss:3.0.0


其餘引數的解釋可以參考上一篇安裝。這裡我們主要關注下 -p   -v兩個引數。

  • -p引數:openGauss的預設偵聽啟動在容器內的5432埠上,如果想要從容器外部訪問資料庫,則需要在docker run的時候指定-p引數。比如以上命令將允許使用15432埠在容器外訪問資料庫。上述命令正常啟動容器資料庫之後,可以通過外部的gsql進行資料庫訪問。
  •  -v 引數:指定Docker中openGauss的所有資料檔案,容器內是/var/lib/opengauss目錄 ,宿主機是/enmotech/opengauss目錄。如果宿主機的/enmotech/opengauss如果不存在,docker會自動建立,但是必須是絕對路徑。Docker對其擁有讀寫許可權。

在容器內部檢視資料庫目錄。如下圖,已在容器內/var/lib/opengauss建立了data目錄。

[[email protected] docker]# docker ps 
CONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS              PORTS                                         NAMES 
89747134cd4d   enmotech/opengauss:3.0.0   "entrypoint.sh gauss…"   About a minute ago   Up About a minute   0.0.0.0:15432->5432/tcp, :::15432->5432/tcp   opengauss 
[[email protected] docker]# docker exec -it 89747134cd4d /bin/bash 
[email protected]:/# cd /var/lib/opengauss/data/ 
[email protected]:/var/lib/opengauss/data# ls 
asp_data       gs_gazelle.conf     pg_audit     pg_errorinfo   pg_location   pg_notify    pg_snapshots  PG_VERSION            postmaster.opts      undo 
base           gs_profile          pg_clog      pg_hba.conf    pg_log        pg_perf      pg_stat_tmp   pg_xlog               postmaster.pid 
gaussdb.state  gswlm_userinfo.cfg  pg_csnlog    pg_ident.conf  pg_logical    pg_replslot  pg_tblspc     postgresql.conf       postmaster.pid.lock 
global         mot.conf            pg_ctl.lock  pg_llog        pg_multixact  pg_serial    pg_twophase   postgresql.conf.lock  sql_monitor 

我們在宿主機上檢視下資料庫目錄。如下圖,已在宿主機上/enmotech/opengauss建立了data目錄。可以看到容器中的資料已儲存到作業系統中。

 

資料持久化驗證

下面我們通過建表、插入資料檢視是否可以完成資料的持久化儲存。
1.進入容器,登入資料庫。

[[email protected] docker]# docker ps 
CONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS              PORTS                                         NAMES 
89747134cd4d   enmotech/opengauss:3.0.0   "entrypoint.sh gauss…"   About a minute ago   Up About a minute   0.0.0.0:15432->5432/tcp, :::15432->5432/tcp   opengauss 
[[email protected] docker]# docker exec -it 89747134cd4d /bin/bash 
[email protected]:/var/lib/opengauss/data# su - omm 
[email protected]:~$ gsql 
omm=# 

是個新的資料庫例項,看下我之前安裝時測試建立的使用者wxx在不。不出所料,就是不存在的。因為之前操作的時候並沒有進行持久化的啟動。


2.建立表test1,然後插入資料。

create table test1(id int,name varchar(20)); 
INSERT INTO test1 VALUES (1, 'oligei');

3.關閉資料庫。

[email protected]:~$ gs_ctl stop -D /var/lib/opengauss/data/ 
[2022-07-19 02:46:25.253][423][][gs_ctl]: gs_ctl stopped ,datadir is /var/lib/opengauss/data 
waiting for server to shut down....[[email protected] docker]#

4.啟動資料庫

[[email protected] docker]# docker start 89747134cd4d 
89747134cd4d 
[[email protected] docker]# docker exec -it 89747134cd4d /bin/bash 
[email protected]:/# su - omm 
[email protected]:~$ gsql

5.驗證一下容器重啟後,原來的資料還在。

 6.只是重啟的話,那資料沒丟一點都不意外。我們更多關注的是容器刪除這種情況。

[[email protected] docker]# docker stop 89747134cd4d 
89747134cd4d 
[[email protected] docker]# docker rm 89747134cd4d 
89747134cd4d 
[[email protected] docker]# docker exec -it 89747134cd4d /bin/bash 
Error: No such container: 89747134cd4d

可以看到原容器已刪除成功。
7.現在重新啟動,看下是否持久化成功。這裡還是需要使用之前指定的儲存路徑的。

[[email protected] docker]# docker run --name opengauss --privileged=true -d -e [email protected] -v /enmotech/opengauss:/var/lib/opengauss -p 15432:5432  enmotech/opengauss:3.0.0 
[[email protected] docker]# docker ps 
[[email protected] docker]# docker exec -it 74b94a7bda80 /bin/bash 
[email protected]:/# su - omm 
[email protected]:~$ gsql 
omm=# select * from test1;

結果上個圖。

 

由上圖也可以看出,原來的表記錄依然存在,資料庫持久化成功。

 

openGauss: 一款高效能、高安全、高可靠的企業級開源關係型資料庫。

🍒如果您覺得博主的文章還不錯或者有幫助的話,請關注一下博主,如果三連收藏支援就更好啦!謝謝各位大佬給予的鼓勵!