This is an old revision of the document!


Moodle Mooc

Introduction

Telecom SudParis à mis en place fin 2013 un MOOC intitulé “Comprendre les concepts des Télécommunication”: http://mooc.telecom-sudparis.eu.

Cette page presente les aspects techniques systemes mis en oeuvre afin d'assurer la diffusion de ce MOOC.

Fort de notre experience sur la plateforme Moodle pour les cours en ligne des formations initiales et continus, et considerant les delais impartis, nous avons jugés opportun de poursuivre sur le LMS moodle pour la diffusion de ce MOOC.

Cette article aborde les aspects tehniques :

  • applicatifs (moodle, gestionnaire git), systemes (apache) ,
  • tests de montés en charge (tsung),
  • reporting, statistiques d'usages

References

statitics

pour commencer l'article sur un apect visuel, voici ci-dessous quelques graphs de statistics en terme d'usage appplicatifs (cours moodle), systeme (serveur load et apache hits) , logiciel d'analyse de log apache ⇒ awstats

moodle

tous les acces

toutes les activités

system

apache hits

system load

mysql requetes (1ere semaine)

Awstats

le résumé awstats d'apache pour le mois de Décembre 2013

Moodle Mooc

reference sur l'installation de moodle 2.x

database

création d'une base de donnée sur un serveur mysql

mysql>  CREATE DATABASE moodle_mooc;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER ON moodle_mooctsp.* to mooc-user@'mooctsp.int-evry.fr' IDENTIFIED by 'secret';
Query OK, 0 rows affected (0.00 sec)

statistiques

l'usage des statistiques dans moodle implique la possibilité à l'utilisateur propiétaire de la base de donnée de creer des tables temporaires, il faut donc ajouter cette aptitude à notre utilisateur

[root@mysql /]# mysql -u root -p
mysql> use mysql
mysql> select * from db where User='mooc-user';

mysql> update db set Create_tmp_table_priv='Y' where User='mooc-user';
mysql> flush privileges;

sans cette aptitude, la generation des statistiques moodle (reports) échoue.

il est alors possible de lancer “manuellement” la generation des statistics en appelant le script cron_stats.php

Server Time: Wed, 18 Dec 2013 15:37:02 +0100

Running daily statistics gathering, starting at 1383778800:
... started 15:37:03. Current memory use 26Mo.
Temporary tables created
Enrolments calculated
0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:0 15:0 16:0 out:0   finished until 1383865200: vendredi 8 novembre 2013, 00:00 (in 0 s)
...
..stopping early, reached maximum number of 31 days (5 s) - will continue next time.

GIT moodle

Utilisation de GIT pour gerer plus finement notre instance moodle (mises à jours, versionning des modifications, plugins, logs etc ..)

variables d'environement GIT

[root@mooc ~]# mkdir git-moodle-mooc
[root@mooc ~]# cd git-moodle-mooc/
[root@mooc git-moodle-mooc]# git config --global user.name "disi-sudparis"
[root@mooc git-moodle-mooc]# git config --global user.email "admins@int-evry.fr"

repertoire de travail

[root@mooc git-moodle-mooc]# mkdir mooctsp
[root@mooc git-moodle-mooc]# cd mooctsp/

initialisation

initialisation du repertoire local et récuperation du code depuis la version de base MOODLE_25_STABLE sur le serveur git de moodle

[root@mooc mooctsp]#  git init
Initialized empty Git repository in /root/git-moodle-mooc/mooctsp/.git/
[root@mooc mooctsp]# git remote add moodle git://git.moodle.org/moodle.git

[root@mooc mooctsp]# git fetch moodle
remote: Counting objects: 703676, done.
remote: Compressing objects: 100% (164991/164991), done.
remote: Total 703676 (delta 522649), reused 703676 (delta 522649)
Receiving objects: 100% (703676/703676), 262.39 MiB | 9.71 MiB/s, done.
Resolving deltas: 100% (522649/522649), done.
From git://git.moodle.org/moodle
 * [new branch]      MOODLE_13_STABLE -> moodle/MOODLE_13_STABLE
...
 * [new branch]      master     -> moodle/master
