3.7 配置复制区域
在cockroachDB中,使用replication zones(副本区域)去控制数据集副本的位置和数量,在复本第一次添加和重新平衡保证集群平衡,最初,是整个集群有一个单独的默认的副本区域。可以根据需要针对单个数据库或单个表调整默认的区域或者添加区域。例如:在一个单独的数据中心中,可以使用默认区域去正常的复制多数数据,创建明确的区域进行多数据中心,跨地理位置的某个数据库或者表的高级复制。
本页将解释,复制区域如何工作,如何使用replication zone
注意:目前只有root用户可以配置副本集区域。
**概要
--副本区域级别
--副本区域格式
--副本区域约束
--节点/副本 推荐
**子命令
**概要
**标志
--通用
--日志
**基本实例
--查看默认副本区域
--编辑副本区域
--针对数据库创建副本区域
--针对表创建副本区域
--针对系统ranges创建副本区域
--通过命令行隐式发送命令语句
**基于情景的例子
--副本跨越数据中心
--不同数据库的多应用写
--对于明确table更严格的复制
--调整系统range的副本
3.7.1 概要
**复制区域级别
集群:cockroachDB在整个集群使用单独的默认的副本区域,
数据库:对明确的数据库添加复制区域。
表:对明确的表添加副本区域
当复制一块数据,cockroachDB使用可用的块状区域:如果有一个包含表数据的副本区域,cockroachDB使用它,否则使用包含数据库数据的副本区域,如果没有应用的表或者数据库副本区域,cockroachDB使用集群集的副本区域。
例外,数据库和表可以使用SQL可视,cockroachDB存储内部数据在系统ranges里,如果你想覆盖集群级设置,对于这些内部的数据range也可以配置副本区域
**复制区域格式
使用Yaml格式
range_min_bytes:<size-in-bytes>
range_max_bytes:<size-in-bytes>
gc:
ttlseconds:<time-in-seconds>
num_replicas:<number-of-replicas>
constraints: [comma-separated constraint list]
range_min_bytes:还没实现
range_max_bytes:一个区域的一份range数据的最大值,当range达到这个值,将分成2个,默认64MiB
ttlseconds:在垃圾回收之前保存的重写时间,如果值频繁的重写,最小值可以保存在磁盘空间中;对于AS OF SYSTEM TIME语句,允许更大的值增加range 。即时间旅行。
root@:26260/bank>select * from accounts;
+-----+----------+
| id | balance |
+-----+----------+
| 1 | 1000.50 |
| 2 | 2001.00 |
| 3 | 2001.00 |
| 5 | 2001.00 |
| 6 | 4002.00 |
| 7 | 2001.00 |
| 10 | 4002.00 |
| 14 | 4002.00 |
| 15 | 4002.00 |
| 21 | 4002.00 |
| 30 | 8004.00 |
| 35 | 4002.00 |
| 42 | 8004.00 |
| 70 | 8004.00 |
| 105 | 8004.00 |
| 210 | 16008.00 |
+-----+----------+
(16 rows)
Time: 8.61519ms
root@:26260/bank>select clock_timestamp();
+----------------------------------+
| clock_timestamp() |
+----------------------------------+
| 2018-01-2507:27:08.356861+00:00 |
+----------------------------------+
(1 row)
Time: 1.871336ms
root@:26260/bank>SELECT * FROM accounts as of system time '2018-1-25 07:00:00';
+----+---------+
| id | balance |
+----+---------+
| 1 | 1000.50 |
+----+---------+
(1 row)
Time: 20.559177ms
不推荐设置小于600(10min),导致长查询。所有版本的行存储在一个单独的range中从不分片,不推荐设置这么高,到时一行数据在同一时代的索引更改可以达到64MB,超大的range将导致服务耗尽memory或者其他问题。默认:90000(25小时)
Num_replicas: 区域副本集的数量,默认为3
约束:一个comma-separated的要求列表,或者禁止约束影响副本集位置。默认没有约束,cockroachDB在每个副本在一个独一无二的节点,试图分发副本即使跨位置。
**副本约束
副本的位置,在复本第一次添加和重新平衡保证集群平衡,基于节点的描述属性和在区域配置中的约束集相互左右。
节点指定的描述属性
3.7.2 命令
# List all replicationzones:
cockroach zone ls<flags>
# View the defaultreplication zone for the cluster:
cockroach zone get.default <flags>
# View thereplication zone for a database:
cockroach zone get<database> <flags>
# View thereplication zone for a table:
cockroach zone get<database.table> <flags>
# Edit the defaultreplication zone for the cluster:
cockroach zone set.default --file=<zone-content.yaml> <flags>
# Create/edit thereplication zone for a database:
cockroach zone set<database> --file=<zone-conent.yaml> <flags>
# Create/edit thereplication zone for a table:
cockroach zone set<database.table> --file=<zone-content.yaml> <flags>
# Remove thereplication zone for a database:
cockroach zone rm<database> <flags>
# Remove thereplication zone for a table:
cockroach zone rm<database.table> <flags>
# View help:
cockroach zone--help
cockroach zone ls--help
cockroach zone get--help
cockroach zone set--help
cockroach zone rm--help
查看更多flag
https://www.cockroachlabs.com/docs/stable/configure-replication-zones.html#flags
3.7.3 示例
[root@localhostcockroach-v1.1.4]# cockroach zone ls --certs-dir=certs --port=26260
# Server version:CockroachDB CCL v1.1.4 (linux amd64, built 2018/01/08 17:32:42,go1.8.3) (same version as client)
# Cluster ID:c2e1f825-f663-433f-80fa-6db8ed05023d
.default
[root@localhostcockroach-v1.1.4]# cockroach zone get .default --certs-dir=certs--port=26260
# Server version:CockroachDB CCL v1.1.4 (linux amd64, built 2018/01/08 17:32:42,go1.8.3) (same version as client)
# Cluster ID:c2e1f825-f663-433f-80fa-6db8ed05023d
.default
range_min_bytes:1048576
range_max_bytes:67108864
gc:
ttlseconds: 90000
num_replicas: 3
constraints: []
在Yaml文件中,只需要添加需要修改的参数
[root@localhostcockroach-v1.1.4]# echo 'num_replicas: 7'|cockroach zone set bank--certs-dir=certs --port=26260
Error: error readingzone config: no filename specified with -f
Failed running"zone"
[root@localhostcockroach-v1.1.4]# echo 'num_replicas: 7'| cockroach zone set bank--certs-dir=certs --port=26260 -f -
range_min_bytes:1048576
range_max_bytes:67108864
gc:
ttlseconds: 90000
num_replicas: 7
constraints: []
[root@localhostcockroach-v1.1.4]# cockroach zone set bank.accounts --certs-dir=certs--port=26260 -f table_zone.yaml
# Server version:CockroachDB CCL v1.1.4 (linux amd64, built 2018/01/08 17:32:42,go1.8.3) (same version as client)
# Cluster ID:c2e1f825-f663-433f-80fa-6db8ed05023d
range_min_bytes:1048576
range_max_bytes:67108864
gc:
ttlseconds: 90000
num_replicas: 5
constraints: []
[root@localhostcockroach-v1.1.4]# cat table_zone.yaml
num_replicas: 5
通过SQL接口,数据库和表是可视的,cockroachDB存储额外的数据在系统range,有3个系统range副本区域策略可以设置:
.meta: 包含集群中所有数据的位置的认证信息,如果集群运行在多数据中心,这是最佳实践,配置元range在每个数据中心存在一个副本。
.system: 配置控制副本集内部重要数据的种类,包括需要的信息分配到新的表IDs,跟踪集群中节点的健康度。
.timeseries: 包含集群中监控数据,用于显示cockroachDB的admin UI 图表。
[root@localhost cockroach-v1.1.4]# cockroach zone set bank.accounts --certs-dir=certs --port=26260 --echo-sql -f table_zone.yaml
> SELECT * FROM crdb_internal.node_build_info
# Server version: CockroachDB CCL v1.1.4 (linux amd64, built 2018/01/08 17:32:42, go1.8.3) (same version as client)
# Cluster ID: c2e1f825-f663-433f-80fa-6db8ed05023d
> BEGIN
> SAVEPOINT cockroach_restart
> SELECT id FROM system.namespace WHERE "parentID" = $1 AND name = $2
> SELECT id FROM system.namespace WHERE "parentID" = $1 AND name = $2
> SELECT config FROM system.zones WHERE id = $1
> UPSERT INTO system.zones (id, config) VALUES ($1, $2)
range_min_bytes: 1048576
range_max_bytes: 67108864
gc:
ttlseconds: 90000
num_replicas: 5
constraints: []
> RELEASE SAVEPOINT cockroach_restart
> COMMIT
3.7.4 基于场景的例子
*在数据中心间的复制
场景:
--有6个节点跨越3个数据中心,每个数据中心2个节点
--数据复制3遍,副本在3个数据中心平衡
# Start the two nodes in datacenter 1:
cockroach start --insecure --host=<node1 hostname>--locality=datacenter=us-1
cockroach start --insecure --host=<node2 hostname>--locality=datacenter=us-1\
--join=<node1 hostname>:27257
# Start the two nodes in datacenter 2:
cockroach start --insecure --host=<node3 hostname>--locality=datacenter=us-2\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node4 hostname>--locality=datacenter=us-2\
--join=<node1 hostname>:27257
# Start the two nodes in datacenter 3:
cockroach start --insecure --host=<node5 hostname>--locality=datacenter=us-3\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node6 hostname>--locality=datacenter=us-3\
--join=<node1 hostname>:27257
不需要配置区域参数更改,默认情况下,集群配置副本数据3次,即使没有外部约束,集群也会分发副本在本地数据节点。
**对于不同数据库的多应用写
--你有2个独立的应用连接相同cockroachDB集群,每个应用使用不同的数据库。
--有6个节点跨越2个数据中心,每个数据中心3个节点
--应用1数据被复制5次,副本跨越在数据中心平衡
--应用1数据被复制3次,所有副本在单独的数据中心
1.启动节点
# Start the three nodes in datacenter 1:
cockroach start --insecure --host=<node1 hostname>--locality=datacenter=us-1
cockroach start --insecure --host=<node2 hostname> --locality=datacenter=us-1\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node3 hostname>--locality=datacenter=us-1\
--join=<node1 hostname>:27257
# Start the three nodes in datacenter 2:
cockroach start --insecure --host=<node4 hostname>--locality=datacenter=us-2\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node5 hostname>--locality=datacenter=us-2\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node6 hostname>--locality=datacenter=us-2\
--join=<node1 hostname>:27257
2. 在任意节点,应用1使用针对数据库配置副本区域
# Create a YAML file with the replica count set to 5:
cat app1_zone.yaml
num_replicas: 5
# Apply the replication zone to the database used byapplication 1:
cockroach zoneset app1_db --insecure -f app1_zone.yaml
range_min_bytes: 1048576
range_max_bytes: 67108864
gc:
ttlseconds: 86400
num_replicas: 5
constraints: []
应用1数据不需要配置。所有节点在本地数据中心,集群将自动平衡数据库里的数据在数据中心1和2
3. 在任意节点,为应用2配置数据库的副本集区域
# Create a YAML file with 1 datacenter as a requiredconstraint:
cat app2_zone.yaml
constraints: [+datacenter=us-2]
# Apply the replication zone to the database used byapplication 2:
cockroach zoneset app2_db --insecure -f app2_zone.yaml
range_min_bytes: 1048576
range_max_bytes: 67108864
gc:
ttlseconds: 86400
num_replicas: 3
constraints: [+datacenter=us-2]
需要约束,强制应用2只使用在us-2数据中心
**对于明确的表的更严格的复制
--你有7个节点,5个使用SSD,2个使用HDD
--数据副本默认3个
--速度和可用性是重要的对于频繁获取的明确的表,想要数据在表中复制5次,节点都在SSD驱动盘中。
1.启动cockroach
# Start the 5 nodes with SSD storage:
cockroach start --insecure --host=<node1 hostname>--store=path=node1,attrs=ssd
cockroach start --insecure --host=<node2 hostname>--store=path=node2,attrs=ssd\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node3 hostname>--store=path=node3,attrs=ssd\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node4 hostname>--store=path=node4,attrs=ssd\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node5 hostname>--store=path=node5,attrs=ssd\
--join=<node1 hostname>:27257
# Start the 2 nodes with HDD storage:
cockroach start --insecure --host=<node6 hostname>--store=path=node6,attrs=hdd\
--join=<node1 hostname>:27257
cockroach start --insecure --host=<node7 hostname>--store=path=node2,attrs=hdd\
--join=<node1 hostname>:27257
2. 在任意节点,配置对于表的严格的副本区域
# Create a YAML file with the replica count set to 5
# and the ssd attribute as a required constraint:
cat table_zone.yaml
num_replicas: 5
constraints: [+ssd]
# Apply the replication zone to the table:
cockroach zoneset db.important_table --insecure -f table_zone.yaml
range_min_bytes: 1048576
range_max_bytes: 67108864
gc:
ttlseconds: 86400
num_replicas: 5
constraints: [+ssd]
表中数据复制5遍,需要约束将表中数据放在ssd驱动盘节点中。
**调整系统range的副本集
场景:
--节点跨越7个数据中心
--数据默认复制5遍
--为了更好的性能,你希望每个数据中心有一份元数据的副本
--为了节约磁盘空间,需要内部时间序列默认复制三次
1. 在不同数据中心启动节点
$ cockroach start --insecure --host=<node1 hostname>--locality=datacenter=us-1
$ cockroach start --insecure --host=<node2 hostname>--locality=datacenter=us-2 \
--join=<node1hostname>:27257
$ cockroach start --insecure --host=<node3 hostname>--locality=datacenter=us-3 \
--join=<node1hostname>:27257
$ cockroach start --insecure --host=<node4 hostname>--locality=datacenter=us-4 \
--join=<node1hostname>:27257
$ cockroach start --insecure --host=<node5 hostname>--locality=datacenter=us-5 \
--join=<node1hostname>:27257
$ cockroach start --insecure --host=<node6 hostname>--locality=datacenter=us-6 \
--join=<node1hostname>:27257
$ cockroach start --insecure --host=<node7 hostname>--locality=datacenter=us-7 \
--join=<node1hostname>:27257
2.在任意的节点,配置默认的副本集区域
echo'num_replicas: 5'| cockroach zone
set.default --insecure -f -
range_min_bytes: 1048576
range_max_bytes: 67108864
gc:
ttlseconds: 86400
num_replicas: 5
constraints: []
集群中的所有数据,包括SQL数据和内部系统数据
3.在任意节点,配置.meta副本区域
echo'num_replicas: 7' | cockroach zone set .meta --insecure -f -
range_min_bytes:1048576
range_max_bytes:67108864
gc:
ttlseconds:86400
num_replicas: 7
constraints: []
.meta addressing range在7个数据中心复制,其他数据将复制5遍。
4. 在任意节点,配置.timeseries副本区域
echo'num_replicas: 3' | cockroach zone set .timeseries --insecure -f -
range_min_bytes:1048576
range_max_bytes:67108864
gc:
ttlseconds:86400
num_replicas: 7
constraints: []
时间序列数据复制3遍,不影响其他数据的配置