Развертывание кластера ClickHouse (Zokeeper не требуется)
Развертывание кластера ClickHouse (Zokeeper не требуется)

Оглавление

1. Настройка одного узла

1. Скачать

2. Установка

3. Старт

4. Проверка

2. Импортируйте образец набора данных.

1. Загрузите и извлеките данные таблицы.

2. Создайте библиотечную таблицу.

3. Импортируйте данные

4. Оптимизация таблиц

5. Пример запроса

3. Развертывание кластера

0. Подготовка перед установкой

1. Установите и настройте ClickHouse Keeper.

(1) Установите сервер ClickHouse и клиент ClickHouse.

(3) Перезапустите ClickHouse.

(4) Убедитесь, что экземпляр Keeper запущен.

(5) Подтвердите системную таблицу Zookeeper.

2. Настройте кластер ClickHouse

(1) Установите сервер ClickHouse и клиент ClickHouse на новый хост (узел 4).

(2) Измените файл конфигурации на новом хосте (узел 4).

(3) Обновление конфигурации

(4) Перезапустите ClickHouse и убедитесь, что кластер создан.

3. Создайте распределенную таблицу

(1) Создать базу данных

(2) Создайте локальную таблицу

(3) Добавьте две новые строки в сегментированный экземпляр (узел 1).

(4) Добавьте две новые строки в другой сегментированный экземпляр (узел3).

(5) Выполнять запросы SELECT для всех экземпляров отдельно.

(6) Создать распределенную таблицу

(7) Выполнять запросы SELECT для всех экземпляров отдельно.

4. Автоматическое сегментирование данных

(1) Создайте локальную таблицу с помощью сегментного ключа.

(2) Создайте распределенную таблицу, которая обеспечивает представление локальной таблицы кластера.

(3) Вставьте данные в распределенную таблицу.

(4) Выполнять запросы SELECT для всех экземпляров отдельно.

5. Используйте механизм таблиц ReplicationMergeTree для копирования данных.

(1) Определить макрос

(2) Создайте локальную таблицу

(3) Создать распределенную таблицу

(4) Вставьте данные в распределенную таблицу.

(5) Выполнять запросы SELECT для всех экземпляров отдельно.

ссылка:


ClickHouse Может использоваться на любом сервере с x86_64, AArch64. или PowerPC64LE CPU архитектурный Linux,FreeBSD или Mac OS X беги дальше. Официальные готовые двоичные файлы обычно предназначены для x86_64 Скомпилируйте и используйте SSE 4.2 набор команд, поэтому, если не указано иное, поддерживает свой CPU использование будет дополнительным системным требованием. Далее необходимо проверить текущий CPU Поддерживать ли SSE 4.2 Команда:

Язык кода:javascript
копировать
$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

1. Настройка одного узла

1. Скачать

Язык кода:javascript
копировать
# Посмотреть версию
https://github.com/ClickHouse/ClickHouse/releases

# Последняя стабильная версия Установить адрес загрузки пакета
https://github.com/ClickHouse/ClickHouse/releases/download/v24.1.8.22-stable/clickhouse-client-24.1.8.22.x86_64.rpm
https://github.com/ClickHouse/ClickHouse/releases/download/v24.1.8.22-stable/clickhouse-common-static-24.1.8.22.x86_64.rpm
https://github.com/ClickHouse/ClickHouse/releases/download/v24.1.8.22-stable/clickhouse-server-24.1.8.22.x86_64.rpm

2. Установка

Язык кода:javascript
копировать
# Сначала установите пакет общих зависимостей.
rpm -ivh clickhouse-common-static-24.1.8.22.x86_64.rpm
# Установить сервер, обнаружено Enter password for default user Введите пароль при появлении запроса
rpm -ivh clickhouse-server-24.1.8.22.x86_64.rpm
# Удалить клиент командной строки
rpm -ivh clickhouse-client-24.1.8.22.x86_64.rpm

3. Старт

Язык кода:javascript
копировать
sudo service clickhouse-server start

Посмотрите прогресс после запуска:

Язык кода:javascript
копировать
[root@vvml-yz-hbase-test~]#ps -ef | grep clickhouse | grep -v grep
clickho+  5322     1  0 08:49 ?        00:00:00 clickhouse-watchdog        --config-file /etc/clickhouse-server/config.xml --pid-file /var/run/clickhouse-server/clickhouse-server.pid --daemon
clickho+  5323  5322  6 08:49 ?        00:00:00 /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml --pid-file /var/run/clickhouse-server/clickhouse-server.pid --daemon
[root@vvml-yz-hbase-test~]#

Посмотреть порт прослушивания

Язык кода:javascript
копировать
[root@vvml-yz-hbase-test~]#netstat -antpl | grep clickhouse
tcp        0      0 127.0.0.1:9004          0.0.0.0:*               LISTEN      5323/clickhouse-ser 
tcp        0      0 127.0.0.1:9005          0.0.0.0:*               LISTEN      5323/clickhouse-ser 
tcp        0      0 127.0.0.1:9009          0.0.0.0:*               LISTEN      5323/clickhouse-ser 
tcp        0      0 127.0.0.1:8123          0.0.0.0:*               LISTEN      5323/clickhouse-ser 
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      5323/clickhouse-ser 
tcp6       0      0 ::1:9004                :::*                    LISTEN      5323/clickhouse-ser 
tcp6       0      0 ::1:9005                :::*                    LISTEN      5323/clickhouse-ser 
tcp6       0      0 ::1:9009                :::*                    LISTEN      5323/clickhouse-ser 
tcp6       0      0 ::1:8123                :::*                    LISTEN      5323/clickhouse-ser 
tcp6       0      0 ::1:9000                :::*                    LISTEN      5323/clickhouse-ser 
[root@vvml-yz-hbase-test~]#

Местоположение журнала сервера по умолчанию: /var/log/clickhouse-server/. Когда сервер записывает в журнал Ready for connections сообщение, указывающее, что сервер готов обрабатывать клиентские соединения. один раз clickhouse-server запускать и бежать, может эксплуатировать clickhouse-client Подключитесь к серверу и запустите несколько тестов.

4. Проверка

Язык кода:javascript
копировать
[root@vvml-yz-hbase-test~]#clickhouse-client --password="123456" --query "select version();"
24.1.8.22
[root@vvml-yz-hbase-test~]#clickhouse-client --password="123456" -n --query "select 1;select 2;"
1
2
[root@vvml-yz-hbase-test~]#

2. Импортируйте образец набора данных.

1. Загрузите и извлеките данные таблицы.

Язык кода:javascript
копировать
curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
curl https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv

2. Создайте библиотечную таблицу.

Создайте файл sample.sql со следующим содержимым (обратите внимание на определение вложенной таблицы):

Язык кода:javascript
копировать
create database if not exists tutorial;

CREATE TABLE tutorial.hits_v1
(
    `WatchID` UInt64,
    `JavaEnable` UInt8,
    `Title` String,
    `GoodEvent` Int16,
    `EventTime` DateTime,
    `EventDate` Date,
    `CounterID` UInt32,
    `ClientIP` UInt32,
    `ClientIP6` FixedString(16),
    `RegionID` UInt32,
    `UserID` UInt64,
    `CounterClass` Int8,
    `OS` UInt8,
    `UserAgent` UInt8,
    `URL` String,
    `Referer` String,
    `URLDomain` String,
    `RefererDomain` String,
    `Refresh` UInt8,
    `IsRobot` UInt8,
    `RefererCategories` Array(UInt16),
    `URLCategories` Array(UInt16),
    `URLRegions` Array(UInt32),
    `RefererRegions` Array(UInt32),
    `ResolutionWidth` UInt16,
    `ResolutionHeight` UInt16,
    `ResolutionDepth` UInt8,
    `FlashMajor` UInt8,
    `FlashMinor` UInt8,
    `FlashMinor2` String,
    `NetMajor` UInt8,
    `NetMinor` UInt8,
    `UserAgentMajor` UInt16,
    `UserAgentMinor` FixedString(2),
    `CookieEnable` UInt8,
    `JavascriptEnable` UInt8,
    `IsMobile` UInt8,
    `MobilePhone` UInt8,
    `MobilePhoneModel` String,
    `Params` String,
    `IPNetworkID` UInt32,
    `TraficSourceID` Int8,
    `SearchEngineID` UInt16,
    `SearchPhrase` String,
    `AdvEngineID` UInt8,
    `IsArtifical` UInt8,
    `WindowClientWidth` UInt16,
    `WindowClientHeight` UInt16,
    `ClientTimeZone` Int16,
    `ClientEventTime` DateTime,
    `SilverlightVersion1` UInt8,
    `SilverlightVersion2` UInt8,
    `SilverlightVersion3` UInt32,
    `SilverlightVersion4` UInt16,
    `PageCharset` String,
    `CodeVersion` UInt32,
    `IsLink` UInt8,
    `IsDownload` UInt8,
    `IsNotBounce` UInt8,
    `FUniqID` UInt64,
    `HID` UInt32,
    `IsOldCounter` UInt8,
    `IsEvent` UInt8,
    `IsParameter` UInt8,
    `DontCountHits` UInt8,
    `WithHash` UInt8,
    `HitColor` FixedString(1),
    `UTCEventTime` DateTime,
    `Age` UInt8,
    `Sex` UInt8,
    `Income` UInt8,
    `Interests` UInt16,
    `Robotness` UInt8,
    `GeneralInterests` Array(UInt16),
    `RemoteIP` UInt32,
    `RemoteIP6` FixedString(16),
    `WindowName` Int32,
    `OpenerName` Int32,
    `HistoryLength` Int16,
    `BrowserLanguage` FixedString(2),
    `BrowserCountry` FixedString(2),
    `SocialNetwork` String,
    `SocialAction` String,
    `HTTPError` UInt16,
    `SendTiming` Int32,
    `DNSTiming` Int32,
    `ConnectTiming` Int32,
    `ResponseStartTiming` Int32,
    `ResponseEndTiming` Int32,
    `FetchTiming` Int32,
    `RedirectTiming` Int32,
    `DOMInteractiveTiming` Int32,
    `DOMContentLoadedTiming` Int32,
    `DOMCompleteTiming` Int32,
    `LoadEventStartTiming` Int32,
    `LoadEventEndTiming` Int32,
    `NSToDOMContentLoadedTiming` Int32,
    `FirstPaintTiming` Int32,
    `RedirectCount` Int8,
    `SocialSourceNetworkID` UInt8,
    `SocialSourcePage` String,
    `ParamPrice` Int64,
    `ParamOrderID` String,
    `ParamCurrency` FixedString(3),
    `ParamCurrencyID` UInt16,
    `GoalsReached` Array(UInt32),
    `OpenstatServiceName` String,
    `OpenstatCampaignID` String,
    `OpenstatAdID` String,
    `OpenstatSourceID` String,
    `UTMSource` String,
    `UTMMedium` String,
    `UTMCampaign` String,
    `UTMContent` String,
    `UTMTerm` String,
    `FromTag` String,
    `HasGCLID` UInt8,
    `RefererHash` UInt64,
    `URLHash` UInt64,
    `CLID` UInt32,
    `YCLID` UInt64,
    `ShareService` String,
    `ShareURL` String,
    `ShareTitle` String,
    `ParsedParams` Nested(
        Key1 String,
        Key2 String,
        Key3 String,
        Key4 String,
        Key5 String,
        ValueDouble Float64),
    `IslandID` FixedString(16),
    `RequestNum` UInt32,
    `RequestTry` UInt8
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);

CREATE TABLE tutorial.visits_v1
(
    `CounterID` UInt32,
    `StartDate` Date,
    `Sign` Int8,
    `IsNew` UInt8,
    `VisitID` UInt64,
    `UserID` UInt64,
    `StartTime` DateTime,
    `Duration` UInt32,
    `UTCStartTime` DateTime,
    `PageViews` Int32,
    `Hits` Int32,
    `IsBounce` UInt8,
    `Referer` String,
    `StartURL` String,
    `RefererDomain` String,
    `StartURLDomain` String,
    `EndURL` String,
    `LinkURL` String,
    `IsDownload` UInt8,
    `TraficSourceID` Int8,
    `SearchEngineID` UInt16,
    `SearchPhrase` String,
    `AdvEngineID` UInt8,
    `PlaceID` Int32,
    `RefererCategories` Array(UInt16),
    `URLCategories` Array(UInt16),
    `URLRegions` Array(UInt32),
    `RefererRegions` Array(UInt32),
    `IsYandex` UInt8,
    `GoalReachesDepth` Int32,
    `GoalReachesURL` Int32,
    `GoalReachesAny` Int32,
    `SocialSourceNetworkID` UInt8,
    `SocialSourcePage` String,
    `MobilePhoneModel` String,
    `ClientEventTime` DateTime,
    `RegionID` UInt32,
    `ClientIP` UInt32,
    `ClientIP6` FixedString(16),
    `RemoteIP` UInt32,
    `RemoteIP6` FixedString(16),
    `IPNetworkID` UInt32,
    `SilverlightVersion3` UInt32,
    `CodeVersion` UInt32,
    `ResolutionWidth` UInt16,
    `ResolutionHeight` UInt16,
    `UserAgentMajor` UInt16,
    `UserAgentMinor` UInt16,
    `WindowClientWidth` UInt16,
    `WindowClientHeight` UInt16,
    `SilverlightVersion2` UInt8,
    `SilverlightVersion4` UInt16,
    `FlashVersion3` UInt16,
    `FlashVersion4` UInt16,
    `ClientTimeZone` Int16,
    `OS` UInt8,
    `UserAgent` UInt8,
    `ResolutionDepth` UInt8,
    `FlashMajor` UInt8,
    `FlashMinor` UInt8,
    `NetMajor` UInt8,
    `NetMinor` UInt8,
    `MobilePhone` UInt8,
    `SilverlightVersion1` UInt8,
    `Age` UInt8,
    `Sex` UInt8,
    `Income` UInt8,
    `JavaEnable` UInt8,
    `CookieEnable` UInt8,
    `JavascriptEnable` UInt8,
    `IsMobile` UInt8,
    `BrowserLanguage` UInt16,
    `BrowserCountry` UInt16,
    `Interests` UInt16,
    `Robotness` UInt8,
    `GeneralInterests` Array(UInt16),
    `Params` Array(String),
    `Goals` Nested(
        ID UInt32,
        Serial UInt32,
        EventTime DateTime,
        Price Int64,
        OrderID String,
        CurrencyID UInt32),
    `WatchIDs` Array(UInt64),
    `ParamSumPrice` Int64,
    `ParamCurrency` FixedString(3),
    `ParamCurrencyID` UInt16,
    `ClickLogID` UInt64,
    `ClickEventID` Int32,
    `ClickGoodEvent` Int32,
    `ClickEventTime` DateTime,
    `ClickPriorityID` Int32,
    `ClickPhraseID` Int32,
    `ClickPageID` Int32,
    `ClickPlaceID` Int32,
    `ClickTypeID` Int32,
    `ClickResourceID` Int32,
    `ClickCost` UInt32,
    `ClickClientIP` UInt32,
    `ClickDomainID` UInt32,
    `ClickURL` String,
    `ClickAttempt` UInt8,
    `ClickOrderID` UInt32,
    `ClickBannerID` UInt32,
    `ClickMarketCategoryID` UInt32,
    `ClickMarketPP` UInt32,
    `ClickMarketCategoryName` String,
    `ClickMarketPPName` String,
    `ClickAWAPSCampaignName` String,
    `ClickPageName` String,
    `ClickTargetType` UInt16,
    `ClickTargetPhraseID` UInt64,
    `ClickContextType` UInt8,
    `ClickSelectType` Int8,
    `ClickOptions` String,
    `ClickGroupBannerID` Int32,
    `OpenstatServiceName` String,
    `OpenstatCampaignID` String,
    `OpenstatAdID` String,
    `OpenstatSourceID` String,
    `UTMSource` String,
    `UTMMedium` String,
    `UTMCampaign` String,
    `UTMContent` String,
    `UTMTerm` String,
    `FromTag` String,
    `HasGCLID` UInt8,
    `FirstVisit` DateTime,
    `PredLastVisit` Date,
    `LastVisit` Date,
    `TotalVisits` UInt32,
    `TraficSource` Nested(
        ID Int8,
        SearchEngineID UInt16,
        AdvEngineID UInt8,
        PlaceID UInt16,
        SocialSourceNetworkID UInt8,
        Domain String,
        SearchPhrase String,
        SocialSourcePage String),
    `Attendance` FixedString(16),
    `CLID` UInt32,
    `YCLID` UInt64,
    `NormalizedRefererHash` UInt64,
    `SearchPhraseHash` UInt64,
    `RefererDomainHash` UInt64,
    `NormalizedStartURLHash` UInt64,
    `StartURLDomainHash` UInt64,
    `NormalizedEndURLHash` UInt64,
    `TopLevelDomain` UInt64,
    `URLScheme` UInt64,
    `OpenstatServiceNameHash` UInt64,
    `OpenstatCampaignIDHash` UInt64,
    `OpenstatAdIDHash` UInt64,
    `OpenstatSourceIDHash` UInt64,
    `UTMSourceHash` UInt64,
    `UTMMediumHash` UInt64,
    `UTMCampaignHash` UInt64,
    `UTMContentHash` UInt64,
    `UTMTermHash` UInt64,
    `FromHash` UInt64,
    `WebVisorEnabled` UInt8,
    `WebVisorActivity` UInt32,
    `ParsedParams` Nested(
        Key1 String,
        Key2 String,
        Key3 String,
        Key4 String,
        Key5 String,
        ValueDouble Float64),
    `Market` Nested(
        Type UInt8,
        GoalID UInt32,
        OrderID String,
        OrderPrice Int64,
        PP UInt32,
        DirectPlaceID UInt32,
        DirectOrderID UInt32,
        DirectBannerID UInt32,
        GoodID String,
        GoodName String,
        GoodQuantity Int32,
        GoodPrice Int64),
    `IslandID` FixedString(16)
)
ENGINE = CollapsingMergeTree(Sign)
PARTITION BY toYYYYMM(StartDate)
ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID)
SAMPLE BY intHash32(UserID);

