Cockroach數據庫初體驗

結論前置

  1. CR(筆者對cockroach的簡稱)數據庫的產品體驗比TIDB要好,例如官網、文檔、部署維護、後臺管理、監控,當然這裏不是說tidb不好,tidb兼容mysql協議就非常棒,而且中文文檔和中文的客服支持也是極棒的。

2.CR對標準sql的支持比較完善,詳情見sql特性支持 sql語句

3.單節點性能大概是postgre數據庫的60%,延遲抖動控制的較好

4.整體上手速度很快,從看文檔、搭建環境到修改一個應用爲postgre連接併成功的運行起來,大概1個小時左右

5.吐槽一下簡書,代碼高亮很不完善,估計是hilight.js中只引入了少數所謂主流語言的插件

下載

下載地址

下載極其簡單,只要下載獲得cockroach的binary文件(Go語言的可執行文件)即可

安裝

安裝文檔

本文使用以下三個節點(host爲虛構)

節點 Host
1 10.100.1.1
2 10.100.1.2
3 10.100.1.3
啓動常用啓動參數 描述
–insecure 不啓用TLS加密模式,建議非生產環境使用
–host 數據庫監聽地址,默認爲本機的外網IP
–port 數據庫監聽端口,默認爲26257
–http-port HTTP請求的端口,比如後臺管理服務,默認爲8089
查看詳細 cockroach start -h
啓動節點1
cockroach start --insecure 

啓動成功後能看到以下命令行提示(請忽略裏面的主機信息):

* WARNING: RUNNING IN INSECURE MODE!
*
* - Your cluster is open for any client that can access <all your IP addresses>.
* - Any user, even root, can log in without providing a password.
* - Any user, connecting as root, can read or write any data in your cluster.
* - There is no network encryption nor authentication, and thus no confidentiality.
*
* Check out how to secure your cluster: https://www.cockroachlabs.com/docs/stable/secure-a-cluster.html
*

sf:cockroach-v1.1.2.darwin-10.9-amd64 sf$ CockroachDB node starting at 2017-11-04 03:57:55.322402865 +0000 UTC (took 1.0s)
build:      CCL v1.1.2 @ 2017/11/02 19:30:00 (go1.8.3)
admin:      http://sf.local:9090
sql:        postgresql://[email protected]:26257?application_name=cockroach&sslmode=disable
logs:       /Users/sf/Downloads/cockroach-v1.1.2.darwin-10.9-amd64/cockroach-data/logs
store[0]:   path=/Users/sf/Downloads/cockroach-v1.1.2.darwin-10.9-amd64/cockroach-data
status:     restarted pre-existing node
clusterID:  514ebcce-7320-4d72-b2db-b618c0b404bf
nodeID:     1

這裏有三點需要注意
- admin: 後臺管理地址
- logs: 日誌位置
- store: 數據存儲位置

其中logs和store位置都可以在啓動參數中指定

依次啓動節點2和3
cockroach start --insecure --join=10.100.1.1:26257

如果三個節點是部署在同一臺機器

cockroach start \
--insecure \
--store=node2 \
--host=localhost \
--port=26258 \
--http-port=8081 \
--join=localhost:26257
結果查驗

至此所有節點都啓動成功,我們來看看集羣是否搭建成功:
訪問任意節點的後臺管理http://host:8080例如http://10.100.1.2:8080

可以看到以下界面(以下所有圖裏的節點地址和我們的三個虛擬節點地址不一致,因爲筆者週末在家臨時搭建了一套集羣):

後臺管理首頁

  • 正中間區域是總體監控圖,可以在Dashboard中選擇更多的監控維度,具體的監控項解釋可以把鼠標移動到歎號上查看
  • 右邊是集羣狀態和集羣重要事件通知

下面我們選擇View nodes list,進入以下界面:

集羣節點狀態

  • 這裏能看到每個節點的狀態
  • Bytes和Replicas代表了數據的分佈,因爲CR每份數據默認是存三份,我們恰好三個節點,因此每個節點存一份,最終三個節點存儲的bytes和replicas會同步一致,實際上tidb也差不多是這個原理,都是基於谷歌的f1和spanner論文產生的
  • 點擊logs可以查看每個節點的詳細日誌

至此所有的安裝就結束了,下面開始簡單的使用之旅

CR客戶端

CR的客戶端其實就是CR本身,是不是很爽?服務器程序和客戶端程序都是同一個執行文件。

