ArangoDB on Raspberry Pi: Database Power for Small Devices
During the ArangoDB Hackathon weekend, we tried to compile ArangoDB on a Raspberry PI using Raspbian as operating system.
ArangoDB needs some external libraries in order to compile
- libev
- ICU
- V8
- zlib
Libev, ICU and zlib compiled without problems. Raspbian comes with a precompiled version of V8 – but it’s too old for ArangoDB. So, we had to compile V8 ourself. A single make run takes hours and hours to complete. Using the default parameters it complains about wrong flags for the hard-float ABI. After some googling and endless hours of waiting for the compile to complete, we found a set of flags that finally worked.
- you need to pass the options -march=armv6 to the compiler and linker
- you need to disable CAN_USE_VFP3_INSTRUCTIONS
- use -O2 instead of -O3 (I’m not sure if this is necessary or not)
If you downloaded ArangoDB 1.3, use the following diff to patch the Google V8 Makesystem
index 3a59639..7bb9cab 100644 --- a/3rdParty/V8/build/common.gypi +++ b/3rdParty/V8/build/common.gypi @@ -146,6 +146,14 @@ 'CAN_USE_ARMV7_INSTRUCTIONS=1', ], }], + ['armv7==0', { + 'target_conditions': [ + ['_toolset=="target"', { + 'cflags': ['-march=armv6',], + 'ldflags': ['-march=armv6',], + }], + ], + }], [ 'v8_can_use_unaligned_accesses=="true"', { 'defines': [ 'CAN_USE_UNALIGNED_ACCESSES=1', @@ -167,7 +175,7 @@ [ 'v8_can_use_vfp3_instructions=="true" or arm_neon==1 or \ arm_fpu=="vfpv3" or arm_fpu=="vfpv3-d16"', { 'defines': [ - 'CAN_USE_VFP3_INSTRUCTIONS', + # 'CAN_USE_VFP3_INSTRUCTIONS', ], }], [ 'v8_use_arm_eabi_hardfloat=="true"', { @@ -414,13 +422,13 @@ ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd" \ or OS=="android"', { 'cflags!': [ - '-O2', + '-O3', '-Os', ], 'cflags': [ '-fdata-sections', '-ffunction-sections', - '-O3', + '-O2', ], 'conditions': [ [ 'gcc_version==44 and clang==0', {
Switch into the 3rdParty/V8 directory and execute
GYP_DEFINES="armv7=0" make library=static strictaliasing=off snapshot=off werror=no hardfp=on arm.release
This will produce the libraries and the shell example. Try the shell to verify that everything worked
pi@raspberrypi ~/ArangoDB/3rdParty/V8 $ ./out/arm.release/shell V8 version 3.16.14.1 [sample shell] >
The ArangoDB Makefile does not know about ARM, so we need to fake it. Go into the out
directory and execute
pi@raspberrypi ~/ArangoDB/3rdParty/V8 $ cd out pi@raspberrypi ~/ArangoDB/3rdParty/V8/out $ ln -s arm.release ia32.release
There is one open problem in some versions: atomic compare and swap. It is currently not used in the production code of 1.3 AFAIK, so I’ve commented it out. Here’s the patch to do this (UPDATE: if you are using latest 1.3, 1.4, or devel branches, there is no need to apply this patch).
https://gist.github.com/jsteemann/6403543.
Now we are ready to compile:
pi@raspberrypi ~/ArangoDB $ touch .v8-build-32 pi@raspberrypi ~/ArangoDB $ ./configure --enable-all-in-one-icu --enable-all-in-one-v8 CPPFLAGS="-DUSE_EABI_HARDFLOAT -march=armv6 -mfloat-abi=hard" pi@raspberrypi ~/ArangoDB $ make
This produced executables. Start the server
pi@raspberrypi ~/ArangoDB $ mkdir /tmp/testbase pi@raspberrypi ~/ArangoDB $ ./bin/arangod -c etc/relative/arangod.conf /tmp/testbase 2013-07-29T09:41:42Z [28103] INFO ArangoDB 1.3.1 -- ICU 49.1.2, V8 version 3.16.14.1, SSL engine OpenSSL 1.0.1e 11 Feb 2013 2013-07-29T09:41:42Z [28103] INFO using default language 'en' 2013-07-29T09:41:42Z [28103] INFO using endpoint 'tcp://localhost:8529' for http non-encrypted requests 2013-07-29T09:41:42Z [28103] INFO JavaScript using startup './js', modules './js/server/modules;./js/common/modules;./js/node', packages './js/npm', actions './js/actions', application './js/apps' 2013-07-29T09:41:53Z [28103] INFO Authentication is turned off 2013-07-29T09:41:54Z [28103] INFO ArangoDB (version 1.3.1) is ready for business. Have fun!
Next start the shell
pi@raspberrypi ~/ArangoDB $ ./bin/arangosh -c etc/relative/arangosh.conf Please specify a password: _ __ _ _ __ __ _ _ __ __ _ ___ ___| |__ / _` | '__/ _` | '_ \ / _` |/ _ \/ __| '_ \ | (_| | | | (_| | | | | (_| | (_) \__ \ | | | \__,_|_| \__,_|_| |_|\__, |\___/|___/_| |_| |___/ Welcome to arangosh 1.3.1. Copyright (c) triAGENS GmbH Using Google V8 3.16.14 JavaScript engine, READLINE 6.2, ICU 49.1.2 Connected to ArangoDB 'tcp://127.0.0.1:8529' version 1.3.1 ------------------------------------- Help ------------------------------------- Predefined objects: arango: ArangoConnection db: ArangoDatabase Example: > db._collections(); list all collections > db.<coll_name>.all().toArray(); list all documents > id = db.<coll_name>.save({ ... }); save a document > db.<coll_name>.remove(<_id>); delete a document > db.<coll_name>.document(<_id>); get a document > db.<coll_name>.replace(<_id>, {...}); overwrite a document > db.<coll_name>.update(<_id>, {...}); partially update a document > help show help pages > exit Note: collection names may be cached in arangosh. To refresh them, issue: > db._collections();
And enjoy! I’ve not done many tests, actually only one: save and restore documents. So, I’ve no idea how stable it is.
Get the latest tutorials, blog posts and news: