El proyecto se divide en varios servicios:
Cada servicio contiene 1 o más contenedores y se pueden escalar independientemente unos de otros.
Todas las imágenes de Docker están alojadas: https://hub.docker.com/u/openblockchaininfo/
Las siguientes instrucciones lo guiarán a través de la instalación de la aplicación openblockchain completa, incluidas todas las dependencias y requisitos del sistema, que le permitirán ejecutar openblockchain desde la mayoría de los sistemas base (Linux, OSX, Windows).
Las instrucciones comenzarán guiándote a través de la instalación de Ubuntu en VirtualBox.
Debido a los requisitos de potencia informática y espacio en disco, el almacenamiento y procesamiento de datos del proyecto se diseñó para ejecutarse en varias máquinas, preferiblemente en una nube con administración local desde una máquina host.
Las siguientes instrucciones lo guiarán a través de la configuración de su máquina host con Ubuntu y docker-engine, docker-machine y docker-compose.
Primero necesitas instalar VirtualBox siguiendo estas instrucciones
Luego deberá descargar Ubuntu 16.04.1 LTS - 64 bits siguiendo estas instrucciones
Necesita crear una nueva máquina virtual usando VirtualBox. La máquina virtual (en adelante denominada "la máquina host") se utilizará para implementar la aplicación. La máquina anfitriona requiere:
Cuando inicie la máquina host por primera vez, seleccione Ubuntu 16.04.1 LTS - 64 bits (que descargó en el paso anterior) como disco de inicio (es posible ejecutar el proyecto en otras versiones de Ubuntu e incluso en otras). sistemas operativos como Windows y OS X, pero aquí no se incluyen instrucciones para ellos).
La máquina host solo se utilizará para enviar comandos al clúster.
Las máquinas del cluster (donde se implementarán los servicios) requieren (cada una):
Una vez que haya configurado la máquina host (consulte la siguiente sección "Requisitos previos"), las instrucciones de "Configuración del clúster" lo guiarán a través de los pasos necesarios para crear 3 máquinas en Scaleway.
Estos deben instalarse únicamente en la máquina host. Asegúrese de que su máquina host tenga Ubuntu instalado (lo cual tendrá si ha seguido los pasos anteriores).
1. Instale el motor Docker
Docker Engine incluye el cliente Docker. docker
se utilizará para comunicarse con los demonios de Docker que se ejecutan en cada máquina del clúster.
Actualizar la información del paquete. Asegúrese de que APT funcione con el método https y que los certificados de CA estén instalados:
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
Agregue la clave GPG oficial y el repositorio APT:
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ sudo echo "deb https://apt.dockerproject.org/repo ubuntu-wily main" > /etc/apt/sources.list.d/docker.list
Actualice el índice del paquete APT e instale Docker:
$ sudo apt-get update
$ sudo apt-get install docker-engine
Inicie el demonio de Docker y verifique que esté instalado correctamente:
$ sudo service docker start
$ sudo docker run hello-world
Las instrucciones siempre actualizadas están disponibles en docker.com.
2. Instale la máquina Docker
docker-machine
se utiliza para aprovisionar máquinas para el clúster.
Descargue el binario Docker Machine 0.8 y extráigalo a su RUTA:
$ sudo curl -L https://github.com/docker/machine/releases/download/v0.8.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
$ sudo chmod +x /usr/local/bin/docker-machine
Verifique la instalación mostrando la versión de la Máquina:
$ docker-machine version
Las instrucciones siempre actualizadas están disponibles en docker.com.
3. Instale Docker Compose
Docker Compose se utiliza para gestionar los servicios.
$ sudo curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
Verifique la instalación mostrando la versión Compose:
$ docker-compose --version
Las instrucciones siempre actualizadas están disponibles en docker.com.
Ahora ha configurado su máquina host. Tienes:
Esto le permitirá administrar todos los microservicios que constituyen la aplicación openblockchain desde la máquina host.
Las siguientes instrucciones lo guiarán a través de la implementación del clúster en la nube mediante Scaleway. El clúster contendrá los siguientes servicios:
Los microservicios se administran a través de Docker-* en su máquina host.
1. Cree el servicio de descubrimiento.
Usando escala
Para utilizar Scaleway, primero deberá instalar el controlador Scaleway para Docker Machine:
$ wget https://github.com/scaleway/docker-machine-driver-scaleway/releases/download/v1.2.1/docker-machine-driver-scaleway_1.2.1_linux_amd64.tar.gz
$ tar -xvf docker-machine-driver-scaleway_1.2.1_linux_amd64.tar.gz
$ sudo cp docker-machine-driver-scaleway_1.2.1_linux_amd64/docker-machine-driver-scaleway /usr/local/bin/
$ sudo chmod +x /usr/local/bin/docker-machine-driver-scaleway
Cree una máquina para alojar un servicio de descubrimiento de Consul:
$ docker-machine create -d scaleway
--scaleway-commercial-type=C2S --scaleway-name=obc-consul
--scaleway-organization=<SCALEWAY-ACCESS-KEY> --scaleway-token=<SCALEWAY-SECRET-KEY>
obc-consul
Apunte su cliente Docker a la nueva máquina:
$ eval $(docker-machine env obc-consul)
Cree e inicie el servicio:
$ docker run --name consul --restart=always -p 8400:8400 -p 8500:8500
-p 53:53/udp -d progrium/consul -server -bootstrap-expect 1 -ui-dir /ui
2. Inicie Docker Swarm (clúster)
Usando escala
Puede aprovisionar las máquinas de Scaleway, que proporciona servidores asequibles de alta gama que son perfectos para este proyecto.
Obtenga sus credenciales de Scaleway (clave de acceso y clave secreta) desde esta página y luego implemente 3 máquinas:
$ docker-machine create -d scaleway
--scaleway-commercial-type=C2L --scaleway-name=obc
--scaleway-organization=<SCALEWAY-ACCESS-KEY> --scaleway-token=<SCALEWAY-SECRET-KEY>
--swarm --swarm-master
--swarm-discovery consul://`docker-machine ip obc-consul`:8500
--engine-opt cluster-store=consul://`docker-machine ip obc-consul`:8500
--engine-opt cluster-advertise=eth0:2376
obc
$ docker-machine create -d scaleway
--scaleway-commercial-type=C2L --scaleway-name=obc-01
--scaleway-organization=<SCALEWAY-ACCESS-KEY> --scaleway-token=<SCALEWAY-SECRET-KEY>
--swarm
--swarm-discovery consul://`docker-machine ip obc-consul`:8500
--engine-opt cluster-store=consul://`docker-machine ip obc-consul`:8500
--engine-opt cluster-advertise=eth0:2376
obc-01
$ docker-machine create -d scaleway
--scaleway-commercial-type=C2L --scaleway-name=obc-02
--scaleway-organization=<SCALEWAY-ACCESS-KEY> --scaleway-token=<SCALEWAY-SECRET-KEY>
--swarm
--swarm-discovery consul://`docker-machine ip obc-consul`:8500
--engine-opt cluster-store=consul://`docker-machine ip obc-consul`:8500
--engine-opt cluster-advertise=eth0:2376
obc-02
Por defecto las máquinas Scaleway tienen un disco de 50GB. Sin embargo, Scaleway también incluye un SSD de 250 GB, que debe montarse manualmente:
$ printf "obcnobc-01nobc-02" |
xargs -n 1 -I CONT_NAME docker-machine ssh CONT_NAME
"echo ; echo ; echo CONT_NAME ;"`
`"echo 'Formatting...' ;"`
`"yes | mkfs -t ext4 /dev/sda ;"`
`"echo 'Mounting...' ;"`
`"mkdir -p /openblockchain ;"`
`"mount /dev/sda /openblockchain ;"`
`"echo 'Adding to fstab...' ;"`
`"echo '/dev/sda /openblockchain auto defaults,nobootwait,errors=remount-ro 0 2' >> /etc/fstab ;"`
`"echo 'Done' ;"
Este almacenamiento adicional no será visible en la interfaz de usuario de su cuenta de Scaleway. Puede verificar manualmente que se haya montado el almacenamiento adicional (en este caso, verificando obc):
$ docker-machine ssh obc
$ cat /etc/fstab
$ ls -al /openblockchain
3. Verificar el enjambre
Apunte su entorno Docker a la máquina que ejecuta el maestro de enjambre:
$ eval $(docker-machine env --swarm obc)
Imprimir información del grupo:
$ docker info
También puede enumerar las IP que Consul ha "descubierto":
$ docker run --rm swarm list consul://`docker-machine ip obc-consul`:8500
1. Crea la red predeterminada
Cree una red superpuesta que permita a los contenedores "verse" entre sí sin importar en qué nodo se encuentren:
$ docker network create --driver overlay --subnet 10.0.9.0/24 obcnet
Enumere todas las redes; obcnet
debería mostrarse overlay
:
$ docker network ls
openblockchain ha sido diseñado con múltiples microservicios que están vinculados en el motor principal de Docker como submódulos de git.
El siguiente comando clona el proyecto y todos los gitmodules necesarios.
$ git clone --recursive https://github.com/open-blockchain/openblockchain.git
Una vez que haya clonado el repositorio, asegúrese de ingresar al directorio.
$ cd openblockchain
2. ¡Arriba!
Desde la carpeta raíz (que contiene docker-compose.yml
), ejecute:
$ docker-compose up -d --build
Docker implementará todos los servicios. De forma predeterminada, se iniciará:
3. Consulta los servicios
Mostrar todos los contenedores y su estado (todos deberían estar "Arriba"):
$ docker-compose ps
Muestre el estado del clúster de Cassandra (debería ver 3 nodos):
$ docker-compose exec cassandra-seed nodetool status
Mientras tanto, el servidor bitcoin ya debería haber escaneado unos cientos de bloques. Veámoslo funcionando en vivo:
$ docker-compose logs -f --tail 100 bitcoin
Deberías ver algo como esto, lo que significa que descargó todos los bloques del 0 al 187591 (en este ejemplo):
bitcoin_1 | 2016-08-25 15:03:16 UpdateTip: new best=00000000000006edbd5920f77c4aeced0b8d84e25bb5123547bc6125bffcc830 height=187589 log2_work=68.352088 tx=4696226 date=2012-07-05 03:45:13 progress=0.015804 cache=48.7MiB(122719tx)
bitcoin_1 | 2016-08-25 15:03:16 UpdateTip: new best=00000000000003f07c1227f986f4687d291af311a346f66247c504b332510931 height=187590 log2_work=68.352117 tx=4696509 date=2012-07-05 03:52:33 progress=0.015805 cache=48.7MiB(122815tx)
bitcoin_1 | 2016-08-25 15:03:16 UpdateTip: new best=00000000000002b34a755d25a5fee4c0ad0c018cf94f4b0afef6aabe823d304a height=187591 log2_work=68.352146 tx=4696593 date=2012-07-05 04:01:11 progress=0.015805 cache=48.7MiB(122839tx)
Ahora veamos los paneles de Spark, que deberían estar vacíos en este momento. Ejecute el siguiente comando para obtener la URL del panel de cada maestro y trabajador de Spark:
$ echo "master: "`docker-machine ip obc`":8080"
$ echo "worker 1: "`docker-machine ip obc-01`":8081"
$ echo "worker 2: "`docker-machine ip obc-02`":8081"
1. Escanea la cadena de bloques
Mostrar los registros de los escáneres:
$ docker-compose logs -f --tail 100 scanner-01
$ docker-compose logs -f --tail 100 scanner-02
Los escáneres se configuraron (en docker-compose.yml
) para que indexen un rango fijo de bloques. Sin embargo, al principio, cuando el nodo bitcoin aún no haya alcanzado el bloque 330.000, scanner-02
(que está configurado para escanear bloques de 330.000 a 400.000) no podrá escanear nada. Por lo tanto, esperará 10 minutos y luego volverá a intentarlo hasta que esos bloques estén disponibles.
2. Análisis de chispas
El servicio spark-submit
ejecuta varios scripts de Spark cada hora. Estos scripts generan visualizaciones (es decir, puntos de datos) que la API proporcionará al frontend. Puede ver su progreso mirando los registros:
$ docker-compose logs -f --tail 100 spark-submit
Ejecutemos un script personalizado que cuente todos los bloques y transacciones en Cassandra:
$ docker-compose exec spark-submit sbt submit-Counter
Cuando finalice el script, debería ver algo como esto (ignore los registros que comienzan con una marca de tiempo):
Blocks: 239699
Transactions: 18941698
3. Accede a la API
Busque el nombre de la máquina en la que se ejecuta el contenedor de API:
$ docker ps --filter "name=node-api" --format "{{.Names}}"
Esto generará algo como obc-02/api
, donde la parte antes de la barra diagonal es el nombre de la máquina.
Ahora obtenga la URL de la API y reemplace <machine-name-from-above>
en consecuencia:
$ echo "http://"`docker-machine ip <machine-name-from-above>`":10010"
4. Acceda a la interfaz de la aplicación web.
Busque el nombre de la máquina en la que se ejecuta el contenedor frontend:
$ docker ps --filter "name=frontend" --format "{{.Names}}"
Esto generará algo como obc-01/frontend
, donde la parte antes de la barra diagonal es el nombre de la máquina.
Ahora obtenga la URL de la interfaz, reemplazando <machine-name-from-above>
en consecuencia:
$ echo "http://"`docker-machine ip <machine-name-from-above>`":80"
5. Visualizaciones
Dependiendo de si el servicio spark-submit
tuvo tiempo de finalizar los scripts de Spark o no, es posible que vea visualizaciones en la interfaz, en http://<frontend-ip>:80/blocks
.
Si las visualizaciones aún no están disponibles, verifique el progreso del spark-submit
:
$ docker-compose logs -f --tail 100 spark-submit
Si está inactivo, reinicie el servicio ( docker-compose restart spark-submit
). De lo contrario, probablemente esté procesando datos de Cassandra. Deje que termine el trabajo y actualice la página (vete y prepárate una taza de té; en 60 minutos seguramente habrá hecho algunos números).
Copyright (C) 2016 Dan Hassan
Diseñado, desarrollado y mantenido por Dan Hassan [email protected]
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Dependencias del servicio API
https://github.com/scalatra/scalatra
Copyright (c) Alan Dipert [email protected]. Reservados todos los derechos.
Dependencias del servicio frontend
https://github.com/gaearon/react-redux-universal-hot-example
La licencia MIT (MIT), Copyright (c) 2015 Erik Rasmussen
dependencias de nodo-api
https://github.com/nodejs/node/blob/master/LICENCIA
Copyright de los contribuyentes de Node.js. Reservados todos los derechos.
dependencias del servicio openblockchain
https://github.com/docker/docker
Licencia Apache, versión 2.0, enero de 2004, http://www.apache.org/licenses/
Dependencias del servicio de escáner
https://github.com/outworkers/phantom
Copyright 2013-2016 Websudos, Limited. , Reservados todos los derechos.
Dependencias del servicio Spark
https://github.com/apache/spark
Licencia Apache, versión 2.0, enero de 2004, http://www.apache.org/licenses/