連接數據庫

用戶可以選擇連接到三臺服務器上去使用CR客戶端,也可以在開發機(本地電腦)安裝一個CR客戶端(適合當前系統的cockroach可執行程序),這裏我們選擇在本地電腦上遠程連接,可以連接三臺服務器中的任何一臺:

cockroach sql --insecure --host=10.100.1.2 --port=26257

連接成功後,在命令行輸入

show databases; 

查看默認存在的數據庫

CR客戶端命令文檔

一個簡單的例子

我們以Go語言爲例,來看看怎麼連接數據庫並進行簡單的操作

下載go驅動
go get -u -v github.com/lib/pq
創建用戶maxroach
cockroach user set maxroach --insecure --host=10.100.1.2 --port=26257
創建數據庫
cockroach sql --insecure -e 'CREATE DATABASE bank' --host=10.100.1.2 --port=26257

這裏我們直接使用客戶端的外部命令,用戶也可以進入客戶端命令行,使用sql命令創建

給用戶授權
cockroach sql --insecure -e 'GRANT ALL ON DATABASE bank TO maxroach'
代碼連接數據庫
package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/lib/pq"
)

func main() {
    // Connect to the "bank" database.
    db, err := sql.Open("postgres", "postgresql://[email protected]:26257/bank?sslmode=disable")
    if err != nil {
        log.Fatal("error connecting to the database: ", err)
    }

    // Create the "accounts" table.
    if _, err := db.Exec(
        "CREATE TABLE IF NOT EXISTS accounts (id INT PRIMARY KEY, balance INT)"); err != nil {
        log.Fatal(err)
    }

    // Insert two rows into the "accounts" table.
    if _, err := db.Exec(
        "INSERT INTO accounts (id, balance) VALUES (1, 1000), (2, 250)"); err != nil {
        log.Fatal(err)
    }

    // Print out the balances.
    rows, err := db.Query("SELECT id, balance FROM accounts")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    fmt.Println("Initial balances:")
    for rows.Next() {
        var id, balance int
        if err := rows.Scan(&id, &balance); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("%d %d\n", id, balance)
    }
}

運行代碼

go run basic-sample.go

結果

Initial balances:
1 1000
2 250
使用事務(包含重試邏輯)
package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"

    "github.com/cockroachdb/cockroach-go/crdb"
)

func transferFunds(tx *sql.Tx, from int, to int, amount int) error {
    // Read the balance.
    var fromBalance int
    if err := tx.QueryRow(
        "SELECT balance FROM accounts WHERE id = $1", from).Scan(&fromBalance); err != nil {
        return err
    }

    if fromBalance < amount {
        return fmt.Errorf("insufficient funds")
    }

    // Perform the transfer.
    if _, err := tx.Exec(
        "UPDATE accounts SET balance = balance - $1 WHERE id = $2", amount, from); err != nil {
        return err
    }
    if _, err := tx.Exec(
        "UPDATE accounts SET balance = balance + $1 WHERE id = $2", amount, to); err != nil {
        return err
    }
    return nil
}

func main() {
    db, err := sql.Open("postgres", "postgresql://maxroach@localhost:26257/bank?sslmode=disable")
    if err != nil {
        log.Fatal("error connecting to the database: ", err)
    }

    // Run a transfer in a transaction.
    err = crdb.ExecuteTx(context.Background(), db, nil, func(tx *sql.Tx) error {
        return transferFunds(tx, 1 /* from acct# */, 2 /* to acct# */, 100 /* amount */)
    })
    if err == nil {
        fmt.Println("Success")
    } else {
        log.Fatal("error: ", err)
    }
}

這裏我們引用了”github.com/cockroachdb/cockroach-go/crdb”,因爲CR的事務重試邏輯封裝在裏面。

執行結果:

Success

查詢結果

cockroach sql --insecure -e 'SELECT id, balance FROM accounts' --database=bank --host=10.100.1.1 --port=26257

+----+---------+
| id | balance |
+----+---------+
|  1 |     900 |
|  2 |     350 |
+----+---------+
(2 rows)
寫在最後

至此,我們初體驗該結束了,相信大家也學會了怎麼搭建集羣和寫代碼去訪問數據庫了,後面有更多的感悟,我會繼續完善這個系列。

總之,Cockroach真的是一個很不錯也很有潛力的數據庫,同時衷心的祝願國產的Tidb越來越好,揚中華開源之威。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章