Un monde d'octets

Aller au contenu | Aller au menu | Aller à la recherche

Ingénierie Système › BDD (Sql, NOSql)

Fil des billets

lundi, février 17 2020

Mongodb : opérations usuelles

Exporter une collection en json

 
mongoexport --uri='mongodb://mongo@localhost:27019/?authsource=admin' -d MyDb -c MyCollection  --forceTableScan --out=example.json 


Exporter toute une base

mongodump --uri='mongodb://mongo@localhost:27019/?authsource=admin' -d MyDb--forceTableScan -o . 
mongodump --uri='mongodb://mongo@localhost:27019/?authsource=admin' -d MyDb -c MyCollection --forceTableScan -o . 



Reimporter une collection de base, une base, une collection


mongorestore --uri='mongodb://mongo@localhost:27019/?authSource=admin' --drop dump/
mongorestore --uri='mongodb://mongo@localhost:27019/?authSource=admin' --drop -d MyDb --drop dump/my_db/
mongorestore --uri='mongodb://mongo@localhost:27019/?authSource=admin' --drop -d MyDb -c expressions dump/my_db/MyCollection.bson 

samedi, mars 16 2019

Influx et dates

Pour avoir des dates lisibles dans Influx lors d'un select, tapez simplement ce qui suit :

precision rfc3339

C'est tout :)

jeudi, décembre 20 2018

Influx et Grafana

Mon premier essai de Grafana fut basé sur l'idée de tracer les relevés de température et d'humidité d'un local, mesurées par un raspberry pi et un module dht22.

L'installation d'Influxdb fut faite au moyen d'Ansible, après ajout du dépot officiel d'influx et en utilisant apt.

La création de la première tsdb fut faite comme suit :

influx -execute "create database sonde with duration 7d shard duration 24h"

Pour l'insertion des données de la sonde, j'ai utilisé python, et l'import se fait par la génération d'un json qu'on envoie au serveur influx.

Nous pouvons controler les valeurs avec les commandes suivantes :

influx uses sensor_dht22; select * from dht22;

ou en shell

influx -database "sensor_dht22" -execute "select * from dht22;"

Nous pouvons controler les retentions avec la commande

show retention policies ...

et les modifier avec

alter retenton policies ...

Attention : si vous créez une nouvelle retention policy et l'appliquez comme defaut, vous n'aurez plus accès a celle de l'autogen. il vous suffit de remettre autogen comme policy par défaut pour régler ce problème.

Ensuite il suffit de rajouter la data source influxdb dans grafana, puis de commencer à créer ses premiers dashboard, graphs, et alertes.

mercredi, novembre 21 2018

Benchmark Redis sous lxc

Suite a une installation via apt de redis dans un container lxc, voici les resultats d'un benchmark :

root@redis:~# redis-benchmark -c 10 -n 100000 -q


PING_INLINE: 27225.70 requests per second
PING_BULK: 29154.52 requests per second
SET: 30039.05 requests per second
GET: 28368.79 requests per second
INCR: 30478.51 requests per second
LPUSH: 29197.08 requests per second
RPUSH: 30469.22 requests per second
LPOP: 28530.67 requests per second
RPOP: 28312.57 requests per second
SADD: 28288.54 requests per second
HSET: 30229.75 requests per second
SPOP: 31230.48 requests per second
LPUSH (needed to benchmark LRANGE): 28851.70 requests per second
LRANGE_100 (first 100 elements): 16450.07 requests per second
LRANGE_300 (first 300 elements): 7722.01 requests per second
LRANGE_500 (first 450 elements): 5751.09 requests per second
LRANGE_600 (first 600 elements): 4663.96 requests per second
MSET (10 keys): 22558.09 requests per second

jeudi, septembre 20 2018

Mysql : Master Slave, désynchronisation du slave

Identification

Chercher dans les logs la cause de l'arrêt de la réplication :

grep mysql /var/log/syslog


