Drupal, Memcached and Solr on Windows Alessandro Pilotti @alexpilotti MVP ASP.NET / IIS MCSD, MCAD, MCSE, MCDBA, MCT Red Hat Certified Engineer
Why Memcached?  It’s a very popular object caching system  To speed up web sites by offloading work from the DBMS  Simple key / value store with cache invalidation  Low CPU usage  Half client / half server  Servers are unaware of each other (no sync)
Memcached on Windows  Memcached supports *nix daemon mode  Ports for Windows exist  Most binaries available on the web are old (1.2.x)  The official git repository contains a Windows compatible branch  git clone --branch engine-pu https://github.com/memcached/memcached.git  Currently version 1.6.0 beta  Older version 1.3.3 available here:  https://github.com/trondn/memcached.git  Building Memcached on Windows is not difficult:  http://trondn.blogspot.de/2010/03/building-memcached-windows.html  Build x64 version if you need more than 4GB of memory per instance  Prebuilt binaries:  http://www.cloudbasesolutions.com/downloads/memcached_x86_1_3_3.zip  http://www.cloudbasesolutions.com/downloads/memcached_x86_1_6_0_beta1.zip
Installing Memcached on Windows  The best way is to run it as a service  We can use e.g. Apache Procrun to wrap it  http://www.apache.org/dist/commons/daemon/binaries/windows /  For security reasons don’t use an account like Administrator or System to run it!  Open the required firewall port(s)  Default: 11211  Limit the client IP range as a best practice  If possible use SASL for authentication
Script 1/2  Create user:  net user memcached yourpassword /add  wmic path Win32_UserAccount where Name='memcached' set PasswordExpires=false  Set service rights  note: using free Windows 2003 Resource Kit  ntrights –u memcached +r SeServiceLogonRight  ntrights –u memcached +r SeBatchLogonRight
Script 2/2  Create Windows service using Apache Procrun prunsrv install memcached --Startup=auto --StartMode=exe --StartImage="c:memcachedmemcached.exe" ++StartParams=-p;11211;-m;256;-l;127.0.0.1 --ServiceUser=.memcached --ServicePassword=yourpassword  For remote host access  Remove “–l 127.0.0.1”  Open firewall port  netsh advfirewall firewall add rule name="memcached" dir=in action=allow protocol=TCP localport=11211  Start service  net start memcached
Memcached and PHP  It requires a PECL extension, two are available:  Memcache  Win32 binary: http://downloads.php.net/pierre/  Memcached  More advanced  Drupal works with both
Memcached protocol  Memcache can use an ascii (default) or binary protocol (faster)  Binary protocol supported from version 1.3  Memcache PECL extension:  PHP.INI  memcache.protocol = binary  Memcached PECL extension:  Drupal settings.php $conf['memcache_options'] = array( Memcached::OPT_BINARY_PROTOCOL => TRUE, );
Memcached and Drupal 7  drush @Drupal7 dl memcache  In “sitesallmodulesmemcachedmemcache.inc”:  comment //drupal_set_message(t('You must enable the PECL memcached or memcache extension to use memcache.inc.'), 'error');  drush @Drupal7 -y en memcache_admin  In settings.php  $conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc';  $conf['cache_default_class'] = 'MemCacheDrupal';  $conf['memcache_key_prefix'] = 'drupal7';  You can now setup separate bins and servers  Examples: http://drupal.org/node/1131468
Apache Solr  Open source search platform  Full text search  Optimized for high volume web traffic  Based on Apache Lucene  Download version 3.5.0 from:  http://www.apache.org/dyn/closer.cgi/lucene/solr
Solr, Windows and Drupal 7  Drupal  drush @Drupal7 dl apachesolr  Expand the content of “example” in “apache- solr-3.5.0.zip“ to e.g. c:Solr  Move c:SolrSolrConf folder to c:SolrConf  Replace solrconfig.xml and schema.xml and protwords.txt with copies from:  <drupal site>sitesallmodulesapachesolrsolr-conf  Version 3.x: solrconfig-solr3x.xml schema-solr3x.xml
Create Windows Solr user  net user solr yourpassword /add  wmic path Win32_UserAccount where Name='solr' set PasswordExpires=false  ntrights -u solr +r SeServiceLogonRight  ntrights -u solr +r SeBatchLogonRight  Set proper folder permissions  icacls c:solr /inheritance:d /grant solr:(OI)(CI)(F) /remove Users
Create Windows service  Download and install Java JRE 7  http://www.oracle.com/technetwork/java/javase/downloads/index.html  Using Apache Procrun x64:  prunsrv install solr --Startup=auto --StartMode=jvm ++JvmOptions=- Dsolr.solr.home=C:/solr/;-Djetty.home=C:/solr/;-Djetty.logs=C:/solr/logs/ - -ServiceUser=.solr –ServicePassword=yourpassword -- Classpath=C:/solr/lib/*.jar;C:/solr/start.jar -- StartClass=org.mortbay.start.Main  Start service  Net start solr  Open firewall port if remote access is required  netsh advfirewall firewall add rule name="solr" dir=in action=allow protocol=TCP localport=8983
Setup Drupal 7 Solr search  Enable solr search module:  drush @drupal7 en –y apachesolr_search  http://yourdrupalsite/admin/config/search/settings  Set Apache Solr Search as the only active search module  Set Apache Solr Search as the default search module  http://drupal7/admin/config/search/apachesolr/settings  Set your Solr url, e.g.: http://solrserver:8983/solr
Autocommit maxTime  Default settings is 120s  In Drupal, this means that after your data changes are received by Solr, your search results will not be updated for 2 minutes  To have a shorter delay (e.g. 20s) change maxTime in solrconfig.xml (in ms):  <maxTime>20000</maxTime>
Drupal cron  Drupal sends data to Solr for indexing using cron  This might provide big delays between data changes  Download elysia_cron module  drush @drupal7 dl elysia_cron  drush @drupal7 en elysia_cron –y  Set cron scheduling as:  Never / Use external crontab  Set apachesolr_cron settings to (e.g. every 2’)  */2 * * * *
“crontab” on Windows  Windows uses scheduled tasks instead of crontab  To create a scheduled task for Drupal elysia_cron to run e.g. every 2’:  schtasks.exe /create /tn drupal7_cron /tr "wget -O - -q -t 1 http://drupal7/sites/all/modules/elysia_cron/cron.php?cron_ke y=yourcronkey" /sc MINUTE /mo 2 /ru solr /rp  put wget.exe in the path  Get your cron key from:  http://yourdrupalsite/admin/config/system/cron/settings  To run the task once (troubleshooting, etc):  schtasks.exe /run /tn drupal7_cron  To delete the task:  schtasks.exe /delete /tn drupal7_cron
Drush integration  drush @drupal7 solr-search something  drush @drupal7 solr-index  drush @drupal7 solr-reindex  drush @drupal7 solr-delete-index

