En este ejemplo, aprenderás a configurar un clúster sencillo de ClickHouse que puede escalar. Hay cinco servidores configurados. Dos se utilizan para segmentar los datos. Los otros tres servidores se utilizan para la coordinación.La arquitectura del clúster que configurarás se muestra a continuación:
Aunque es posible ejecutar ClickHouse Server y ClickHouse Keeper juntos en el mismo servidor,
recomendamos encarecidamente usar hosts dedicados para ClickHouse Keeper en entornos de producción,
que es el enfoque que mostraremos en este ejemplo.Los servidores Keeper pueden ser más pequeños, y 4 GB de RAM suele ser suficiente para cada servidor Keeper
hasta que los servidores ClickHouse alcancen un tamaño considerable.
Requisitos previos
- Ya has configurado antes un servidor local de ClickHouse
- Estás familiarizado con los conceptos básicos de configuración de ClickHouse, como los archivos de configuración
- Tienes Docker instalado en tu equipo
1
Configurar la estructura de directorios y el entorno de prueba
En este tutorial, utilizará Docker compose para configurar el clúster de ClickHouse. Esta configuración puede adaptarse para funcionar también con máquinas locales independientes, máquinas virtuales o instancias en la nube.Ejecute los siguientes comandos para configurar la estructura de directorios de este ejemplo:docker-compose.yml al directorio cluster_2S_1R:docker-compose.yml
- El directorio
config.dcontiene el archivo de configuración del servidor ClickHouseconfig.xml, en el que se define la configuración personalizada de cada nodo de ClickHouse. Esta configuración se combina con el archivo de configuración predeterminadoconfig.xmlde ClickHouse, incluido en cada instalación de ClickHouse. - El directorio
users.dcontiene el archivo de configuración de usuariosusers.xml, en el que se define la configuración personalizada para los usuarios. Esta configuración se combina con el archivo de configuración predeterminadousers.xmlde ClickHouse, incluido en cada instalación de ClickHouse.
2
Configurar nodos de ClickHouse
Configuración del servidor
Ahora modifique cada archivo de configuración vacíoconfig.xml ubicado en
fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d. Las líneas resaltadas
a continuación deben cambiarse para que sean específicas de cada nodo:Cada sección del archivo de configuración anterior se explica con más detalle a continuación.
Redes y registro
La comunicación externa a través de la interfaz de red se habilita al activar la configuración de listen host. Esto garantiza que el host del servidor ClickHouse sea accesible desde otros hosts:8123:9000:<logger>. Esta configuración de ejemplo
genera un log de depuración que rotará cada 1000M un máximo de tres veces:Configuración del clúster
La configuración del clúster se establece en el bloque<remote_servers>.
Aquí se define el nombre del clúster cluster_2S_1R.El bloque <cluster_2S_1R></cluster_2S_1R> define el layout del clúster
mediante las configuraciones <shard></shard> y <replica></replica>, y actúa como
plantilla para las consultas de DDL distribuido, es decir, consultas que se ejecutan en todo el
clúster mediante la cláusula ON CLUSTER. De forma predeterminada, las consultas de DDL distribuido
están permitidas, pero también pueden desactivarse con la configuración allow_distributed_ddl_queries.internal_replication se deja en false de forma predeterminada, ya que solo hay una réplica por segmento.Configuración de Keeper
La sección<ZooKeeper> indica a ClickHouse dónde se está ejecutando ClickHouse Keeper (o ZooKeeper).
Como estamos utilizando un cluster de ClickHouse Keeper, es necesario especificar cada <node> del cluster,
junto con su hostname y número de puerto mediante las etiquetas <host> y <port> respectivamente.La configuración de ClickHouse Keeper se explica en el siguiente paso del tutorial.Aunque es posible ejecutar ClickHouse Keeper en el mismo servidor que ClickHouse Server,
en entornos de producción recomendamos encarecidamente que ClickHouse Keeper se ejecute en servidores dedicados.
Configuración de macros
Además, la sección<macros> se utiliza para definir sustituciones de parámetros para
tablas replicadas. Estas se listan en system.macros y permiten usar sustituciones
como {shard} y {replica} en las consultas.Estos se definirán específicamente según la configuración del clúster.
Configuración de usuario
Ahora modifique cada archivo de configuración vacíousers.xml ubicado en
fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d con el siguiente contenido:/users.d/users.xml
En este ejemplo, el usuario predeterminado se configura sin contraseña por motivos de simplicidad.
En la práctica, esto no es recomendable.
En este ejemplo, cada archivo
users.xml es idéntico para todos los nodos del clúster.3
Configurar ClickHouse Keeper
Configuración de ClickHouse Keeper
Para que la replicación funcione, es necesario configurar un clúster de ClickHouse Keeper. ClickHouse Keeper proporciona el sistema de coordinación para la replicación de datos y actúa como reemplazo directo de ZooKeeper, que también podría utilizarse. No obstante, se recomienda ClickHouse Keeper, ya que ofrece mejores garantías y fiabilidad, además de utilizar menos recursos que ZooKeeper. Para lograr alta disponibilidad y mantener el quorum, se recomienda ejecutar al menos tres nodos de ClickHouse Keeper.ClickHouse Keeper puede ejecutarse en cualquier nodo del clúster junto con ClickHouse, aunque
se recomienda hacerlo en un nodo dedicado, lo que permite escalar y
administrar el clúster de ClickHouse Keeper de forma independiente del clúster de base de datos.
keeper_config.xml para cada nodo de ClickHouse Keeper
con el siguiente comando desde la raíz de la carpeta de ejemplo:fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper. Las
líneas resaltadas a continuación deben modificarse para que sean específicas de cada nodo:/clickhouse-keeper/keeper_config.xml
Cada archivo de configuración contendrá la siguiente configuración única (que se muestra a continuación).
El
server_id utilizado debe ser único para ese nodo específico de ClickHouse Keeper
en el clúster y coincidir con el <id> del servidor definido en la sección <raft_configuration>.
tcp_port es el puerto que utilizan los clientes de ClickHouse Keeper.4
Prueba la configuración
Asegúrate de que Docker se esté ejecutando en tu máquina. Inicia el clúster con el comandodocker-compose up desde la raíz del directorio cluster_2S_1R:clickhouse-01 o clickhouse-02 y ejecute la
siguiente consulta. A continuación, se muestra el comando para conectarse al primer nodo:Query
Response
Query
Response
mntr también se usa habitualmente para verificar que ClickHouse Keeper
está en ejecución y para obtener información sobre el estado de la relación entre los tres nodos de Keeper.
En la configuración utilizada en este ejemplo, hay tres nodos que trabajan juntos.
Los nodos elegirán un líder y los nodos restantes serán followers.El comando mntr proporciona información relacionada con el rendimiento y con si un nodo
determinado es follower o leader.Ejecute el siguiente comando desde un shell en clickhouse-keeper-01, clickhouse-keeper-02 y
clickhouse-keeper-03 para comprobar el estado de cada nodo de Keeper. El comando
para clickhouse-keeper-01 se muestra a continuación:Response
Response
5
Crear una base de datos
Ahora que ha verificado que el clúster está correctamente configurado y en ejecución, volverá a crear la misma tabla que se utiliza en el tutorial del conjunto de datos de ejemplo UK property prices. Consta de alrededor de 30 millones de filas con precios pagados por propiedades inmobiliarias en Inglaterra y Gales desde 1995.Conéctese al cliente de cada host ejecutando cada uno de los siguientes comandos en pestañas o ventanas de terminal independientes:clickhouse-client en cada host para confirmar que
aún no se ha creado ninguna base de datos, aparte de las predeterminadas:Query
Response
clickhouse-01, ejecute la siguiente consulta DDL distribuida con la
cláusula ON CLUSTER para crear una nueva base de datos llamada uk:clickhouse-01:6
Crear una tabla en el clúster
Ahora que ya se ha creado la base de datos, cree una tabla. Ejecute la siguiente consulta desde cualquiera de los clientes del host:CREATE original del
tutorial del conjunto de datos de ejemplo
UK property prices,
excepto por la cláusula ON CLUSTER.La cláusula ON CLUSTER está diseñada para la ejecución distribuida de consultas DDL (Data Definition Language)
como CREATE, DROP, ALTER y RENAME, lo que garantiza que estos
cambios de esquema se apliquen en todos los nodos de un clúster.Puede ejecutar la siguiente consulta desde el cliente de cada host para confirmar que la tabla se ha creado en todo el clúster:Query
Response
clickhouse-01 la siguiente consulta INSERT:clickhouse-02 y ejecuta la siguiente consulta INSERT:Query
clickhouse-01 o clickhouse-02, ejecute la siguiente consulta:ReplicatedMergeTree, solo se devuelve la fila que se insertó en la tabla de ese
host concreto, y no ambas filas.Para leer los datos de los dos segmentos, necesitamos una interfaz que pueda gestionar consultas
en todos los segmentos, combinando los datos de ambos segmentos cuando ejecutamos consultas SELECT
sobre ella o insertando datos en ambos segmentos cuando ejecutamos consultas INSERT.En ClickHouse, esta interfaz se denomina tabla distribuida, y la creamos con
el motor de tabla Distributed. Veamos cómo funciona.7
Crear una tabla distribuida
Cree una tabla distribuida con la consulta siguiente:rand() como clave de sharding para que
las inserciones se distribuyan aleatoriamente entre los segmentos.Ahora consulta la tabla distribuida desde cualquiera de los hosts y obtendrás
ambas filas insertadas en los dos hosts, a diferencia del ejemplo anterior:ON CLUSTER:8
Insertar datos en una tabla distribuida
Ahora conéctese a cualquiera de los hosts e inserte los datos:Query
Response
rand(), por lo que los resultados pueden variar):clickhouse-01:Response
clickhouse-02, ejecuta la misma consulta SELECT que ejecutamos antes en la tabla
distribuida:Response