Запустите файл sample.sql:

Язык кода:javascript
копировать
clickhouse-client --password="123456" --queries-file sample.sql

3. Импортируйте данные

Язык кода:javascript
копировать
clickhouse-client --password="123456" --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv
clickhouse-client --password="123456" --query "INSERT INTO tutorial.visits_v1 FORMAT TSV" --max_insert_block_size=100000 < visits_v1.tsv

Самый простой способ узнать доступные настройки, их значения и значения по умолчанию — Запрос. system.settings поверхность:

Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.126 :) select name, value, changed, description
  from system.settings
 where name like '%max_insert_b%';

SELECT
    name,
    value,
    changed,
    description
FROM system.settings
WHERE name LIKE '%max_insert_b%'

Query id: 05bc6241-2d1f-432e-87b3-f35a3ad612c8

┌─name──────────────────┬─value───┬─changed─┬─description───────────────────────────────────────────────────────────────────────────────┐
│ max_insert_block_size │ 1048449 │       0 │ The maximum block size for insertion, if we control the creation of blocks for insertion. │
└───────────────────────┴─────────┴─────────┴───────────────────────────────────────────────────────────────────────────────────────────┘

1 row in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.126 :) 

4. Оптимизация таблиц

Может OPTIMIZE Импортированная таблица. использовать MergeTree-family Таблицы движка Конфигурация всегда объединяют части данных в фоновом режиме, чтобы оптимизировать хранение данных (или хотя бы проверить, имеет ли это смысл). Эти Запросы заставляют движок таблиц немедленно выполнить оптимизацию хранилища (медленнее, осторожное ручное изучение):

Язык кода:javascript
копировать
clickhouse-client --password="123456" --query "OPTIMIZE TABLE tutorial.hits_v1 FINAL"
clickhouse-client --password="123456" --query "OPTIMIZE TABLE tutorial.visits_v1 FINAL"

5. Пример запроса

Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.126 :) SELECT
    StartURL AS URL,
    AVG(Duration) AS AvgDuration
FROM tutorial.visits_v1
WHERE StartDate BETWEEN '2014-03-23' AND '2014-03-30'
GROUP BY URL
ORDER BY AvgDuration DESC
LIMIT 10;

SELECT
    StartURL AS URL,
    AVG(Duration) AS AvgDuration
FROM tutorial.visits_v1
WHERE (StartDate >= '2014-03-23') AND (StartDate <= '2014-03-30')
GROUP BY URL
ORDER BY AvgDuration DESC
LIMIT 10

Query id: fc2e8638-5081-496a-964b-a679eab63af9

┌─URL─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─AvgDuration─┐
│ http://itpalanija-pri-patrivative=0&ads_app_user                                                                                                                                                │       60127 │
│ http://renaul-myd-ukraine                                                                                                                                                                       │       58938 │
│ http://karta/Futbol/dynamo.kiev.ua/kawaica.su/648                                                                                                                                               │       56538 │
│ https://moda/vyikroforum1/top.ru/moscow/delo-product/trend_sms/multitryaset/news/2014/03/201000                                                                                                 │       55218 │
│ http://e.mail=on&default?abid=2061&scd=yes&option?r=city_inter.com/menu&site-zaferio.ru/c/m.ensor.net/ru/login=false&orderStage.php?Brandidatamalystyle/20Mar2014%2F007%2F94dc8d2e06e56ed56bbdd │       51378 │
│ http://karta/Futbol/dynas.com/haberler.ru/messages.yandsearchives/494503_lte_13800200319                                                                                                        │       49078 │
│ http://xmusic/vstreatings of speeds                                                                                                                                                             │       36925 │
│ http://news.ru/yandex.ru/api.php&api=http://toberria.ru/aphorizana                                                                                                                              │       36902 │
│ http://bashmelnykh-metode.net/video/#!/video/emberkas.ru/detskij-yazi.com/iframe/default.aspx?id=760928&noreask=1&source                                                                        │       34323 │
│ http://censonhaber/547-popalientLog=0&strizhki-petro%3D&comeback=search?lr=213&text                                                                                                             │       31773 │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────┘

10 rows in set. Elapsed: 0.080 sec. Processed 1.43 million rows, 112.12 MB (17.91 million rows/s., 1.40 GB/s.)
Peak memory usage: 45.07 MiB.

vvml-yz-hbase-test.172.18.4.126 :) SELECT
    sum(Sign) AS visits,
    sumIf(Sign, has(Goals.ID, 1105530)) AS goal_visits,
    (100. * goal_visits) / visits AS goal_percent
FROM tutorial.visits_v1
WHERE (CounterID = 912887) AND (toYYYYMM(StartDate) = 201403) AND (domain(StartURL) = 'yandex.ru');

SELECT
    sum(Sign) AS visits,
    sumIf(Sign, has(Goals.ID, 1105530)) AS goal_visits,
    (100. * goal_visits) / visits AS goal_percent
FROM tutorial.visits_v1
WHERE (CounterID = 912887) AND (toYYYYMM(StartDate) = 201403) AND (domain(StartURL) = 'yandex.ru')

Query id: 02df86cc-ef97-4cec-9892-6ba92dc87d2c

┌─visits─┬─goal_visits─┬──────goal_percent─┐
│  10543 │        8553 │ 81.12491700654462 │
└────────┴─────────────┴───────────────────┘

1 row in set. Elapsed: 0.014 sec. Processed 19.72 thousand rows, 3.45 MB (1.46 million rows/s., 255.24 MB/s.)
Peak memory usage: 5.01 MiB.

vvml-yz-hbase-test.172.18.4.126 :) 

3. Развертывание кластера

На этот раз развернутьиспользовать четыре хоста, построить два шарда, каждый шард имеет две копии. ClickHouse кластер,IP Имя хоста следующее:

Язык кода:javascript
копировать
172.18.4.126    node1
172.18.4.188    node2
172.18.4.71    node3
172.18.4.86    node4

Внимание, ClickHouse Требуется, чтобы каждая копия каждого шарда находилась на отдельном инстансе, то есть копий было столько, сколько есть во всем диапазоне существования. ClickHouse Пример. Лучшая практика — 3 осколка, 2 реплики и 6 экземпляров.

