国内データベース|GBase 8c 分散導入のあれこれ

95e0886b20ae5e7ab833e3e89687af5e.gif

著者 | JiekeXu

出典|パブリック アカウント JiekeXu DBA Road (ID: JiekeXu_IT)

転載する必要がある場合は、許可を得るためにご連絡ください | (個人 WeChat ID: JiekeXu_DBA)

みなさん、こんにちは。私は JiekeXu です。またお会いできてとてもうれしいです。今日は、国内データベース | GBase 8c 分散展開について見ていきます。ようこそ、青い文字「JiekeXu DBA Road」をクリックして私の公開番号をフォローしてください、スターまたはトップ、より多くの乾物ができるだけ早く到着します。

目次 はじめに
    GBase
    8c のインストールとアンインストール インストール
        プロセス
        その他のインストール チェック項目
        ユーザーの作成と sudoer の設定
        相互信頼の設定
        NTP 時刻同期の設定            インストール デプロイ ダウンロード インストール パッケージ プラン            クラスタ トポロジの編集
        yml            ファイルの編集 データベースの            インストール データベースの            接続 データベースのアン        インストール データベースの        インストールで発生した問題            問題1            問題 質問 2            質問 3            質問 4    参考リンク  











      

序文

NTU General GBase 8c は、 openGauss 3.0 に基づくマルチモードおよびマルチステートの分散データベースであり、行ストレージ、列ストレージ、メモリなどの複数のストレージ モードと、スタンドアロン、アクティブ/スタンバイ、そして配布されました。GBase 8c は、高性能、高可用性、柔軟なスケーリング、高セキュリティの特徴を持ち、物理マシン、仮想マシン、コンテナ、プライベート クラウド、パブリック クラウドに導入でき、主要な業界の基幹システム、インターネット ビジネス システム、政府および企業のビジネス システム、安全、安定、信頼性の高いデータ ストレージおよび管理サービス。

ここでのマルチモードとマルチステートは、 GBase 8c が行ストレージ、列ストレージ、メモリの 3 つのストレージ モードをサポートし、スタンドアロン、アクティブ/スタンバイ、分散の 3 つの展開形式をサポートすることを意味します。 GBase 8c のアーキテクチャ図。

4c2cd327b98fe72c4a2d8471ebfd81d2.png

6f5b96730932978ed54298d0b1d5888f.png

fdbe287d4bc6ebd9fa99a82d7f5c1857.png

NTU General が現在推進している主要なデータベース製品は 4 つあります。

  • 分散論理データ ウェアハウス GBase 8a

  • 共有ストレージに基づくデータベース クラスター GBase 8s

  • マルチモードおよびマルチステート分散データベース GBase 8c

  • クラウドネイティブ データ ウェアハウス GCDW

多くの友人は 8a、8c、および 8s についてあまり知りませんが、混同したり忘れたりしやすいので、ここでは私自身の理解に従って簡単に紹介します。8a または GBase 8a MPP クラスターは、8a または GBase 8a MPP クラスターであり、統合データ処理をサポートする中国 データウェアハウス分析ビジネスに適したリレーショナルデータベースクラスタ製品; 8c openGauss 3.0をベースに開発されたマルチモード、マルチステート分散データベースで、行ストレージ、列ストレージなどの複数のストレージモードをサポート、メモリ、およびスタンドアロン、マスターおよびバックアップ 8s は、初期に Informix ソース コードを購入して独自に開発された共有ストレージに基づく成熟した安定したデータベース クラスターです。GCDW は、NTU GBase Cloud Data の一般的なクラウド データ ウェアハウスですウェアハウス (略して GCDW) 大規模な分散および大規模な並列処理のためのカラム ストレージに基づく自社開発のマルチインスタンスのエラスティック クラウド データ ウェアハウスです。GCDW は、ローカル デプロイメントとクラウド デプロイメントの両方をサポートします。ストレージとコンピューティングの分離アーキテクチャを採用しています。 GBase 8a MPP Cluster との違いがわかりません。

GBase 8c のインストールとアンインストール

インストールする前に、次の図にある GBase 8c 分散アーキテクチャでのいくつかの名詞と機能を確認してから、インストールしてください。

a87acb87c34da36356b001b5d30b1418.png

インストールプロセス

次の図は、インストールの全体的なプロセスを示しています。比較的単純に見えます。
8fcdf6971849469a1add54179a00e39d.png

インストールに必要な環境構成、必要なrpmパッケージ、ファイアウォールの終了などの準備作業を次の3つの図に示します。

5405edf67be443507a256162de9692d6.png

3ab6ec5ce99c8086d36d5f8289d9cbc6.png

fe700b0fb290ea34af58b699fb63bf23.png

次の 2 つの写真は、3 つの仮想マシンの構成とディスク サイズです。3 つのマシンは CentOS7.6、メモリは 4g 6g 6g、インストールされるファイル システムは /home で、サイズは であることがわかります。約10g。
私の 3 つのホスト IP は次のとおりです。

############## GBase 8c HOST IP ####################
192.168.32.31             JiekeXu 
192.168.32.32             test19crac1
192.168.32.33             test19crac2

個人リソースの制限のため、ここでは前回の記事で 19c RAC と GBase 8s をインストールしたマシンを借りて、分散 GBase 8c をインストールします。

ac70239df25e0f366f8729d87d9302d2.png

07df69186d02a287ae00be904333d808.png

上の図に示すように、3 つのホストのメモリが小さいため、8G を超えておらず、Swap も 8G に十分ではありません。ここでは、まず Swap を拡張します。ここでは、各マシンに 5G スワップを追加します。具体的な手順は次のとおりです。

① 创建 5G 的 Swap 文件
# dd if=/dev/zero of=/etc/swapfile bs=10M count=512


② 制作为 Swap 文件
# mkswap /etc/swapfile


③ 令 Swap 文件生效
# swapon /etc/swapfile


④ 查看当前SWAP
# swapon -s
Filename        Type    Size  Used  Priority
/dev/dm-1                                partition  4063228  1288  -2
/etc/swapfile                            file  5242876  0  -3


