結論前置
- 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越來越好,揚中華開源之威。