ClickHouse рекомендоватьиспользовать ClickHouse Keeper заменять Zookeeper(https://clickhouse.com/docs/knowledgebase/why_recommend_clickhouse_keeper_over_zookeeper)。 подиспользовать ClickHouse Keeper Конфигурация ClickHouse кластер. Ссылка на конкретные этапы работы ClickHouse Keeper Руководство пользователя(https://clickhouse.com/docs/en/guides/sre/keeper/clickhouse-keeper#clickhouse-keeper-user-guide)。

ClickHouse В комплекте на сервере кликхаус-хранитель. Если сервер «Установить» уже существует, вы не можете установить его по отдельности. clickhouse-keeper, вы получите конфликтную ошибку:

Язык кода:javascript
копировать
[root@vvml-yz-hbase-test~]#rpm -ivh clickhouse-keeper-24.1.8.22.x86_64.rpm 
error: Failed dependencies:
    clickhouse-server conflicts with clickhouse-keeper-0:24.1.8.22-1.x86_64
[root@vvml-yz-hbase-test~]#

Но если используется только clickhouse-keeper сервер, тогда только может быть установлен самостоятельно clickhouse-keeper。

Язык кода:javascript
копировать
# Посмотреть версию
https://github.com/ClickHouse/ClickHouse/releases

# Последняя стабильная версия Установить адрес загрузки пакета
https://github.com/ClickHouse/ClickHouse/releases/download/v24.1.8.22-stable/clickhouse-keeper-24.1.8.22.x86_64.rpm

На этот разразвертыватьсуществоватьза хост Установить clickhouse-сервер, не только Установить кликхаус-хранитель. Планы шардинга, реплики и хранителя следующие:

Язык кода:javascript
копировать
node1    Осколок 1 реплика 1    keeper
node2    Осколок 1 Реплика 2    keeper
node3    Осколок 2 Реплика 1    keeper
node4    Осколок 2 Реплика 2

Все четыре хоста служат сегментами данных, и каждый фрагмент данных имеет две копии. Кипер развертывается на трех экземплярах, причем нечетное количество экземпляров используется для достижения необходимого количества голосов в ClickHouse Keeper.

0. Подготовка перед установкой

существующая Конфигурация кластера ClickHouse, вам необходимо выполнить следующие приготовления на всех четырех машинах:

  • запускать NTP Синхронизация часов
  • Добавьте все имена хостов, составляющие кластер, в файл /etc/hosts.
  • Конфигурациявсех хостов ssh Без пароля
  • Исправлять Количество файлов и процессов, которые может открыть пользователь
  • Отключить брандмауэр
  • отключить прозрачную огромную страницу

1. Установите и настройте ClickHouse Keeper.

Выполните следующие шаги на трех хостах: node1, node2 и node3.

(1) Установите сервер ClickHouse и клиент ClickHouse.
Язык кода:javascript
копировать
rpm -ivh clickhouse-common-static-24.1.8.22.x86_64.rpm
rpm -ivh clickhouse-server-24.1.8.22.x86_64.rpm
rpm -ivh clickhouse-client-24.1.8.22.x86_64.rpm

(2) Модификация ClickHouse хозяин Конфигурационный файл

Язык кода:javascript
копировать
# Сделайте резервную копию перед загрузкой
cp /etc/clickhouse-server/config.xml /etc/clickhouse-server/config.xml.bak

Исправлять /etc/clickhouse-server/config.xml хозяин Конфигурационный файл,существоватькорневой узел <clickhouse> Добавьте следующее ниже:

Язык кода:javascript
копировать
<!-- Добавьте следующие записи, чтобы разрешить внешнюю связь через сетевой интерфейс. -->
<listen_host>0.0.0.0</listen_host>

<!-- Включить указанный экземпляр ClickHouse Keeper。Обновите каждый сервер<server_id>настраивать,узел1 равен 1, узел2 равен 2、node3для3。-->
<keeper_server>
    <tcp_port>9181</tcp_port>
    <server_id>1</server_id>
    <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
    <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>

    <coordination_settings>
        <operation_timeout_ms>10000</operation_timeout_ms>
        <session_timeout_ms>30000</session_timeout_ms>
        <raft_logs_level>warning</raft_logs_level>
    </coordination_settings>

    <raft_configuration>
        <server>
            <id>1</id>
            <hostname>node1</hostname>
            <port>9234</port>
        </server>
        <server>
            <id>2</id>
            <hostname>node2</hostname>
            <port>9234</port>
        </server>
        <server>
            <id>3</id>
            <hostname>node3</hostname>
            <port>9234</port>
        </server>
    </raft_configuration>
</keeper_server>

<!-- Указывает экземпляр использования ClickHouse Keeper -->
<zookeeper>
    <node>
        <host>node1</host>
        <port>9181</port>
    </node>
    <node>
        <host>node2</host>
        <port>9181</port>
    </node>
    <node>
        <host>node3</host>
        <port>9181</port>
    </node>
</zookeeper>
(3) Перезапустите ClickHouse.
Язык кода:javascript
копировать
sudo service clickhouse-server restart
(4) Убедитесь, что экземпляр Keeper запущен.

Выполните следующие команды на узлах node1, node2 и node3. Если Keeper работает нормально, команда ruok вернет imok:

Язык кода:javascript
копировать
[root@vvml-yz-hbase-test~]#echo ruok | nc localhost 9181; echo
imok
[root@vvml-yz-hbase-test~]#
(5) Подтвердите системную таблицу Zookeeper.

В системной базе данных есть таблица Zookeeper, содержащая подробную информацию об экземпляре ClickHouse Keeper:

Язык кода:javascript
копировать
[root@vvml-yz-hbase-test~]#clickhouse-client --password="123456"
ClickHouse client version 24.1.8.22 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 24.1.8.

vvml-yz-hbase-test.172.18.4.126 :) SELECT *
FROM system.zookeeper
WHERE path IN ('/', '/clickhouse');

SELECT *
FROM system.zookeeper
WHERE path IN ('/', '/clickhouse')

Query id: e713c446-26c5-4c3f-994c-db22eb68b9ad

┌─name───────┬─value─┬─path────────┐
│ keeper     │       │ /           │
│ clickhouse │       │ /           │
│ task_queue │       │ /clickhouse │
│ sessions   │       │ /clickhouse │
└────────────┴───────┴─────────────┘

4 rows in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.126 :) 

2. Настройте кластер ClickHouse

(1) Установите сервер ClickHouse и клиент ClickHouse на новый хост (узел 4).
Язык кода:javascript
копировать
rpm -ivh clickhouse-common-static-24.1.8.22.x86_64.rpm
rpm -ivh clickhouse-server-24.1.8.22.x86_64.rpm
rpm -ivh clickhouse-client-24.1.8.22.x86_64.rpm
(2) Измените файл конфигурации на новом хосте (узел 4).
Язык кода:javascript
копировать
# Сделайте резервную копию перед загрузкой
cp /etc/clickhouse-server/config.xml /etc/clickhouse-server/config.xml.bak

Исправлять /etc/clickhouse-server/config.xml хозяин Конфигурационный файл,существоватькорневой узел <clickhouse> Добавьте следующее ниже:

Язык кода:javascript
копировать
<!-- Добавьте следующие записи, чтобы разрешить внешнюю связь через сетевой интерфейс. -->
<listen_host>0.0.0.0</listen_host>

<!-- Указывает экземпляр использования ClickHouse Keeper -->
<zookeeper>
    <node>
        <host>node1</host>
        <port>9181</port>
    </node>
    <node>
        <host>node2</host>
        <port>9181</port>
    </node>
    <node>
        <host>node3</host>
        <port>9181</port>
    </node>
</zookeeper>

Затем выполните следующие шаги на всех четырех хостах.

(3) Обновление конфигурации

Исправлять /etc/clickhouse-server/config.xml хозяин Конфигурационный файл,существоватькорневой узел <clickhouse> Добавьте следующее ниже:

Язык кода:javascript
копировать
    <remote_servers>
        <cluster_2S_2R>
            <shard>
                <replica>
                    <host>node1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
                <replica>
                    <host>node2</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>node3</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
                <replica>
                    <host>node4</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
            </shard>
        </cluster_2S_2R>
    </remote_servers>
