天天看點

如何使用 minio 進行 BR 備份

作者:懂的都懂​

1. BR 備份的支援的後端存儲

From tidb doc https://docs.pingcap.com/zh/tidb/v5.0/backup-and-restore-storages#scheme

Scheme

TiDB 遷移工具支援以下存儲服務:

服務 Scheme 示例
本地檔案系統(分布在各節點上) local local:///path/to/dest/
Amazon S3 及其他相容 S3 的服務 s3 s3://bucket-name/prefix/of/dest/
GCS gcs, gs gcs://bucket-name/prefix/of/dest/
不寫入任何存儲(僅作為基準測試) noop noop://

其中 local 的模式我們可以直接使用本地挂載的硬碟,也可以使用 nfs。

2. 使用 local 模式存在的問題

From tidb doc:使用 BR 指令行進行備份恢複

​​

如何使用 minio 進行 BR 備份

​​

目前官方并不建議在 BR 備份恢複中使用 local storage。在實際使用中,local storage 也可能存在一些問題:

  • 通過 BR 備份的資料會分散到每個 TiKV 上
  • 通過 BR 恢複時,需要将每個 TiKV 上的 sst 收集到一起,全量的 sst 檔案要複制到每個 TiKV 下
  • 大量的小檔案在 server 中複制,很容易造成丢包,任何一個 sst 檔案的異常,都可能導緻恢複失敗
  • 大量小檔案的傳輸時間遠遠高于一個同體積的大檔案傳輸時間
  • BR 備份的 sst 檔案打包壓縮,體積并沒有明顯減小,壓縮與解壓時間依然消耗巨大

一般來說,我們建議使用 NFS 網盤,或者直接備份到 S3 上。

當我們使用 NFS 網盤恢複的時候,很有可能因為大量的 server 同時讀取 NFS,即便我們使用 ratelimit 進行了限速,也會抛出 i/o timeout 的異常。這是一個比較迷惑的報錯,從使用者的角度上來看,硬碟的 io 不夠最多隻應該導緻性能問題,而不應該導緻功能上不可用。

3. 使用 minio 模拟 S3 的對象存儲及 API

S3 的好處一大堆,但不選用 S3 的理由也很簡單:對不起,我沒有。

對于大部分技術人員來說,IDC 的實體裝置雖然也有成本的,但下意識還是認為是免費的。如果真的需要申請購買 S3 的存儲,流程稽核多半通過不了。為了解決這個問題,我們可以考慮通過 IDC 的裝置模拟 S3 的協定,搭建一套對象存儲系統。目前比較流行的相容 S3 協定的檔案或對象存儲有 ceph 和 minio。簡單打個比方,同樣是拍照,minio 像手機,ceph 像單反。minio 操作簡單,運維成本低,不支援線上動态擴容。ceph 功能強大,支援數千結點,支援動态增減結點,自動平衡分布。據了解,阿裡雲和華為雲都是基于 ceph 做的雲存儲。但是伴随強大的功能,維護成本高到可怕。我在研究 MySQL + 分布式存儲的時候,考慮過 MySQL + ceph 的方案。但是高昂的運維成本使我遲遲不敢上線。一般來說,我更建議由專門的團隊來維護 ceph。

對于大部分中小型企業,如果不選擇存儲上雲,那麼 minio 是一個不錯的選擇。麻雀雖小,五髒俱全。或者對于大中型企業的某一個獨立的業務,minio 也足夠能支撐起業務的要求。minio 不僅可以作為對象存儲使用,也可以作為雲上對象存儲服務的網管,無縫對接到 Amazon S3、MicroSoft Azure。

4. 使用 minio S3 接口進行 BR 備份的方案落地

4.1 環境介紹

4.1.1 作業系統環境

在本例中,使用 CentOS Stream release 8 版本。

[root@r60 ~]# cat /etc/redhat-release
CentOS Stream release 8
[root@r60 ~]# uname -r
4.18.0-294.el8.x86_64      

4.1.2 硬體環境及機器配置設定

