PHP & MariaDB dans le Cloud - prog2017.rmll.info · MariaDB 5.1 (Fev 2010) 5.5.56 (Aujourd'hui)...

49
PHP & MariaDB dans le Cloud Christophe Villeneuve @hellosct1 @[email protected]

Transcript of PHP & MariaDB dans le Cloud - prog2017.rmll.info · MariaDB 5.1 (Fev 2010) 5.5.56 (Aujourd'hui)...

PHP & MariaDB dans le Cloud

Christophe Villeneuve

@hellosct1@[email protected]

Qui ???

Christophe Villeneuve

mozilla reps - firefox os - B2GOS - ausy - afup – lemug.fr – mysql – mariadb – drupal – demoscene – firefoxos – drupagora – phptour – forumphp – solutionlinux – Libre@toi – eyrolles – editions eni – programmez – linux pratique – webriver – phptv – elephpant - owasp -security

RMLL 2017 – 5 Juillet 2017

Aujourd'hui

● Environnement● Côté développeur● Côté DBA● Autres● Maintenance

Environnement de développement

RMLL 2017 – 5 Juillet 2017

Environnement

● Serveur Mutualisé● Serveur Dédié● Auto-Hébergement

● Amazon Web Service (AWS)

● Azure● Google Cloud Platform● OVH● Gandi● ...

Classique Cloud

Installation par - Interface- Ligne de commande

Installation par - Interface- Ligne de commande

OS ?OS ?

RMLL 2017 – 5 Juillet 2017

Installation Serveur

$ apt-get -y install apache2

$ a2enmod ssl

$ a2ensite default-ssl

$ apt-get install nginx$ mkdir /etc/nginx/ssl

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

RMLL 2017 – 5 Juillet 2017

Installation Langage : PHP

$ apt-get -y install php7.0 libapache2-mod-php7.0

$ apt-get -y install php7.0-mysql \

...

RMLL 2017 – 5 Juillet 2017

Installation Base de données

RMLL 2017 – 5 Juillet 2017

✔ Fondé par

✔ Monty Widenius✔ David Axmark

✔ 1983 – 1ère idée

✔ Fondé en 1995

✔ 2007 Préparation pour Nasdaq

✔ 2008 Rachat par Sun

✔ 2009 Sun racheté par Oracle

✔ Promesse de Oracle sur 5 ans (fin 2014)

L'origine Dates importantes

Rappels

RMLL 2017 – 5 Juillet 2017

✔ Communauté d'amis✔ 100 % Open source et 

compatible MySQL✔ Plateforme d'innovation✔ Des commiteurs✔ Fondation (2013)

✔ Dec 2008 Création de Monty Program 

 → Monty Widenius

­­­­­­­­­­­­ MariaDB ­­­­­­­­­­­­­

✔ 5.1 (Fev 2010)✔ 5.5.56 (Aujourd'hui)

✔ 10.0 (Mars 2013)✔ 10.2 (Mai 2017) 

Galera people

Compression Multimaster Replication

MariaDB : Le projet...

RMLL 2017 – 5 Juillet 2017

✔ PHP (driver natif) → BSD licence

✔ Python

✔ Perl

✔ Ruby

✔ .NET avec MyODBC

✔ JDBC (basé sur drizzle driver)

✔ C

✔ Oracle connector (licence GPL)

Tous sont LGPL → Aucune licence commerciale

Différents connecteurs avec MariaDB

RMLL 2017 – 5 Juillet 2017

MariaDB Repositories : installation

> sudo apt-get install software-properties-common

> sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

> sudo add-apt-repository 'deb [arch=amd64,i386] http://fr.mirror.babylon.network/mariadb/repo/10.2/ubuntu yakkety main'

https://downloads.mariadb.org/mariadb/repositories/#mirror=babylon-fr&distro=Ubuntu&distro_release=yakkety--ubuntu_yakkety&version=10.2

RMLL 2017 – 5 Juillet 2017

✔ sudo apt-get install mariadb-server mariadb-client

✔ Vous retrouvez :✔ /etc/mysql/my.cnf✔ > mysql

✔ Au final

Linux

RMLL 2017 – 5 Juillet 2017

PHP & MariaDB (1/3)

● Connexion

<?php

try{$cnx = new PDO('mysql:host='.$serveur.';port='.$port.';dbname='.$bdd, $login,$pass);$cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Ici votre code}catch (PDOException $e) {die ('Erreur : '.$e->getMessage());}

?>

$serveur = "localhost";$login= "votreLogin";$pass = "VotrePassword";$bdd = "votreDatabase" ;$port='3306';

RMLL 2017 – 5 Juillet 2017

PHP & MariaDB (2/3)

● Select<?php$sql="SELECT * from users ";$qid=$cnx->prepare($sql);$qid->execute();$row=$qid->fetchAll(PDO::FETCH_ASSOC);

echo '<pre>';print_r($row);echo '</pre>';

$qid->closeCursor();$cnx = null;

?>

Requête SQLclassique

RMLL 2017 – 5 Juillet 2017

PHP & MariaDB (3/3)

● Insert

● Update

<?php$cnx->beginTransaction();$sql="INSERT INTO users (‘last_name’, ‘first_name’) VALUES ('Villeneuve', 'Christophe')";$qid=$cnx->prepare($sql);$qid->execute();$cnx->commit();?>

<?php$cnx->beginTransaction();$sql="UPDATE exemple SET nom='ENI' WHERE id=3";$qid=$cnx->prepare($sql);$qid→execute();$cnx->commit();?>

RMLL 2017 – 5 Juillet 2017

NewSQL

→ Développement → Moteur de stockages

+

RMLL 2017 – 5 Juillet 2017

Développement

RMLL 2017 – 5 Juillet 2017

✔ Pont entre les BDD relationnelles et non relationnelles

✔ Toutes les colonnes stockées dans un « blob »

✔ Possibilité de le manipuler

✔ Possibilité de créer des index Virtuels

Colonnes Dynamiques

RMLL 2017 – 5 Juillet 2017

create table newsql( 

id int 

    auto_increment        primary key,

nom varchar(40),

type enum 

     ('animal',

     'ordinateur'),

prix int,

nosql blob);

COLUMN_CREATE(

column_nr, 

value [as type],

[

column_nr, 

value [as type]

], 

...)

Exemple (colonne dynamique) 1/3

ID nom type Prix blob

Multi produits

RMLL 2017 – 5 Juillet 2017

Exemple (colonne dynamique) 2/3

>INSERT into newsql values (NULL, 'Atari' ,'ordinateur',500, COLUMN_CREATE('couleur', 'Noir', 'type' , 'STe'));

>INSERT into newsql values (NULL, 'elePHPant','animal',20, COLUMN_CREATE('taille', 'normal', 'description' , 'peluche'));

>UPDATE newsql SET nosql = COLUMN_ADD(nosql, 'couleur' , 'blue') WHERE id=2;

ID Nom type prix couleur type taille description

1Atari Ordinateur 500Noir Ste

2elePHPant animal 20bleu normal peluche

>SELECT nom, column_list (nosql) FROM newsql;

Multi produits

RMLL 2017 – 5 Juillet 2017

Exemple (colonne dynamique) 3/3

>SELECT nom, COLUMN_JSON(nosql) FROM newsql;

>SELECT id,type,nom,

COLUMN_GET(nosql, 'couleur' as char) AS couleur,prix FROM newsql;

Multi produits

RMLL 2017 – 5 Juillet 2017

Moteur de stockagestorage engine

RMLL 2017 – 5 Juillet 2017

Ouverture vers le NewSQL

● Moteur de stockage : CassandraSE

● Dispo MariaDB 10.0+

● Brique de Apache Cassandra

● Données non relationnelles (NoSQL)

● Assurer l'intégration des données SQL / NoSQL

● Mapping possible

● Manipulations :

static columns, dynamic columns, rowkey ● Installation dans My.cnf

[mysqld]

plugin-load=ha_cassandra.so

RMLL 2017 – 5 Juillet 2017

CassandraSE : Utilisation (1/2)

> create table t2 (rowkey varchar(36) primary key,

data1 varchar(60),data2 varchar(60)) engine=cassandrakeyspace='mariadbtest'thrift_host='localhost'column_family='cf1';

Clé primaire obligatoire

Colonnes statiques

Sous ensemble des colonnes CF

RMLL 2017 – 5 Juillet 2017

CassandraSE : Utilisation (2/2)

> insert into t1 values

('rowkey10', 'data1-value', 123456),

('rowkey11', 'data1-value2', 34543);

> select * from t1 where rowkey='rowkey11';

RMLL 2017 – 5 Juillet 2017

Manipuler les données : Connect

● Dispo MariaDB 10.0+

● ETL : Extract, transform et Load

● Lecture / Ecriture / MAJ

– TXT, DBF, INI, XML

– MS Access, MS Excel, TBL (similaire à MERGE)

– ODBC, MySQL,SQLite, Oracle, DB2, WMI…

– NoSQL : MongoDB● Locale ou distant

● Custom possible

● Accès en parallèle sur multitables

● Installation dans My.cnf

[mysqld]

plugin-load=ha_connect.so

RMLL 2017 – 5 Juillet 2017

Connect : exemple CSV

● Fichier

– first,last,birthday

– "Christophe","Villeneuve","Jan 1"

– "PHP","ODBC","Nov 22"

> CREATE TABLE users_csv (

first varchar(32) NOT NULL,

last varchar(32) NOT NULL,

birthday varchar(50) NOT NULL

) ENGINE=CONNECT TABLE_TYPE =CSV FILE_NAME ='/var/lib/mysql/users.csv' HEADER=1 SEP_CHAR=',' QUOTED=1;

> SELECT * FROM users_csv;

| first | last | birthday |

+---------------+---------------+-------------+

| Christophe | Villeneuve | Jan 1 |

| PHP | ODBC | Nov 22 |

+---------------+---------------+-------------+

RMLL 2017 – 5 Juillet 2017

Connect : exemple MongoDB (1/3)

● Driver : ha_connect.so

● Méthode ODBC

– > mongoexport

–db test

–collection restaurants

–out

/var/lib/mysql/test/restaurants.json

–jsonArray

https://github.com/NYUITP/sp13_10g

RMLL 2017 – 5 Juillet 2017

Connect : exemple MongoDB (2/3)

{'_id' : ObjectId('580cda5aaf1de8b908ccfe40'),'coord' : {'numero' : '522', 'adresse' : 'Rue des champs elysees', 'codepostal' : '75000' },'Notes' : [ {'date' : ISODate('2016-09-02T00:00:00Z'), 'note' : 'A', 'but' : 12 }, {'date' : ISODate('2013-12-19T00:00:00Z'), 'note' : 'B', 'but' : 16 }, {'date' : ISODate('2013-05-28T00:00:00Z'), 'note' : 'A', 'but' : 9 }, {'date' : ISODate('2012-12-07T00:00:00Z'), 'note' : 'A', 'but' : 13 }, {'date' : ISODate('2012-03-29T00:00:00Z'), 'note' : 'A', 'but' : 11 } ],'name' : 'Restaurant XXX','restaurant_id' : '40361521'}

● Avec MongoDB

RMLL 2017 – 5 Juillet 2017

Connect : exemple MongoDB (3/3)● Avec MariaDB

| proprietaire | Nom restaurant | notes |+---------------------+------------------------------------------------+--------------+| Treva Tullis | Bagels N Buns | A || Maud Morningstar | La Fusta Restaurant | A || Vanessa Vowell | The Greek Corner | A || Teressa Truex | Mcdonald’S | A || Eli Enright | Neron’S Pizza | A

> SELECT proprietaire, nom_restaurant, note FROM proprietors, restaurants WHERE proprietors.restaurant_id=restaurants.restaurant_id AND grades_date>‘2017-01-08’ AND grades_grade IN(‘A’,‘B’);

RMLL 2017 – 5 Juillet 2017

Storage Engine : ColumnStore

BigData

RMLL 2017 – 5 Juillet 2017

MariaDB ColumnStore (1/2)

● Portage de la Base de données : InfiniDB 4.6.7● Disponible à partir de MariaDB 10.1

– Update MariaDB 10.2

● Moteur de stockage orienté en colonnes● Architecture (en parallèle)

– Exécution de requêtes distribuée

– Chargement de données

● Licence GPL

https://mariadb.com/kb/en/mariadb/mariadb-columnstore/

RMLL 2017 – 5 Juillet 2017

MariaDB ColumnStore (2/2)

● OS– CentOS 6 et 7

– Debian 8

– Ubuntu 16.04

● Utilisation dans cloud : – AWS AMI

● Utilisation pour les développeurs :– Docker

– Vagrant

RMLL 2017 – 5 Juillet 2017

Axée sur la rangée VS Orienté Column

● Axée sur la rangée– Les Lignes stockées séquentiellement dans un fichier

● Orienté colonne– Chaque colonne est stockée dans un fichier séparé

RMLL 2017 – 5 Juillet 2017

Pourquoi ?

● Traitement des 'petabytes' de données● Utilisation

– Temps de réponse en temps réel ● aux requêtes analytiques

– Traitement par lots → Batch

– Algorithmique

● Sécurité– Bénéficie des mêmes fonctionnalités de sécurité

existante

– Cryptage sur les données en mouvement

RMLL 2017 – 5 Juillet 2017

Réplication (en temps réel)

● MariaDB MaxScale– Maitre(s) / Eclave(s)

● Réplications les transactions – MariaDB → Hadoop

● Pas d'impact – Sur les performances

– Sur les métadonnées

RMLL 2017 – 5 Juillet 2017

Architecture

● Moteur utilisateur : précompte les requêtes SQL● Module de performance : moteur de traitement

distribué

(C) MariaDB

RMLL 2017 – 5 Juillet 2017

Sécuriser

RMLL 2017 – 5 Juillet 2017

Lors de l'installation

> mysql_secure_installation

Enter current password for root (enter for none): ← Entrée

Set root password? [Y/n] ← y

New password: ← saisir nouveau Mot de passe

Re-enter new password: ← resaisir Mot de passe

Remove anonymous users? [Y/n] ← y

Disallow root login remotely? [Y/n] ← y

Reload privilege tables now? [Y/n] ← y

RMLL 2017 – 5 Juillet 2017

Les connexions 'SSL / TLS' sécurisés disponibles

● Connexions client / serveur → protocole TLS– Les données peuvent être cryptées pendant le transfert à

l'aide du protocole TLS

● Variable système SSL / TLS● Variable d'état SSL / TLS● Réplication avec connexions sécurisées

– Maître(s) / Esclave(s) avec des données cryptées

RMLL 2017 – 5 Juillet 2017

Connexion 'SSL / TLS'

● Par défaut – Connexion non chiffré

● Si le serveur prend en charge les connexions sécurisées

→ OUI

● Pour activer TLS

– Démarrer le serveur avec l'option --ssl

> SHOW VARIABLES LIKE 'have_ssl';+---------------+----------+| Variable_name | Value |+---------------+----------+| have_ssl | DISABLED |+---------------+----------+

https://mariadb.com/kb/en/mariadb/secure-connections-overview/

RMLL 2017 – 5 Juillet 2017

● Cryptage de données● Transfert TLS● Exemple

– have_openssl

– have_ssl

● Interchangeable SSL● SSL

n'est plus considéré comme sécurisé

● Exemple– ssl_ca

– ssl_capath

– ...

Options 'SSL / TLS'

Système/Status de variables Attention

https://mariadb.com/kb/en/mariadb/ssltls-system-variables/

https://mariadb.com/kb/en/mariadb/ssltls-status-variables/

RMLL 2017 – 5 Juillet 2017

Réplication

https://mariadb.com/kb/en/mariadb/replication-with-secure-connections/

● Maître(s) / Esclave(s)● Répliqués des données cryptées● Activation des connexions sécurisées (obligatoire)● Cluster

AttentionSi un des serveurs n'est pas configuré pour les connexions sécurisés → les connexions ne seront pas cryptées

RMLL 2017 – 5 Juillet 2017

Réplication : exemple (1/3)

● Création SSL dans chaque serveursudo mkdir -p /etc/mariadb/ssl

● Gestion des certificats$ sudo openssl genrsa 4096 > ca-key.pem

$ sudo openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem

● Créer un certificat de serveur sur serveur1$ sudo openssl req -newkey rsa:4096 -days 3600 -nodes -keyout server-key.pem -out server-req.pem

$ sudo openssl rsa -in server-key.pem -out server-key.pem

$ sudo openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

RMLL 2017 – 5 Juillet 2017

Réplication : exemple (2/3)

● Vérification des certificats (serveur1)sudo openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

● Résultatserver-cert.pem: OK

client-cert.pem: OK

● Copier le certificat vers les autres serveurssudo scp /etc/mariadb/ssl/*.pem [email protected]:/etc/mariadb/ssl/

● Installation MariaDBsudo apt-get install mariadb mariadb-server -y

RMLL 2017 – 5 Juillet 2017

Réplication : exemple (3/3)

● Configuration de my.cnf – pour chaque serveur

# SSLssl-ca=/etc/mariadb/ssl/ca-cert.pem

ADD under [mysqld]:# SSLssl-ca=/etc/mariadb/ssl/ca-cert.pemssl-cert=/etc/mariadb/ssl/server-cert.pemssl-key=/etc/mariadb/ssl/server-key.pem

CHANGE under [mysqld]:server-id = 1log-bin=mysql-binbinlog_format=mixed

Pas de modifications (processus identique) pour :La réplication / MariaDB Galera Cluster

RMLL 2017 – 5 Juillet 2017

En résumé

RMLL 2017 – 5 Juillet 2017

Merci

Christophe Villeneuve@hellosct1