⑤ 自动挂载
编辑/etc/fstab,将以下行追加到文件末尾
/etc/swapfile swap swap defaults 0 0
# vi /etc/fstab
/dev/mapper/centos_opengauss-root /                       xfs     defaults        0 0
/dev/mapper/centos_opengauss-app /app                    xfs     defaults        0 0
UUID=0f53d172-81af-4100-b623-0957ed6ed459 /boot                   xfs     defaults        0 0
/dev/mapper/centos_opengauss-home /home                   xfs     defaults        0 0
/dev/mapper/centos_opengauss-swap swap                    swap    defaults        0 0
/etc/swapfile                     swap                    swap    defaults        0 0
/dev/cdrom /mnt/contos iso9660 defaults 0 0 0 0


⑥ 查看创建好的 SWAP,已经增长了 5G
[root@JiekeXu ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3771        349        2676        20        744        2754
Swap:          9087          0        9087

26eb13a0f754f3c9886791a57f0a86d6.png

その他の装着確認項目

1 つずつ確認するには、3 台のマシンで root アカウントを使用する必要があります。

(1)、ファイアウォールとSELINUXの検査

ファイアウォールの状態を確認します: systemctl status firewalld
手動でファイアウォールを閉じる必要があります: systemctl stop firewalld
と自動起動を禁止します: systemctl disable firewalld
SELINUX の状態を確認します: sestatus
• 無効と表示されている場合は、SELINUX が無効になっているため、操作は必要ありません。

(2) 各ホストのホスト名構成 /etc/hosts を確認してください。3 つのホスト名が同じであると、インストールが失敗する可能性があります。

#cat /etc/hosts 如下:
##############GBase 8c IP ##############
192.168.32.31             JiekeXu
192.168.32.32             test19crac1
192.168.32.33             test19crac2

(3) bison、flex、patch、bzip2 の依存関係がインストールされているか確認する
rpm -q bison flex patch bzip2
をすべてのサーバで root ユーザーとして実行します。
• 表示された依存関係のバージョン情報がソフトウェア依存関係の構成要件に含まれている場合、アクションは必要ありません。

[root@JiekeXu ~]# rpm -q bison flex libaio-devel lsb_release patch ncurse-devel bzip2
bison-3.0.4-2.el7.x86_64
flex-2.5.37-6.el7.x86_64
patch-2.7.1-10.el7_5.x86_64
bzip2-1.0.6-13.el7.x86_64

41f54c96e9d9300e443239542382d1ba.png

• 依存パッケージがインストールされていない場合は、yum ソースを設定し、yum install -y name コマンドを実行して、対応する依存パッケージをインストールする必要があります。

(4) (仮想マシン環境) rdtscp 命令セットがサポートされているか確認します: cat /proc/cpuinfo | grep rdtscp
• 以下の情報に「rdtscp」が表示されていれば、rdtscp 命令セットはサポートされています。

b1615652c2415a4e6408be51078284ef.png

• サポートされていない場合は、対応する CPU モデルの公式 Web サイトを参照して、rdtscp 命令セットをインストールしてください。

ユーザーを作成して sudoer を設定する

すでにサーバー上に gbase ユーザーが存在する場合は、そのパスワードで正常にログインできるかどうか、また sudo 権限とインストールディレクトリ権限があるかどうかを確認してください。すべて利用可能な場合は、この章の手順は無視してかまいません。そうでない場合は、以下の対応する操作を参照して変更してください。

(1) ユーザーグループとユーザーの作成

すべてのノード サーバー上に gbase ユーザー グループとユーザーを作成します。コマンドは次のとおりです。

# groupadd gbase
# useradd -m -d /home/gbase gbase -g gbase
# passwd gbase  #回车并设置密码,输入两次密码,这里演示为 gbase

(2) 一般ユーザーをsudoerリストに追加する

デフォルトでは、通常のユーザーは sudoer リストに含まれていません。一般のユーザーが sudo コマンドを実行できるように、root ユーザーを使用してアカウントを sudoer リストに手動で追加する必要があります。

root は visudo コマンドを実行し、構成ファイルを開き、以下の図の root ALL の下に次の行を追加します。

gbase   ALL=(ALL)       NOPASSWD:ALL

2b33a9973c5884c58e44675a5540adec.png

(3) sudo権限を確認する

sudoer を構成した後、gbase ユーザーに切り替えて、後続の環境設定、インストールおよびデプロイメント操作を実行します。データベースの環境設定操作にはroot権限は必要ありません。たとえば、root ユーザーに切り替えるか、次のようにファイアウォール コマンドを表示すると、root パスワードを入力しなくても構成は成功します。

[gbase@JiekeXu ~]$ sudo su - root
[gbase@JiekeXu ~]$ sudo systemctl status firewalld.service

相互信頼を構成する

3 つのホストの gbase ユーザー ssh 相互信頼を構成する

(1) gbaseユーザーに切り替える

[root@JiekeXu ~]# su - gbase

(2) キーディレクトリと必要な権限を作成する

[gbase@JiekeXu ~]$ mkdir ~/.ssh
[gbase@JiekeXu ~]$ chmod 700 ~/.ssh

(3) キーファイルの生成(Enterキーを押し続ける)

[gbase@JiekeXu ~]$ ssh-keygen -t rsa

d6dfa69a273d0752ca6d2c04022984b5.png

(4) 公開鍵ファイルを他ノードにアップロードし、パスワードレスログインを実現

この操作では、yes と gbase ユーザーのパスワードを入力する必要があり、すべてのノードで次の copy コマンドが実行されます。

$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]

次に、authorized_keys ファイルをチェックして、ホスト名を含む 3 行を確認します。

[gbase@JiekeXu ~]$ cat ~/.ssh/authorized_keys

f84dcaf5b4fca3e50e45c7337b29404b.png

(5) ssh コマンドを使用して、相互信頼とパスワードフリーが実現しているかどうかを確認します: ssh gbase@hostip

for h in jiekexu test19crac1 test19crac2;do
ssh -l gbase -o StrictHostKeyChecking=no $h date;
done

パスワードを入力せずにログインできます。これは、相互信頼の構成が成功したことを示します。

CRT 接続を高速化するために ssh サービスを構成する