HOSTNAME IP COMPONENT COMMENT
r60 192.168.232.60 TiUP
r61 192.168.232.61 TiDB Cluster 1 [tidb-c1] 1 * TiDB, 1 * PD, 1 * TiKV
r62 192.168.232.62 TiDB Cluster 2 [tidb-c2] 1 * TiDB, 1 * PD, 1 * TiKV
r63 192.168.232.63 minio client
r64 192.168.232.64 minio server
r65 192.168.232.65 minio server

4.2 搭建 minio 環境

4.2.1 minio 目錄

目錄結構
[root@r64 ~]# mkdir -p /opt/minio/{data,conf,bin,scripts}
[root@r65 ~]# mkdir -p /opt/minio/{data,conf,bin,scripts}      
資料目錄

本例中的 minio 叢集由 2 台伺服器構成(官方推薦叢集最小為 4 台伺服器),每台伺服器上挂在兩個磁盤目錄,最小的資料挂載點為 4 個。

[root@r64 ~]# mkdir -p /data/minio/{data1,data2}
[root@r65 ~]# mkdir -p /data/minio/{data3,data4}

[root@r64 ~]# ln -s /data/minio/data1 /opt/minio/data/data1
[root@r64 ~]# ln -s /data/minio/data2 /opt/minio/data/data2
[root@r65 ~]# ln -s /data/minio/data3 /opt/minio/data/data3
[root@r65 ~]# ln -s /data/minio/data4 /opt/minio/data/data4      

4.2.2 下載下傳 minio server 與 client 執行檔案

[root@r64 bin]# wget https://dl.minio.io/server/minio/release/linux-amd64/minio
[root@r64 bin]# wget https://dl.minio.io/client/mc/release/linux-amd64/mc
[root@r64 bin]# chmod +x /opt/minio/bin/*
[root@r64 bin]# scp /opt/minio/bin/* root@r65:/opt/minio/bin      

4.2.3 建立 minio 啟動腳本

[root@r64 scripts]# cat run_minio.sh
#!/bin/bash
export MINIO_ACCESS_KEY=myminioid
export MINIO_SECRET_KEY=myminiopasswd

/opt/minio/bin/minio server --config-dir /opt/minio/conf \"
http://192.168.232.64/opt/minio/data/data1 http://192.168.232.64/opt/minio/data/data2 \"
http://192.168.232.65/opt/minio/data/data3 http://192.168.232.65/opt/minio/data/data4

[root@r64 scripts]# scp run_minio.sh root@r65:/opt/minio/scripts/      

4.2.4 建立 minio 服務檔案

[root@r64 ~] cat /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
 