(4) Перезапустите ClickHouse и убедитесь, что кластер создан.
Язык кода:javascript
копировать
sudo service clickhouse-server restart

Посмотреть кластер:

Язык кода:javascript
копировать
[root@vvml-yz-hbase-test~]#clickhouse-client --password="123456"
ClickHouse client version 24.1.8.22 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 24.1.8.

vvml-yz-hbase-test.172.18.4.126 :) SHOW CLUSTERS;

SHOW CLUSTERS

Query id: 80e81978-d1f4-4721-85d8-7e7803230373

┌─cluster───────┐
│ cluster_2S_2R │
└───────────────┘

1 row in set. Elapsed: 0.001 sec. 

vvml-yz-hbase-test.172.18.4.126 :) select cluster,shard_num,replica_num,host_name,is_local,user,database_shard_name,database_replica_name from system.clusters;

SELECT
    cluster,
    shard_num,
    replica_num,
    host_name,
    is_local,
    user,
    database_shard_name,
    database_replica_name
FROM system.clusters

Query id: 4b39d9ec-b4f7-4557-b76d-05f3893f4ef7

┌─cluster───────┬─shard_num─┬─replica_num─┬─host_name─┬─is_local─┬─user────┬─database_shard_name─┬─database_replica_name─┐
│ cluster_2S_2R │         1 │           1 │ node1     │        1 │ default │                     │                       │
│ cluster_2S_2R │         1 │           2 │ node2     │        0 │ default │                     │                       │
│ cluster_2S_2R │         2 │           1 │ node3     │        0 │ default │                     │                       │
│ cluster_2S_2R │         2 │           2 │ node4     │        0 │ default │                     │                       │
└───────────────┴───────────┴─────────────┴───────────┴──────────┴─────────┴─────────────────────┴───────────────────────┘

4 rows in set. Elapsed: 0.001 sec. 

vvml-yz-hbase-test.172.18.4.126 :) 

3. Создайте распределенную таблицу

(1) Создать базу данных

использовать node1 Создайте базу данных на. НА Предложение CLUSTER автоматически создает базы данных во всех экземплярах.

Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.126 :) CREATE DATABASE db1 ON CLUSTER 'cluster_2S_2R';

CREATE DATABASE db1 ON CLUSTER cluster_2S_2R

Query id: 7a8cd789-bcfb-4855-a131-ba7935cffcfb

┌─host──┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ node1 │ 9000 │      0 │       │                   3 │                0 │
│ node3 │ 9000 │      0 │       │                   2 │                0 │
│ node4 │ 9000 │      0 │       │                   1 │                0 │
│ node2 │ 9000 │      0 │       │                   0 │                0 │
└───────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.099 sec. 

vvml-yz-hbase-test.172.18.4.126 :)
(2) Создайте локальную таблицу

Создайте таблицу в базе данных db1. Аналогично, предложение ON CLUSTER автоматически создаст таблицу во всех экземплярах.

Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.126 :) CREATE TABLE db1.table1 on cluster 'cluster_2S_2R'
(
    `id` UInt64,
    `column1` String
)
ENGINE = MergeTree
ORDER BY column1;

CREATE TABLE db1.table1 ON CLUSTER cluster_2S_2R
(
    `id` UInt64,
    `column1` String
)
ENGINE = MergeTree
ORDER BY column1

Query id: abb936ad-3618-4821-92f6-cfaa83fb4d51

┌─host──┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ node3 │ 9000 │      0 │       │                   3 │                2 │
│ node1 │ 9000 │      0 │       │                   2 │                2 │
└───────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host──┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ node4 │ 9000 │      0 │       │                   1 │                0 │
│ node2 │ 9000 │      0 │       │                   0 │                0 │
└───────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.158 sec. 

vvml-yz-hbase-test.172.18.4.126 :)
(3) Добавьте две новые строки в сегментированный экземпляр (узел 1).
Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.126 :) INSERT INTO db1.table1
    (id, column1)
VALUES
    (1, 'abc'),
    (2, 'def');

INSERT INTO db1.table1 (id, column1) FORMAT Values

Query id: 959da99c-c473-4c3a-9381-fa65b447161c

Ok.

2 rows in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.126 :) 
(4) Добавьте две новые строки в другой сегментированный экземпляр (узел3).
Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.71 :) INSERT INTO db1.table1
    (id, column1)
VALUES
    (3, 'ghi'),
    (4, 'jkl');

INSERT INTO db1.table1 (id, column1) FORMAT Values

Query id: c8864197-ec82-4aba-8c2e-aaa2af468553

Ok.

2 rows in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.71 :)
(5) Выполнять запросы SELECT для всех экземпляров отдельно.

Результаты Запроса на узлах node1 и node3 показывают две строки данных о локальном экземпляре:

Язык кода:javascript
копировать
# node1
vvml-yz-hbase-test.172.18.4.126 :) SELECT *
FROM db1.table1;

SELECT *
FROM db1.table1

Query id: 2f2fc679-9091-41ae-967b-4bd8e2ec7311

┌─id─┬─column1─┐
│  1 │ abc     │
│  2 │ def     │
└────┴─────────┘

2 rows in set. Elapsed: 0.001 sec. 

vvml-yz-hbase-test.172.18.4.126 :) 

# node3
vvml-yz-hbase-test.172.18.4.71 :) SELECT *
FROM db1.table1;

SELECT *
FROM db1.table1

Query id: 18843522-c678-45f0-901d-73e1bbfd4dbf

┌─id─┬─column1─┐
│  3 │ ghi     │
│  4 │ jkl     │
└────┴─────────┘

2 rows in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.71 :) 

На узлах node2 и node4 данные не найдены, а это значит, что данные, записанные в локальную таблицу, не копируются в ее копию.

(6) Создать распределенную таблицу

Может создавать распределенную таблицу для представления данных по двум шардам. Таблицы с механизмом распределенных таблиц не хранят никаких собственных данных, а вместо этого позволяют обрабатывать существующий распределенный Запрос на нескольких серверах. Чтение бьет по всем шардам, пишет "распределение существует среди шардов". существует любой экземпляр на Создать распределенную таблицу:

Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.126 :) CREATE TABLE db1.dist_table ON CLUSTER 'cluster_2S_2R'
(
    id UInt64,
    column1 String
)
ENGINE = Distributed(cluster_2S_2R,db1,table1);

CREATE TABLE db1.dist_table ON CLUSTER cluster_2S_2R
(
    `id` UInt64,
    `column1` String
)
ENGINE = Distributed(cluster_2S_2R, db1, table1)

Query id: 7c08e756-90cf-4014-9368-dc41fe7d06f4

┌─host──┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ node4 │ 9000 │      0 │       │                   3 │                0 │
│ node2 │ 9000 │      0 │       │                   2 │                0 │
│ node1 │ 9000 │      0 │       │                   1 │                0 │
│ node3 │ 9000 │      0 │       │                   0 │                0 │
└───────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.095 sec. 

vvml-yz-hbase-test.172.18.4.126 :)
(7) Выполнять запросы SELECT для всех экземпляров отдельно.

Создано во всех экземплярах db1.dist_table стол, но SELECT * FROM db1.dist_table Запрос Результат оказался неожиданным. Ожидается, что существование будет иметь одинаковые результаты для Запроса во всех экземплярах, возвращая все четыре строки данных в обоих сегментах, но фактические результаты, возвращаемые четырьмя экземплярами, неопределенны: node1 Иногда возвращаются все 4 строки, иногда возвращаются только первые две строки node3; Иногда возвращаются все 4 строки, иногда возвращаются только две последние строки node2; Иногда возвращаются две последние строки, иногда данные не возвращаются; Иногда возвращаются первые две строки, иногда данные не возвращаются.

проиллюстрировать:

  • ClickHouse кластер — это одноранговая архитектура, в которой каждый человек в кластере ClickHouse Все экземпляры независимы, и не существует концепции «главный-подчиненный» даже между разными экземплярами реплик в одном сегменте.
  • Предложение использовать ON CLUSTER в операторе DDL изучения для любого экземпляра существующего кластера будет автоматически применяться во всех экземплярах изучающего.
  • Распределенная таблица на самом деле представляет собой представление, сопоставленное с ClickHouse кластер Локальная таблица на экземпляре. Из распределенной таблицы изучить SELECT Запрос будет использовать ресурсы кластера для всех связанных шардов.
  • Базовая локальная таблица ifuse MergeTree Движок таблицы, существующая распределенная таблица, рассматривает один и тот же Запрос, возвращаемые результаты могут быть неопределенными.