--配置LoginGraceTime参数为0, 将timeout wait设置为无限制
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +"%Y%m%d_%H%M%S"` && sed -i '/#LoginGraceTime 2m/ s/#LoginGraceTime 2m/LoginGraceTime 0/' /etc/ssh/sshd_config && grep LoginGraceTime /etc/ssh/sshd_config
--加快SSH登陆速度,禁用DNS
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +"%Y%m%d_%H%M%S"` && sed -i '/#UseDNS yes/ s/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config && grep UseDNS /etc/ssh/sshd_config
配置 NTP 时间同步

(1) 全サーバのNTPサービスの状態を確認する
sudo systemctl status ntpd.service

a0e0a84a23d60c93369006761346ce40.png

ntp サービスが開始されていない場合は、 sudo systemctl start ntpd.service を開始する必要があります。ただし、ntp サービスがインストールされていない場合は、yum ソースを構成して ntp サービスをインストールする必要があります。

[gbase@JiekeXu etc]$ sudo service ntpd start
Redirecting to /bin/systemctl start ntpd.service
Failed to start ntpd.service: Unit not found.
[root@JiekeXu yum.repos.d]# yum install ntp -y

68ea440556845134410b2d8ba2f67488.png

(2) NTPサービスの設定

cat /etc/hosts
##############GBase 8c IP ##############
192.168.32.31             JiekeXu
192.168.32.32             test19crac1
192.168.32.33             test19crac2
#####################################

クラスター内のすべてのサーバーで gbase ユーザーとして実行します。
NTP マスター ノード (通常は GTM マスター ノード) を人為的に選択します。すべてのノードで構成ファイル (vim /etc/ntp.conf) を編集し、「:wq」を編集して保存して終了します。

8a60fb2b8561a1f058d57be1a5460183.png

NTPマスターノード:127.127.1.0(ローカルクロック)を設定
NTPスレーブノード:マスターノードIPを設定

systemctl enable ntpd ----设置开机自启动

他の 2 つのノードについては、次の内容を記述します。

ノード 2

driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 192.168.32.32 nomodify notrap nopeer noquery   ##本机 IP
restrict 127.0.0.1 
restrict ::1
restrict 192.168.32.255 mask 255.255.255.0 nomodify notrap
server 192.168.32.31
Fudge 192.168.32.31 stratum 10

ノード 3

driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 192.168.32.33 nomodify notrap nopeer noquery
restrict 127.0.0.1 
restrict ::1
restrict 192.168.32.255 mask 255.255.255.0 nomodify notrap
server 192.168.32.31
Fudge 192.168.32.31 stratum 10

ntp.conf ファイルを保存して終了した後、ntp サービスを開始し、自動的に開始するように設定します。

$ sudo service ntpd start # 启动NTP服务
$ sudo chkconfig ntpd on # 设置 NTP 服务开机自启

注:
 一部の仮想マシン環境では、起動後に NTP を自動的に開始するように構成できず、再起動するたびに手動で開始する必要があります。
 時刻同期はデータベース クラスターの展開と整合性操作に影響するため、有効にするには事前に構成する必要があります。

(3) 設定完了後、各ノードで以下のコマンド ntpstat を実行し、NTP サービスが接続されているか確認します。
NTP マスターは以下を返す必要があります。

[gbase@JiekeXu ~]$ ntpstat
synchronised to local net at stratum 6 
   time correct to within 12 ms
   polling server every 64 s

さらに、ノードは以下を返します。

[gbase@test19crac1 ~]$ ntpstat
synchronised to NTP server (192.168.32.31) at stratum 7 
   time correct to within 30 ms
   polling server every 128 s

ノード 3 は次を返します。

[gbase@test19crac2 ~]$ ntpstat
unsynchronised
  time server re-starting
   polling server every 8 s

注: NTP サーバーを構成した後、時刻の同期が完了するまで 5 ~ 20 分待つ必要があります。構成後に、
非同期のタイム サーバーが 8 秒ごとにポーリング サーバーを再起動するか、または非同期のポーリング サーバーが 8 秒ごとに再起動するように求められた場合は、正常です。しばらく待ってから再試行してください。ntpstat コマンドを実行して表示します。

インストールと展開

インストールパッケージをダウンロードする

インストール パッケージをダウンロードするには、アカウントを登録するだけで済みます。登録には携帯電話番号を使用するだけです。

https://www.gbase.cn/download/gbase-8c?category=INSTALL_PACKAGE

61695bf462031a6602ffcaa587d1c3ab.png

次に、インストール パッケージ GBase8cV5_S3.0.0_distributed version_x86_64.zip をダウンロードし、xshell の sftp 機能を使用して、インストール パッケージをサーバーの /home/gbase/gbase_package ディレクトリにアップロードします。

次のプロセス操作は、デプロイメント マシン (ノード 1) でのみ実行されます。