[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh
 
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=multi-user.target


[root@r64 ~] scp /usr/lib/systemd/system/minio.service root@r65: /usr/lib/systemd/system/minio.service      

4.2.5 啟動 minio 并測試 minio 服務

啟動 minio 服務
[root@r64 ~] systemctl daemon-reload && systemctl start minio
[root@r65 ~] systemctl daemon-reload && systemctl start minio      
測試 minio 服務

浏覽器中輸入 http://192.168.232.64:9000​ 或 http://192.168.232.65:9000

如何使用 minio 進行 BR 備份
如何使用 minio 進行 BR 備份

4.2.6 minio 用戶端指令測試

在下載下傳了 minio 用戶端 mc 的機器上可以進行以下的測試

在 mc 用戶端添加主機資訊
[root@r63 soft]# ./mc config host add myminio http://192.168.232.65:9000 myminioid myminiopasswd
Added `myminio` successfully.      
檢視 mc 用戶端已經添加的主機資訊
[root@r63 soft]# ./mc config host ls
gcs
  URL       : https://storage.googleapis.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v2
  Path      : dns

local
  URL       : http://localhost:9000
  AccessKey :
  SecretKey :
  API       :
  Path      : auto

myminio
  URL       : http://192.168.232.65:9000
  AccessKey : myminioid
  SecretKey : myminiopasswd
  API       : s3v4
  Path      : auto

play
  URL       : https://play.min.io
  AccessKey : Q3AM3UQ867SPQQA43P2F
  SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
  API       : S3v4
  Path      : auto

s3
  URL       : https://s3.amazonaws.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v4
  Path      : dns      
在 minio 中建立 buket
[root@r63 soft]# ./mc mb myminio/test-dir
Bucket created successfully `myminio/test-dir`.      
上傳檔案到 buket 中
[root@r63 soft]# echo 'test-upload' > minio-test-upload
[root@r63 soft]# ./mc cp minio-test-upload myminio/test-dir
minio-test-upload:                    12 B / 12 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 909 B/s 0s      
下載下傳 buket 中的檔案
[root@r63 soft]# ./mc cp myminio/test-dir/minio-test-upload /tmp/
...:9000/test-dir/minio-test-upload:  12 B / 12 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 561 B/s 0s
[root@r63 soft]# cat /tmp/minio-test-upload
test-upload      
在 minio 中檢視建立的 buket
[root@r63 soft]# ./mc ls myminio
[2021-08-03 22:00:05 CST]     0B test-dir/
[root@r63 soft]# ./mc ls myminio/test-dir
[2021-08-03 22:03:05 CST]    12B minio-test-upload      

4.3 建立 TiDB 叢集

4.3.1 使用以下的 yaml 檔案建立兩套 TiDB 叢集

其中 tidb-c1 叢集 pd,tidb,tikv 混部在 192.168.232.61 上,tidb-c2 叢集 pd,tidb,tikv 混部在 192.168.232.62 上。

[root@r60 .tiup]# cat tidb-c1.yaml
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/opt/tidb-c1/"
  data_dir: "/opt/tidb-c1/data/"

pd_servers:
  - host: 192.168.232.61
    ssh_port: 22
    name: "pd-2"
    client_port: 12379
    peer_port: 12380
    deploy_dir: "/opt/tidb-c1/pd-12379"
    data_dir: "/opt/tidb-c1/data/pd-12379"
    log_dir: "/opt/tidb-c1/log/pd-12379"
    config: {}

tidb_servers:
  - host: 192.168.232.61
    ssh_port: 22
    port: 14000
    status_port: 12080
    deploy_dir: "/opt/tidb-c1/tidb-14000"
    log_dir: "/opt/tidb-c1/log/tidb-14000"
    config: {}

tikv_servers:
  - host: 192.168.232.61
    ssh_port: 22
    port: 12160
    status_port: 12180
    deploy_dir: "/opt/tidb-c1/tikv-12160"
    data_dir: "/opt/tidb-c1/data/tikv-12160"
    log_dir: "/opt/tidb-c1/log/tikv-12160"
    config: {}      

4.3.2 檢查 TiDB 叢集

[root@r60 .tiup]# tiup cluster list
Starting component `cluster`: /root/.tiup/components/cluster/v1.5.3/tiup-cluster list
Name     User  Version  Path                                          PrivateKey
----     ----  -------  ----                                          ----------
tidb-c1  tidb  v5.1.1   /root/.tiup/storage/cluster/clusters/tidb-c1  /root/.tiup/storage/cluster/clusters/tidb-c1/ssh/id_rsa
tidb-c2  tidb  v5.1.1   /root/.tiup/storage/cluster/clusters/tidb-c2  /root/.tiup/storage/cluster/clusters/tidb-c2/ssh/id_rsa      

4.3.3 tidb-c1 叢集上生成用于備份的資料

[root@r60 ~]# mysql -uroot -P14000 -hr61 -e "create database br-test"
[root@r60 ~]# mysql -uroot -P14000 -hr61 -e "create table brtest.t1(id int, name varchar(20))"
[root@r60 ~]# for i in `seq 1 10000`; do mysql -uroot -P14000 -hr31 -e "insert into brtest.t1 values($i, 'AAAAA')"; done;      

4.4 使用 BR 将資料備份到 minio 上

相關文檔參考 使用 BR 指令行進行備份恢複

[tidb@r61 tmp]$ export AWS_ACCESS_KEY_ID=myminioid
[tidb@r61 tmp]$ export AWS_SECRET_ACCESS_KEY=myminiopasswd
[tidb@r61 tmp]$ ./br backup full --pd "r61:12379" --storage "s3://br-dir" --send-credentials-to-tikv=true --s3.endpoint "http://192.168.232.65:9000" --log-                                                   file backupfull.log
Detail BR log in backupfull.log
Full backup <-------------------------------------------------------------------------------------------------------------------------------------> 100.00%
Checksum <----------------------------------------------------------------------------------------------------------------------------------------> 100.00%
[2021/08/03 20:01:37.304 +08:00] [INFO] [collector.go:66] ["Full backup success summary"] [total-ranges=21] [ranges-succeed=21] [ranges-failed=0] [backup-c                                                   hecksum=16.098966ms] [backup-fast-checksum=2.284638ms] [backup-total-ranges=51] [backup-total-regions=51] [total-take=713.02994ms] [total-kv=12773] [total-                                                   kv-size=539.7kB] [average-speed=976.9kB/s] ["backup data size(after compressed)"=158kB] [BackupTS=426768360174256131]      

4.5 使用 BR 從 minio 恢複資料

[tidb@r62 tmp]$ export AWS_ACCESS_KEY_ID=myminioid
[tidb@r62 tmp]$ export AWS_SECRET_ACCESS_KEY=myminiopasswd
[tidb@r62 tmp]$ ./br restore full --pd "r62:12379" --storage "s3://br-dir" --send-credentials-to-tikv=true --s3.endpoint "http://192.168.232.65:9000" --log                                                   -file restorefull.log
Detail BR log in restorefull.log
Full restore <------------------------------------------------------------------------------------------------------------------------------------> 100.00%
[2021/08/03 20:27:27.013 +08:00] [INFO] [collector.go:66] ["Full restore success summary"] [total-ranges=2] [ranges-succeed=2] [ranges-failed=0] [split-reg                                                   ion=26.225236ms] [restore-checksum=6.044077ms] [restore-ranges=1] [total-take=1.727646683s] ["restore data size(after decompressed)"=93.05kB] [total-kv=100                                                   00] [total-kv-size=379.9kB] [average-speed=7.09MB/s]      

檢查 tidb-c2 叢集中的資料

[root@r60 ~]# mysql -uroot -P14000 -hr62 -e "select count(*) from brtest.t1"
+----------+
| count(*) |
+----------+
|    10000 |
+----------+      

4.6 參數及變量對應說明

以 BR 備份的指令為例

./br backup full --pd "r61:12379" \"
--storage "s3://br-dir" \"
--send-credentials-to-tikv=true \"
--s3.endpoint "http://192.168.232.65:9000" \"
--log-file backupfull.log      

其中 --storage “s3://br-dir” 表示使用 S3 存儲。

br-dir 使我們在 myminio 下建立的 buket

如果 --storage 後面的參數值為 “s3://myminio/br-dir”

[root@r63 soft]# ./mc mb myminio/test-dir-2
Bucket created successfully `myminio/test-dir-2`.

[tidb@r61 tmp]$ export AWS_ACCESS_KEY_ID=myminioid
[tidb@r61 tmp]$ export AWS_SECRET_ACCESS_KEY=myminiopasswd

[tidb@r61 tmp]$ ./br backup full --pd "r61:12379" --storage "s3://myminio/test-dir-2" --send-credentials-to-tikv=true --s3.endpoint "http://192.168.232.65:9000" --log-file backupfull.log
Detail BR log in backupfull.log
[2021/08/03 22:36:49.367 +08:00] [INFO] [collector.go:66] ["Full backup failed summary"] [total-ranges=0] [ranges-succeed=0] [ranges-failed=0]
Error: Bucket myminio is not accessible: NotFound: Not Found
        status code: 404, request id: 1697D2A802D68D43, host id: : [BR:ExternalStorage:ErrStorageInvalidConfig]invalid external storage config
        
[tidb@r61 tmp]$ ./br backup full --pd "r61:12379" --storage "s3://test-dir-2" --send-credentials-to-tikv=true --s3.endpoint "http://192.168.232.65:9000" --log-file backupfull.log
Detail BR log in backupfull.log
Full backup <----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 100.00%
Checksum <-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 100.00%
[2021/08/03 22:38:04.105 +08:00] [INFO] [collector.go:66] ["Full backup success summary"] [total-ranges=21] [ranges-succeed=21] [ranges-failed=0] [backup-checksum=10.686351ms] [backup-fast-checksum=2.559501ms] [backup-total-ranges=51] [backup-total-regions=51] [total-take=648.760226ms] [total-kv-size=539.7kB] [average-speed=1.051MB/s] ["backup data size(after compressed)"=158kB] [BackupTS=426770820880400385] [total-kv=12773]      

5. 使用 minio 進行 BR 備份的權限說明

minio 預設為我們提供了五中權限:

  • consoleAdmin
  • diagnostics
  • readonly
  • Readwrite
  • writeonly

在大多數情況下,這些權限不足以滿足複雜的業務需求。在上面的實驗中,我們使用了 admin 使用者 myminioid。在實際的業務中,我們要針對不同的角色配置設定不同的使用者與 quota。

比如說備份與恢複的場景。我們可以定義 backup-user 與 restore-user。對于 backup-user,我們可以賦予某一個 bucket 的 readwrite 權限。而對于 restore-user,我們賦予 readonly 權限。

在下面的例子中,我們完成了以下的操作

  • 建立了用于 BR 備份回複的 bucket test-bucket-br-dir
  • 針對于備份操作
  • 建立針對 test-bucket-br-dir 的 readwrite 權限 policy-readwrite-brbucket
  • 建立 user test-user-br-backup
  • 給 test-use-br-backupr 賦予 policy-readwrite-brbucket 權限
  • 針對于恢複操作
  • 建立針對 test-bucket-br-dir 的 readonly 權限 policy-readonly-brbucket
  • 建立 user test-user-br-restore
  • 給 test-user -br-restore賦予 policy-readonly-brbucket 權限

5.1 建立 bucket test-bucket-br-dir

[root@r63 soft]# export MINIO_ACCESS_KEY=myminioid
[root@r63 soft]# export MINIO_SECRET_KEY=myminiopasswd
[root@r63 soft]# ./mc mb myminio/test-bucket-br-dir
Bucket created successfully `myminio/test-bucket-br-dir`.      

5.2 針對于備份操作,建立一下的權限與使用者

5.2.1 建立針對 test-bucket-br-dir 的 readwrite 權限 policy-readwrite-brbucket

模仿 readwrite 權限,我們可以修改隻針對與 test-bucket-br-dir,在本例中,我們可以将 “arn:aws:s3:::*” 中的通配符 * 替換成指定的 bucket test-bucket-br-dir

[root@r63 soft]# export MINIO_ACCESS_KEY=myminioid
[root@r63 soft]# export MINIO_SECRET_KEY=myminiopasswd
[root@r63 soft]# ./mc admin policy info myminio readwrite
{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Effect": "Allow",
   "Action": [
    "s3:*"
   ],
   "Resource": [
    "arn:aws:s3:::*"
   ]
  }
 ]
}

