本文主要介绍了应用如何使用CockroachDB,结合之前《CockroachDB集群部署及常见问题》,业务可以快速搭建自己的集群,并进行访问使用。
数据库创建

在往期文章《CockroachDB集群部署及常见问题》中,我们部署了一个3节点3副本的CockroachDB集群,集群信息如下:
节点列表
192.168.180.21:26257
192.168.180.22:26257
192.168.180.23:26257
安装目录
/home/cockroach/CockroachDB
证书目录
/home/cockroach/CockroachDB/certs
版本信息
v1.0.4
并在每一台 CockroachDB 服务器上生成了 root 用户证书和私钥( root 用户在集群搭建完成时默认创建且拥有所有权限,开发人员可以使用 root 用户的证书和私钥登录集群),接下来主要介绍如何使用 root 用户创建库、表、新用户以及授权。
1)在服务器192.168.180.21上用 Cockroach 客户端以 root 用户连接 CockroachDB 集群:
$ cd home/cockroach/CockroachDB
$ ./cockroach sql --user=root --certs-dir=certs --port=26257 --host= 192.168.180.21
2)创建 test 库,在终端中运行命令:
> CREATE database test;
3)在 test 库中创建表 logoff,运行命令:
> SET database = 'test' ;
> CREATE TABLE logoff (
a INT PRIMARY KEY,
b INT UNIQUE,
c INT );
4)创建用户 tester ,密码 testpasswd ,运行命令:
> CREATE USER tester WITH PASSWORD 'testpasswd';
5)为 tester 用户授予对 logoff 表增删改查的权限:
> GRANT INSERT, DELETE, UPDATE, SELECT ON TABLE logoff TO tester;
CockroachDB 的权限体系如下图:
通过上述步骤,我们在 CockroachDB 集群上创建了 test 库,在 test 库中创建了 logoff 表,密码为 testpasswd 的新用户 tester ,并且为 tester 授予了对表 logoff 增删改查的权限。
负载均衡

对于 CockroachDB 集群中,所有节点地位对等,均能对外接收读写请求。业务操作CockroachDB集群时,一般需要在业务层将连接打散到集群的各个节点。为了屏蔽应用操作的复杂性,可以在应用和CockroachDB之间搭建HAProxy。CockroachDB 内置了生成 HAProxy 配置文件的功能,安装 HAProxy 后可以直接使用。
在节点192.168.180.21上生成 HAProxy 配置文件 haproxy.cfg ,生成方式:
$ cd home/cockroach/CockroachDB
$ ./cockroach gen haproxy --certs-dir=certs --host=192.168.180.21--port=26257
$ cat haproxy.cfg
global
maxconn 4096
defaults
mode tcp
# Timeout values should be configured for your specific use.
# See: https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-timeout%20connect
timeout connect 10s
timeout client 1m
timeout server 1m
# TCP keep-alive on client side. Server already enables them.
option clitcpka
listen psql
bind :26257
mode tcp
balance roundrobin
server cockroach1 192.168.180.21:26257 check
server cockroach1 192.168.180.22:26257 check
server cockroach1 192.168.180.23:26257 check
maxconn 指示该 HAProxy 最大可接受的连接数,bind 指示 HAProxy 监听端口,balance 指示负载均衡的方式,server 指示集群节点列表。
本文在192.168.180.24上部署 HAProxy 进程,提供负载均衡服务:
1)配置 HAProxy 工作目录
$ mkdir home/haproxy/haproxy
2)启动 HAProxy
将配置文件 haproxy.cfg 放置在目录 /home/haproxy/haproxy 下,安装 HAProxy 后启动方式如下 :
$ haproxy -f haproxy.cfg -D
下图是当前 CockroachDB 服务的流量模型,客户端首先与 haproxy server 建立连接,haproxy 会以轮询的方式将流量分发到后面三个 cockroach server。
现在,经过上述步骤,已经完成了建库、建表、新建用户和授权工作,并为CockroachDB集群配置负载均衡功能。DBA 可以将 tester 用户提供给业务方使用,业务可以在任何机器上通过 tester 用户使用 cockroach 或者 psql 客户端或者其他开发语言连接至 haprxoy server,进行数据的存储,提取和修改工作。
连接

连接集群所需信息如下:
库名
test
用户
tester
密码
testpasswd
入口
192.168.180.24:26257
下面介绍客户端和程序语言方式连接 CockroachDB 数据库的方法:
1 ) cockroach 客户端
CockroachDB 提供了两种用 Cockroach 客户端连接数据库的方法:
方法一
url格式:url=postgresql://youruser:passwd@host:port/yourdb
youruser
已经授权的用户
passwd
用户密码
host:port
CockroachDB集群流量入口
yourdb
指要连接的数据库
本集群连接示例:
$ cd home/cockroach/CockroachDB
$ ./cockroach sql --url=postgresql://'tester':'testpasswd'@192.168.180.24:26257/test
方法二
使用证书方式要求业务通过证书和私钥连接 CockroachDB。
tester 用户证书和私钥的生成方法同 root用户,生成命令:
$ cd home/cockroach/CockroachDB
$ ./cockroach cert create-client tester --certs-dir=certs --ca-key=certs/ca.key --overwrite
上述操作生成的证书文件client.tester.crt和client.tester.key。随后,DBA将证书ca.crt,client.tester.crt 和client.tester.key (三者缺一不可)交付业务,假定证书存放在目录 certs-tester 中,使用 cockroach 登录:
$ ./cockroach sql --user=tester --certs-dir=certs-tester --port=26257--host=192.168.180.24
2 ) psql 客户端
运行登录命令:
$ psql -h 192.168.180.24 -p 26257 -U tester -d test -W
按提示输入密码 testpasswd 即可登录。登录时可能会报错如下:
psql: SSL error: tlsv1 alert protocol version
ERROR: cleartext connections are not permitted
这是由于本地 openssl 或者 postgresql 版本太低导致,升级之后可以正常使用,推荐使用 CentOS 7 操作系统,避免上述问题。
3) Python 连接
使用 Python 连接至 CockroachDB 需要安装 psycopg2 (官网 :http://initd.org/psycopg/docs/install.html)库,安装方法如下:
$ pip install psycopg2
使用时可能遭遇psql客户端一样的问题,推荐使用 CentOS 7。
Python连接数据库示例:
# Import the driver.
import psycopg2
# Connect to the "bank" database.
conn = psycopg2.connect(database='test',user='tester',host='192.168.180.24', port=26257,password='testpasswd')
conn = psycopg2.connect(database='test',user='tester',host='192.168.180.24',
port=
26257,password='testpasswd')
# Open a cursor to perform database operations.
cur = conn.cursor()
# Create the "accounts" table.
cur.execute("show tables)")
# Print out the balances.
rows = cur.fetchall()
print rows
# Close the database connection.
cur.close()
conn.close()
其他程序语言连接CockroachDB方法,请查看链接https://www.cockroachlabs.com/docs/stable/build-an-app-with-cockroachdb.html
CockroachDB SQL语法请参看链接https://www.cockroachlabs.com/docs/stable/sql-statements.html
关于我们:我们是百度DBA团队,团队有两位CockroachDB PMC Member及一位Contributor, 目前正积极推动NewSQL在百度内部以及外部的发展。除了NewSQL, 我们在MySQL, PostgreSQL, GreenPlum有多年的内核开发经验及实践经验,对数据库和大数据领域有疑问或者需求欢迎联系我们,同时欢迎有志青年加入我们!
关注我们