デプロイメント マシン上に GBase 8c データベースのインストール ディレクトリを作成します。構成ファイル内の pkg_path パラメータ値は、インストール ディレクトリと一致している必要があります。/home/gbase/gbase_packageに設定することをお勧めします。これは、yml ファイルの pkg_path パラメーターのデフォルト値です (追記: 公式の推奨事項は、デフォルトの gbase ホーム ディレクトリに直接インストールすることですが、/home ディレクトリ別のファイルシステムとして使用されていますが、別のファイルシステムがない場合はまだ過去です ファイルシステムはルートディレクトリに直接インストールするのと同じです ディスク容量がいっぱいの場合、システム全体が使用できなくなります不要なトラブルが発生した場合、ベスト プラクティスとして、/home を別のファイル システムとして使用するか、/data (gbase を別のファイル システムとしてインストールする) を使用することをお勧めします。

たとえば、データベースのインストール ディレクトリが /home/gbase/gbase_package の場合、具体的な操作は次のとおりです。

[gbase@JiekeXu ~]$ mkdir -p /home/gbase/gbase_package
[gbase@JiekeXu gbase_package]$ unzip  GBase8cV5_S3.0.0_分布式版_x86_64.zip
Archive:  GBase8cV5_S3.0.0_分布式版_x86_64.zip
 extracting: GBase8cV5_S3.0.0B78_centos7.8_x86_64.tar.gz

解凍後、必要な解凍パッケージは GBase8cV5_S3.0.0B78_centos7.8_x86_64.tar.gz です。このファイルを再度解凍して、GBase8cV5_S3.0.0B78_CentOS_x86_64_om.tar.gz ファイルを取得します。また、om で終わるファイルも解凍する必要があります。

[gbase@JiekeXu gbase_package]$ tar -zxvf GBase8cV5_S3.0.0B78_centos7.8_x86_64.tar.gz
GBase8cV5_S3.0.0B78_CentOS_x86_64_om.sha256
GBase8cV5_S3.0.0B78_CentOS_x86_64_om.tar.gz
GBase8cV5_S3.0.0B78_CentOS_x86_64_pgpool.tar.gz
GBase8cV5_S3.0.0B78_CentOS_x86_64.sha256
GBase8cV5_S3.0.0B78_CentOS_x86_64.tar.bz2
[gbase@JiekeXu gbase_package]$ ll
total 786076
-rw-rw-r-- 1 gbase gbase 267810471 Mar  6 18:13 GBase8cV5_S3.0.0B78_centos7.8_x86_64.tar.gz
-rw-rw-r-- 1 gbase gbase        65 Mar  6 18:13 GBase8cV5_S3.0.0B78_CentOS_x86_64_om.sha256
-rw-rw-r-- 1 gbase gbase 103810486 Mar  6 18:13 GBase8cV5_S3.0.0B78_CentOS_x86_64_om.tar.gz
-rw-rw-r-- 1 gbase gbase   1035963 Mar  6 18:12 GBase8cV5_S3.0.0B78_CentOS_x86_64_pgpool.tar.gz
-rw-rw-r-- 1 gbase gbase        65 Mar  6 18:12 GBase8cV5_S3.0.0B78_CentOS_x86_64.sha256
-rw-rw-r-- 1 gbase gbase 164458080 Mar  6 18:12 GBase8cV5_S3.0.0B78_CentOS_x86_64.tar.bz2
-rw-r--r-- 1 gbase gbase 267810691 Jun 11 19:05 GBase8cV5_S3.0.0_分布式版_x86_64.zip
[gbase@JiekeXu gbase_package]$ tar -zxvf GBase8cV5_S3.0.0B78_CentOS_x86_64_om.tar.gz
[gbase@JiekeXu gbase_package]$ tar -zxvf GBase8cV5_S3.0.0B78_CentOS_x86_64_om.tar.gz

注: 解凍後、元のインストール パッケージ ファイルと第 1 レベルの解凍ファイルは削除しないでください。また、インストール パッケージ名を自分で変更することはできません。そうしないと、インストール時のファイルやバージョン番号の検証に影響し、インストールの失敗や運用・保守コマンドの喪失などの問題が発生する可能性があります。

インストール プロセス中に理解しておく必要があるファイル:
gbase.yml: データベース名 .yml で終わるインストール構成ファイル テンプレート。
script: gha_ctl、gs_check、gs_backup およびその他のツールを含むツール ライブラリ。

fc4fad141839a536d6eecac1cb1752c2.png

クラスタトポロジの計画

公式ドキュメントのインストール トポロジの提案によると、cn、gtm、および dn にはすべてアクティブ モードとスタンバイ モードがありますが、メモリが 6GB であるか 8GB にアップグレードされている場合、インストールでエラーが報告され、数回試行すると失敗します。 GDCAコースのデモンストレーションでは、ノード数を減らしてインストールします。

77c6c7607fc71d60fae53eca4368abfd.png

クラスター計画トポロジーの導入を簡素化します (個人学習バージョンのみ)。

ba2a04aaaf9bdc12fce2eb41c6575657.png

ymlファイルを編集する

ユーザーは、実際の状況に応じて設定ファイル名とそのノードパラメータ情報を変更する必要があります。使用する必要のないパラメータは、直接削除するか、# 記号を使用してコメントアウトできます。以下は、yml ファイルの構成例の簡単な説明です。

8dc1c665ad95770c174a7ff85f6efaa7.png

たとえば、インストール ディレクトリは /home/gbase/gbase_package/ で、所有者が gbase ユーザーである /home/gbase ディレクトリにテンプレート ファイルをコピーし、gbase.yml 構成ファイルを編集します。

cp /home/gbase/gbase_package/gbase.yml /home/gbase/


vim gbase.yml


gha_server:
  - gha_server1:
      host: 192.168.32.31
      port: 20001
dcs:
  - host: 192.168.32.31
    port: 2379
  - host: 192.168.32.32
    port: 2379
  - host: 192.168.32.33
    port: 2379
gtm:
  - gtm1:
      host: 192.168.32.31
      agent_host: 192.168.32.31
      role: primary
      port: 6666
      agent_port: 8001
      work_dir: /home/gbase/data/gtm/gtm1
coordinator:
  - cn1:
      host: 192.168.32.31
      agent_host: 192.168.32.31
      role: primary
      port: 5432
      agent_port: 8003
      work_dir: /home/gbase/data/coord/cn1
datanode:
  - dn1:
      - dn1_1:
          host: 192.168.32.32
          agent_host: 192.168.32.32
          role: primary
          port: 15432
          agent_port: 8005
          work_dir: /home/gbase/data/dn1/dn1_1
  - dn2:
      - dn2_1:
          host: 192.168.32.33
          agent_host: 192.168.32.33
          role: primary
          port: 20010
          agent_port: 8007
          work_dir: /home/gbase/data/dn2/dn2_1
          # numa:
          #   cpu_node_bind: 0,1
          #   mem_node_bind: 0,1
env:
  # cluster_type allowed values: multiple-nodes, single-inst, default is multiple-nodes
  cluster_type: multiple-nodes
  pkg_path: /home/gbase/gbase_package
  prefix: /home/gbase/gbase_db
  version: V5_S3.0.0B78
  user: gbase
  port: 22
# constant:
#   virtual_ip: 100.0.1.254/24

このうち、必須パラメータは以下のとおりです。
 host パラメータ: データ プレーン ノード (gtm、cn、dn) がアクセスするノードの IP アドレスを指定します。
 Agent_host パラメータ: このノードがコントロール プレーン ノード (gha_server、dcs) によって接続される IP アドレスを指定します。これは、ホスト パラメーターと同じにすることができ、データ プレーンとコントロール プレーンの両方が同じ IP アドレスを介してこのノードにアクセスし、接続することを示します。
注: ホストにデュアル ネットワーク カードがある場合は、大量のデータ フローが実際のネットワーク カードに影響を与えないように、コントロール プレーンをギガビット ネットワーク カードに設定し、データ プレーンを 10 ギガビット ネットワーク カードに設定することをお勧めします。高可用性メッセージの時間パフォーマンス。
 role パラメータ: クラスターノードのロールタイプ。オプションの値はプライマリまたはスタンバイです。これは、gtm、coordinator、および datanode ノード パラメーターの必須フィールドです。
 port パラメーター: クラスターノードの接続ポート番号。
 Agent_port パラメータ: 高可用性ポート番号。
 syncMode パラメータ: CN が読み取り専用 (スタンバイ) の場合のみ、この項目を設定する必要があります。オプションの値は同期、非同期です。このうち、sync(同期)は読み取り専用CNを同期スタンバイ機で読み取ることを意味し、asyncは読み取り専用CNを非同期スタンバイ機で読み取ることを意味します。
 work_dir パラメータ: クラスタノードのデータが保存されるディレクトリ。
 cluster_type パラメータ: クラスターのタイプを指定します。分散クラスターをデプロイする場合はパラメーターを multi-node として指定し、アクティブ/スタンバイ クラスターをデプロイする場合はパラメーターを single-inst として指定します。
 pkg_path パラメータ: データベース インストール パッケージのストレージ パスを指定します。
 プレフィックスパラメータ: 実行ディレクトリのパスを指定します。インストール中に、バックグラウンドでディレクトリが既に存在するかどうかが自動的にスキャンされ、ディレクトリが存在しない場合は自動的に作成されます。存在する場合、所有者は gbase ユーザーである必要があることに注意してください。
version パラメータ: インストール パッケージのバージョンを指定します。形式は V5_S3.0.0BXX です。XX は特定のバージョン番号であり、インストール パッケージの名前に従って変更できます。このパラメータが正しく構成されていない場合、インストール パッケージが見つからず、インストールは失敗します。

注: リソース制約などの要因の影響を受ける可能性があるため、同じノードが 1 つの高可用性グループのマスター ノードの役割のみを担うようにするために、同じノードを再利用する必要があります。また、ポートの再利用やエラー報告を避けるために、インストール前にクラスタ トポロジに従ってポートの競合 netstat -antp| grep 5432 を確認することをお勧めします。

データベースをインストールする

文法形式

2 層インストール パッケージを解凍すると、インストール ディレクトリの下にスクリプト サブディレクトリが生成されます。このディレクトリに入り、gha_ctl コマンドを実行して GBase 8c データベースをインストールします。構文形式は次のとおりです。

gha_ctl install <-c cluster> <-p confpath>

パラメータの説明:
 -c パラメータ: データベース名を指定します。これはオプションのフィールドです。デフォルトのデフォルトは gbase です。
 -p パラメータ: 設定ファイルを保存するパスを指定します。これはオプションのフィールドです。デフォルトのデフォルトは /tmp です。

注: クラスター名は構成ファイル名と一致している必要があります。インストール完了後、gha_ctl コマンドファイルが配置されているスクリプトディレクトリを削除しないでください。削除すると、運用および保守コマンドが失われます。

データベースのインストール時には環境変数が設定されていないため、gha_ctl コマンドを実行するにはスクリプト ディレクトリに入る必要があります。インストールが成功したら、任意のディレクトリで gbase ユーザーとして gha_ctl コマンドを実行できます。

デプロイメント コマンドの例は次のとおりです。

[gbase@JiekeXu gbase_package]$ cd /home/gbase/gbase_package/script/
[gbase@gbase8c script]$ ./gha_ctl install -p /home/gbase/ -c gbase

a01aba9e7edba0ec993d725b1fbef0c0.png

ここでは公式ドキュメントに記載されているトポロジのインストール例に従ったため、長時間待った結果エラーレポートが表示されましたが、数多くのエラーレポートの中で以下のような情報がありました。

WARNING:  Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (3556 Mbytes) is larger
FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=6666001, size=3729021888, 03600).
2023-06-25 23:38:25.922 64985f71.1 [unknown] 140668180328896 [unknown] 0 gtm 42809  0 [BACKEND] HINT:  This error usually means that openGauss's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 3729021888 bytes), reduce openGauss's shared memory usage, perhaps by reducing shared_buffers.If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.The openGauss documentation contains more information about shared memory configuration.