4. Автоматическое сегментирование данных

Первое, что приходит на ум, — можно ли это выполнить на распределенной таблице. DML заявление, оно может достичь Автоматического сегментирование Эффект данных.

Язык кода:javascript
копировать
vvml-yz-hbase-test.172.18.4.126 :) insert into db1.dist_table
    (id, column1)
values
    (5, 'mno'),
    (6, 'pqr');

INSERT INTO db1.dist_table (id, column1) FORMAT Values

Query id: 78b4cc88-9b13-4078-a3f0-d405f4338cfb


Elapsed: 0.002 sec. 

Received exception from server (version 24.1.8):
Code: 55. DB::Exception: Received from localhost:9000. DB::Exception: Method write is not supported by storage Distributed with more than one shard and no sharding key provided. (STORAGE_REQUIRES_PARAMETER)

vvml-yz-hbase-test.172.18.4.126 :)

В ошибке четко указано, что когда хранилище данных распределено более чем по одному шарду и ключ шарда не предоставлен, распределенная таблица не поддерживает запись. Для дальнейшей демонстрации ниже используйтеисоздавать hits_v1 таблица аналогичная CREATE TABLE Оператор создает новую локальную таблицу с тремя отличиями:

  • Названия библиотек разные.
  • Имена таблиц разные.
  • использовать ON CLUSTER пункт.
(1) Создайте локальную таблицу с помощью сегментного ключа.

Выполните следующий оператор создания таблицы в любом экземпляре:

Язык кода:javascript
копировать
CREATE TABLE db1.hits_local ON CLUSTER 'cluster_2S_2R'
(
    `WatchID` UInt64,
    `JavaEnable` UInt8,
    `Title` String,
    `GoodEvent` Int16,
    `EventTime` DateTime,
    `EventDate` Date,
    `CounterID` UInt32,
    `ClientIP` UInt32,
    `ClientIP6` FixedString(16),
    `RegionID` UInt32,
    `UserID` UInt64,
    `CounterClass` Int8,
    `OS` UInt8,
    `UserAgent` UInt8,
    `URL` String,
    `Referer` String,
    `URLDomain` String,
    `RefererDomain` String,
    `Refresh` UInt8,
    `IsRobot` UInt8,
    `RefererCategories` Array(UInt16),
    `URLCategories` Array(UInt16),
    `URLRegions` Array(UInt32),
    `RefererRegions` Array(UInt32),
    `ResolutionWidth` UInt16,
    `ResolutionHeight` UInt16,
    `ResolutionDepth` UInt8,
    `FlashMajor` UInt8,
    `FlashMinor` UInt8,
    `FlashMinor2` String,
    `NetMajor` UInt8,
    `NetMinor` UInt8,
    `UserAgentMajor` UInt16,
    `UserAgentMinor` FixedString(2),
    `CookieEnable` UInt8,
    `JavascriptEnable` UInt8,
    `IsMobile` UInt8,
    `MobilePhone` UInt8,
    `MobilePhoneModel` String,
    `Params` String,
    `IPNetworkID` UInt32,
    `TraficSourceID` Int8,
    `SearchEngineID` UInt16,
    `SearchPhrase` String,
    `AdvEngineID` UInt8,
    `IsArtifical` UInt8,
    `WindowClientWidth` UInt16,
    `WindowClientHeight` UInt16,
    `ClientTimeZone` Int16,
    `ClientEventTime` DateTime,
    `SilverlightVersion1` UInt8,
    `SilverlightVersion2` UInt8,
    `SilverlightVersion3` UInt32,
    `SilverlightVersion4` UInt16,
    `PageCharset` String,
    `CodeVersion` UInt32,
    `IsLink` UInt8,
    `IsDownload` UInt8,
    `IsNotBounce` UInt8,
    `FUniqID` UInt64,
    `HID` UInt32,
    `IsOldCounter` UInt8,
    `IsEvent` UInt8,
    `IsParameter` UInt8,
    `DontCountHits` UInt8,
    `WithHash` UInt8,
    `HitColor` FixedString(1),
    `UTCEventTime` DateTime,
    `Age` UInt8,
    `Sex` UInt8,
    `Income` UInt8,
    `Interests` UInt16,
    `Robotness` UInt8,
    `GeneralInterests` Array(UInt16),
    `RemoteIP` UInt32,
    `RemoteIP6` FixedString(16),
    `WindowName` Int32,
    `OpenerName` Int32,
    `HistoryLength` Int16,
    `BrowserLanguage` FixedString(2),
    `BrowserCountry` FixedString(2),
    `SocialNetwork` String,
    `SocialAction` String,
    `HTTPError` UInt16,
    `SendTiming` Int32,
    `DNSTiming` Int32,
    `ConnectTiming` Int32,
    `ResponseStartTiming` Int32,
    `ResponseEndTiming` Int32,
    `FetchTiming` Int32,
    `RedirectTiming` Int32,
    `DOMInteractiveTiming` Int32,
    `DOMContentLoadedTiming` Int32,
    `DOMCompleteTiming` Int32,
    `LoadEventStartTiming` Int32,
    `LoadEventEndTiming` Int32,
    `NSToDOMContentLoadedTiming` Int32,
    `FirstPaintTiming` Int32,
    `RedirectCount` Int8,
    `SocialSourceNetworkID` UInt8,
    `SocialSourcePage` String,
    `ParamPrice` Int64,
    `ParamOrderID` String,
    `ParamCurrency` FixedString(3),
    `ParamCurrencyID` UInt16,
    `GoalsReached` Array(UInt32),
    `OpenstatServiceName` String,
    `OpenstatCampaignID` String,
    `OpenstatAdID` String,
    `OpenstatSourceID` String,
    `UTMSource` String,
    `UTMMedium` String,
    `UTMCampaign` String,
    `UTMContent` String,
    `UTMTerm` String,
    `FromTag` String,
    `HasGCLID` UInt8,
    `RefererHash` UInt64,
    `URLHash` UInt64,
    `CLID` UInt32,
    `YCLID` UInt64,
    `ShareService` String,
    `ShareURL` String,
    `ShareTitle` String,
    `ParsedParams` Nested(
        Key1 String,
        Key2 String,
        Key3 String,
        Key4 String,
        Key5 String,
        ValueDouble Float64),
    `IslandID` FixedString(16),
    `RequestNum` UInt32,
    `RequestTry` UInt8
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);
(2) Создайте распределенную таблицу, которая обеспечивает представление локальной таблицы кластера.

Выполните следующий оператор создания таблицы в любом экземпляре:

Язык кода:javascript
копировать
CREATE TABLE db1.hits_all ON CLUSTER 'cluster_2S_2R'
AS db1.hits_local
ENGINE = Distributed(cluster_2S_2R, db1, hits_local, rand());
(3) Вставьте данные в распределенную таблицу.

Выполните следующий оператор вставки в любом экземпляре:

Язык кода:javascript
копировать
INSERT INTO db1.hits_all SELECT * FROM tutorial.hits_v1;
(4) Выполнять запросы SELECT для всех экземпляров отдельно.
Язык кода:javascript
копировать
# node1
vvml-yz-hbase-test.172.18.4.126 :) select count(*) from db1.hits_local;

SELECT count(*)
FROM db1.hits_local

Query id: 10a10594-dad1-4693-96fa-a27e62256cc0

┌─count()─┐
│ 4437894 │
└─────────┘

1 row in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.126 :) select count(*) from db1.hits_all;

SELECT count(*)
FROM db1.hits_all

Query id: 4d825459-19fa-4f68-9326-cf6a9b7e113a

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.006 sec. 

vvml-yz-hbase-test.172.18.4.126 :) 

# node2
vvml-yz-hbase-test.172.18.4.188 :) select count(*) from db1.hits_local;

SELECT count(*)
FROM db1.hits_local

Query id: 7da679f4-4f0f-42e5-8c78-df6c9814c61f