...
From git://git.moodle.org/moodle
 * [new tag]         v1.0.0     -> v1.0.0
...
 * [new tag]         v2.5.2     -> v2.5.2
 * [new tag]         v2.6.0-beta -> v2.6.0-beta

Déclaration de suivi de la branche MOODLE_25_STABLE

# git branch --track MOODLE_25_STABLE moodle/MOODLE_25_STABLE
# git checkout MOODLE_25_STABLE

sub repo mooc disi

depuis la version moodle_stable2.5 on fork notre “version” maison (disi) du projet.

[root@mooc mooctsp]# git checkout -b mooc_disi
Switched to a new branch 'mooc_disi'

A partir de là, nous allons gerer sur notyre propre serveur GIT, une version “remote” afin de disposer d'un serveur de distribution GIT de notre propre branche (pour d'eventuels clones et autres serveurs de failover …)

⇒ declaration du remote disi

# ssh-keygen
# ssh-copy-id gituser@git.tem-tsp.eu

# git remote add mooc ssh://gituser@git.tem-tsp.eu/~/moodle/mooc.git

puis push vers le remote serveur (git.tem-tsp.eu) de notre branche mooc_disi

# git push mooc mooc_disi:mooc_disi

[root@mooc mooctsp]# git branch 
  MOODLE_25_STABLE
* mooc_disi

recapitulatif

etat des lieux GIT à ce niveau, liste de toutes les branches:

[root@mooc mooctsp]# git branch -a
  MOODLE_25_STABLE
* mooc_disi
  remotes/mooc/mooc_disi
  remotes/mooc/mooc_productive
  remotes/mooc/mooc_rebase
  remotes/moodle/MOODLE_13_STABLE
  remotes/moodle/MOODLE_14_STABLE
  remotes/moodle/MOODLE_15_STABLE
  remotes/moodle/MOODLE_16_STABLE
  remotes/moodle/MOODLE_17_STABLE
  remotes/moodle/MOODLE_18_STABLE
  remotes/moodle/MOODLE_19_STABLE
  remotes/moodle/MOODLE_20_STABLE
  remotes/moodle/MOODLE_21_STABLE
  remotes/moodle/MOODLE_22_STABLE
  remotes/moodle/MOODLE_23_STABLE
  remotes/moodle/MOODLE_24_STABLE
  remotes/moodle/MOODLE_25_STABLE
  remotes/moodle/master

D'apres http://www.techblogistech.com/2012/07/setting-a-default-upstream-branch-in-git/, nous devons indiquer a chaque commande git pull et git push depuis où retirer les modifications et vers où les envoyer. C'est fastidieux, nous allons donc fixer la branche remote par defaut.

[root@mooc mooctsp]# git branch --set-upstream remotes/mooc/mooc_disi
Branch remotes/mooc/mooc_disi set up to track local branch mooc_disi.

mise en ligne via rsync

Now we are ready to bring the code to the productive Server. You can pull the code from the remote ISIS repository, but you will have a lot of overhead this way. So we simply rsync the code to the server.

[root@mooc mooctsp]# cd ..
[root@mooc git-moodle-mooc]# rsync -a --delete --exclude=.htaccess --exclude=.git/ mooctsp /var/www/

modification et ajout de fichiers

on veux gerer config.php via git donc on le retire de .gitignore

[root@mooc mooctsp]# grep config.php .gitignore 
##/config.php

ajout et commit

[root@mooc mooctsp]# cp config-dist.php config.php 
[root@mooc mooctsp]# vim config.php 

[root@mooc mooctsp]# git add config.php
[root@mooc mooctsp]# git commit -a -m "add config.php and configured to DB  mysql3"
[mooc_disi 792f740] add config.php and configured to DB  mysql3
 1 files changed, 651 insertions(+), 0 deletions(-)
 create mode 100644 config.php

push serveur git local

on push nos modifications sur notre serveur git local

[root@mooc mooctsp]# git push mooc mooc_disi:mooc_disi
Counting objects: 8, done.
Delta compression using up to 32 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 11.24 KiB, done.
Total 6 (delta 3), reused 0 (delta 0)
To ssh://gituser@git.tem-tsp.eu/~/moodle/mooc.git
   c9ee1a7..792f740  mooc_disi -> mooc_disi

