0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQL Server 2019 ビッグデータクラスターを AKS で使う - azdata を使った高可用性インストール

Last updated at Posted at 2019-12-15

前回はカスタム構成でのインストールとして、異なるディスクタイプの利用と replicaset の数の変更、およびクラスタ名の変更を試しましたが、今回は SQL Server マスターインスタンスの高可用性構成を見ていきます。

SQL Server 2019 BDC の高可用性

高可用性対応は以下の 3 つのコンポーネントで行えます。

  • SQL Server マスターインスタンス
  • Spark
  • HDFS

SQL Server マスターインスタンス

SQL Server 2019 BDC は k8s 上で稼働していることから、ポッドの状態監視や自動的な再起動など、もともと高可用性を備えています。しかし、よりミッションクリティカルで継続性が求められる状況において、可用性グループを利用することができます。

可用性グループはもともと SQL Server の機能です。参照: AlwaysOn 可用性グループの概要 (SQL Server)

BDC で可用性グループを利用する場合、以下の動作となります。

  • containedag という可用性グループが作成される
  • 既定で 3 つのレプリカが作成される
  • すべての CRUD 操作は内部的に処理されるため、可用性グループの作成や追加はできない
  • すべてのシステムとユーザーデータベースはそれぞれのインスタンスにコピーされる
  • 可用性グループ固有のデータベースがいくつか追加される
  • 読み取り専用セカンダリ用のエンドポイントが作成される

Spark の高可用性

Spark を高可用性にする場合、SparkHead ポッドを複数用意するだけでなく、処理を分散するよう Zookeeper も複数構成とします。Active/Standby 構成となります。

HDFS の高可用性

HDFS を高可用性にする場合、Name node ポッドを複数用意し、こちらも Zookeeper で管理します。Active/Standby 構成となります。

zookeeper の詳細は Apache Zookeeper を参照してください。

高可用性構成でのインストール

高可用性は azdata の既定の構成でサポートされているため、今回はそちらを利用してインストールします。

構成ファイルの確認

以下コマンドで高可用性用構成をコピー

azdata bdc config init -s aks-dev-test-ha -t custom-ha
code custom-ha

このテンプレートは SQL Server マスターインスタンスの高可用性の他、HDFS のネームノードおよび Spark の高可用性も設定がされています。

[HDFS 関連]

  • nmnode, sparkhead ともに Active/Standby として replicas が 2 に設定
  • zookeeper の replicas が 3 に設定
  • 記憶域プールの replicas が 3 に設定
  • hdfs サービスの設定で replication が 3 に設定