中国語に翻訳すると: このエラーは通常、共有メモリ セグメントに対する openGauss リクエストがカーネルの SHMMAX パラメータを超えていることを意味します。リクエストのサイズを減らすか、より大きな SHMMAX を使用してカーネルを再構成できます。リクエスト サイズ (現在 3729021888 バイト) を減らすには、shared_buffers を減らすことで openGauss の共有メモリ使用量を減らすことができます。リクエスト サイズがすでに小さい場合は、カーネルの SHMMIN パラメータよりも小さい可能性があります。その場合は、リクエスト サイズを増やすか、SHMMIN を再構成する必要があります。opengaus のドキュメントには、共有メモリ構成に関する詳細情報が含まれています。

注: gha_ctl install コマンドを使用して GBase 8c クラスターをインストールする場合、コマンドは実行に失敗します。json 形式で返されるエラー メッセージを確認できます。エラー メッセージが単純で理解しにくい場合は、/tmp/gha_ctl/gha_ctl.log でより詳細なエラー メッセージを確認できます。

FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=6666001, size=3729021888, 03600).

ログを確認するとインストールは成功していますが、起動処理で失敗しています。システムのカーネルパラメータに問題があるような気がします。セマフォが不足していて初期化できないので、システムのカーネルパラメータを修正します。価値観。

sudo vim /etc/sysctl.conf
kernel.shmall = 2097152
kernel.shmmax = 6068117503
kernel.shmmni = 4096
#kernel.sem = 40960 2048000 40960 20480
kernel.sem = 40960 838860800 40960 20480