publication web

depuis notre répertoire de travail git (dans le homedir de root) nous allons pousser notre instance moodle dans une arborescence de visibilité web d'apache ⇒ “DocumentRoot”

[root@mooc git-moodle-mooc]# rsync -av --delete --exclude=.htaccess --exclude=.git/ mooctsp /var/www/
sending incremental file list
mooctsp/
mooctsp/.gitignore
mooctsp/config.php

sent 354720 bytes  received 3558 bytes  238852.00 bytes/sec
total size is 116222732  speedup is 324.39

etat des lieux

[root@mooc mooctsp]# git remote -v 
mooc	ssh://gituser@git.tem-tsp.eu/~/moodle/mooc.git (fetch)
mooc	ssh://gituser@git.tem-tsp.eu/~/moodle/mooc.git (push)
moodle	git://git.moodle.org/moodle.git (fetch)
moodle	git://git.moodle.org/moodle.git (push)

[root@mooc mooctsp]# git remote show mooc
* remote mooc
  Fetch URL: ssh://gituser@git.tem-tsp.eu/~/moodle/mooc.git
  Push  URL: ssh://gituser@git.tem-tsp.eu/~/moodle/mooc.git
  HEAD branch: (unknown)
  Remote branches:
    mooc_disi       tracked
  Local refs configured for 'git push':
    mooc_disi       pushes to mooc_disi       (up to date)

Apache

Définition d'un Virtual Host Apache pour heberger cette instance moodle-mooc ⇒ création d'un fichier de configuration spécifique dans conf.d d'apache.

On notera l'usage d'une authetification SSO shibboleth pour la communauté education/recherche, qui ne sera pas detaillée ici, sujet à part entiere …

On gere aussi une instance en https avec les certificats qui vont bien.

[root@mooc ~]# cat /etc/httpd/conf.d/mooc.conf
#mooctsp
<VirtualHost 157.159.10.35:80>
        ServerName mooc.telecom-sudparis.eu
#        ServerAlias mooc.*
        DocumentRoot /var/www/mooctsp
        ErrorLog logs/mooctsp-error_log
        CustomLog logs/mooctsp-access_log combined
        # Moodle private data - must NOT be publically accessible
        <Directory /var/www/moodledata_mooctsp>
        Order deny,allow
        Deny from all
        </Directory>
        <Directory  /var/www/mooctsp/auth/shibboleth/index.php>
        AuthType shibboleth
        ShibRequireSession On
        require valid-user
        </Directory>
<Location />
ShibRequestSetting applicationId default
</Location>
</VirtualHost>

#mooc https
<VirtualHost 157.159.10.35:443>
        ServerName mooc.telecom-sudparis.eu
#        ServerAlias mooc.*
        DocumentRoot /var/www/mooctsp
        ErrorLog logs/ssl_mooctsp-error_log
        CustomLog logs/ssl_mooctsp-access_log combined
        LogLevel warn
        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
        SSLCertificateFile /etc/pki/tls/certs/cert-19020-mooc.telecom-sudparis.eu.pem
        SSLCertificateKeyFile /etc/pki/tls/private/mooc_telecom-sudparis_nop.key
        SSLCertificateChainFile /etc/pki/tls/certs/chain-19020-mooc.telecom-sudparis.eu.pem
        SSLCACertificateFile /etc/pki/tls/certs/add_trust_external_ca_root.pem
       <Directory /var/moodledata_mooctsp>
        Order deny,allow
        Deny from all
        </Directory>
        <Directory  /var/www/mooctsp/auth/shibboleth/index.php>
        AuthType shibboleth
        ShibRequireSession On
        require valid-user
        </Directory>

<Location />
ShibRequestSetting applicationId default
</Location>
</VirtualHost>
#ipv6 mooc
#<VirtualHost [2001:660:3203:100:1:0:80:35]:80>
....
# desctivation de cette version IPv6 pour l'instant ...

moodledata

l'espace de stockage de data de moodle

[root@mooc mooctsp]# mkdir /var/www/moodledata_mooctsp/
[root@mooc mooctsp]# chown -R apache /var/www/moodledata_mooctsp

