piątek, 21 marca 2014

MongoDB + SSL + Elasticsearch + River


Standardowo MongoDB nie wspiera SSL-a, więc musimy go w kompilować. Dystrybucja Linuxa z jakiej korzystałem to Debian 7. To co się na pewno przyda to dokumentacja MongoDB, z której korzystałem http://docs.mongodb.org/manual/tutorial/configure-ssl/

1) Kompilacja mongo z SSL-em

apt-get install git-core build-essential scons libssl-dev
git clone git://github.com/mongodb/mongo.git
cd mongo
git tag -l
git checkout r2.4.9
scons --ssl --prefix=/opt/mongo install




Generowanie certyfikatów


cd /etc/ssl/
openssl req -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key

cat mongodb-cert.key mongodb-cert.crt > mongodb.pem


Zmieniamy konfigurację:


vim  /etc/mongodb.conf

replSet=rs0  # nawet jesli to ma byc samodzielna instancja
sslOnNormalPorts = true
sslPEMKeyFile = /etc/ssl/mongodb.pem  #ten, który wcześniej zrobiliśmy

Uruchamiamy Mongod

/opt/mongo/bin/mongod --config /etc/mongodb.conf


2) Elasticsearch - należy pamiętać aby pobrać odpowiedniego elasticsearch w raz z wersjami pluginów - np. dla  MongoDB 2.4.9 elasticsearch 1.0.0, river 2.0.0 i mapper 2.0.0.RC1

http://www.elasticsearch.org/ - pobieramy i instalujemy według manuala ze strony projektu
https://github.com/richardwilly98/elasticsearch-river-mongodb
https://github.com/elasticsearch/elasticsearch-mapper-attachments


cd /usr/share/elasticsearch/
./bin/plugin -install elasticsearch/elasticsearch-mapper-attachments/2.0.0.RC1
./bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/2.0.0
/etc/init.d/elasticsearch restart

rsconf='{
_id: "rs0",
members: [{_id: 0, host: "localhost:27017"}]
}'

/opt/mongo/bin/mongo --ssl --eval "rs.initiate( $rsconf )"
/opt/mongo/bin/mongo --ssl --eval 'rs.isMaster().ismaster'


Następnie

curl -s -XGET localhost:9200/_status

jeśli pusto to:

curl -XPUT "localhost:9200/_river/beta/_meta" -d '
{
  "type": "mongodb",
  "mongodb": {
    "servers": [
      { "host": "mongod_ip", "port": mongod_port }
    ],
    "options": { "secondary_read_preference": true },
"credentials": [
{ "db": "admin", "user": "user", "password": "haslo" }
],
    "db": "nazwa_bazy",
    "collection": "nazwa_kolekcji"
  },
  "index": {
    "name": "nazwa_indexu",
    "type": "typ_indexu"
  }
}'


Ważne, aby { "db": "admin", "user": "user", "password": "haslo" } użytkownik miał prawa do bazy admin. Jak się okazało było to  niezbędne do przeprowadzenia synchronizacji.


/opt/mongo/bin/mongo --ssl
use nazwa_bazy
db.nazwa_kolekcji.insert({pole_1: "cos1", pole2: new Date().toString()})

db.nazwa_kolekcji.insert({pole_1: "cos2", pole2: new Date().toString()})
exit


curl -XPOST http://localhost:9200/nazwa_indexu/typ_indexu/_search?pretty=true


Gdy dostaniemy wynik, to wiemy że wszystko działa :)


{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.6615001,
    "hits" : [ {
      "_index" : "nazwa_indexu",
      "_type" : "typ_indexu",
      "_id" : "5327018e15bd41df438e1d9d",
......
.nasze tajne dane.
......}
    } ]
  }
}