ちなみに、ノード 1 のメモリをノード 2 および 3 のサイズと一致するように 6GB に調整した後でも、起動は失敗します。sysctl.conf を見ると、kernel.sem が上でコメントアウトした値に変更されており、このパラメータはインストール時に自動的に設定されるようです。

WARNING:  Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (4495 Mbytes) is larger.
FATAL:  could not create shared memory segment: No space left on device
DETAIL:  Failed system call was shmget(key=15432001, size=4713553920, 03600).
HINT:  This error does *not* mean that you have run out of disk space.  It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.  If you cannot increase the shared memory limit, reduce openGauss's shared memory request (currently 4713553920 bytes), perhaps by reducing shared_buffers.
直接启动数据库
./gha_ctl start all -l http://192.168.32.31:2379
然后我便把三台机器的内存又从 6G 加到 8G,但是使用官方推荐的拓扑结构重新安装还是会报错,执行启动命令会显示如下的结果,有的节点是 
stopped 状态,两个 CN 节点也是 stopped 的状态,没法直接使用,想查看日志也没有找到 CN 和 DN2 的日志,只有启动了的 
GTM 和 DN1 有日志。熬夜整了两晚实在没办法了,可能的原因一是我的文件系统空间不足只有 10G 大小,无法启动多个节点,二是 
postgresql.conf 文件中对于 shared_buffers 的配置过大了,但由于 CN、DN、GTM 
配置文件下都有,一时间不知道该改哪些配置文件,改为多少,由于时间太晚所以就放弃了。第三晚上又想到了 GDCA 
课程中的安装示例,好像集群拓扑有存在单点的架构,故我这里将 gbase.yml 调整为上面一小节中的架构,CN 和 GTM 均为单点,8GB 
的内存 10G 大小的磁盘很快就按照成功了。
[gbase@JiekeXu script]$ ./gha_ctl start all -l http://192.168.32.31:2379
{
    "ret":80000116,
    "msg":"Rpc request failed:Rpc request failed:Start pg failed"
}
[gbase@JiekeXu script]$ ./gha_ctl monitor all -l http://192.168.32.31:2379 -H
+----+-------------+---------------+-------+---------+--------+
| No |     name    |      host     |  port |  state  | leader |
+----+-------------+---------------+-------+---------+--------+
| 0  | gha_server1 | 192.168.32.31 | 20001 | running |  True  |
+----+-------------+---------------+-------+---------+--------+
+----+------+---------------+------+---------------------------+---------+---------+
| No | name |      host     | port |          work_dir         |  state  |   role  |
+----+------+---------------+------+---------------------------+---------+---------+
| 0  | gtm1 | 192.168.32.31 | 6666 | /home/gbase/data/gtm/gtm1 | running | primary |
| 1  | gtm2 | 192.168.32.32 | 6666 | /home/gbase/data/gtm/gtm2 | running | standby |
+----+------+---------------+------+---------------------------+---------+---------+
+----+------+---------------+------+----------------------------+---------+---------+
| No | name |      host     | port |          work_dir          |  state  |   role  |
+----+------+---------------+------+----------------------------+---------+---------+
| 0  | cn1  | 192.168.32.32 | 5432 | /home/gbase/data/coord/cn1 | stopped | primary |
| 1  | cn2  | 192.168.32.33 | 5432 | /home/gbase/data/coord/cn2 | stopped | standby |
+----+------+---------------+------+----------------------------+---------+---------+
+----+-------+-------+---------------+-------+----------------------------+---------+---------+
| No | group |  name |      host     |  port |          work_dir          |  state  |   role  |
+----+-------+-------+---------------+-------+----------------------------+---------+---------+
| 0  |  dn1  | dn1_1 | 192.168.32.32 | 15432 | /home/gbase/data/dn1/dn1_1 | running | primary |
| 1  |  dn1  | dn1_2 | 192.168.32.33 | 15433 | /home/gbase/data/dn1/dn1_2 | running | standby |
| 2  |  dn1  | dn1_3 | 192.168.32.31 | 15433 | /home/gbase/data/dn1/dn1_3 | running | standby |
| 3  |  dn2  | dn2_1 | 192.168.32.33 | 20010 | /home/gbase/data/dn2/dn2_1 | running | primary |
| 4  |  dn2  | dn2_2 | 192.168.32.31 | 20010 | /home/gbase/data/dn2/dn2_2 | stopped | standby |
| 5  |  dn2  | dn2_3 | 192.168.32.32 | 20010 | /home/gbase/data/dn2/dn2_3 | stopped | standby |
+----+-------+-------+---------------+-------+----------------------------+---------+---------+
+----+---------------------------+--------+---------+----------+
| No |            url            |  name  |  state  | isLeader |
+----+---------------------------+--------+---------+----------+
| 0  | http://192.168.32.33:2379 | node_2 | healthy |   True   |
| 1  | http://192.168.32.31:2379 | node_0 | healthy |  False   |
| 2  | http://192.168.32.32:2379 | node_1 | healthy |  False   |
+----+---------------------------+--------+---------+----------+


[gbase@JiekeXu ~]$ find ./ -name postgresql.conf
./data/gtm/gtm1/postgresql.conf
./data/dn1/dn1_3/postgresql.conf
./data/dn2/dn2_2/postgresql.conf
./data/coord/cn1/postgresql.conf

すぐに成功した展開情報を返します

[gbase@JiekeXu ~]$ cd /home/gbase/gbase_package/script/
[gbase@JiekeXu script]$ ./gha_ctl install -p /home/gbase/ -c gbase
{
    "ret":0,
    "msg":"Success"
}
[gbase@JiekeXu script]$ ./gha_ctl monitor all -l http://192.168.32.31:2379 -H
 
