Я настроил небезопасный кластер с тремя узлами для тестирования на локальной машине. Я создал базу данных и добавил таблицу с несколькими записями. Я запросил конфигурацию зоны, и она показала, что num_replicas равно 3, а диапазон имеет реплики как {1, 2, 3}.
root@:26257/foo> show zone configuration for database foo;
target | raw_config_sql
----------------+-------------------------------------------
RANGE default | ALTER RANGE default CONFIGURE ZONE USING
| range_min_bytes = 134217728,
| range_max_bytes = 536870912,
| gc.ttlseconds = 90000,
| num_replicas = 3,
| constraints = '[]',
| lease_preferences = '[]'
(1 row)
Time: 2ms total (execution 2ms / network 0ms)
root@:26257/foo> show ranges from database foo;
table_name | start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities
-------------+-----------+---------+----------+---------------+--------------+-----------------------+----------+---------------------
bar | NULL | NULL | 36 | 0.000105 | 2 | | {1,2,3} | {"","",""}
(1 row)
Затем я изменил num_replicas на 5 с запросом ниже. Теперь количество реплик больше, чем количество узлов, доступных в кластере, и я не получил никакой ошибки.
root@:26257/foo> ALTER RANGE default CONFIGURE ZONE USING num_replicas = 5, gc.ttlseconds = 100000;
CONFIGURE ZONE 1
Time: 174ms total (execution 174ms / network 0ms)
root@:26257/foo> show zone configuration for database foo;
target | raw_config_sql
----------------+-------------------------------------------
RANGE default | ALTER RANGE default CONFIGURE ZONE USING
| range_min_bytes = 134217728,
| range_max_bytes = 536870912,
| gc.ttlseconds = 100000,
| num_replicas = 5,
| constraints = '[]',
| lease_preferences = '[]'
(1 row)
Затем я добавил узел в кластер и ожидал, что реплики для диапазона будут расти. Он не был реплицирован, но был перебалансирован на дополнительный узел {1, 2, 4}.
cockroach node ls --insecure
id
------
1
2
3
4
Из консоли SQL
root@:26257/foo> show ranges from database foo;
table_name | start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities
-------------+-----------+---------+----------+---------------+--------------+-----------------------+----------+---------------------
bar | NULL | NULL | 36 | 0.000105 | 2 | | {1,2,4} | {"","",""}
(1 row)
Согласно документу, в столбце реплик должны быть перечислены узлы с репликами для этого диапазона. Если для num_replicas установлено значение 5, разве в этом столбце не должны отображаться все 4 узла? Я что-то неправильно понял в своем понимании или вопросах?
Хотя в документации CockroachDB это неясно, кластер будет применять коэффициент репликации только при наличии соответствующего количества узлов или более. Таким образом, после установки коэффициента репликации 5 для базы данных foo
и добавления четвертого узла кластер может перебалансировать реплики на этот новый узел, если это имеет смысл, но он не увеличит количество реплик до 5, пока не появится пятый узел.
После добавления еще одного узла в кластер, т. е. когда количество узлов в кластере становится равным 5, количество реплик увеличивается до пяти {1, 2, 3, 4, 5}. Но точную причину такого поведения я не знаю.