┌─count()─┐
│ 4437894 │
└─────────┘

1 row in set. Elapsed: 0.003 sec. 

vvml-yz-hbase-test.172.18.4.188 :) select count(*) from db1.hits_all;

SELECT count(*)
FROM db1.hits_all

Query id: 29594d92-e38e-473a-bc91-7a5fb37e0647

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.005 sec. 

vvml-yz-hbase-test.172.18.4.188 :) 

# node3
vvml-yz-hbase-test.172.18.4.71 :) select count(*) from db1.hits_local;

SELECT count(*)
FROM db1.hits_local

Query id: 2e5a0fca-9b13-4c4e-8cb9-f9ee60da6152

┌─count()─┐
│ 4436004 │
└─────────┘

1 row in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.71 :) select count(*) from db1.hits_all;

SELECT count(*)
FROM db1.hits_all

Query id: 85e6e7a4-eaab-4455-8c29-52ec0998a9b0

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.006 sec. 

vvml-yz-hbase-test.172.18.4.71 :) 

# node4
vvml-yz-hbase-test.172.18.4.86 :) select count(*) from db1.hits_local;

SELECT count(*)
FROM db1.hits_local

Query id: 9950210e-a4a4-4e1d-a449-4aefb2ea396f

┌─count()─┐
│ 4436004 │
└─────────┘

1 row in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.86 :) select count(*) from db1.hits_all;

SELECT count(*)
FROM db1.hits_all

Query id: 45777141-ff08-452f-93b8-1650265d4175

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.009 sec. 

vvml-yz-hbase-test.172.18.4.86 :)

Посмотреть из Запроса Может результаты, что локальная таблица node1、node2 Результаты по Запросу те же, node3, node4 Результаты Запроса на распределенной таблице такие же. узел1 и node3 принадлежат разным шардам в кластере и существуют Создать распределенную Правила распределения, указанные в таблице, являются случайными, поэтому ожидается небольшая разница в объеме данных локальной таблицы, хранящихся в этих двух экземплярах. Вывод таков:

  • Записать данные в распределенную таблицу, указав шард-ключ.
  • Данные распределяются в соответствии с пользовательскими правилами сегментирования, указанными при создании распределенной таблицы.
  • select count(*) из учебника.hits_v1 Выбор занял 2 миллисекунды count(*) из db1.hits_all занял 6 миллисекунд,существовать В этой тестовой среде,Таблица Запросраспределенный работает в два раза медленнее локальной таблицы Запрос.
  • Базовая таблица ifuse MergeTree настольный движок,распределенная таблица, в которой обычно определяются правила распределения,Вставка в распределенную таблицу может автоматически синхронизировать данные между разными копиями на одном шарде.

5. Используйте механизм таблиц ReplicationMergeTree для копирования данных.

Согласно общепринятому пониманию, распределенная база данных должна отвечать как минимум следующим основным требованиям:

  • Данные автоматически фрагментируются по заданным правилам.
  • Несколько копий одних и тех же данных осколков остаются согласованными
  • Сегментирование данных и синхронизация данных между несколькими копиями прозрачны для приложений.

ClickHouse Рекомендуется Конфигурациядаиспользовать ReplicatedMergeTree Табличный движок автоматически выполняет репликацию данных между репликами. создавать ReplcatedMergeTree поверхность,обычно требуетсянастраиватьмакрос для идентификации каждогосоздаватьповерхностьосколковикопировать。

(1) Определить макрос

Выполните следующие шаги на всех четырех хостах.

Исправлять /etc/clickhouse-server/config.xml хозяин Конфигурационный файл,существование каждого узла <shard> Добавить под <internal_replication>true</internal_replication>:

Язык кода:javascript
копировать
    <remote_servers>
        <cluster_2S_2R>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>node1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
                <replica>
                    <host>node2</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>node3</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
                <replica>
                    <host>node4</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
            </shard>
        </cluster_2S_2R>
    </remote_servers>

в узле </remote_servers> Добавьте следующий контент позже:

Язык кода:javascript
копировать
<macros>
    <shard>01</shard>
    <replica>01</replica>
</macros>

node1 Конфигурациястановиться 01、01;node2 Конфигурациястановиться 01、02;node3 Конфигурациястановиться 02、01;node4 Конфигурациястановиться 02、02。

Затем перезапустите все экземпляры:

Язык кода:javascript
копировать
sudo service clickhouse-server restart
(2) Создайте локальную таблицу

Выполните следующий оператор создания таблицы в любом экземпляре:

Язык кода:javascript
копировать
CREATE TABLE db1.hits_replica ON CLUSTER 'cluster_2S_2R'
(
    `WatchID` UInt64,
    `JavaEnable` UInt8,
    `Title` String,
    `GoodEvent` Int16,
    `EventTime` DateTime,
    `EventDate` Date,
    `CounterID` UInt32,
    `ClientIP` UInt32,
    `ClientIP6` FixedString(16),
    `RegionID` UInt32,
    `UserID` UInt64,
    `CounterClass` Int8,
    `OS` UInt8,
    `UserAgent` UInt8,
    `URL` String,
    `Referer` String,
    `URLDomain` String,
    `RefererDomain` String,
    `Refresh` UInt8,
    `IsRobot` UInt8,
    `RefererCategories` Array(UInt16),
    `URLCategories` Array(UInt16),
    `URLRegions` Array(UInt32),
    `RefererRegions` Array(UInt32),
    `ResolutionWidth` UInt16,
    `ResolutionHeight` UInt16,
    `ResolutionDepth` UInt8,
    `FlashMajor` UInt8,
    `FlashMinor` UInt8,
    `FlashMinor2` String,
    `NetMajor` UInt8,
    `NetMinor` UInt8,
    `UserAgentMajor` UInt16,
    `UserAgentMinor` FixedString(2),
    `CookieEnable` UInt8,
    `JavascriptEnable` UInt8,
    `IsMobile` UInt8,
    `MobilePhone` UInt8,
    `MobilePhoneModel` String,
    `Params` String,
    `IPNetworkID` UInt32,
    `TraficSourceID` Int8,
    `SearchEngineID` UInt16,
    `SearchPhrase` String,
    `AdvEngineID` UInt8,
    `IsArtifical` UInt8,
    `WindowClientWidth` UInt16,
    `WindowClientHeight` UInt16,
    `ClientTimeZone` Int16,
    `ClientEventTime` DateTime,
    `SilverlightVersion1` UInt8,
    `SilverlightVersion2` UInt8,
    `SilverlightVersion3` UInt32,
    `SilverlightVersion4` UInt16,
    `PageCharset` String,
    `CodeVersion` UInt32,
    `IsLink` UInt8,
    `IsDownload` UInt8,
    `IsNotBounce` UInt8,
    `FUniqID` UInt64,
    `HID` UInt32,
    `IsOldCounter` UInt8,
    `IsEvent` UInt8,
    `IsParameter` UInt8,
    `DontCountHits` UInt8,
    `WithHash` UInt8,
    `HitColor` FixedString(1),
    `UTCEventTime` DateTime,
    `Age` UInt8,
    `Sex` UInt8,
    `Income` UInt8,
    `Interests` UInt16,
    `Robotness` UInt8,
    `GeneralInterests` Array(UInt16),
    `RemoteIP` UInt32,
    `RemoteIP6` FixedString(16),
    `WindowName` Int32,
    `OpenerName` Int32,
    `HistoryLength` Int16,
    `BrowserLanguage` FixedString(2),
    `BrowserCountry` FixedString(2),
    `SocialNetwork` String,
    `SocialAction` String,
    `HTTPError` UInt16,
    `SendTiming` Int32,
    `DNSTiming` Int32,
    `ConnectTiming` Int32,
    `ResponseStartTiming` Int32,
    `ResponseEndTiming` Int32,
    `FetchTiming` Int32,
    `RedirectTiming` Int32,
    `DOMInteractiveTiming` Int32,
    `DOMContentLoadedTiming` Int32,
    `DOMCompleteTiming` Int32,
    `LoadEventStartTiming` Int32,
    `LoadEventEndTiming` Int32,
    `NSToDOMContentLoadedTiming` Int32,
    `FirstPaintTiming` Int32,
    `RedirectCount` Int8,
    `SocialSourceNetworkID` UInt8,
    `SocialSourcePage` String,
    `ParamPrice` Int64,
    `ParamOrderID` String,
    `ParamCurrency` FixedString(3),
    `ParamCurrencyID` UInt16,
    `GoalsReached` Array(UInt32),
    `OpenstatServiceName` String,
    `OpenstatCampaignID` String,
    `OpenstatAdID` String,
    `OpenstatSourceID` String,
    `UTMSource` String,
    `UTMMedium` String,
    `UTMCampaign` String,
    `UTMContent` String,
    `UTMTerm` String,
    `FromTag` String,
    `HasGCLID` UInt8,
    `RefererHash` UInt64,
    `URLHash` UInt64,
    `CLID` UInt32,
    `YCLID` UInt64,
    `ShareService` String,
    `ShareURL` String,
    `ShareTitle` String,
    `ParsedParams` Nested(
        Key1 String,
        Key2 String,
        Key3 String,
        Key4 String,
        Key5 String,
        ValueDouble Float64),
    `IslandID` FixedString(16),
    `RequestNum` UInt32,
    `RequestTry` UInt8
)
ENGINE = ReplicatedMergeTree(
    '/clickhouse/tables/{shard}/hits',
    '{replica}'
)
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);
(3) Создать распределенную таблицу