[gbase@JiekeXu ~]$ gha_ctl monitor all -l http://192.168.32.31:2379 -H
+----+-------------+---------------+-------+---------+--------+
| No |     name    |      host     |  port |  state  | leader |
+----+-------------+---------------+-------+---------+--------+
| 0  | gha_server1 | 192.168.32.31 | 20001 | running |  True  |
+----+-------------+---------------+-------+---------+--------+
+----+------+---------------+------+---------------------------+---------+---------+
| No | name |      host     | port |          work_dir         |  state  |   role  |
+----+------+---------------+------+---------------------------+---------+---------+
| 0  | gtm1 | 192.168.32.31 | 6666 | /home/gbase/data/gtm/gtm1 | running | primary |
+----+------+---------------+------+---------------------------+---------+---------+
+----+------+---------------+------+----------------------------+---------+---------+
| No | name |      host     | port |          work_dir          |  state  |   role  |
+----+------+---------------+------+----------------------------+---------+---------+
| 0  | cn1  | 192.168.32.31 | 5432 | /home/gbase/data/coord/cn1 | running | primary |
+----+------+---------------+------+----------------------------+---------+---------+
+----+-------+-------+---------------+-------+----------------------------+---------+---------+
| No | group |  name |      host     |  port |          work_dir          |  state  |   role  |
+----+-------+-------+---------------+-------+----------------------------+---------+---------+
| 0  |  dn1  | dn1_1 | 192.168.32.32 | 15432 | /home/gbase/data/dn1/dn1_1 | running | primary |
| 1  |  dn2  | dn2_1 | 192.168.32.33 | 20010 | /home/gbase/data/dn2/dn2_1 | running | primary |
+----+-------+-------+---------------+-------+----------------------------+---------+---------+
+----+---------------------------+--------+---------+----------+
| No |            url            |  name  |  state  | isLeader |
+----+---------------------------+--------+---------+----------+
| 0  | http://192.168.32.33:2379 | node_2 | healthy |  False   |
| 1  | http://192.168.32.31:2379 | node_0 | healthy |  False   |
| 2  | http://192.168.32.32:2379 | node_1 | healthy |   True   |
+----+---------------------------+--------+---------+----------+

aa97e4c5f855d84158c19e917cdfd763.png

データベースの listen_addresses 構成を表示する

[gbase@JiekeXu ~]$ gs_guc check -Z gtm -N all -I all -c "listen_addresses"
The gs_guc run with the following arguments: [gs_guc -Z gtm -N all -I all -c listen_addresses check ].


Total GUC values: 1.
The value of parameter listen_addresses is same on all instances.
    listen_addresses='localhost,192.168.32.31'


[gbase@JiekeXu ~]$ gs_guc check -Z coordinator -N all -I all -c "listen_addresses"
The gs_guc run with the following arguments: [gs_guc -Z coordinator -N all -I all -c listen_addresses check ].


Total GUC values: 1.
The value of parameter listen_addresses is same on all instances.
    listen_addresses='localhost,192.168.32.31'


[gbase@JiekeXu ~]$ gs_guc check -Z datanode -N all -I all -c "listen_addresses"
The gs_guc run with the following arguments: [gs_guc -Z datanode -N all -I all -c listen_addresses check ].


Total GUC values: 2.
The details for listen_addresses:
    [test19crac1]  listen_addresses='localhost,192.168.32.32'  [/home/gbase/data/dn1/dn1_1/postgresql.conf]
    [test19crac2]  listen_addresses='localhost,192.168.32.33'  [/home/gbase/data/dn2/dn2_1/postgresql.conf]
检查监控数据库状态
gha_ctl monitor all -l http://192.168.32.31:2379 -H
停止数据库
gha_ctl stop all -l http://192.168.32.31:2379
启动数据库

gha_ctl すべて開始 -l http://192.168.32.31:2379

データベースに接続する

クライアント ツール gsql を使用して GBase 8c データベースに接続し、分散アーキテクチャの読み取り/書き込み CN ノードにログインすることをお勧めします。これは最初のノード 192.168.32.31 で、形式は次のとおりです。

gsql -d dbname -p port <-U user_name> <-h hostip>

b5915a692628de1fa9d2bb2d71e1e487.png

