蟑螂是地球上适应性最强的物种之一。它们能在无氧环境下存活45分钟,在没有食物的情况下存活超过一个月。甚至就算身首异处也无法让小强当场毙命——他们的身体没了头都还能活好几天。
在像 Google,Amazon 和 Facebook 这样的科技巨头内部,掌握领先技术的工程师们也在让他们自己的网站像小强一样顽强。如果一台服务器宕机,一个服务器集群宕机,或者整个数据中心电力中断,那这些网站每一秒都在损失大量收入。
现在,一个开源开发者小组想让每一家公司都能够通过使用这种完全基于网络的云计算系统来搭建如小强般顽强的网站。他们为项目命名为“CockroachDB”(“小强DB”),在宣传中称该项目是“具有超强生命力的数据库”。或许蟑螂被用在软件命名中很违和,但联合创始人 Spencer Kimball —— 一名前 Google 工程师 —— 则认为只有小强才能配得上他们的项目。
“这个名字代表了项目最重要的两大特征:首先不用说,是生存性,其次是一种近乎自主的散布性”。
和很多其他同类型的开源项目一样,CockroachDB 的灵感来自于一份 Google 的研究论文,这篇论文详细地介绍了一种叫做“Spanner”的大型系统。Spanner 将允许 Google 将数据分布到全球上百个数据中心的上百万台服务器。系统的开发大约会耗时5年。
目前项目还处于 α 阶段的开发,离实际应用还很遥远。但 CockroachDB 小组也是现在唯一一个致力于实现 Spanner 系统的开发组。不少参与项目的开发者都曾就职于 Google,但没有一个参与过 Spanner 项目。这其中,最出名的 Photoshop 开源替代产品 GIMP 的的联合创始人 Spencer Kimball 和 Peter Mattis 曾帮助开发 Google 的大型文件存储系统,也就是 Colossus;Ben Darnell 曾参与过 Google Reader 开发,而 Andy Bonventre 则参与过 Chrome 和 Google Tasks 的开发。
CockroachDB 并没有尝试复制 Spanner 最不寻常的理念——用原子钟来让全球各地的数据中心时间同步。考虑到大多数线上应用都没有达到 Google 的规模,他们或许不需要这样的功能。Kimball 表示,这些公司真正需要的是是有一种稳定可靠的方式来让数据自动复制和同步到各个数据中心的服务器里,这样就算一个数据中心倒下了,应用还能正常运行,这也是 CockroachDB 的目标。
转自:CockroachDB —— 像小强一样坚不可摧的数据库
1、 下载cockroachDB二进制文件
[root@ dcs-01 ~]# wget https://binaries.cockroachdb.com/cockroach-latest.linux-amd64.tgz
2、 解压文件
[root@dcs-01 ~]# tar xfz cockroach-latest.linux-amd64.tgz
[root@dcs-01 ~]# cp cockroach-latest.linux-amd64/ cockroach /usr/local/bin/
[root@dcs-01 ~]# scp /usr/local/bin/cockroach dev2:/usr/local/bin
1、 启动第1个节点
[root@dcs-01 ~]# cockroach start --insecure --host=dcs-01 --background --http-port=8081
CockroachDB node starting at 2017-03-02 17:59:35.757366168 +0800 CST
build: CCL 9648163 @ 2017/02/13 19:27:00 (go1.7.5)
admin: http://dcs-01:8081
sql: postgresql://root@dcs-01:26257?sslmode=disable
logs: cockroach-data/logs
store[0]: path=cockroach-data
status: initialized new cluster
clusterID: 255b11fe-d801-4b06-9efc-db7baa3fccbf
nodeID: 1
说明: –store=指定存储位置 –http-port=指定web端口。多节点集群部署时,在启动命令中要加上–insecure –host=,否则其它节点会连接不到第1个节点。
配置安全连接参考:https://www.cockroachlabs.com/docs/secure-a-cluster.html
2、 启动第2个节点
[root@dcs-02 ~]# cockroach start --insecure --host=dcs-02 --background --http-port
CockroachDB node starting at 2017-03-02 18:06:44.519846508 +0800 CST
build: CCL 9648163 @ 2017/02/13 19:27:00 (go1.7.5)
admin: http://dcs-02:8081
sql: postgresql://root@dcs-02:26257?sslmode=disable
logs: /opt/cockroach-data/logs
store[0]: path=/opt/cockroach-data
status: initialized new node, joined pre-existing cluster
clusterID: 255b11fe-d801-4b06-9efc-db7baa3fccbf
nodeID: 2
说明:启动时要求各节点时间同步。
3、 启动第3个节点
[root@dcs-03 ~]# cockroach start --insecure --host=dcs-03 --background --http-port
CockroachDB node starting at 2017-03-02 18:07:59.945175342 +0800 CST
build: CCL 9648163 @ 2017/02/13 19:27:00 (go1.7.5)
admin: http://dcs-03:8081
sql: postgresql://root@dcs-03:26257?sslmode=disable
logs: /opt/cockroach-data/logs
store[0]: path=/opt/cockroach-data
status: initialized new node, joined pre-existing cluster
clusterID: 255b11fe-d801-4b06-9efc-db7baa3fccbf
nodeID: 3
4、 sql命令行
[root@dcs-01 ~]# cockroach sql --url=postgresql://root@dcs-01:26257?sslmode=disab
# Welcome to the cockroach SQL interface.
# All statements must be terminated by a semicolon.
# To exit: CTRL + D.
root@dcs-01:26257/>
root@dcs-01:26257/> create database bank;
CREATE DATABASE
root@dcs-01:26257/> set database = bank;
SET
root@dcs-01:26257/bank> create table accounts (id INT PRIMARY KEY, balance DECIMAL);
CREATE TABLE
root@dcs-01:26257/bank> INSERT INTO accounts VALUES (1234, 10000);
INSERT 1
root@dcs-01:26257/bank> SELECT * FROM accounts;
+------+---------+
| id | balance |
+------+---------+
| 1234 | 10000 |
+------+---------+
(1 row)
1、 登录http://:8081 进入web界面,查看集群运行状态
[root@ dcs-01 ~]# cockroach quit --host=dcs-01
[root@ dcs-01 ~]# cockroach quit --host=dcs-02
[root@ dcs-01 ~]# cockroach quit --host=dcs-03
只是语法稍有区别(字段后缀和语句后缀均可,无任何差异,见下面例子); “on delete cascade”语法crdb不支持,删除即可。
外键的第一种写法(字段后缀写法):
DROP TABLE IF EXISTS xxx.IDN_OAUTH1A_REQUEST_TOKEN;
CREATE TABLE xxx.IDN_OAUTH1A_REQUEST_TOKEN (
REQUEST_TOKEN VARCHAR(512),
REQUEST_TOKEN_SECRET VARCHAR(512),
CONSUMER_KEY_ID INTEGER REFERENCES xxx.IDN_OAUTH_CONSUMER_APPS(ID),
CALLBACK_URL VARCHAR(1024),
SCOPE VARCHAR(2048),
AUTHORIZED VARCHAR(128),
OAUTH_VERIFIER VARCHAR(512),
AUTHZ_USER VARCHAR(512),
TENANT_ID INTEGER DEFAULT -1,
PRIMARY KEY (REQUEST_TOKEN)
);
外键的第二种写法(语句后缀写法):
DROP TABLE IF EXISTS xxx.IDN_OAUTH2_ACCESS_TOKEN;
CREATE TABLE xxx.IDN_OAUTH2_ACCESS_TOKEN (
TOKEN_ID VARCHAR (255),
ACCESS_TOKEN VARCHAR(255),
REFRESH_TOKEN VARCHAR(255),
CONSUMER_KEY_ID INTEGER,
AUTHZ_USER VARCHAR (100),
TENANT_ID INTEGER,
USER_DOMAIN VARCHAR(50),
USER_TYPE VARCHAR (25),
GRANT_TYPE VARCHAR (50),
TIME_CREATED TIMESTAMP,
REFRESH_TOKEN_TIME_CREATED TIMESTAMP,
VALIDITY_PERIOD BIGINT,
REFRESH_TOKEN_VALIDITY_PERIOD BIGINT,
TOKEN_SCOPE_HASH VARCHAR(32),
TOKEN_STATE VARCHAR(25) DEFAULT 'ACTIVE',
TOKEN_STATE_ID VARCHAR (128) DEFAULT 'NONE',
SUBJECT_IDENTIFIER VARCHAR(255),
PRIMARY KEY (TOKEN_ID),
FOREIGN KEY (CONSUMER_KEY_ID) REFERENCES xxx.IDN_OAUTH_CONSUMER_APPS(ID),
CONSTRAINT CON_APP_KEY UNIQUE (CONSUMER_KEY_ID,AUTHZ_USER,TOKEN_ID,USER_DOMAIN,USER_TYPE,TOKEN_SCOPE_HASH,
TOKEN_STATE,TOKEN_STATE_ID)
);
SEQUENCE类型CRDB没有,但CRDB使用SERIAL,更灵活。
例如原始语句:
CREATE TABLE IDN_OAUTH_CONSUMER_APPS (
ID INTEGER DEFAULT NEXTVAL('IDN_OAUTH_CONSUMER_APPS_PK_SEQ'),
CONSUMER_KEY VARCHAR(255),
CONSUMER_SECRET VARCHAR(512),
USERNAME VARCHAR(255),
TENANT_ID INTEGER DEFAULT 0,
USER_DOMAIN VARCHAR(50),
APP_NAME VARCHAR(255),
OAUTH_VERSION VARCHAR(128),
CALLBACK_URL VARCHAR(1024),
GRANT_TYPES VARCHAR (1024),
PKCE_MANDATORY CHAR(1) DEFAULT '0',
PKCE_SUPPORT_PLAIN CHAR(1) DEFAULT '0',
CONSTRAINT CONSUMER_KEY_CONSTRAINT UNIQUE (CONSUMER_KEY),
PRIMARY KEY (ID)
);
对于CRDB则改为:
CREATE TABLE xxx.IDN_OAUTH_CONSUMER_APPS (
ID SERIAL,
CONSUMER_KEY VARCHAR(255),
CONSUMER_SECRET VARCHAR(512),
USERNAME VARCHAR(255),
TENANT_ID INTEGER DEFAULT 0,
USER_DOMAIN VARCHAR(50),
APP_NAME VARCHAR(255),
OAUTH_VERSION VARCHAR(128),
CALLBACK_URL VARCHAR(1024),
GRANT_TYPES VARCHAR (1024),
PKCE_MANDATORY CHAR(1) DEFAULT '0',
PKCE_SUPPORT_PLAIN CHAR(1) DEFAULT '0',
CONSTRAINT CONSUMER_KEY_CONSTRAINT UNIQUE (CONSUMER_KEY),
PRIMARY KEY (ID)
);
DEFAULT NULL, 在CRDB中的处理是:不指定”DEFAULT”的修饰就会使用默认值指定为NULL。
DEFAULT ‘0’ 改为 DEFAULT False; DEFAULT ‘1’ 改为 DEFAULT True。
安装参考:https://www.cockroachlabs.com/docs/manual-deployment.html
语法参考:https://www.cockroachlabs.com/docs/data-types.html