Выполните следующий оператор создания таблицы в любом экземпляре:

Язык кода:javascript
копировать
CREATE TABLE db1.hits_replica_all ON CLUSTER 'cluster_2S_2R'
AS db1.hits_replica
ENGINE = Distributed(cluster_2S_2R, db1, hits_replica, rand());
(4) Вставьте данные в распределенную таблицу.

Выполните следующий оператор вставки в любом экземпляре:

Язык кода:javascript
копировать
INSERT INTO db1.hits_replica_all SELECT * FROM tutorial.hits_v1;
(5) Выполнять запросы SELECT для всех экземпляров отдельно.
Язык кода:javascript
копировать
# node1
vvml-yz-hbase-test.172.18.4.126 :) select count(*) from db1.hits_replica;

SELECT count(*)
FROM db1.hits_replica

Query id: e4f08a9c-39be-48cf-a8f9-6caaa98b9fed

┌─count()─┐
│ 4438089 │
└─────────┘

1 row in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.126 :) select count(*) from db1.hits_replica_all;

SELECT count(*)
FROM db1.hits_replica_all

Query id: 765f0ea5-a199-4bfb-85c4-6fd31e23f1af

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.007 sec. 

vvml-yz-hbase-test.172.18.4.126 :) 

# node2
vvml-yz-hbase-test.172.18.4.188 :) select count(*) from db1.hits_replica;

SELECT count(*)
FROM db1.hits_replica

Query id: b464df00-4c1a-4fea-8f2f-70fd0c32569f

┌─count()─┐
│ 4438089 │
└─────────┘

1 row in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.188 :) select count(*) from db1.hits_replica_all;

SELECT count(*)
FROM db1.hits_replica_all

Query id: 19a77125-7e7e-4654-bb90-8884c3b0ed26

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.007 sec. 

vvml-yz-hbase-test.172.18.4.188 :) 

# node3
vvml-yz-hbase-test.172.18.4.71 :) select count(*) from db1.hits_replica;

SELECT count(*)
FROM db1.hits_replica

Query id: e021f13c-b980-4297-9c26-b94465503101

┌─count()─┐
│ 4435809 │
└─────────┘

1 row in set. Elapsed: 0.003 sec. 

vvml-yz-hbase-test.172.18.4.71 :) select count(*) from db1.hits_replica_all;

SELECT count(*)
FROM db1.hits_replica_all

Query id: 80ebbda2-be03-445c-8c16-f67428a45572

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.005 sec. 

vvml-yz-hbase-test.172.18.4.71 :) 

# node4
vvml-yz-hbase-test.172.18.4.86 :) select count(*) from db1.hits_replica;

SELECT count(*)
FROM db1.hits_replica

Query id: 204f483d-3fcb-4758-8df4-20e79f78e42e

┌─count()─┐
│ 4435809 │
└─────────┘

1 row in set. Elapsed: 0.002 sec. 

vvml-yz-hbase-test.172.18.4.86 :) select count(*) from db1.hits_replica_all;

SELECT count(*)
FROM db1.hits_replica_all

Query id: e3d28b81-50b7-46e6-a855-1b40ef9fe42a

┌─count()─┐
│ 8873898 │
└─────────┘

1 row in set. Elapsed: 0.007 sec. 

vvml-yz-hbase-test.172.18.4.86 :)

Посмотреть из Запроса Может результаты, что локальная таблица node1、node2 Результаты по Запросу те же, node3, node4 Результаты Запроса на распределенной таблице такие же. узел1 и node3 принадлежат разным шардам в кластере и существуют Создать распределенную Правила распределения, указанные в таблице, являются случайными, поэтому ожидается небольшая разница в объеме данных локальной таблицы, хранящихся в этих двух экземплярах. Реплицированное дерево слияния Таблица может автоматически синхронизировать данные между разными репликами одного шарда.

ссылка:

boy illustration
Краткое изложение 10 способов регистрации bean-компонентов в SpringBoot
boy illustration
Flask Learning-9. 2 способа включения режима отладки (debug mode).
boy illustration
Руководство по настройке самостоятельного сервера для Eudemons Parlu
boy illustration
40 вопросов для собеседований по SpringBoot, которые необходимо задавать на собеседованиях! При необходимости ответьте на вопросы для собеседования SpringBoot [предлагаемый сборник] [легко понять]
boy illustration
Через два года JVM может быть заменен GraalVM.
boy illustration
Разрешение циклических зависимостей Spring Bean: существует ли неразрешимая циклическая ссылка?
boy illustration
Разница между промежуточным программным обеспечением ASP.NET Core и фильтрами
boy illustration
[Серия Foolish Old Man] Ноябрь 2023 г. Специальная тема Winform Control Элемент управления DataGridView Подробное объяснение
boy illustration
.NET Как загрузить файлы через HttpWebRequest
boy illustration
[Веселый проект Docker] Обновленная версия 2023 года! Создайте эксклюзивный инструмент управления паролями за 10 минут — Vaultwarden
boy illustration
Высокопроизводительная библиотека бревен Golang zap + компонент для резки бревен лесоруба подробное объяснение
boy illustration
Концепция и использование Springboot ConstraintValidator
boy illustration
Новые функции Go 1.23: точная настройка основных библиотек, таких как срезы и синхронизация, значительно улучшающая процесс разработки.
boy illustration
[Весна] Введение и базовое использование AOP в Spring, SpringBoot использует AOP.
boy illustration
Чтобы начать работу с рабочим процессом Flowable, этой статьи достаточно.
boy illustration
Байтовое интервью: как решить проблему с задержкой сообщений MQ?
boy illustration
ASP.NET Core использует функциональные переключатели для управления реализацией доступа по маршрутизации.
boy illustration
[Проблема] Решение Невозможно подключиться к Redis; вложенное исключение — io.lettuce.core.RedisConnectionException.
boy illustration
От теории к практике: проектирование чистой архитектуры в проектах Go
boy illustration
Решение проблемы искажения китайских символов при чтении файлов Net Core.
boy illustration
Реализация легких независимых конвейеров с использованием Brighter
boy illustration
Как удалить и вернуть указанную пару ключ-значение из ассоциативного массива в PHP
boy illustration
Feiniu fnos использует Docker для развертывания учебного пособия по AList
boy illustration
Принципы и практика использования многопоточности в различных версиях .NET.
boy illustration
Как использовать PaddleOCRSharp в рамках .NET
boy illustration
CRUD используется уже два или три года. Как читать исходный код Spring?
boy illustration
Устраните проблему совместимости между версией Spring Boot и Gradle Java: возникла проблема при настройке корневого проекта «demo1» > Не удалось.
boy illustration
Научите вас шаг за шагом, как настроить Nginx.
boy illustration
Это руководство — все, что вам нужно для руководства по автономному развертыванию сервера для проектов Python уровня няни (рекомендуемый сборник).
boy illustration
Не удалось запустить docker.service — Подробное объяснение идеального решения ️