installation web

Une fois le serveur apache parametré, on peux lancer l'installation interractive de moodle depuis l'interface web

http://mooc.telecom-sudpris.eu/admin/index.php

Plateforme de stress applicatif Tsung

Quand on met en ligne une application il est toujours intéréssant de pouvoir tester sa montée en charge. Une application fonctionnant très bien sous une faible charge peut s'avérer défaillante lors de la montée en charge. Pour cela nous allons utiliser tsung.

installation

au plus simple, tsung etant packagé !

yum install tsung

il s'installe avec toute une série de dépendance de packages “erlang-*” .

plateforme distribuée

Nous utiliserons plusieurs agents tsung, afin d'effectuer acces distribué sur 3 clients, le host principal (ici flow) et deux “slave” (wik.tem-tsp.eu et aude.tem-tsp.eu)

astuce de parametrage

pour que le coté distribué fonctione il faut plusieurs conditions, un bon fichier /etc/hosts, un bon partage de clés ssh, un bon hostname etc … cf

il faut aussi que le “master” tsung accept les packets des ces slave dans le firewall

[root@flow .tsung]# grep /32 /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -s 157.159.11.129/32 -m state --state NEW -m tcp -p tcp -j ACCEPT
-A RH-Firewall-1-INPUT -s 157.159.211.18/32 -m state --state NEW -m tcp -p tcp -j ACCEPT

test erl de base depuis le master flow vers le slave aude.tem-tsp.eu :

[root@flow .tsung]# erl -rsh ssh -sname foo -setcookie mycookie
Erlang R14B04 (erts-5.8.5) [source] [smp:32:24] [rq:32] [async-threads:0] [kernel-poll:false]

Eshell V5.8.5  (abort with ^G)
(foo@flow)1> slave:start(aude,bar,"-setcookie mycookie"). 
{ok,bar@aude}

senario moocZ

nous utilisons un clone de notre serveur mooc (moocZ) pour effectuer cette montée en charge

[root@flow .tsung]# cat tsung-moocZ-scenario3.xml
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">

    <!-- Configuration du client -->
    <clients>
            <client host="flow" use_controller_vm="false"/>
            <client host="wik" weight="1" maxusers="600" cpu="1"> 
        	<ip value="157.159.11.129"></ip>
            </client>
            <client host="aude" weight="1" maxusers="600" cpu="1"> 
        	<ip value="157.159.211.18"></ip>
            </client>
    </clients>

 
    <!-- Configuration du serveur -->
    <servers>
        <server host="moocZ.telecom-sudparis.eu" port="80" type="tcp"></server>
    </servers>
 
    <!-- phases d'arrivée, 3 paliers de 10 minutes où l'on augmente la fréquence d'arrivée de 1 puis 10 puis 30 visiteurs par seconde -->
    <load>
        <arrivalphase phase="1" duration="1" unit="minute">
            <users arrivalrate="1" unit="second"></users>
        </arrivalphase>
        <arrivalphase phase="2" duration="1" unit="minute">
            <users arrivalrate="5" unit="second"></users>
        </arrivalphase>
        <arrivalphase phase="3" duration="1" unit="minute">
            <users arrivalrate="10" unit="second"></users>
        </arrivalphase>
    </load>
 
    <!-- Les scénarios -->
    <sessions>
        <!-- Scénarios 1 avec 70% de probabilité, l'internaute charge successivement 3 pages -->
        <session name="scenario1" probability="70" type="ts_http">
		<request><http url='/index.php' version='1.1' method='GET'></http></request>
		<request><http url='/login/signup.php' version='1.1' method='GET'></http></request>
		<request><http url='/mod/page/view.php?id=110' version='1.1' method='GET'></http></request>
        </session>
        <!-- Scénarios 2 avec 30% de probabilité, l'internaute charge 5 fois la page 1 -->
        <session name="scenario2" probability="30" type="ts_http">
            <for from="1" to="5" var="i">
                <request><http url='/login/forgot_password.php' version='1.1' method='GET'></http></request>
            </for>
        </session>
    </sessions>
</tsung>