How To Gather Infrastructure Metrics with Metricbeat on Ubuntu 18.04

The author selected the Computer History Museum to receive a donation as part of the Write for DOnations program.

Introduction

Metricbeat, which is one of several Beats that helps send various types of server data to an Elastic Stack server, is a lightweight data shipper that, once installed on your servers, periodically collects system-wide and per-process CPU and memory statistics and sends the data directly to your Elasticsearch deployment. This shipper replaces the earlier Topbeat in version 5.0 of the Elastic Stack.

Other Beats currently available from Elastic are:

  • Filebeat: collects and ships log files.
  • Packetbeat: collects and analyzes network data.
  • Winlogbeat: collects Windows event logs.
  • Auditbeat: collects Linux audit framework data and monitors file integrity.
  • Heartbeat: monitors services for their availability with active probing.

In this tutorial, you will use Metricbeat to forward local system metrics like CPU/memory/disk usage and network utilization from an Ubuntu 18.04 server to another server of the same kind with the Elastic Stack installed. With this shipper, you will gather the basic metrics that you need to get the current state of your server.

Prerequisites

To follow this tutorial, you will need:

Note: When installing the Elastic Stack, you must use the same version across the entire stack. In this tutorial, you will use the latest versions of the entire stack which are, at the time of this writing, Elasticsearch 6.6.2, Kibana 6.6.2, Logstash 6.6.2, and Metricbeat 6.6.2.

Step 1 — Configuring Elasticsearch to Listen for Traffic on an External IP

The tutorial How To Install Elasticsearch, Logstash, and Kibana (Elastic Stack) on Ubuntu 18.04 restricted Elasticsearch access to the localhost only. In practice, this is rare, since you will often need to monitor many hosts. In this step, you will configure the Elastic Stack components to interact with the external IP address.

Log in to your Elastic Stack server as your non-root user:

  • ssh sammy@Elastic_Stack_server_ip

Use your preferred text editor to edit Elasticsearch’s main configuration file, elasticsearch.yml. This tutorial will use nano:

  • sudo nano /etc/elasticsearch/elasticsearch.yml

Find the following section and modify it so that Elasticsearch listens on all interfaces:

/etc/elasticsearch/elasticsearch.yml
. . . network.host: 0.0.0.0 . . . 

The address 0.0.0.0 is assigned specific meanings in a number of contexts. In this case, 0.0.0.0 means “any IPv4 address at all.”

Save and close elasticsearch.yml by pressing CTRL+X, followed by Y and then ENTER if you’re using nano. Then, restart the Elasticsearch service with systemctl to apply new settings:

  • sudo systemctl restart elasticsearch

Now, allow access to the Elasticsearch port from your second Ubuntu server. You will use ufw for this:

  • sudo ufw allow from second_ubuntu_server_ip/32 to any port 9200

Repeat this command for each of your servers if you have more than two. If your servers are on the same network, you can allow access using one rule for all hosts on the network. To do this, you need to replace the prefix /32 with a lower value, for example /24. You can find more examples of UFW setups in the UFW Essentials: Common Firewall Rules and Commands tutorial.

Next, test the connection. Log in to your second Ubuntu server as your non-root user:

  • ssh sammy@second_ubuntu_server_ip

Use the telnet command to test the connection to the Elastic Stack server. This command enables communication with another host using the Telnet protocol and can check the availability of a port on a remote system.

  • telnet Elastic_Stack_server_ip 9200

You’ll receive the following output:

Output
Trying Elastic_Stack_server_ip... Connected to Elastic_Stack_server_ip. Escape character is '^]'.

Close the Telnet connection by pressing CTRL+], followed by CTRL+d. You can type quit and then press ENTER to exit the Telnet utility.

Now you are ready to send metrics to your Elastic Stack server.

Step 2 — Installing and Configuring Metricbeat on the Elastic Stack Server

In the next two steps, you will first install Metricbeat on the Elastic Stack server and import all the needed data, then install and configure the client on the second Ubuntu server.

Log into your Elastic Stack server as your non-root user:

  • ssh sammy@Elastic_Stack_server_ip

Since you previously set up the Elasticsearch repositories in the prerequisite, you only need to install Metricbeat:

  • sudo apt install metricbeat

Once Metricbeat is finished installing, load the index template into Elasticsearch. An Elasticsearch index is a collection of documents that have similar characteristics. Specific names identify each index, which Elasticsearch will use to refer to the indexes when performing various operations. Your Elasticsearch server will automatically apply the index template when you create a new index.

To load the template, use the following command:

  • sudo metricbeat setup --template -E 'output.elasticsearch.hosts=["localhost:9200"]'

You will see the following output:

Output
Loaded index template

Metricbeat comes packaged with example Kibana dashboards, visualizations, and searches for visualizing Metricbeat data in Kibana. Before you can use the dashboards, you need to create the index pattern and load the dashboards into Kibana.

To load the templates, use the following command:

  • sudo metricbeat setup -e -E output.elasticsearch.hosts=['localhost:9200'] -E setup.kibana.host=localhost:5601

You will see output that looks like this:

Output
. . . 2019-02-15T09:51:32.096Z INFO instance/beat.go:281 Setup Beat: metricbeat; Version: 6.6.2 2019-02-15T09:51:32.136Z INFO add_cloud_metadata/add_cloud_metadata.go:323 add_cloud_metadata: hosting provider type detected as digitalocean, metadata={"instance_id":"133130541","provider":"digitalocean","region":"fra1"} 2019-02-15T09:51:32.137Z INFO elasticsearch/client.go:165 Elasticsearch url: http://localhost:9200 2019-02-15T09:51:32.137Z INFO [publisher] pipeline/module.go:110 Beat name: elastic 2019-02-15T09:51:32.138Z INFO elasticsearch/client.go:165 Elasticsearch url: http://localhost:9200 2019-02-15T09:51:32.140Z INFO elasticsearch/client.go:721 Connected to Elasticsearch version 6.6.2 2019-02-15T09:51:32.148Z INFO template/load.go:130 Template already exists and will not be overwritten. 2019-02-15T09:51:32.148Z INFO instance/beat.go:894 Template successfully loaded. Loaded index template Loading dashboards (Kibana must be running and reachable) 2019-02-15T09:51:32.149Z INFO elasticsearch/client.go:165 Elasticsearch url: http://localhost:9200 2019-02-15T09:51:32.150Z INFO elasticsearch/client.go:721 Connected to Elasticsearch version 6.6.2 2019-02-15T09:51:32.151Z INFO kibana/client.go:118 Kibana url: http://localhost:5601 2019-02-15T09:51:56.209Z INFO instance/beat.go:741 Kibana dashboards successfully loaded. Loaded dashboards

Now you can start and enable Metricbeat:

  • sudo systemctl start metricbeat
  • sudo systemctl enable metricbeat

Metricbeat will begin shipping your system stats into Elasticsearch.

To verify that Elasticsearch is indeed receiving this data, query the Metricbeat index with this command:

  • curl -XGET 'http://localhost:9200/metricbeat-*/_search?pretty'

You will see an output that looks similar to this:

Output
... { "took" : 3, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 108, "max_score" : 1.0, "hits" : [ { "_index" : "metricbeat-6.6.2-2019.02.15", "_type" : "doc", "_id" : "A4mU8GgBKrpxEYMLjJZt", "_score" : 1.0, "_source" : { "@timestamp" : "2019-02-15T09:54:52.481Z", "metricset" : { "name" : "network", "module" : "system", "rtt" : 125 }, "event" : { "dataset" : "system.network", "duration" : 125260 }, "system" : { "network" : { "in" : { "packets" : 59728, "errors" : 0, "dropped" : 0, "bytes" : 736491211 }, "out" : { "dropped" : 0, "packets" : 31630, "bytes" : 8283069, "errors" : 0 }, "name" : "eth0" } }, "beat" : { "version" : "6.6.2", "name" : "elastic", "hostname" : "elastic" }, ...

The line "total" : 108, indicates that Metricbeat has found 108 search results for this specific metric. If your output shows 0 total hits, you will need to review your setup for errors. If you received the expected output, continue to the next step, in which you will install Metricbeat on the second Ubuntu server.

Step 3 — Installing and Configuring Metricbeat on the Second Ubuntu Server

Perform this step on all Ubuntu servers from which you want to send metrics to your Elastic Stack server.

Log into your second Ubuntu server as your non-root user:

  • ssh sammy@second_ubuntu_server_ip

The Elastic Stack components are not available in Ubuntu’s default package repositories. However, you can install them with APT after adding Elastic’s package source list.

All of the Elastic Stack’s packages are signed with the Elasticsearch signing key in order to protect your system from package spoofing. Your package manager will trust packages that have been authenticated using the key. In this step, you will import the Elasticsearch public GPG key and add the Elastic package source list in order to install Metricbeat.

To begin, run the following command to import the Elasticsearch public GPG key into APT:

  • wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Next, add the Elastic source list to the sources.list.d directory, where APT will look for new sources:

  • echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Next, update your package lists so APT will read the new Elastic source:

  • sudo apt update

Then install Metricbeat with this command:

  • sudo apt install metricbeat

Once Metricbeat is finished installing, configure it to connect to Elasticsearch. Open its configuration file, metricbeat.yml:

  • sudo nano /etc/metricbeat/metricbeat.yml

Note: Metricbeat’s configuration file is in YAML format, which means that indentation is very important! Be sure that you do not add any extra spaces as you edit this file.

Metricbeat supports numerous outputs, but you’ll usually only send events directly to Elasticsearch or to Logstash for additional processing. Find the following section and update the IP address:

/etc/metricbeat/metricbeat.yml
#-------------------------- Elasticsearch output ------------------------------ output.elasticsearch:   # Array of hosts to connect to.   hosts: ["Elastic_Stack_server_ip:9200"]  ... 

Save and close the file.

You can extend the functionality of Metricbeat with modules. In this tutorial, you will use the system module, which allows you to monitor your server’s stats like CPU/memory/disk usage and network utilization.

In this case, the system module is enabled by default. You can see a list of enabled and disabled modules by running:

  • sudo metricbeat modules list

You will see a list similar to the following:

Output
Enabled: system Disabled: aerospike apache ceph couchbase docker dropwizard elasticsearch envoyproxy etcd golang graphite haproxy http jolokia kafka kibana kubernetes kvm logstash memcached mongodb munin mysql nginx php_fpm postgresql prometheus rabbitmq redis traefik uwsgi vsphere windows zookeeper

You can see the parameters of the module in the /etc/metricbeat/modules.d/system.yml configuration file. In the case of this tutorial, you do not need to change anything in the configuration. The default metricsets are cpu, load, memory, network, process, and process_summary. Each module has one or more metricset. A metricset is the part of the module that fetches and structures the data. Rather than collecting each metric as a separate event, metricsets retrieve a list of multiple related metrics in a single request to the remote system.

Now you can start and enable Metricbeat:

  • sudo systemctl start metricbeat
  • sudo systemctl enable metricbeat

You need to repeat this step on all servers where you want to collect metrics. After that, you can proceed to the next step in which you will see how to navigate through some of Kibana’s dashboards.

Step 4 — Exploring Kibana Dashboards

In this step, you will take a look at Kibana, the web interface that you installed in the Prerequisites section.

In a web browser, go to the FQDN or public IP address of your Elastic Stack server. After entering the login credentials you defined in Step 2 of the Elastic Stack tutorial, you will see the Kibana homepage:

Kibana Homepage

Click the Discover link in the left-hand navigation bar. On the Discover page, select the predefined meticbeat-* index pattern to see Metricbeat data. By default, this will show you all of the log data over the last 15 minutes. You will find a histogram and some metric details:

Discover page

Here, you can search and browse through your metrics and also customize your dashboard. At this point, though, there won’t be much in there because you are only gathering system stats from your servers.

Use the left-hand panel to navigate to the Dashboard page and search for the Metricbeat System dashboard. Once there, you can search for the sample dashboards that come with Metricbeat’s system module.

For example, you can view brief information about all your hosts:

Syslog Dashboard

You can also click on the host name and view the detailed information:

Sudo Dashboard

Kibana has many other features, such as graphing and filtering, so feel free to explore.

Conclusion

In this tutorial, you’ve installed Metricbeat and configured the Elastic Stack to collect and analyze system metrics. Metricbeat comes with internal modules that collect metrics from services like Apache, Nginx, Docker, MySQL, PostgreSQL, and more. Now you can collect and analyze the metrics of your applications by simply turning on the modules you need.

If you want to understand more about server monitoring, check out An Introduction to Metrics, Monitoring, and Alerting and Putting Monitoring and Alerting into Practice.

DigitalOcean Community Tutorials

Comment installer la pile Linux, Apache, MySQL, PHP (LAMP) sur un serveur Ubuntu 18.04

Introduction

Une pile “LAMP” est un groupe de logiciels libres qui sont généralement installés ensemble afin de permettre à un serveur d’héberger des sites internet dynamiques ainsi que des applications web. Le terme constitue généralement un acronyme qui représente le système d’exploitation Linux, le serveur web Apache. Les données du site sont hébergées sur une base de données MySQL, puis le contenu dynamique est traité par PHP.

Dans ce guide, nous installerons une pile LAMP sur un serveur Ubuntu 18.04.

Préalable

Afin de compléter ce tutoriel, vous aurez besoin d’un serveur Ubuntu 18.04, un compte d’utilisateur non-root «sudo» activé, ainsi qu’un pare-feu de base. Cela peut être configuré en se référant à notre guide de configuration initial pour Ubuntu 18.04.

Étape 1 — Installer Apache et mettre à jour le pare-feu.

Le serveur Apache est parmi les serveurs web les plus populaires au monde. Il est bien documenté et a été utilisé abondamment pour la majeure partie de l’histoire de l’internet, ce qui en fait un bon choix par défaut pour héberger un site internet.

Installer Apache à l’aide du gestionnaire de paquets d’Ubuntu, apt:

  • sudo apt update
  • sudo apt install apache2

Puisqu’il s’agit d’une commande sudo, ces opérations sont exécutées avec les privilèges root. On vous demandera votre mot de passe d’utilisateur régulier afin de connaître vos intentions.

Dès que vous aurez entré votre mot de passe, apt vous dira quels paquets il prévoit installer et combien d’espace il prendra sur votre disque dur. Entrez la touche Y et appuyer sur ENTER afin de continuer, et l’installation poursuivra.

Ajuster votre pare-feu afin d’autoriser le trafic web.

Ensuite, en présumant que vous avez suivi les instructions de configuration initiale du serveur et autorisé le pare-feu UFW, assurez-vous que votre pare-feu autorise le trafic HTTP et HTTPS. Vous pouvez vérifier que UFW possède un profil d’application pour Apache de la manière suivante :

  • sudo ufw app list
SortieOutput
Available applications: Apache Apache Full Apache Secure OpenSSH

Si vous regardez sur le profil Apache Full, il devrait y être indiqué qu’il permet le trafic aux ports 80 et 443 :

  • sudo ufw app info "Apache Full"
SortieOutput
Profile: Apache Full Title: Web Server (HTTP,HTTPS) Description: Apache v2 is the next generation of the omnipresent Apache web server. Ports: 80,443/tcp

Autoriser le trafic HTTP et HTTPS entrant pour ce profil :

  • sudo ufw allow in "Apache Full"

Vous pouvez immédiatement effectuer une vérification afin de valider que tout se soit déroulé comme prévu en visitant l’adresse IP de votre serveur public sur votre navigateur web (voir la note sous la rubrique suivante afin de voir quel est votre adresse IP, si vous ne disposez pas déjà de cette information) :

http://your_server_ip 

Vous allez voir la page web par défaut du serveur Ubuntu 18.04 Apache qui s’affiche à titre d’information et à des fins d’essai. La page devrait ressembler à ceci :

Ubuntu 18.04 Apache default

Si vous voyez cette page, cela veut dire que votre serveur web est maintenant bien installé et qu’il est accessible à travers votre pare-feu.

Comment trouver l’adresse IP publique de votre serveur

Si vous ne connaissez pas l’adresse IP publique de votre serveur, il existe différentes façons de la trouver. Normalement, il s’agit de l’adresse que vous utilisez afin de vous connecter à votre serveur via SSH.

Il y a plusieurs façons d’effectuer cela à partir de la ligne de commande. D’abord, vous pouvez utiliser les outils iproute2 afin d’obtenir votre adresse IP en écrivant ceci :

  • ip addr show eth0 | grep inet | awk '{ print $ 2; }' | sed 's/\/.*$ //'

Vous devriez voir apparaître deux ou trois lignes de résultats. Ce sont tous des adresses correctes, par contre votre ordinateur ne sera peut-être qu’en mesure d’utiliser une de celles-ci, alors libre à vous d’essayer chacune d’entre elles.

Une autre méthode consiste à utiliser l’outil curl pour contacter un correspondant externe afin qu’il vous informe comment « il » perçoit votre serveur. Cela s’effectue en demandant à un serveur spécifique quelle est votre adresse IP :

  • sudo apt install curl
  • curl http://icanhazip.com

Indépendamment de la méthode que vous choisissez pour obtenir votre adresse IP, inscrivez-la sur la barre d’adresse de votre navigateur afin de voir la page par défaut d’Apache.

Étape 2 — Installer MySQL

Maintenant que votre serveur web est opérationnel, il est temps d’installer MySQL. MySQL est un système de gestion de base de données. Il sert essentiellement à organiser et donner l’accès aux bases de données au sein desquelles votre site pourra emmagasiner de l’information.

Encore une fois, utiliser apt pour obtenir et installer ce logiciel.

  • sudo apt install mysql-server

Note: Dans ce cas, vous n’avez pas besoin d’activer sudo apt update avant d’effectuer la commande. Cela est dû au fait que l’avez récemment activé dans les commandes ci-dessus pour installer Apache. Le paquet d’index sur votre ordinateur devrait déjà être à jour.

Cette commande affichera également une liste des paquets qui seront installés, de même que l’espace qu’ils occuperont sur votre disque dur. Entrez la touche Y pour continuer.

Lorsque l’installation est complétée, exécuter un script de sécurité simple qui est préinstallé avec MySQL et qui permettra de supprimer des défaillances dangereuses et puis de verrouiller l’accès à votre système de base de données. Démarrer le script interactif en exécutant la commande :

  • sudo mysql_secure_installation

On vous demandera si vous désirez configurer le VALIDATE PASSWORD PLUGIN.

Note: Activer cette fonctionnalité demeure une question de jugement. Lorsqu’activés, les mots de passe qui ne correspondent pas au critère spécifique seront refusés par MySQL avec un message d’erreur. Ceci engendrera des problèmes si vous utilisez un mot de passe faible conjointement à l’application qui configure automatiquement les identifiants d’utilisateurs MySQL, tels que les paquets d’Ubuntu pour phpMyAdmin. Il est sécuritaire de laisser la validation désactivée, mais vous devriez toujours utiliser un mot de passe robuste et unique pour les authentifications de base de données.

Répondre Y pour oui, ou n’importe quelle autre commande pour continuer sans l’activer.

VALIDATE PASSWORD PLUGIN peut être utilisé pour tester les mots de passe et améliorer la sécurité. Le système vérifie la sécurité du mot de passe et permet aux utilisateurs de définir uniquement les mots de passe qui sont assez bien sécurisés en demandant : Voulez-vous configurer le plug-in  - VALIDATE PASSWORD? Press y|Y for Yes, any other key for No: 

Si vous répondez “oui”, on vous demandera de choisir un niveau de validation de mot de passe. Gardez à l’esprit que si vous choisissez 2, pour le niveau le plus élevé, vous recevrez des messages d’erreur lorsque vous tenterez de définir un mot de passe qui ne contient pas de chiffre, de majuscule et de minuscule, de caractères spéciaux, ou qui s’inspire de mots communs du dictionnaire.

Il existe trois niveaux de politique de validation du mot de passe:  LOW    Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file  Veuillez saisir 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1 

Indépendamment de votre décision de configurer ou non le VALIDATE PASSWORD PLUGIN, votre serveur vous demandera de choisir et de confirmer un mot de passe pour l’utilisateur root MySQL. Il s’agit d’un compte administratif au sein de MySQL qui possède des privilèges accrus. Voyez-le comme étant similaire au compte root pour le serveur lui-même (bien que celui que vous êtes en train de configurer est un compte spécifique au sein de MySQL). Assurez-vous que vous de détenir un mot de passe robuste, unique, et de ne pas laisser l’espace vide.

Si vous activez la validation du mot de passe, on vous indiquera la robustesse du mot de passe root que vous venez d’inscrire et votre serveur vous demandera si vous voulez le modifier. Si vous êtes satisfait de votre mot de passe, entrez N pour « non » au moment de faire le choix :

Utiliser le mot de passe existant pour root.  Force estimée du mot de passe : 100 Changer le mot de passe pour root ? ((Press y|Y for Yes, any other key for No) : n 

Pour le reste des questions, entrez la touche Y et appuyer sur le bouton ENTER au moment de faire le choix. Cela supprimera certains utilisateurs anonymes ainsi que la base de données d’essai, désactivera les identifications root à distance et chargera les nouvelles règles afin que MySQL applique automatiquement les changements que vous venez d’apporter.

Veuillez noter que pour les systèmes Ubuntu fonctionnant avec MySQL 5.7 (et les versions ultérieures), l’utilisateur root MySQL est configuré par défaut pour authentifier en utilisant le plugin auth_socket, plutôt qu’avec un mot de passe. Cela permet d’avoir une meilleure sécurité et ergonomie dans de nombreux cas, mais il peut également compliquer les choses lorsque vous devez autoriser l’ouverture d’un programme externe (ex : phpMyAdmin) afin d’accéder au serveur.

Si vous préférez utiliser un mot de passe lorsque vous vous connectez au MySQL en tant que root, vous aurez besoin de changer le mode d’authentification de auth_socket à mysql_native_password. Pour y parvenir, ouvrez le prompt MySQL à partir de votre terminal :

  • sudo mysql

Ensuite, vérifier quel mode d’authentification chacun de vos comptes d’utilisateurs MySQL fait appel avec la commande suivante :

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
SortieOutput
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

Dans cet exemple, vous pouvez voir que l’utilisateur root s’authentifie effectivement en utilisant le plugin auth_socket. Afin de configurer le compte root pour l’identification avec mot de passe, exécuter la commande ALTER USER ci-dessous. Assurez-vous de modifier password pour un mot de passe robuste de votre choix :

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Ensuite, exécuter FLUSH PRIVILEGES, qui envoie un message au serveur de renouveler les tableaux d’autorisations et de mettre en application vos nouvelles modifications :

  • FLUSH PRIVILEGES;

Vérifier encore les modes d’authentifications utilisées par chacun de vos utilisateurs afin de confirmer que le root ne s’authentifie plus en utilisant le plugin auth_socket :

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
SortieOutput
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

Vous pouvez voir dans cet exemple que l’utilisateur root de MySQL s’authentifie actuellement en utilisant un mot de passe. Une fois que vous aurez confirmé cela sur votre propre serveur, vous pouvez sortir du shell MySQL :

  • exit

À ce stade, votre système de base de données est maintenant programmé et vous pouvez poursuivre avec l’installation PHP, le dernier composant de la pile LAMP.

Étape 3 — Installer PHP

PHP est le composant de votre configuration qui sert de code de traitement pour afficher le contenu dynamique. Il peut exécuter des scripts, se connecter à vos bases de données MySQL afin d’obtenir de l’information et acheminer le contenu traité vers votre serveur web pour affichage.

Encore une fois, utiliser le système apt pour installer PHP. De plus, inclure des paquets d’assistance cette fois-ci afin de permettre au code PHP de s’exécuter sous le serveur Apache et communiquer avec votre base de données MySQL :

  • sudo apt install php libapache2-mod-php php-mysql

Cela devrait permettre d’installer PHP sans problème. Nous le mettrons à l’essai dans un moment.

Dans la plupart des cas, vous allez vouloir modifier la façon dont Apache dessert les fichiers lorsqu’un répertoire est demandé. Actuellement, si un utilisateur demande un répertoire du serveur, Apache recherchera d’abord pour un fichier nommé index.html. Nous voulons dire au serveur web de donner priorité aux fichiers PHP, ainsi il faut exiger à Apache de regarder pour un fichier index.php en premier.

Afin d’effectuer cela, entrez cette commande pour ouvrir le fichier dir.conf dans un éditeur de texte avec des privilèges root :

  • sudo nano /etc/apache2/mods-enabled/dir.conf

Cela va ressembler à cela :

/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>     DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm </IfModule> 

Déplacer le fichier d’index PHP (surligner ci-dessous) à la première position après la spécification DirectoryIndex, de la manière suivante :

/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>     DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule> 

Lorsque vous avez terminé, sauvegarder et fermer le fichier en appuyant sur CTRL+X. Confirmer la sauvegarde en entrant la touche Y et en appuyant sur ENTER afin de vérifier la localisation du fichier de sauvegarde.

Ensuite, redémarrer le serveur web Apache afin que vos modifications prennent effet. Cela s’effectuera en inscrivant ceci :

  • sudo systemctl restart apache2

Vous pouvez également vérifier le statut du service apache2 en utilisant la commande systemctl :

  • sudo systemctl status apache2
Sample SortieOutput
● apache2.service - LSB: Apache2 web server Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Tue 2018-04-23 14:28:43 EDT; 45s ago Docs: man:systemd-sysv-generator(8) Process: 13581 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS) Process: 13605 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS) Tasks: 6 (limit: 512) CGroup: /system.slice/apache2.service ├─13623 /usr/sbin/apache2 -k start ├─13626 /usr/sbin/apache2 -k start ├─13627 /usr/sbin/apache2 -k start ├─13628 /usr/sbin/apache2 -k start ├─13629 /usr/sbin/apache2 -k start └─13630 /usr/sbin/apache2 -k start

Afin d’améliorer le fonctionnement de PHP, vous avez l’option d’installer de modules supplémentaires. Pour voir les options disponibles de modules PHP et de bibliothèques, mener les résultats de apt search vers less, un récepteur qui vous laissera défiler à travers les résultats d’autres commandes :

  • apt search php- | less

Utiliser les flèches afin de défiler de haut en bas, et appuyer sur Q pour quitter.

Les résultats sont tous des composants optionnels que vous pouvez installer. Une courte description de chacun d’entre eux sera affichée :

bandwidthd-pgsql/bionic 2.0.1+cvs20090917-10ubuntu1 amd64   Tracks usage of TCP/IP and builds html files with graphs  bluefish/bionic 2.2.10-1 amd64   advanced Gtk+ text editor for web and software development  cacti/bionic 1.1.38+ds1-1 all   web interface for graphing of monitoring systems  ganglia-webfrontend/bionic 3.6.1-3 all   cluster monitoring toolkit - web front-end  golang-github-unknwon-cae-dev/bionic 0.0~git20160715.0.c6aac99-4 all   PHP-like Compression and Archive Extensions in Go  haserl/bionic 0.9.35-2 amd64   CGI scripting program for embedded environments  kdevelop-php-docs/bionic 5.2.1-1ubuntu2 all   transitional package for kdevelop-php  kdevelop-php-docs-l10n/bionic 5.2.1-1ubuntu2 all   transitional package for kdevelop-php-l10n … : 

Pour en savoir plus sur la fonctionnalité de chaque module, vous pouvez chercher sur internet pour plus d’informations à leur sujet. Une autre solution est de lire la longue description du paquet en tapant :

  • apt show package_name

Il y aura plusieurs résultats, incluant un champ intitulé Description qui présentera une explication plus détaillée de la fonctionnalité du module en question.

Par exemple, afin de découvrir en quoi le module php-cli consiste, vous pouvez taper :

  • apt show php-cli

En plus de la grande quantité d’autres informations, vous obtiendrez quelque chose qui ressemble à ceci :

SortieOutput
… Description: command-line interpreter for the PHP scripting language (default) This package provides the /usr/bin/php command interpreter, useful for testing PHP scripts from a shell or performing general shell scripting tasks. . PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. . Ce paquet est un forfait de dépendances, qui dépend du défaut d'Ubuntu PHP version (currently 7.2). …

Si, après votre recherche, vous décidez que vous voulez installer un paquet, vous pouvez le faire en utilisation la commande apt install, de la même manière que vous avez procédé pour l’autre logiciel.

Si vous décidez que le php-cli est quelque chose dont vous avez besoin, vous pouvez taper cette commande :

  • sudo apt install php-cli

Si vous désirez installer plus d’un module, vous pouvez le faire en énumérant chacun d’entre eux, séparé d’un espace, suivant la commande apt install, comme ceci :

  • sudo apt install package1 package2 ...

À ce stade, votre pile LAMP est installée et configurée. Cependant, avant de procéder à toute modification ou de déployer une application, il serait préférable de tester votre configuration PHP de manière proactive au cas où il y aurait un problème à traiter.

Étape 4 — Tester le processus PHP sur votre serveur web

Afin de tester si votre système est configuré correctement pour PHP, créer un script PHP de base appelé info.php. Afin qu’Apache puisse localiser ce fichier et le desservir correctement, il devra être sauvegardé dans un répertoire bien spécifique, qui se nomme le “web root”.

Sur Ubuntu 18.04, ce répertoire est situé au /var/www/html/. Créer le fichier à cet emplacement en exécutant :

  • sudo nano /var/www/html/info.php

Cela ouvrira un fichier vierge. Ajouter le texte suivant, qui s’agit d’un code PHP valide, à l’intérieur du fichier :

info.php
<?php phpinfo(); ?> 

Lorsque vous aurez terminé, sauvegarder et fermer le fichier.

Vous pouvez maintenant tester si votre serveur web affiche correctement le contenu généré par ce script PHP. Pour le tester, visiter la page suivante dans votre navigateur web. Vous aurez encore besoin de votre adresse IP publique.

L’adresse que vous devrez consulter est la suivante :

http://your_server_ip/info.php 

La page que vous allez accéder devrait ressembler à ceci :
Ubuntu 18.04 default PHP info

Cette page présente de l’information de base sur votre serveur du point de vue de PHP. Elle est pratique pour le débogage et afin d’assurer que vos réglages sont appliqués correctement.

Si vous voyez cette page sur votre navigateur, alors votre PHP fonctionne correctement.

Vous devriez supprimer ce fichier après la mise en essai parce qu’il pourrait en fait donner de l’information sur votre serveur à des utilisateurs non autorisés. Pour ce faire, exécuter la commande suivante :

  • sudo rm /var/www/html/info.php

Vous pourrez toujours recréer cette page si vous avez besoin d’accéder à cette information plus tard.

Conclusion

Maintenant que votre pile LAMP est installée, vous avez plusieurs choix quant à ce que vous pouvez faire par la suite. Essentiellement, vous venez d’installer une plateforme qui vous permettra d’installer la plupart des types de site internet et de logiciels web sur votre serveur.

Dans l’immédiat, vous devriez vous assurer que les connexions à votre serveur web sont sécurisées, en les faisant fonctionner via HTTPS. L’option la plus simple dans ce cas est de utiliser Let’s Encrypt afin de sécuriser votre site avec un certificat TLS/SSL gratuit.

D’autres options populaires demeurent (notez que pour le moment ces tutoriels sont seulement disponibles en anglais) :

DigitalOcean Community Tutorials

Configuration initiale de serveur avec Ubuntu 18.04

Introduction

Lorsque vous installez un nouveau serveur Ubuntu 18.04, il y a quelques étapes de configuration que vous devriez effectuer au sein de votre paramétrage initial. Cela renforcera la sécurité et l’ergonomie de votre serveur et vous procurera une base solide pour vos actions futures.

Note: Le guide ci-dessous montre comment compléter manuellement les étapes que nous recommandons de suivre pour les nouveaux serveurs Ubuntu 18.04. Suivre cette procédure manuellement peut être pratique afin d’apprendre des techniques d’administration de système de base et pour bien comprendre les actions entreprises sur votre serveur. De manière alternative, si vous désirez être en mesure de débuter plus rapidement, vous pouvez suivre ce guide [run our initial server setup script] (en Anglais) (https://www.digitalocean.com/community/tutorials/automating-initial-server-setup-with-ubuntu-18-04) qui automatise ces étapes.

Étape 1 — Se connecter en tant que Root

Afin de vous connecter à votre serveur, vous aurez besoin de connaître votre « adresse IP publique ». Vous aurez également besoin du mot de passe, ou si vous avez installé une clé d’identification SSH, la clé privée de votre compte d’utilisateur root. Si vous ne vous êtes pas encore connecté à votre serveur, vous devriez penser à suivre notre guide [how to connect to your Droplet with SSH] (en anglais) (https://www.digitalocean.com/community/tutorials/how-to-connect-to-your-droplet-with-ssh), qui couvre ce processus en détail.

Si vous n’êtes pas encore connecté à votre serveur, vous pouvez aller de l’avant et vous connecter en tant qu’utilisateur root à l’aide de la commande suivante : (substituer la partie surlignée de la commande avec l’adresse IP publique de votre serveur)

  • ssh root@your_server_ip

Acceptez l’avertissement concernant l’authenticité de l’hôte si elle apparaît. Si vous utilisez l’authentification avec mot de passe, entrez votre mot de passe root afin de vous connecter. Si vous utilisez une clé SSH qui est protégée à l’aide d’une phrase de sécurité, il est possible que vous soyez invité à entrer la phrase de sécurité la première fois que vous utilisez la clé chaque session. S’il s’agit de la première fois que vous vous connectez sur le serveur à l’aide d’un mot de passe, il est possible que vous soyez également invité à changer votre mot de passe root.

À propos de Root

L’utilisateur root est l’utilisateur administratif dans un environnement Linux qui bénéficie d’une large gamme de privilèges. Dû aux privilèges accrus du compte root, vous êtes déconseillé de l’utiliser sur une base régulière. Cela est dû au fait qu’une partie du pouvoir propre au compte root est sa capacité à faire des modifications très destructives, même par accident.

La prochaine étape consiste à configurer un compte d’utilisateur alternatif avec un champ d’influence limité pour le travail de tous les jours. Nous vous enseignerons comment accéder à des privilèges accrus pour les moments où vous en aurez besoin.

Étape 2 — Créer un nouvel utilisateur

Une fois connectés en tant que root, nous sommes prêts à ajouter le nouveau compte d’utilisateur que nous utiliserons toujours dorénavant pour nous connecter.

Cet exemple créer un utilisateur nommé sammy, mais vous devriez le replacer par un nom d’utilisateur que vous aimez :

  • adduser sammy

On vous posera quelques questions, commençant par le mot de passe de votre compte.

Entrez un mot de passe robuste et, si vous le désirez, remplissez quelconque information supplémentaire. Ceci n’est pas obligatoire et vous pouvez simplement pesez ENTER au sein de n’importe quel champ que vous désirez sauter.

Étape 3 — Octroyer les privilèges d’administration

Présentement, nous avons un nouveau compte d’utilisateur avec des privilèges de compte régulier. Cependant, il se peut que nous ayons besoin d’effectuer des tâches administratives de temps à autre.

Afin d’éviter de devoir se déconnecter de notre utilisateur normal pour ensuite se reconnecter à notre compte root, nous pouvons régler ce qu’on appelle le “superuser” ou les privilèges root pour notre compte normal. Cela permettra à notre utilisateur normal d’exécuter des commandes avec des privilèges administratifs en inscrivant le mot sudo avant chaque commande.

Afin d’ajouter ces privilèges à notre nouvel utilisateur, nous devons ajouter le nouvel utilisateur au groupe sudo. Par défaut, sur Ubuntu 18.04, les utilisateurs appartenant au groupe sudo sont autorisés à utiliser la commande sudo.

En tant que root, effectuez cette commande afin d’ajouter votre nouvel utilisateur au groupe sudo (substituer le mot surligné avec votre nouvel utilisateur) :

  • usermod -aG sudo sammy

Maintenant, une fois connecté avec votre utilisateur régulier, vous pouvez tapez sudo avant chaque commande pour effectuer des actions avec des privilèges “superuser”.

Étape 4 —Régler un pare-feu de base

Les serveurs Ubuntu 18.04 peuvent faire appel à un pare-feu UFW afin de s’assurer que seules les connexions à certains services soient autorisées. Nous pouvons régler un pare-feu de base très facilement en utilisant cette application.

Note: Si vos serveurs fonctionnent avec DigitalOcean, vous pouvez de manière facultative utiliser [DigitalOcean Cloud Firewalls] (en Anglais) (https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-cloud-firewalls) au lieu du pare-feu UFW. Nous vous recommandons d’utiliser seulement un pare-feu à la fois afin d’éviter d’avoir des règles conflictuelles qui pourraient prendre du temps à déboguer.

Différentes applications peuvent inscrire leurs profils avec UFW au moment de l’installation. Ces profils permettent à UFW de gérer ces applications selon leur nom. OpenSSH, le service nous permettant maintenant de nous connecter à notre serveur possède un profil inscrit avec UFW.

Vous pouvez voir cela en tapant:

  • ufw app list
Output
Available applications: OpenSSH

Nous devons s’assurer que le pare-feu permette les connexions SSH afin que nous puissions nous connecter la prochaine fois. Nous pouvons autoriser ces connexions en tapant :

  • ufw allow OpenSSH

Ensuite, nous pouvons activer le pare-feu en tapant:

  • ufw enable

Tapez “y” et pesez sur ENTER afin de procéder. Vous pouvez voir si les connexions SSH sont toujours autorisées en tapant :

  • ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

Alors que le pare-feu bloque présentement toutes les connexions mises à part celle SSH, si vous installez et configurez des services additionnels, vous devrez régler les paramètres du pare-feu afin de permettre un trafic entrant acceptable. Vous pouvez lire davantage sur les opérations courantes UFW [this guide] (en Anglais) (https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands).

Étape 5 — Autoriser l’accès externe à votre utilisateur régulier

Maintenant que nous possédons un utilisateur régulier pour une utilisation quotidienne, nous devons s’assurer que nous pouvons SSH directement au sein de notre compte.

Note:Avant d’avoir pu vérifier que vous pouvez bien vous connecté et utilisé sudo avec votre nouvel utilisateur, nous vous recommandons de rester connecté en tant que root. De cette manière, si vous avez des problèmes, vous pourrez diagnostiquer le problème et le résoudre ainsi que faire les modifications nécessaires en tant que root. Si vous utilisez DigitalOcean Droplet et vous rencontrez des problèmes avec votre connexion SSH root, vous pouvez suivre ce guide [log into the Droplet using the DigitalOcean Console] (en Anglais) (https://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-console-to-access-your-droplet).

Le processus pour configurer l’accès SSH pour votre nouvel utilisateur dépendra si le compte root de votre serveur utilise un mot de passe ou des clés SSH pour l’authentification.

Si le compte Root utilise l’authentification par mot de passe

Si vous vous êtes connecté à votre compte root à l’aide d’un mot de passe, alors l’authentification par mot de passe est activée pour SSH. Vous pouvez SSH à votre nouveau compte d’utilisateur en ouvrant une nouvelle session terminale et utilisez SSH avec votre nouveau nom d’utilisateur :

  • ssh sammy@your_server_ip

Après avoir entré votre mot de passe d’utilisateur régulier, vous serez connecté. Rappelez-vous, si vous avez besoin d’exécuter une commande avec des privilèges administratifs, tapez sudo avant comme ceci :

  • sudo command_to_run

Vous serez invité à entrer votre mot de passe régulier d’utilisateur lorsque vous utilisez sudo pour la première fois chaque session (et de manière périodique par la suite).

Afin de renforcer la sécurité de votre serveur, nous suggérons fortement de mettre en place des clés SSH plutôt que d’utiliser l’authentification par mot de passe. Suivez notre guide sur [setting up SSH keys on Ubuntu 18.04] (en Anglais) (https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-1804) afin de savoir comment configurer une authentification par clé.

Si le compte “Root” utilise l’authentification par clé SSH.

Si vous vous êtes connecté à votre compte root en utilisant des clés SSH, alors l’authentification par mot de passe est désactivée pour SSH. Vous devrez ajouter une copie de votre clé locale publique à votre nouveau fichier d’utilisateur ~/.ssh/authorized_keys afin de vous connecter.

Étant donné que votre clé publique figure déjà au sein du fichier ~/.ssh/authorized_keys de votre compte root sur le serveur, nous pouvons copier ce fichier et la structure de répertoires au sein de notre nouveau compte d’utilisateur dans notre session préexistante.

La manière la plus simple de copier les fichiers avec les droits et permissions appropriés est par la commande rsync. Cela copiera le répertoire .ssh de l’utilisateur root, préserver les permissions et modifier les propriétaires de fichier, le tout au sein d’une seule commande. Assurez-vous de modifier les parties surlignées de la commande ci-dessous afin qu’elles concordent avec votre nom d’utilisateur régulier :

Note: La commande rsync traite différemment les sources et destinations qui terminent avec une barre oblique que celles-ci terminant sans barre oblique. En utilisant la commande rsync ci-dessous, assurez-vous que la source du répertoire (~/.ssh) n’inclut pas de barre oblique (vérifiez pour vous assurer que vous n’utilisez pas ~/.ssh/).

Si vous ajoutez une barre oblique par mégarde à la commande, rsync copiera le contenu du répertoire ~/.ssh du compte root au répertoire d’origine de l’utilisateur au lieu de copier la structure complète du répertoire ~/.ssh. Les fichiers se situeront à la mauvaise destination et SSH ne serait pas en mesure de les trouver et les utiliser.

  • rsync --archive --chown=sammy:sammy ~/.ssh /home/sammy

Maintenant, ouvrez une nouvelle session terminale et utilisez SSH avec votre nouveau nom d’utilisateur :

  • ssh sammy@your_server_ip

Vous devriez être connecté avec votre nouveau compte d’utilisateur sans devoir utiliser de mot de passe. N’oubliez pas, si vous devez exécuter une commande avec des privilèges administratifs, tapez sudo avant comme ceci :

  • sudo command_to_run

Vous serez invité à entrer votre mot de passe régulier lorsque vous utilisez sudo pour la première fois à chaque session (et de manière périodique par la suite).

Que pouvons-nous faire ensuite ?

À ce stade, vous avez une base solide pour votre serveur. Vous pouvez à présent installer quelconque logiciel dont vous avez besoin sur votre serveur.

DigitalOcean Community Tutorials

How To Install and Use ClickHouse on Debian 9

The author selected the Free and Open Source Fund to receive a donation as part of the Write for DOnations program.

Introduction

ClickHouse is an open-source, column-oriented analytics database created by Yandex for OLAP and big data use cases. ClickHouse’s support for real-time query processing makes it suitable for applications that require sub-second analytical results. ClickHouse’s query language is a dialect of SQL that enables powerful declarative querying capabilities while offering familiarity and a smaller learning curve for the end user.

Column-oriented databases store records in blocks grouped by columns instead of rows. By not loading data for columns absent in the query, column-oriented databases spend less time reading data while completing queries. As a result, these databases can compute and return results much faster than traditional row-based systems for certain workloads, such as OLAP.

Online Analytics Processing (OLAP) systems allow for organizing large amounts of data and performing complex queries. They are capable of managing petabytes of data and returning query results quickly. In this way, OLAP is useful for work in areas like data science and business analytics.

In this tutorial, you’ll install the ClickHouse database server and client on your machine. You’ll use the DBMS for typical tasks and optionally enable remote access from another server so that you’ll be able to connect to the database from another machine. Then you’ll test ClickHouse by modeling and querying example website-visit data.

Prerequisites

  • One Debian 9 server with a sudo enabled non-root user and firewall setup. You can follow the initial server setup tutorial to create the user and set up the firewall.
  • (Optional) A secondary Debian 9 server with a sudo enabled non-root user and firewall setup. You can follow the initial server setup tutorial.

Step 1 — Installing ClickHouse

In this section, you will install the ClickHouse server and client programs using apt-get.

First, SSH into your server by running:

  • ssh sammy@your_server_ip

dirmngr is a server for managing certificates and keys. It is required for adding and verifying remote repository keys, install it by running:

  • sudo apt-get install -y dirmngr

Yandex maintains an APT repository that has the latest version of ClickHouse. Add the repository’s GPG key so that you’ll be able to securely download validated ClickHouse packages:

  • sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4

You will see output similar to the following:

Output
Executing: /tmp/apt-key-gpghome.JkkcKnBAFY/gpg.1.sh --keyserver keyserver.ubuntu.com --recv E0C56BD4 gpg: key C8F1E19FE0C56BD4: public key "ClickHouse Repository Key <milovidov@yandex-team.ru>" imported gpg: Total number processed: 1 gpg: imported: 1

The output confirms it has successfully verified and added the key.

Add the repository to your APT repositories list by executing:

  • echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list

Here you’ve piped the output of echo to sudo tee so that this output can print to a root-owned file.

Now, run apt-get update to update your packages:

  • sudo apt-get update

The clickhouse-server and clickhouse-client packages will now be available for installation. Install them with:

  • sudo apt-get install -y clickhouse-server clickhouse-client

You’ve installed the ClickHouse server and client successfully. You’re now ready to start the database service and ensure that it’s running correctly.

Step 2 — Starting the Service

The clickhouse-server package that you installed in the previous section creates a systemd service, which performs actions such as starting, stopping, and restarting the database server. systemd is an init system for Linux to initialize and manage services. In this section you’ll start the service and verify that it is running successfully.

Start the clickhouse-server service by running:

  • sudo service clickhouse-server start

The previous command will not display any output. To verify that the service is running successfully, execute:

  • sudo service clickhouse-server status

You’ll see output similar to the following:

Output
clickhouse-server.service - ClickHouse Server (analytic DBMS for big data) Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2018-12-22 07:23:20 UTC; 1h 9min ago Main PID: 27101 (ClickHouse-serv) Tasks: 34 (limit: 1152) CGroup: /system.slice/ClickHouse-server.service └─27101 /usr/bin/ClickHouse-server --config=/etc/ClickHouse-server/config.xml

The output denotes that the server is running.

You have successfully started the ClickHouse server and will now be able to use the clickhouse-client CLI program to connect to the server.

Step 3 — Creating Databases and Tables

In ClickHouse, you can create and delete databases by executing SQL statements directly in the interactive database prompt. Statements consist of commands following a particular syntax that tell the database server to perform a requested operation along with any data required. You create databases by using the CREATE DATABASE table_name syntax. To create a database, first start a client session by running the following command:

  • clickhouse-client

This command will log you into the client prompt where you can run ClickHouse SQL statements to perform actions such as:

  • Creating, updating, and deleting databases, tables, indexes, partitions, and views.

  • Executing queries to retrieve data that is optionally filtered and grouped using various conditions.

In this step, with the ClickHouse client ready for inserting data, you’re going to create a database and table. For the purposes of this tutorial, you’ll create a database named test, and inside that you’ll create a table named visits that tracks website-visit durations.

Now that you’re inside the ClickHouse command prompt, create your test database by executing:

  • CREATE DATABASE test;

You’ll see the following output that shows that you have created the database:

Output
CREATE DATABASE test Ok. 0 rows in set. Elapsed: 0.003 sec.

A ClickHouse table is similar to tables in other relational databases; it holds a collection of related data in a structured format. You can specify columns along with their types, add rows of data, and execute different kinds of queries on tables.

The syntax for creating tables in ClickHouse follows this example structure:

CREATE TABLE table_name (     column_name1 column_type [options],     column_name2 column_type [options],     ... ) ENGINE = engine 

The table_name and column_name values can be any valid ASCII identifiers. ClickHouse supports a wide range of column types; some of the most popular are:

  • UInt64: used for storing integer values in the range 0 to 18446744073709551615.

  • Float64: used for storing floating point numbers such as 2039.23, 10.5, etc.

  • String: used for storing variable length characters. It does not require a max length attribute since it can store arbitrary lengths.

  • Date: used for storing dates that follow the YYYY-MM-DD format.

  • DateTime: used for storing dates coupled with time and follows the YYYY-MM-DD HH:MM:SS format.

After the column definitions, you specify the engine used for the table. In ClickHouse, Engines determine the physical structure of the underlying data, the table’s querying capabilities, its concurrent access modes, and support for indexes. Different engine types are suitable for different application requirements. The most commonly used and widely applicable engine type is MergeTree.

Now that you have an overview of table creation, you’ll create a table. Start by confirming the database you’ll be modifying:

  • USE test;

You will see the following output showing that you have switched to the test database from the default database:

Output
USE test Ok. 0 rows in set. Elapsed: 0.001 sec.

The remainder of this guide will assume that you are executing statements within this database’s context.

Create your visits table by running this command:

  • CREATE TABLE visits (
  • id UInt64,
  • duration Float64,
  • url String,
  • created DateTime
  • ) ENGINE = MergeTree()
  • PRIMARY KEY id
  • ORDER BY id;

Here’s a breakdown of what the command does. You create a table named visits that has four columns:

  • id: The primary key column. Similarly to other RDBMS systems, a primary key column in ClickHouse uniquely identifies a row; each row should have a unique value for this column.

  • duration: A float column used to store the duration of each visit in seconds. float columns can store decimal values such as 12.50.

  • url: A string column that stores the URL visited, such as http://example.com.

  • created: A date and time column that tracks when the visit occurred.

After the column definitions, you specify MergeTree as the storage engine for the table. The MergeTree family of engines is recommended for production databases due to its optimized support for large real-time inserts, overall robustness, and query support. Additionally, MergeTree engines support sorting of rows by primary key, partitioning of rows, and replicating and sampling data.

If you intend to use ClickHouse for archiving data that is not queried often or for storing temporary data, you can use the Log family of engines to optimize for that use-case.

After the column definitions, you’ll define other table-level options. The PRIMARY KEY clause sets id as the primary key column and the ORDER BY clause will store values sorted by the id column. A primary key uniquely identifies a row and is used for efficiently accessing a single row and efficient colocation of rows.

On executing the create statement, you will see the following output:

Output
CREATE TABLE visits ( id UInt64, duration Float64, url String, created DateTime ) ENGINE = MergeTree() PRIMARY KEY id ORDER BY id Ok. 0 rows in set. Elapsed: 0.010 sec.

In this section, you’ve created a database and a table to track website-visits data. In the next step, you’ll insert data into the table, update existing data, and delete that data.

Step 4 — Inserting, Updating, and Deleting Data and Columns

In this step, you’ll use your visits table to insert, update, and delete data. The following command is an example of the syntax for inserting rows into a ClickHouse table:

INSERT INTO table_name VALUES (column_1_value, column_2_value, ....); 

Now, insert a few rows of example website-visit data into your visits table by running each of the following statements:

  • INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
  • INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01');
  • INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01');
  • INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');

You’ll see the following output repeated for each insert statement.

Output
INSERT INTO visits VALUES Ok. 1 rows in set. Elapsed: 0.004 sec.

The output for each row shows that you’ve inserted it successfully into the visits table.

Now you’ll add an additional column to the visits table. When adding or deleting columns from existing tables, ClickHouse supports the ALTER syntax.

For example, the basic syntax for adding a column to a table is as follows:

ALTER TABLE table_name ADD COLUMN column_name column_type; 

Add a column named location that will store the location of the visits to a website by running the following statement:

  • ALTER TABLE visits ADD COLUMN location String;

You’ll see output similar to the following:

Output
ALTER TABLE visits ADD COLUMN location String Ok. 0 rows in set. Elapsed: 0.014 sec.

The output shows that you have added the location column successfully.

As of version 19.3.6, ClickHouse doesn’t support updating and deleting individual rows of data due to implementation constraints. ClickHouse has support for bulk updates and deletes, however, and has a distinct SQL syntax for these operations to highlight their non-standard usage.

The following syntax is an example for bulk updating rows:

ALTER TABLE table_name UPDATE  column_1 = value_1, column_2 = value_2 ...  WHERE  filter_conditions; 

You’ll run the following statement to update the url column of all rows that have a duration of less than 15. Enter it into the database prompt to execute:

  • ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;

The output of the bulk update statement will be as follows:

Output
ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15 Ok. 0 rows in set. Elapsed: 0.003 sec.

The output shows that your update query completed successfully. The 0 rows in set in the output denotes that the query did not return any rows; this will be the case for any update and delete queries.

The example syntax for bulk deleting rows is similar to updating rows and has the following structure:

ALTER TABLE table_name DELETE WHERE filter_conditions; 

To test deleting data, run the following statement to remove all rows that have a duration of less than 5:

  • ALTER TABLE visits DELETE WHERE duration < 5;

The output of the bulk delete statement will be similar to:

Output
ALTER TABLE visits DELETE WHERE duration < 5 Ok. 0 rows in set. Elapsed: 0.003 sec.

The output confirms that you have deleted the rows with a duration of less than five seconds.

To delete columns from your table, the syntax would follow this example structure:

ALTER TABLE table_name DROP COLUMN column_name; 

Delete the location column you added previously by running the following:

  • ALTER TABLE visits DROP COLUMN location;

The DROP COLUMN output confirming that you have deleted the column will be as follows:

Output
ALTER TABLE visits DROP COLUMN location String Ok. 0 rows in set. Elapsed: 0.010 sec.

Now that you’ve successfully inserted, updated, and deleted rows and columns in your visits table, you’ll move on to query data in the next step.

Step 5 — Querying Data

ClickHouse’s query language is a custom dialect of SQL with extensions and functions suited for analytics workloads. In this step, you’ll run selection and aggregation queries to retrieve data and results from your visits table.

Selection queries allow you to retrieve rows and columns of data filtered by conditions that you specify, along with options such as the number of rows to return. You can select rows and columns of data using the SELECT syntax. The basic syntax for SELECT queries is:

SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options; 

Execute the following statement to retrieve url and duration values for rows where the url is http://example.com.

  • SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;

You will see the following output:

Output
SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2 ┌─url─────────────────┬─duration─┐ │ http://example2.com │ 10.5 │ └─────────────────────┴──────────┘ ┌─url─────────────────┬─duration─┐ │ http://example2.com │ 13 │ └─────────────────────┴──────────┘ 2 rows in set. Elapsed: 0.013 sec.

The output has returned two rows that match the conditions you specified. Now that you’ve selected values, you can move to executing aggregation queries.

Aggregation queries are queries that operate on a set of values and return single output values. In analytics databases, these queries are run frequently and are well optimized by the database. Some aggregate functions supported by ClickHouse are:

  • count: returns the count of rows matching the conditions specified.

  • sum: returns the sum of selected column values.

  • avg: returns the average of selected column values.

Some ClickHouse-specific aggregate functions include:

  • uniq: returns an approximate number of distinct rows matched.

  • topK: returns an array of the most frequent values of a specific column using an approximation algorithm.

To demonstrate the execution of aggregation queries, you’ll calculate the total duration of visits by running the sum query:

  • SELECT SUM(duration) FROM visits;

You will see output similar to the following:

Output
SELECT SUM(duration) FROM visits ┌─SUM(duration)─┐ │ 63.7 │ └───────────────┘ 1 rows in set. Elapsed: 0.010 sec.

Now, calculate the top two URLs by executing:

  • SELECT topK(2)(url) FROM visits;

You will see output similar to the following:

Output
SELECT topK(2)(url) FROM visits ┌─topK(2)(url)──────────────────────────────────┐ │ ['http://example2.com','http://example1.com'] │ └───────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.010 sec.

Now that you have successfully queried your visits table, you’ll delete tables and databases in the next step.

Step 6 — Deleting Tables and Databases

In this section, you’ll delete your visits table and test database.

The syntax for deleting tables follows this example:

DROP TABLE table_name; 

To delete the visits table, run the following statement:

  • DROP TABLE visits;

You will see the following output declaring that you’ve deleted the table successfully:

output
DROP TABLE visits Ok. 0 rows in set. Elapsed: 0.005 sec.

You can delete databases using the DROP database table_name syntax. To delete the test database, execute the following statement:

  • DROP DATABASE test;

The resulting output shows that you’ve deleted the database successfully.

Output
DROP DATABASE test Ok. 0 rows in set. Elapsed: 0.003 sec.

You’ve deleted tables and databases in this step. Now that you’ve created, updated, and deleted databases, tables, and data in your ClickHouse instance, you’ll enable remote access to your database server in the next section.

Step 7 — Setting Up Firewall Rules (Optional)

If you intend to only use ClickHouse locally with applications running on the same server, or do not have a firewall enabled on your server, you don’t need to complete this section. If instead, you’ll be connecting to the ClickHouse database server remotely, you should follow this step.

Currently your server has a firewall enabled that disables your public IP address accessing all ports. You’ll complete the following two steps to allow remote access:

  • Modify ClickHouse’s configuration and allow it to listen on all interfaces.

  • Add a firewall rule allowing incoming connections to port 8123, which is the HTTP port that ClickHouse server runs.

If you are inside the database prompt, exit it by typing CTRL+D.

Edit the configuration file by executing:

  • sudo nano /etc/clickhouse-server/config.xml

Then uncomment the line containing <!-- <listen_host>0.0.0.0</listen_host> -->, like the following file:

/etc/clickhouse-server/config.xml
 ...  <interserver_http_host>example.yandex.ru</interserver_http_host>     -->      <!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->     <!-- <listen_host>::</listen_host> -->     <!-- Same for hosts with disabled ipv6: -->     <listen_host>0.0.0.0</listen_host>      <!-- Default values - try listen localhost on ipv4 and ipv6: -->     <!--     <listen_host>::1</listen_host>     <listen_host>127.0.0.1</listen_host>     --> ...  

Save the file and exit nano. For the new configuration to apply restart the service by running:

  • sudo service clickhouse-server restart

You won’t see any output from this command. ClickHouse’s server listens on port 8123 for HTTP connections and port 9000 for connections from clickhouse-client. Allow access to both ports for your second server’s IP address with the following command:

  • sudo ufw allow from second_server_ip/32 to any port 8123
  • sudo ufw allow from second_server_ip/32 to any port 9000

You will see the following output for both commands that shows that you’ve enabled access to both ports:

Output
Rule added

ClickHouse will now be accessible from the IP that you added. Feel free to add additional IPs such as your local machine’s address if required.

To verify that you can connect to the ClickHouse server from the remote machine, first follow the steps in Step 1 of this tutorial on the second server and ensure that you have the clickhouse-client installed on it.

Now that you have logged into the second server, start a client session by executing:

  • clickhouse-client --host your_server_ip

You will see the following output that shows that you have connected successfully to the server:

Output
ClickHouse client version 19.3.6. Connecting to your_server_ip:9000 as user default. Connected to ClickHouse server version 19.3.6 revision 54415. hostname 🙂

In this step, you’ve enabled remote access to your ClickHouse database server by adjusting your firewall rules.

Conclusion

You have successfully set up a ClickHouse database instance on your server and created a database and table, added data, performed queries, and deleted the database. Within ClickHouse’s documentation you can read about their benchmarks against other open-source and commercial analytics databases and general reference documents. Further features ClickHouse offers include distributed query processing across multiple servers to improve performance and protect against data loss by storing data over different shards.

DigitalOcean Community Tutorials

How To Install and Use ClickHouse on Ubuntu 18.04

The author selected the Free and Open Source Fund to receive a donation as part of the Write for DOnations program.

Introduction

ClickHouse is an open-source, column-oriented analytics database created by Yandex for OLAP and big data use cases. ClickHouse’s support for real-time query processing makes it suitable for applications that require sub-second analytical results. ClickHouse’s query language is a dialect of SQL that enables powerful declarative querying capabilities while offering familiarity and a smaller learning curve for the end user.

Column-oriented databases store records in blocks grouped by columns instead of rows. By not loading data for columns absent in the query, column-oriented databases spend less time reading data while completing queries. As a result, these databases can compute and return results much faster than traditional row-based systems for certain workloads, such as OLAP.

Online Analytics Processing (OLAP) systems allow for organizing large amounts of data and performing complex queries. They are capable of managing petabytes of data and returning query results quickly. In this way, OLAP is useful for work in areas like data science and business analytics.

In this tutorial, you’ll install the ClickHouse database server and client on your machine. You’ll use the DBMS for typical tasks and optionally enable remote access from another server so that you’ll be able to connect to the database from another machine. Then you’ll test ClickHouse by modeling and querying example website-visit data.

Prerequisites

  • One Ubuntu 18.04 server with a sudo enabled non-root user and firewall setup. You can follow the initial server setup tutorial to create the user and set up the firewall.
  • (Optional) A secondary Ubuntu 18.04 server with a sudo enabled non-root user and firewall setup. You can follow the initial server setup tutorial.

Step 1 — Installing ClickHouse

In this section, you will install the ClickHouse server and client programs using apt-get.

First, SSH into your server by running:

  • ssh sammy@your_server_ip

Yandex maintains an APT repository that has the latest version of ClickHouse. Add the repository’s GPG key so that you’ll be able to securely download validated ClickHouse packages:

  • sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4

You will see output similar to the following:

Output
Executing: /tmp/apt-key-gpghome.JkkcKnBAFY/gpg.1.sh --keyserver keyserver.ubuntu.com --recv E0C56BD4 gpg: key C8F1E19FE0C56BD4: public key "ClickHouse Repository Key <milovidov@yandex-team.ru>" imported gpg: Total number processed: 1 gpg: imported: 1

The output confirms it has successfully verified and added the key.

Add the repository to your APT repositories list by executing:

  • echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list

Here you’ve piped the output of echo to sudo tee so that this output can print to a root-owned file.

Now, run apt-get update to update your packages:

  • sudo apt-get update

The clickhouse-server and clickhouse-client packages will now be available for installation. Install them with:

  • sudo apt-get install -y clickhouse-server clickhouse-client

You’ve installed the ClickHouse server and client successfully. You’re now ready to start the database service and ensure that it’s running correctly.

Step 2 — Starting the Service

The clickhouse-server package that you installed in the previous section creates a systemd service, which performs actions such as starting, stopping, and restarting the database server. systemd is an init system for Linux to initialize and manage services. In this section you’ll start the service and verify that it is running successfully.

Start the clickhouse-server service by running:

  • sudo service clickhouse-server start

The previous command will not display any output. To verify that the service is running successfully, execute:

  • sudo service clickhouse-server status

You’ll see output similar to the following:

Output
clickhouse-server.service - ClickHouse Server (analytic DBMS for big data) Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2018-12-22 07:23:20 UTC; 1h 9min ago Main PID: 27101 (ClickHouse-serv) Tasks: 34 (limit: 1152) CGroup: /system.slice/ClickHouse-server.service └─27101 /usr/bin/ClickHouse-server --config=/etc/ClickHouse-server/config.xml

The output denotes that the server is running.

You have successfully started the ClickHouse server and will now be able to use the clickhouse-client CLI program to connect to the server.

Step 3 — Creating Databases and Tables

In ClickHouse, you can create and delete databases by executing SQL statements directly in the interactive database prompt. Statements consist of commands following a particular syntax that tell the database server to perform a requested operation along with any data required. You create databases by using the CREATE DATABASE table_name syntax. To create a database, first start a client session by running the following command:

  • clickhouse-client

This command will log you into the client prompt where you can run ClickHouse SQL statements to perform actions such as:

  • Creating, updating, and deleting databases, tables, indexes, partitions, and views.

  • Executing queries to retrieve data that is optionally filtered and grouped using various conditions.

In this step, with the ClickHouse client ready for inserting data, you’re going to create a database and table. For the purposes of this tutorial, you’ll create a database named test, and inside that you’ll create a table named visits that tracks website-visit durations.

Now that you’re inside the ClickHouse command prompt, create your test database by executing:

  • CREATE DATABASE test;

You’ll see the following output that shows that you have created the database:

Output
CREATE DATABASE test Ok. 0 rows in set. Elapsed: 0.003 sec.

A ClickHouse table is similar to tables in other relational databases; it holds a collection of related data in a structured format. You can specify columns along with their types, add rows of data, and execute different kinds of queries on tables.

The syntax for creating tables in ClickHouse follows this example structure:

CREATE TABLE table_name (     column_name1 column_type [options],     column_name2 column_type [options],     ... ) ENGINE = engine 

The table_name and column_name values can be any valid ASCII identifiers. ClickHouse supports a wide range of column types; some of the most popular are:

  • UInt64: used for storing integer values in the range 0 to 18446744073709551615.

  • Float64: used for storing floating point numbers such as 2039.23, 10.5, etc.

  • String: used for storing variable length characters. It does not require a max length attribute since it can store arbitrary lengths.

  • Date: used for storing dates that follow the YYYY-MM-DD format.

  • DateTime: used for storing dates coupled with time and follows the YYYY-MM-DD HH:MM:SS format.

After the column definitions, you specify the engine used for the table. In ClickHouse, Engines determine the physical structure of the underlying data, the table’s querying capabilities, its concurrent access modes, and support for indexes. Different engine types are suitable for different application requirements. The most commonly used and widely applicable engine type is MergeTree.

Now that you have an overview of table creation, you’ll create a table. Start by confirming the database you’ll be modifying:

  • USE test;

You will see the following output showing that you have switched to the test database from the default database:

Output
USE test Ok. 0 rows in set. Elapsed: 0.001 sec.

The remainder of this guide will assume that you are executing statements within this database’s context.

Create your visits table by running this command:

  • CREATE TABLE visits (
  • id UInt64,
  • duration Float64,
  • url String,
  • created DateTime
  • ) ENGINE = MergeTree()
  • PRIMARY KEY id
  • ORDER BY id;

Here’s a breakdown of what the command does. You create a table named visits that has four columns:

  • id: The primary key column. Similarly to other RDBMS systems, a primary key column in ClickHouse uniquely identifies a row; each row should have a unique value for this column.

  • duration: A float column used to store the duration of each visit in seconds. float columns can store decimal values such as 12.50.

  • url: A string column that stores the URL visited, such as http://example.com.

  • created: A date and time column that tracks when the visit occurred.

After the column definitions, you specify MergeTree as the storage engine for the table. The MergeTree family of engines is recommended for production databases due to its optimized support for large real-time inserts, overall robustness, and query support. Additionally, MergeTree engines support sorting of rows by primary key, partitioning of rows, and replicating and sampling data.

If you intend to use ClickHouse for archiving data that is not queried often or for storing temporary data, you can use the Log family of engines to optimize for that use-case.

After the column definitions, you’ll define other table-level options. The PRIMARY KEY clause sets id as the primary key column and the ORDER BY clause will store values sorted by the id column. A primary key uniquely identifies a row and is used for efficiently accessing a single row and efficient colocation of rows.

On executing the create statement, you will see the following output:

Output
CREATE TABLE visits ( id UInt64, duration Float64, url String, created DateTime ) ENGINE = MergeTree() PRIMARY KEY id ORDER BY id Ok. 0 rows in set. Elapsed: 0.010 sec.

In this section, you’ve created a database and a table to track website-visits data. In the next step, you’ll insert data into the table, update existing data, and delete that data.

Step 4 — Inserting, Updating, and Deleting Data and Columns

In this step, you’ll use your visits table to insert, update, and delete data. The following command is an example of the syntax for inserting rows into a ClickHouse table:

INSERT INTO table_name VALUES (column_1_value, column_2_value, ....); 

Now, insert a few rows of example website-visit data into your visits table by running each of the following statements:

  • INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
  • INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01');
  • INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01');
  • INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');

You’ll see the following output repeated for each insert statement.

Output
INSERT INTO visits VALUES Ok. 1 rows in set. Elapsed: 0.004 sec.

The output for each row shows that you’ve inserted it successfully into the visits table.

Now you’ll add an additional column to the visits table. When adding or deleting columns from existing tables, ClickHouse supports the ALTER syntax.

For example, the basic syntax for adding a column to a table is as follows:

ALTER TABLE table_name ADD COLUMN column_name column_type; 

Add a column named location that will store the location of the visits to a website by running the following statement:

  • ALTER TABLE visits ADD COLUMN location String;

You’ll see output similar to the following:

Output
ALTER TABLE visits ADD COLUMN location String Ok. 0 rows in set. Elapsed: 0.014 sec.

The output shows that you have added the location column successfully.

As of version 19.3.6, ClickHouse doesn’t support updating and deleting individual rows of data due to implementation constraints. ClickHouse has support for bulk updates and deletes, however, and has a distinct SQL syntax for these operations to highlight their non-standard usage.

The following syntax is an example for bulk updating rows:

ALTER TABLE table_name UPDATE  column_1 = value_1, column_2 = value_2 ...  WHERE  filter_conditions; 

You’ll run the following statement to update the url column of all rows that have a duration of less than 15. Enter it into the database prompt to execute:

  • ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;

The output of the bulk update statement will be as follows:

Output
ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15 Ok. 0 rows in set. Elapsed: 0.003 sec.

The output shows that your update query completed successfully. The 0 rows in set in the output denotes that the query did not return any rows; this will be the case for any update and delete queries.

The example syntax for bulk deleting rows is similar to updating rows and has the following structure:

ALTER TABLE table_name DELETE WHERE filter_conditions; 

To test deleting data, run the following statement to remove all rows that have a duration of less than 5:

  • ALTER TABLE visits DELETE WHERE duration < 5;

The output of the bulk delete statement will be similar to:

Output
ALTER TABLE visits DELETE WHERE duration < 5 Ok. 0 rows in set. Elapsed: 0.003 sec.

The output confirms that you have deleted the rows with a duration of less than five seconds.

To delete columns from your table, the syntax would follow this example structure:

ALTER TABLE table_name DROP COLUMN column_name; 

Delete the location column you added previously by running the following:

  • ALTER TABLE visits DROP COLUMN location;

The DROP COLUMN output confirming that you have deleted the column will be as follows:

Output
ALTER TABLE visits DROP COLUMN location String Ok. 0 rows in set. Elapsed: 0.010 sec.

Now that you’ve successfully inserted, updated, and deleted rows and columns in your visits table, you’ll move on to query data in the next step.

Step 5 — Querying Data

ClickHouse’s query language is a custom dialect of SQL with extensions and functions suited for analytics workloads. In this step, you’ll run selection and aggregation queries to retrieve data and results from your visits table.

Selection queries allow you to retrieve rows and columns of data filtered by conditions that you specify, along with options such as the number of rows to return. You can select rows and columns of data using the SELECT syntax. The basic syntax for SELECT queries is:

SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options; 

Execute the following statement to retrieve url and duration values for rows where the url is http://example.com.

  • SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;

You will see the following output:

Output
SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2 ┌─url─────────────────┬─duration─┐ │ http://example2.com │ 10.5 │ └─────────────────────┴──────────┘ ┌─url─────────────────┬─duration─┐ │ http://example2.com │ 13 │ └─────────────────────┴──────────┘ 2 rows in set. Elapsed: 0.013 sec.

The output has returned two rows that match the conditions you specified. Now that you’ve selected values, you can move to executing aggregation queries.

Aggregation queries are queries that operate on a set of values and return single output values. In analytics databases, these queries are run frequently and are well optimized by the database. Some aggregate functions supported by ClickHouse are:

  • count: returns the count of rows matching the conditions specified.

  • sum: returns the sum of selected column values.

  • avg: returns the average of selected column values.

Some ClickHouse-specific aggregate functions include:

  • uniq: returns an approximate number of distinct rows matched.

  • topK: returns an array of the most frequent values of a specific column using an approximation algorithm.

To demonstrate the execution of aggregation queries, you’ll calculate the total duration of visits by running the sum query:

  • SELECT SUM(duration) FROM visits;

You will see output similar to the following:

Output
SELECT SUM(duration) FROM visits ┌─SUM(duration)─┐ │ 63.7 │ └───────────────┘ 1 rows in set. Elapsed: 0.010 sec.

Now, calculate the top two URLs by executing:

  • SELECT topK(2)(url) FROM visits;

You will see output similar to the following:

Output
SELECT topK(2)(url) FROM visits ┌─topK(2)(url)──────────────────────────────────┐ │ ['http://example2.com','http://example1.com'] │ └───────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.010 sec.

Now that you have successfully queried your visits table, you’ll delete tables and databases in the next step.

Step 6 — Deleting Tables and Databases

In this section, you’ll delete your visits table and test database.

The syntax for deleting tables follows this example:

DROP TABLE table_name; 

To delete the visits table, run the following statement:

  • DROP TABLE visits;

You will see the following output declaring that you’ve deleted the table successfully:

output
DROP TABLE visits Ok. 0 rows in set. Elapsed: 0.005 sec.

You can delete databases using the DROP database table_name syntax. To delete the test database, execute the following statement:

  • DROP DATABASE test;

The resulting output shows that you’ve deleted the database successfully.

Output
DROP DATABASE test Ok. 0 rows in set. Elapsed: 0.003 sec.

You’ve deleted tables and databases in this step. Now that you’ve created, updated, and deleted databases, tables, and data in your ClickHouse instance, you’ll enable remote access to your database server in the next section.

Step 7 — Setting Up Firewall Rules (Optional)

If you intend to only use ClickHouse locally with applications running on the same server, or do not have a firewall enabled on your server, you don’t need to complete this section. If instead, you’ll be connecting to the ClickHouse database server remotely, you should follow this step.

Currently your server has a firewall enabled that disables your public IP address accessing all ports. You’ll complete the following two steps to allow remote access:

  • Modify ClickHouse’s configuration and allow it to listen on all interfaces.

  • Add a firewall rule allowing incoming connections to port 8123, which is the HTTP port that ClickHouse server runs.

If you are inside the database prompt, exit it by typing CTRL+D.

Edit the configuration file by executing:

  • sudo nano /etc/clickhouse-server/config.xml

Then uncomment the line containing <!-- <listen_host>0.0.0.0</listen_host> -->, like the following file:

/etc/clickhouse-server/config.xml
 ...  <interserver_http_host>example.yandex.ru</interserver_http_host>     -->      <!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->     <!-- <listen_host>::</listen_host> -->     <!-- Same for hosts with disabled ipv6: -->     <listen_host>0.0.0.0</listen_host>      <!-- Default values - try listen localhost on ipv4 and ipv6: -->     <!--     <listen_host>::1</listen_host>     <listen_host>127.0.0.1</listen_host>     --> ...  

Save the file and exit nano. For the new configuration to apply restart the service by running:

  • sudo service clickhouse-server restart

You won’t see any output from this command. ClickHouse’s server listens on port 8123 for HTTP connections and port 9000 for connections from clickhouse-client. Allow access to both ports for your second server’s IP address with the following command:

  • sudo ufw allow from second_server_ip/32 to any port 8123
  • sudo ufw allow from second_server_ip/32 to any port 9000

You will see the following output for both commands that shows that you’ve enabled access to both ports:

Output
Rule added

ClickHouse will now be accessible from the IP that you added. Feel free to add additional IPs such as your local machine’s address if required.

To verify that you can connect to the ClickHouse server from the remote machine, first follow the steps in Step 1 of this tutorial on the second server and ensure that you have the clickhouse-client installed on it.

Now that you have logged into the second server, start a client session by executing:

  • clickhouse-client --host your_server_ip

You will see the following output that shows that you have connected successfully to the server:

Output
ClickHouse client version 19.3.6. Connecting to your_server_ip:9000 as user default. Connected to ClickHouse server version 19.3.6 revision 54415. hostname 🙂

In this step, you’ve enabled remote access to your ClickHouse database server by adjusting your firewall rules.

Conclusion

You have successfully set up a ClickHouse database instance on your server and created a database and table, added data, performed queries, and deleted the database. Within ClickHouse’s documentation you can read about their benchmarks against other open-source and commercial analytics databases and general reference documents. Further features ClickHouse offers includes distributed query processing across multiple servers to improve performance and protect against data loss by storing data over different shards.

DigitalOcean Community Tutorials