bdc.json
{
    ...
    "spec": {
        "resources": {
            "nmnode-0": {
                "spec": {
                    "replicas": 2
                }
            },
            "sparkhead": {
                "spec": {
                    "replicas": 2
                }
            },
            "zookeeper": {
                "spec": {
                    "replicas": 3
                }
            },
...
            "storage-0": {
                ...
                "spec": {
                    "type": "Storage",
                    "replicas": 3,
                    ...
                }
            }
        ...
        },
        "services": {
            ...
            "hdfs": {
                ...
                "settings": {
                    "hdfs-site.dfs.replication": "3"
                }
            },

ノードの追加

現在利用している L8s サイズの VM はディスクを最大で 32 までしかアタッチできませんが、HA 構成を既定のまま実施するとそれを超えます。また他のリソースも不足する可能性があるため、現在 1 台のノードを 2 台にスケールします。

az aks nodepool scale --cluster-name sqlbdc -g sqlbdcrg --name nodepool1 -c 2

インストールの実施

azdata コマンドで aks-dev-test-ha 構成をインストール

1. 以下コマンドを実行。

SET AZDATA_USERNAME=admin
SET AZDATA_PASSWORD=<password>
azdata bdc create --config-profile aks-dev-test-ha --accept-eula yes

2. インストールは 15-30 分程度かかる為、BDC 構成のビデオでも見て待つ。

Big Data Cluster Configuration | Data Exposed

3. 作成完了後、ポッドを確認。

  • 各ポッドが指定された数だけ存在
>kubectl get pods --namespace=mssql-cluster
NAME              READY   STATUS    RESTARTS   AGE
appproxy-cnxnq    2/2     Running   0          25m
compute-0-0       3/3     Running   0          25m
control-k2z6g     3/3     Running   0          41m
controldb-0       2/2     Running   0          41m
controlwd-mc9mb   1/1     Running   0          37m
data-0-0          3/3     Running   0          25m
data-0-1          3/3     Running   0          25m
gateway-0         2/2     Running   0          25m
logsdb-0          1/1     Running   0          37m
logsui-b9fqz      1/1     Running   0          37m
master-0          4/4     Running   0          24m
master-1          4/4     Running   0          24m
master-2          4/4     Running   0          24m
metricsdb-0       1/1     Running   0          37m
metricsdc-94tbx   1/1     Running   0          37m
metricsdc-tbzmw   1/1     Running   0          37m
metricsui-wrvbk   1/1     Running   0          37m
mgmtproxy-z86nr   2/2     Running   0          37m
nmnode-0-0        2/2     Running   0          25m
nmnode-0-1        2/2     Running   0          25m
operator-79lkd    1/1     Running   0          25m
sparkhead-0       4/4     Running   0          24m
sparkhead-1       4/4     Running   0          24m
storage-0-0       4/4     Running   0          24m
storage-0-1       4/4     Running   0          24m
storage-0-2       4/4     Running   0          24m
zookeeper-0       2/2     Running   0          25m
zookeeper-1       2/2     Running   0          25m
zookeeper-2       2/2     Running   0          25m

4. SQL Server マスターインスタンスのセカンダリエンドポイントを確認。

>kubectl get svc master-secondary-svc-external master-svc-external --namespace=mssql-cluster
NAME                            TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)           AGE
master-secondary-svc-external   LoadBalancer   10.0.36.208   52.xxx.xx.244   31436:31997/TCP   26m
NAME                            TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)           AGE
master-svc-external             LoadBalancer   10.0.215.32   52.xxx.xx.171   31433:30076/TCP   26m

5. リソースの状況を確認。

>kubectl describe node aks-nodepool1-41170276-vmss000000
...
Non-terminated Pods:         (16 in total)
  Namespace                  Name                CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                ------------  ----------  ---------------  -------------  ---
  kube-system                kube-proxy-kpnqd    100m (1%)     0 (0%)      0 (0%)           0 (0%)         54m
  mssql-cluster              appproxy-cnxnq      100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         28m
  mssql-cluster              compute-0-0         100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         28m
  mssql-cluster              control-k2z6g       100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         44m
  mssql-cluster              controlwd-mc9mb     0 (0%)        0 (0%)      0 (0%)           0 (0%)         40m
  mssql-cluster              data-0-1            100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         28m
  mssql-cluster              logsdb-0            500m (6%)     0 (0%)      1Gi (1%)         2Gi (3%)       40m
  mssql-cluster              logsui-b9fqz        0 (0%)        0 (0%)      0 (0%)           0 (0%)         40m
  mssql-cluster              master-0            100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         27m
  mssql-cluster              master-2            100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         27m
  mssql-cluster              metricsdc-tbzmw     500m (6%)     0 (0%)      256Mi (0%)       1Gi (1%)       40m
  mssql-cluster              nmnode-0-0          100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         28m
  mssql-cluster              operator-79lkd      0 (0%)        0 (0%)      0 (0%)           0 (0%)         28m
  mssql-cluster              sparkhead-1         100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         27m
  mssql-cluster              storage-0-1         100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         27m
  mssql-cluster              zookeeper-0         600m (7%)     0 (0%)      2148Mi (3%)      0 (0%)         28m
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource                       Requests     Limits
  --------                       --------     ------
  cpu                            2600m (33%)  0 (0%)
  memory                         4328Mi (7%)  3Gi (5%)
  ephemeral-storage              0 (0%)       0 (0%)
  attachable-volumes-azure-disk  0            0
...
>kubectl describe node aks-nodepool1-41170276-vmss000001

...
Non-terminated Pods:         (21 in total)
  Namespace                  Name                                     CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                     ------------  ----------  ---------------  -------------  ---
  kube-system                coredns-866fc6b6c8-2sdks                 100m (1%)     0 (0%)      70Mi (0%)        170Mi (0%)     59m
  kube-system                coredns-866fc6b6c8-kbk75                 100m (1%)     0 (0%)      70Mi (0%)        170Mi (0%)     55m
  kube-system                coredns-autoscaler-5d5695b54f-8c4xn      20m (0%)      0 (0%)      10Mi (0%)        0 (0%)         59m
  kube-system                kube-proxy-n4ht9                         100m (1%)     0 (0%)      0 (0%)           0 (0%)         56m
  kube-system                kubernetes-dashboard-6f697bd9f5-dvg9l    100m (1%)     100m (1%)   50Mi (0%)        500Mi (0%)     59m
  kube-system                metrics-server-566bd9b4f7-f7bfx          0 (0%)        0 (0%)      0 (0%)           0 (0%)         59m
  kube-system                tunnelfront-54d584d6c7-n9wkj             10m (0%)      0 (0%)      64Mi (0%)        0 (0%)         59m
  mssql-cluster              controldb-0                              100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         46m
  mssql-cluster              data-0-0                                 100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         29m
  mssql-cluster              gateway-0                                100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         29m
  mssql-cluster              master-1                                 100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         29m
  mssql-cluster              metricsdb-0                              0 (0%)        0 (0%)      0 (0%)           0 (0%)         41m
  mssql-cluster              metricsdc-94tbx                          500m (6%)     0 (0%)      256Mi (0%)       1Gi (1%)       41m
  mssql-cluster              metricsui-wrvbk                          0 (0%)        0 (0%)      0 (0%)           0 (0%)         41m
  mssql-cluster              mgmtproxy-z86nr                          100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         41m
  mssql-cluster              nmnode-0-1                               100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         29m
  mssql-cluster              sparkhead-0                              100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         29m
  mssql-cluster              storage-0-0                              100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         29m
  mssql-cluster              storage-0-2                              100m (1%)     0 (0%)      100Mi (0%)       0 (0%)         29m
  mssql-cluster              zookeeper-1                              600m (7%)     0 (0%)      2148Mi (3%)      0 (0%)         29m
  mssql-cluster              zookeeper-2                              600m (7%)     0 (0%)      2148Mi (3%)      0 (0%)         29m
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource                       Requests     Limits
  --------                       --------     ------
  cpu                            3030m (38%)  100m (1%)
  memory                         5716Mi (9%)  1864Mi (3%)
  ephemeral-storage              0 (0%)       0 (0%)
  attachable-volumes-azure-disk  0            0
...

6. ストレージを確認。

  • 合計 44 本
>kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                            STORAGECLASS   REASON   AGE
pvc-2aefad27-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-nmnode-0-0    default                 30m
pvc-2af0f46e-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-nmnode-0-0    default                 30m
pvc-2af56cd9-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-nmnode-0-1    default                 30m
pvc-2afc3216-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-nmnode-0-1    default                 30m
pvc-2b224d13-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-compute-0-0   default                 30m
pvc-2b244ec7-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-compute-0-0   default                 30m
pvc-2c3b49ba-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-data-0-0      default                 30m
pvc-2c40353a-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-data-0-0      default                 30m
pvc-2c57b45c-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-data-0-1      default                 30m
pvc-2c5e3f11-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-data-0-1      default                 30m
pvc-2df0dc93-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-gateway-0     default                 30m
pvc-2df46634-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-gateway-0     default                 30m
pvc-2e05da4b-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-zookeeper-0   default                 30m
pvc-2e0a55a4-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-zookeeper-0   default                 30m
pvc-2e15c91c-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-zookeeper-1   default                 30m
pvc-2e1d5eb1-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-zookeeper-1   default                 30m
pvc-2e28190f-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-zookeeper-2   default                 30m
pvc-2e2fc20a-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-zookeeper-2   default                 30m
pvc-38b9bc73-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-master-0      default                 30m
pvc-38bd5e90-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-master-0      default                 30m
pvc-38c41485-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-master-1      default                 30m
pvc-38c74637-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-master-1      default                 30m
pvc-38cec031-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-master-2      default                 30m
pvc-38d4ca12-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-master-2      default                 30m
pvc-3da710d8-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-sparkhead-0   default                 30m
pvc-3da861a7-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-sparkhead-0   default                 30m
pvc-3db16c8e-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-sparkhead-1   default                 30m
pvc-3db85731-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-sparkhead-1   default                 30m
pvc-3dd12237-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-storage-0-0   default                 30m
pvc-3dd2eb0b-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-storage-0-0   default                 30m
pvc-3ddba73f-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-storage-0-1   default                 30m
pvc-3de3b549-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-storage-0-1   default                 30m
pvc-3de9b1d4-1cbe-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-storage-0-2   default                 30m
pvc-3ded9b05-1cbe-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-storage-0-2   default                 30m
pvc-7dc2e05b-1cbc-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-metricsdb-0   default                 42m
pvc-7dc64f44-1cbc-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-metricsdb-0   default                 42m
pvc-7ee0d66f-1cbc-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-logsdb-0      default                 42m
pvc-7ee414ad-1cbc-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-logsdb-0      default                 42m
pvc-d6ed6120-1cbb-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-controller    default                 47m
pvc-d7004244-1cbb-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-controller    default                 47m
pvc-d710af64-1cbb-11ea-a20b-dab52d93f0d4   10Gi       RWO            Delete           Bound    mssql-cluster/logs-controldb     default                 47m
pvc-d72065ea-1cbb-11ea-a20b-dab52d93f0d4   15Gi       RWO            Delete           Bound    mssql-cluster/data-controldb     default                 47m

azdata を使った確認

kubectl だけでなく、azdata でクラスタを確認、操作することができます。

1. クラスタへログイン。

azdata login -n mssql-cluster -n admin -p <password>

2. SQL Server プライマリインスタンスのエンドポイントをクエリ。

>azdata bdc endpoint list -e sql-server-master -o table
Description                           Endpoint             Name               Protocol
------------------------------------  -------------------  -----------------  ----------
SQL Server Master Instance Front-End  52.xxx.xx.171,31433  sql-server-master  tds

3. SQL Server セカンダリインスタンスのエンドポイントをクエリ。

>azdata bdc endpoint list -e sql-server-master-readonly -o table
Description                                    Endpoint             Name                        Protocol
---------------------------------------------  -------------------  --------------------------  ---あ-------
SQL Server Master Readable Secondary Replicas  52.xxx.xx.244,31436  sql-server-master-readonly  tds

4. ステータスを確認。

>azdata bdc status show


 Mssql-cluster: ready                                                            Health Status:  healthy
 =======================================================================================================
 Services: ready                                                                 Health Status:  healthy
 -------------------------------------------------------------------------------------------------------
 Servicename    State    Healthstatus    Details

 sql            ready    healthy         -
 hdfs           ready    healthy         -
 spark          ready    healthy         -
 control        ready    healthy         -
 gateway        ready    healthy         -
 app            ready    healthy         -


 Sql Services: ready                                                             Health Status:  healthy
 -------------------------------------------------------------------------------------------------------
 Resourcename    State    Healthstatus    Details

 master          ready    healthy         StatefulSet master is healthy
 compute-0       ready    healthy         StatefulSet compute-0 is healthy
 data-0          ready    healthy         StatefulSet data-0 is healthy
 storage-0       ready    healthy         StatefulSet storage-0 is healthy


 Hdfs Services: ready                                                            Health Status:  healthy
 -------------------------------------------------------------------------------------------------------
 Resourcename    State    Healthstatus    Details

 nmnode-0        ready    healthy         StatefulSet nmnode-0 is healthy
 zookeeper       ready    healthy         StatefulSet zookeeper is healthy
 storage-0       ready    healthy         StatefulSet storage-0 is healthy
 sparkhead       ready    healthy         StatefulSet sparkhead is healthy


 Spark Services: ready                                                           Health Status:  healthy
 -------------------------------------------------------------------------------------------------------
 Resourcename    State    Healthstatus    Details

 sparkhead       ready    healthy         StatefulSet sparkhead is healthy
 storage-0       ready    healthy         StatefulSet storage-0 is healthy


 Control Services: ready                                                         Health Status:  healthy
 -------------------------------------------------------------------------------------------------------
 Resourcename    State    Healthstatus    Details

 controldb       ready    healthy         StatefulSet controldb is healthy
 control         ready    healthy         ReplicaSet control is healthy
 metricsdc       ready    healthy         DaemonSet metricsdc is healthy
 metricsui       ready    healthy         ReplicaSet metricsui is healthy
 metricsdb       ready    healthy         StatefulSet metricsdb is healthy
 logsui          ready    healthy         ReplicaSet logsui is healthy
 logsdb          ready    healthy         StatefulSet logsdb is healthy
 mgmtproxy       ready    healthy         ReplicaSet mgmtproxy is healthy
 controlwd       ready    healthy         ReplicaSet controlwd is healthy


 Gateway Services: ready                                                         Health Status:  healthy
 -------------------------------------------------------------------------------------------------------
 Resourcename    State    Healthstatus    Details

 gateway         ready    healthy         StatefulSet gateway is healthy


 App Services: ready                                                             Health Status:  healthy
 -------------------------------------------------------------------------------------------------------
 Resourcename    State    Healthstatus    Details

 appproxy        ready    healthy         ReplicaSet appproxy is healthy

ADS からの接続

最後に ADS から接続して操作をしてみます。

1. ADS からプライマリエンドポイントへ接続。以下のクエリを発行。

CREATE DATABASE TestDB;
GO
USE TestDB;
GO
CREATE TABLE TestTable1(ID int);
INSERT INTO TestTable1 VALUES(0),(1),(2),(3);
SELECT * FROM TestTable1;

image.png

2. セカンダリエンドポイントに接続。以下のクエリを発行して読み取りができることを確認。

USE TestDB;
SELECT * FROM TestTable1;

image.png

3. 引き続き以下のクエリを発行して読み取り以外はできないことを確認。

INSERT INTO TestTable1 VALUES (5);

image.png

環境の停止

使わない場合は、これまで通り必要に応じて環境を停止してください。

まとめ

以前は SQL Server の高可用性を構成するために Windows クラスターを組んだり、いろいろ大変でしたが、今回は通常の構成と同じ手順で作成ができました。必要となるリソースだけ事前に計算してしっかり確保してから構築を行ってください。次回はクラスタの管理についてみていきます。

次の記事へ
目次へ戻る

参照

Apache Zookeeper

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?