server1:/home/admin# grep mysql /var/log/syslog
May 29 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Slave: Error 'Table 'mydb.taggregate_temp_1212047760' doesn't exist' on query. Default database: 'mydb'. Query: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate
May 29 09:56:08 http2 mysqld[1380]: ^ISET thread.views = thread.views + aggregate.views
May 29 09:56:08 http2 mysqld[1380]: ^IWHERE thread.threadid = aggregate.threadid', Error_code: 1146
May 29 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.001079' position 203015142
server1:/home/admin#

On voir ici à quelle position la réplication à stoppé.

On peut aussi vérifier cela directement avec mysql

mysql -u root -p
mysql> SHOW SLAVE STATUS \G



*************************** 1. row ***************************

            Slave_IO_State: Waiting for master to send event
               Master_Host: 1.2.3.4
               Master_User: slave_user
               Master_Port: 3306
             Connect_Retry: 60
           Master_Log_File: mysql-bin.001079
       Read_Master_Log_Pos: 269214454
            Relay_Log_File: slave-relay.000130
             Relay_Log_Pos: 100125935
     Relay_Master_Log_File: mysql-bin.001079
          Slave_IO_Running: Yes
         Slave_SQL_Running: No
           Replicate_Do_DB: mydb
       Replicate_Ignore_DB:
        Replicate_Do_Table:
    Replicate_Ignore_Table:
   Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

                Last_Errno: 1146
                Last_Error: Error 'Table 'mydb.taggregate_temp_1212047760' doesn't exist' on query. Default database: 'mydb'.

Query: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate

       SET thread.views = thread.views + aggregate.views
       WHERE thread.threadid = aggregate.threadid'
              Skip_Counter: 0
       Exec_Master_Log_Pos: 203015142
           Relay_Log_Space: 166325247
           Until_Condition: None
            Until_Log_File:
             Until_Log_Pos: 0
        Master_SSL_Allowed: No
        Master_SSL_CA_File:
        Master_SSL_CA_Path:
           Master_SSL_Cert:
         Master_SSL_Cipher:
            Master_SSL_Key:
     Seconds_Behind_Master: NULL

1 row in set (0.00 sec)

on voir ici qu'une requête n'est pas passé. Pour réparere la réplication, nous allons forcer le saut de cette requête.

Réparation

Arrêt du slave

mysql> STOP SLAVE;

Indiquer le nombre de reqûetes dont on va ignorer la réplication (ici 1, mais on pourrait en ignorer 2, 3, ... 100)

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;

Relancer le slave :

mysql> START SLAVE;
mysql> SHOW SLAVE STATUS \G


mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 1.2.3.4
                Master_User: slave_user
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.001079
        Read_Master_Log_Pos: 447560366
             Relay_Log_File: slave-relay.000130
              Relay_Log_Pos: 225644062
      Relay_Master_Log_File: mysql-bin.001079
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: mydb
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 447560366
            Relay_Log_Space: 225644062
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)

Nous constatons que Slave_IO_Running and Slave_SQL_Running sont bien a YES maintenant.

mardi, septembre 5 2017

MongoDB 101

Installation des paquets ubuntu

apt install mongodb-clients mongodb-server mongo-tools

Lancement du client

mongo

Listes les bases de données :

show dbs

Création d'une base / Connexion a une base :

use movies

Listes les collections :

show collections

Insertion d'un document dans une collection :

db.movie.insert((name:"Batman : Under the Red Hood"))

Recherche d'un document :

db.movie.find()
db.movie.find().pretty()
db.movie.find({name:"Batman : Under the Red Hood})

Mettre à jour un document :

db.movie.update({name:"Batman : Under the Red Hood"},{$set:{editor:"DC Comics"}})
db.movie.update({name:"Batman : Under the Red Hood"},{$unset:{editor:""}})

Supprimer un document :

db.movie.remove({name:"Batman : Under the Red Hood"})

Vider la collection :

db.movie.remove({})

Détruire la collection :

db.movie.drop()

Détruire la base courante (celle sélectionnée avec use):

db.dropDatabase()