[root@r63 soft]# cat policy-readwrite-br-bucket.json
{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Effect": "Allow",
   "Action": [
    "s3:*"
   ],
   "Resource": [
    "arn:aws:s3:::test-bucket-br-dir"
   ]
  }
 ]
}      

通過 policy-readwrite-br-bucket.json 檔案,我們可以建立 policy-readwrite-br-bucket 權限

[root@r63 soft]# export MINIO_ACCESS_KEY=myminioid
[root@r63 soft]# export MINIO_SECRET_KEY=myminiopasswd
[root@r63 soft]# ./mc admin policy add myminio policy-readwrite-br-bucket policy-readwrite-br-bucket.json
Added policy `policy-readwrite-br-bucket` successfully.

[root@r63 soft]# ./mc admin policy info myminio policy-readwrite-br-bucket
{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Effect": "Allow",
   "Action": [
    "s3:*"
   ],
   "Resource": [
    "arn:aws:s3:::test-bucket-br-dir"
   ]
  }
 ]
}      

5.2.2 建立 user test-user-br-backup

[root@r63 soft]# ./mc admin user add myminio test-user-br-backup test12345678
Added user `test-user-br-backup` successfully.      

6.2.3 給 test-user-br-backup 賦予 policy-readwrite-brbucket 權限

[root@r63 soft]# ./mc admin policy set myminio policy-readwrite-br-bucket  user=test-user-br-backup
Policy `policy-readwrite-br-bucket` is set on user `test-user-br-backup`      

繼續閱讀