[gbase@JiekeXu ~]$ gsql -d postgres -p 5432
gsql ((multiple_nodes GBase8cV5 3.0.0B78 build f35d85c7) compiled at 2023-03-06 17:14:54 commit 0 last mr 1247 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.


postgres=# \l
                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 postgres  | gbase | UTF8     | C       | C     | 
 template0 | gbase | UTF8     | C       | C     | =c/gbase         +
           |       |          |         |       | gbase=CTc/gbase
 template1 | gbase | UTF8     | C       | C     | =c/gbase         +
           |       |          |         |       | gbase=CTc/gbase
(3 rows)


postgres=# create user jiekexu sysadmin password jiekexu;
ERROR:  Password must be quoted
postgres=# create user jiekexu sysadmin password 'jiekexu';
ERROR:  Password must contain at least 8 characters.
postgres=# create user jiekexu sysadmin password 'Jieke_Xu';
CREATE ROLE
postgres=# create database jiekexudb;
CREATE DATABASE
postgres=# \c jiekexudb
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "jiekexudb" as user "gbase".
jiekexudb=# create table jieke(ID int, Name varchar(10));
CREATE TABLE
jiekexudb=# insert into jieke values(1, 'JiekeXu'),(2,'Jieke');
INSERT 0 2
jiekexudb=# select * from jieke;
 id |  name   
----+---------
  1 | JiekeXu
  2 | Jieke
(2 rows)

リモート接続では、
サーバーとクライアントでそれぞれ次の構成が完了し、クライアントで gsql コマンドが実行されます。
GBase 8c 分散クラスターの場合、サーバーは読み取り/書き込み CN 上で gbase ユーザーとして次のコマンドを実行する必要があります。

gs_guc reload -Z coordinator -N all -I all -h "host all all 0.0.0.0/0 sha256"
gs_guc reload -Z coordinator -N all -I all -c "password_encryption_type=1"
gs_guc reload -Z coordinator -N all -I all -c "listen_addresses = '*'"
重启数据库
停止数据库
gha_ctl stop all -l http://192.168.32.31:2379
启动数据库
gha_ctl start all -l http://192.168.32.31:2379

e5feaa60ab45e3f21a256f8336871322.png

クライアント接続

このように、ビジュアル クライアント接続を使用することができ、PG をサポートするクライアント ツールがすべて利用可能になります。公式では DBeaver (公式 Web サイトのダウンロード アドレス: https://dbeaver.io/download/) を使用することが推奨されていますが、以下の図に示すようにドライバー パッケージをインポートする必要があります 個人的な感想 あまり便利ではありませんが、幸いなことにオープンソースで無料ですが、有料ではあるもののより便利かもしれないNavicat Premiumを使用することをお勧めします。

オフラインインポート: 「データベース」→「ドライバーマネージャー」をクリックし、ドライバーマネージャーウィンドウでPostgreSQLを検索し、次のように設定します。
6ed1b37e8a48fcdd31f2e0adc8d9d326.png

8c7d3554d487df66b5c7e89401d9402e.png

2d440f6fc2292e5341f8ec2ae52f9dfc.png

データベースをアンマウントする

環境変数はクラスターのアンインストール後に自動的にクリアされるため、スクリプト ディレクトリに入って gha_ctl コマンドを再度実行する必要があります。DCS ツールをアンインストールするための具体的な操作コマンドは次のとおりです。

クラスタアンインストールの具体的な操作コマンドは以下のとおりです。

-c パラメータ: データベース名を指定します。これはオプションのフィールドです。デフォルトのデフォルトは gbase です。
-f パラメータ: インストール ディレクトリをクリーンアップすることを示します。これはオプションのフィールドです。ディレクトリ フォルダーはデフォルトで保持されます。

gha_ctl uninstall -c gbase -l http://192.168.32.31:2379

操作成功メッセージを返します:

cd /home/gbase/gbase_package/script
./gha_ctl destroy dcs -l http://192.168.32.31:2379

6eba160c5fadd2271d326d05fd2b1abb.png

インストール中に発生した問題

質問 1

エラー ポート番号が使用されています。gbase.yml ファイルに設定されている IP ポート番号が重複していて競合が発生していないか確認する必要があります。設定ファイルが正しいことを再度確認する必要があります。次に、 netstat コマンドを使用して、サーバー自体のポートが占有されているかどうかを確認します。

sudo netstat -anltp | grep 15433

4fe7625e7cb6e360d31475bd986243e9.png

質問2

以下に示すように、依存パッチのインストールに失敗する旨のメッセージが表示されるため、表示された各ノードのパッチパッケージが正しくインストールされているか、バージョンが正しいか確認する必要があります。# rpm -q patch インストールされていない場合は、yum ソースを構成し、このパッケージを個別にインストールする必要があります。

2fc99de2ac83f783ddde9b882333af46.png

Yum インストールのデモ:
以下の図に示すように、CD イメージを仮想マシンに挿入し、yum ソースを構成します。

8235a0a2bba2cfb21dab3c42fff60957.png

CD イメージを /mnt ディレクトリに一時的にマウントし (再起動は失敗します)、yum ソースを file:///mnt ディレクトリに設定すると、パッチ パッケージを直接インストールできます。

061f96a53c85b3df0f13c720ed91112a.png

質問3

インストールプロセス中に非常に多くのエラーレポートがあり、しばらくエラーレポートが見つからないため、/tmp/gha_ctl/gha_ctl.log インストールログを確認することをお勧めします。

ec722773f2b729f2f9ba030812186df1.png

31bd4eeff1589d628fea31df56c0409f.png

エラーはしばらく解決されませんでしたが、インストール トポロジが変更されて問題が隠れて解決されました。以下は、メモリパラメータを計算する単純なシェルです。

memTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}')
totalMemory=$((memTotal / 2048))
shmall=$((memTotal / 2))
if [ $shmall -lt 2097152 ]; then
  shmall=2097152
fi
shmmax=$((memTotal * 1024 - 1))
if [ "$shmmax" -lt 4294967295 ]; then
  shmmax=4294967295
fi
echo $shmall
echo $shmmax


sudo vim /etc/sysctl.conf


kernel.shmall = 2962948
kernel.shmmax = 6068117503
kernel.shmmni = 4096
kernel.sem = 40960 2048000 40960 20480
質問4

インストール プロセス中に、エラー メッセージ 80000301: トランスポート エンドポイントに到達しませんでした

他のノード 2 および 3 の /etc/resolv.conf 設定ファイル (赤枠) の次の内容をコメント アウトし、バックアップ マシンの resolv 設定をキャンセルし、マスター マシンとバックアップ マシン間の遅延を復元して、再度インストール。

41aebf0447bf0fdffe7c269d001de5d5.png

参考文献

https://www.gbase.cn/download/gbase-8c?category=DOCUMENT


《GBase 8c V5_3.0.0_安装部署手册_分布式_V2.5_20230210.pdf》
《GBase 8c V5_ 3.0.0_错误码手册_V1.0_20220621.pdf》
《GBase 8c V5_3.0.0_技术白皮书_V3.1_20221108.pdf》
【GBase 学堂】GDCA 课程第一、二、三节

全文が完成しました。読んでいる皆さんのお役に立てれば幸いです。この記事が役立つと思われる場合は、友人、同僚、気になる人にシェアしてください。一緒に学び、進歩しましょう~~~

私の公式アカウント [JiekeXu DBA Road] をフォローして、できるだけ早く一緒に新しい知識を学んでください。

———————————————————————————————
公開アカウント: JiekeXu DBA Road
CSDN: https://blog.csdn.net/ JiekeXu
Motian Wheel: https://www.modb.pro/u/4347
Tencent クラウド: https://cloud.tencent.com/developer/user/5645107
——————————————— ——— ———————————

052845963ea68a85711f5ec47b838dbc.gif

複数のデータベース バックアップ スクリプトを共有する

Oracle テーブルの断片化チェックと最適化スキーム

OGG|Oracle GoldenGate 基础2022 年公众号历史文章合集整理
 
  

Oracle 19c RAC で発生するいくつかの問題

OGG|Oracle 数据迁移后比对一致性

OGG|Oracle GoldenGate マイクロサービス アーキテクチャ

Oracle クエリテーブルスペースの使用量が非常に遅い

国内データベース|TiDB 5.4 スタンドアロン クイック インストールのファースト エクスペリエンス

Oracle ADGスタンバイ・データベースのシャットダウン・メンテナンス・プロセスと増分リカバリ

MySQL8.0.28マスタ・スレーブ同期環境を構築するためのLinux環境

a78d0ccd197265288babf7cb587af296.png

おすすめ

転載: blog.csdn.net/JiekeXu/article/details/131467404