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 示例
[[email protected]]# 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
[[email protected]]# 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文件中,只需要添加需要修改的參數
[[email protected]]# 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"
[[email protected]]# 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: []
[[email protected]]# 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: []
[[email protected]]# 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遍,不影響其他數據的配置