Drupal, Memcache and Solr on Windows

  • 1.
    Drupal, Memcached and Solron Windows Alessandro Pilotti @alexpilotti MVP ASP.NET / IIS MCSD, MCAD, MCSE, MCDBA, MCT Red Hat Certified Engineer
  • 2.
    Why Memcached?  It’sa very popular object caching system  To speed up web sites by offloading work from the DBMS  Simple key / value store with cache invalidation  Low CPU usage  Half client / half server  Servers are unaware of each other (no sync)
  • 3.
    Memcached on Windows  Memcached supports *nix daemon mode  Ports for Windows exist  Most binaries available on the web are old (1.2.x)  The official git repository contains a Windows compatible branch  git clone --branch engine-pu https://github.com/memcached/memcached.git  Currently version 1.6.0 beta  Older version 1.3.3 available here:  https://github.com/trondn/memcached.git  Building Memcached on Windows is not difficult:  http://trondn.blogspot.de/2010/03/building-memcached-windows.html  Build x64 version if you need more than 4GB of memory per instance  Prebuilt binaries:  http://www.cloudbasesolutions.com/downloads/memcached_x86_1_3_3.zip  http://www.cloudbasesolutions.com/downloads/memcached_x86_1_6_0_beta1.zip
  • 4.
    Installing Memcached on Windows  The best way is to run it as a service  We can use e.g. Apache Procrun to wrap it  http://www.apache.org/dist/commons/daemon/binaries/windows /  For security reasons don’t use an account like Administrator or System to run it!  Open the required firewall port(s)  Default: 11211  Limit the client IP range as a best practice  If possible use SASL for authentication
  • 5.
    Script 1/2  Createuser:  net user memcached yourpassword /add  wmic path Win32_UserAccount where Name='memcached' set PasswordExpires=false  Set service rights  note: using free Windows 2003 Resource Kit  ntrights –u memcached +r SeServiceLogonRight  ntrights –u memcached +r SeBatchLogonRight
  • 6.
    Script 2/2  CreateWindows service using Apache Procrun prunsrv install memcached --Startup=auto --StartMode=exe --StartImage="c:memcachedmemcached.exe" ++StartParams=-p;11211;-m;256;-l;127.0.0.1 --ServiceUser=.memcached --ServicePassword=yourpassword  For remote host access  Remove “–l 127.0.0.1”  Open firewall port  netsh advfirewall firewall add rule name="memcached" dir=in action=allow protocol=TCP localport=11211  Start service  net start memcached
  • 7.
    Memcached and PHP It requires a PECL extension, two are available:  Memcache  Win32 binary: http://downloads.php.net/pierre/  Memcached  More advanced  Drupal works with both
  • 8.
    Memcached protocol  Memcachecan use an ascii (default) or binary protocol (faster)  Binary protocol supported from version 1.3  Memcache PECL extension:  PHP.INI  memcache.protocol = binary  Memcached PECL extension:  Drupal settings.php $conf['memcache_options'] = array( Memcached::OPT_BINARY_PROTOCOL => TRUE, );
  • 9.
    Memcached and Drupal7  drush @Drupal7 dl memcache  In “sitesallmodulesmemcachedmemcache.inc”:  comment //drupal_set_message(t('You must enable the PECL memcached or memcache extension to use memcache.inc.'), 'error');  drush @Drupal7 -y en memcache_admin  In settings.php  $conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc';  $conf['cache_default_class'] = 'MemCacheDrupal';  $conf['memcache_key_prefix'] = 'drupal7';  You can now setup separate bins and servers  Examples: http://drupal.org/node/1131468
  • 10.
    Apache Solr  Opensource search platform  Full text search  Optimized for high volume web traffic  Based on Apache Lucene  Download version 3.5.0 from:  http://www.apache.org/dyn/closer.cgi/lucene/solr
  • 11.
    Solr, Windows andDrupal 7  Drupal  drush @Drupal7 dl apachesolr  Expand the content of “example” in “apache- solr-3.5.0.zip“ to e.g. c:Solr  Move c:SolrSolrConf folder to c:SolrConf  Replace solrconfig.xml and schema.xml and protwords.txt with copies from:  <drupal site>sitesallmodulesapachesolrsolr-conf  Version 3.x: solrconfig-solr3x.xml schema-solr3x.xml
  • 12.
    Create Windows Solruser  net user solr yourpassword /add  wmic path Win32_UserAccount where Name='solr' set PasswordExpires=false  ntrights -u solr +r SeServiceLogonRight  ntrights -u solr +r SeBatchLogonRight  Set proper folder permissions  icacls c:solr /inheritance:d /grant solr:(OI)(CI)(F) /remove Users
  • 13.
    Create Windows service Download and install Java JRE 7  http://www.oracle.com/technetwork/java/javase/downloads/index.html  Using Apache Procrun x64:  prunsrv install solr --Startup=auto --StartMode=jvm ++JvmOptions=- Dsolr.solr.home=C:/solr/;-Djetty.home=C:/solr/;-Djetty.logs=C:/solr/logs/ - -ServiceUser=.solr –ServicePassword=yourpassword -- Classpath=C:/solr/lib/*.jar;C:/solr/start.jar -- StartClass=org.mortbay.start.Main  Start service  Net start solr  Open firewall port if remote access is required  netsh advfirewall firewall add rule name="solr" dir=in action=allow protocol=TCP localport=8983
  • 14.
    Setup Drupal 7Solr search  Enable solr search module:  drush @drupal7 en –y apachesolr_search  http://yourdrupalsite/admin/config/search/settings  Set Apache Solr Search as the only active search module  Set Apache Solr Search as the default search module  http://drupal7/admin/config/search/apachesolr/settings  Set your Solr url, e.g.: http://solrserver:8983/solr
  • 15.
    Autocommit maxTime  Defaultsettings is 120s  In Drupal, this means that after your data changes are received by Solr, your search results will not be updated for 2 minutes  To have a shorter delay (e.g. 20s) change maxTime in solrconfig.xml (in ms):  <maxTime>20000</maxTime>
  • 16.
    Drupal cron  Drupalsends data to Solr for indexing using cron  This might provide big delays between data changes  Download elysia_cron module  drush @drupal7 dl elysia_cron  drush @drupal7 en elysia_cron –y  Set cron scheduling as:  Never / Use external crontab  Set apachesolr_cron settings to (e.g. every 2’)  */2 * * * *
  • 17.
    “crontab” on Windows Windows uses scheduled tasks instead of crontab  To create a scheduled task for Drupal elysia_cron to run e.g. every 2’:  schtasks.exe /create /tn drupal7_cron /tr "wget -O - -q -t 1 http://drupal7/sites/all/modules/elysia_cron/cron.php?cron_ke y=yourcronkey" /sc MINUTE /mo 2 /ru solr /rp  put wget.exe in the path  Get your cron key from:  http://yourdrupalsite/admin/config/system/cron/settings  To run the task once (troubleshooting, etc):  schtasks.exe /run /tn drupal7_cron  To delete the task:  schtasks.exe /delete /tn drupal7_cron
  • 18.
    Drush integration  drush@drupal7 solr-search something  drush @drupal7 solr-index  drush @drupal7 solr-reindex  drush @drupal7 solr-delete-index