Search code examples
dockeraerospike

Multiple aerospike nodes on docker


I want to have multiple instances of an aerospike-server node so load balance because I hit the server with so many requests I get an error saying 'Error Code 22: Operation not allow at this time'.

I assume that having more aerospike-server nodes that i can lessen the load on one node and therefore complete more operations? I'm jsut not sure where to start with this.

I need these nodes all locally on one host. Any help would be great.

My network knowledge isn't great so forgive me for any

My DockerFile:

FROM aerospike/aerospike-server

MAINTAINER "xxxx"

ADD aerospike.conf /etc/aerospike/

docker-compose.yml

version: "3"

services:
   aerospike-server:
      image: amc
      container_name: aerospike-server
      ports:
      - "3000:3000"
      - "3001:3001"
      - "3002:3002"
      - "3003:3003"
   aerospike-amc:
      image: mrbar42/aerospike-amc
      container_name: aerospike-amc
      ports:
      - "8081:8081"

aerospike.conf network stanza

network {
    service {
        address any
        port 3000

        # Uncomment the following to set the `access-address` parameter to the
        # IP address of the Docker host. This will the allow the server to correctly
        # publish the address which applications and other nodes in the cluster to
        # use when addressing this node.
        # access-address <IPADDR>
    }

    heartbeat {

        # mesh is used for environments that do not support multicast
        mode mesh
        port 3002

        # use asinfo -v 'tip:host=<ADDR>;port=3002' to inform cluster of
        # other mesh nodes
        interval 150
        timeout 10
    }

    fabric {
        # address any
        port 3001
    }

    info {
        # address any
        port 3003
    }
}

Solution

  • You could use a multicast heartbeat configuration and get a small cluster of aerospike nodes running on a single machine.

    Here are the steps I used:

    1) Get the latest Dockerfile from the aerospike repo

    git clone https://github.com/aerospike/aerospike-server.docker.git

    2) Modify the heartbeat section and use multicast:

        heartbeat {
    
                mode multicast
                multicast-group 239.1.99.2
                port 9918
    
                interval 150
                timeout 10
        }
    

    3) Build image and cluster with either docker-compose or custom script.

    I used the following custom makecluster.sh bash shell script:

    cat makecluster.sh 
    docker build -t "aerospike/aerospike-server" .
    for i in {3..9} ; do
    echo $i;
    docker stop aerospike${i}
    docker rm aerospike${i}
    docker run -tid --name aerospike${i} -p ${i}000:3000 -p ${i}001:3001 -p ${i}002:3002 -p ${i}003:3003 aerospike/aerospike-server
    done;
    

    and run:

     ./makecluster.sh 
    Sending build context to Docker daemon  12.8 kB
    Step 1/10 : FROM ubuntu:xenial
     ---> 2fa927b5cdd3
    Step 2/10 : ENV AEROSPIKE_VERSION 3.12.1
     ---> Using cache
     ---> f9740fe0e5b5
    Step 3/10 : ENV AEROSPIKE_SHA256 16ceb0d131892c3caab31ee031f7e37d7a611c22686fec2692facde87ac69a00
     ---> Using cache
     ---> 5e7fbc820f7a
    Step 4/10 : RUN apt-get update -y   && apt-get install -y wget python python-argparse python-bcrypt python-openssl logrotate net-tools iproute2 iputils-ping   && wget "https://www.aerospike.com/artifacts/aerospike-server-community/${AEROSPIKE_VERSION}/aerospike-server-community-${AEROSPIKE_VERSION}-ubuntu16.04.tgz" -O aerospike-server.tgz   && echo "$AEROSPIKE_SHA256 *aerospike-server.tgz" | sha256sum -c -   && mkdir aerospike   && tar xzf aerospike-server.tgz --strip-components=1 -C aerospike   && dpkg -i aerospike/aerospike-server-*.deb   && dpkg -i aerospike/aerospike-tools-*.deb   && mkdir -p /var/log/aerospike/   && mkdir -p /var/run/aerospike/   && rm -rf aerospike-server.tgz aerospike /var/lib/apt/lists/*   && dpkg -r wget ca-certificates   && dpkg --purge wget ca-certificates   && apt-get purge -y
     ---> Using cache
     ---> a1d797e088fa
    Step 5/10 : COPY aerospike.conf /etc/aerospike/aerospike.conf
     ---> Using cache
     ---> 7bb9f5326c7b
    Step 6/10 : COPY entrypoint.sh /entrypoint.sh
     ---> Using cache
     ---> 345534f6c3b8
    Step 7/10 : VOLUME /opt/aerospike/data
     ---> Using cache
     ---> 3f07a5e4b113
    Step 8/10 : EXPOSE 3000 3001 3002 3003
     ---> Using cache
     ---> e081dff6a725
    Step 9/10 : ENTRYPOINT /entrypoint.sh
     ---> Using cache
     ---> 923ff0299e70
    Step 10/10 : CMD asd
     ---> Using cache
     ---> a05c71468897
    Successfully built a05c71468897
    3
    aerospike3
    aerospike3
    4d2df0569581c967d29750a5f7f6e67fc1835e1f6b78157eb5c8b11f843a222b
    4
    aerospike4
    aerospike4
    3173f06d9012996ce318855d982fbc20c5985beb7e356863a0075ce3ae337b21
    5
    aerospike5
    aerospike5
    10592f8ca508c678cd67695402f3c23ad417716772cf5a20de91c3e178bb1c28
    6
    aerospike6
    aerospike6
    7ddac9e31db5b618114c155b40d8ad524b629e96c514837a36854cf420a29d5c
    7
    aerospike7
    aerospike7
    6168421deffead460ac238b2a9817769e29d3c68eca33863cf9b0e19a8c09a0f
    8
    aerospike8
    aerospike8
    9d1761592c30b1460c064ef06f70067217e1b1c61f3efc2b016113b4869cfc6f
    9
    aerospike9
    aerospike9
    67c37f2f6ebae065eef978dcf4683b6ad5bd18bed0411e3d6681c723776c1834
    

    5) Verify cluster info :

    Use docker exec to run asadm tool

    docker exec -ti aerospike7 asadm
    Aerospike Interactive Shell, version 0.1.9
    
    Found 7 nodes
    Online:  172.17.0.2:3000, 172.17.0.8:3000, 172.17.0.3:3000, 172.17.0.4:3000, 172.17.0.7:3000, 172.17.0.6:3000, 172.17.0.5:3000
    
    Admin> 
    
    
    Admin> info
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Network Information~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 Node               Node                Ip      Build   Cluster            Cluster     Cluster         Principal   Rackaware   Client     Uptime   
                    .                 Id                 .          .      Size                Key   Integrity                 .        Mode    Conns          .   
    172.17.0.2:3000     BB9020011AC4202    172.17.0.2:3000   C-3.12.1         7   8DBD43898C508D41   True        BB9080011AC4202   none             7   00:06:03   
    172.17.0.3:3000     BB9030011AC4202    172.17.0.3:3000   C-3.12.1         7   8DBD43898C508D41   True        BB9080011AC4202   none             8   00:06:02   
    172.17.0.4:3000     BB9040011AC4202    172.17.0.4:3000   C-3.12.1         7   8DBD43898C508D41   True        BB9080011AC4202   none             8   00:06:00   
    172.17.0.5:3000     BB9050011AC4202    172.17.0.5:3000   C-3.12.1         7   8DBD43898C508D41   True        BB9080011AC4202   none             6   00:05:58   
    172.17.0.7:3000     BB9070011AC4202    172.17.0.7:3000   C-3.12.1         7   8DBD43898C508D41   True        BB9080011AC4202   none            10   00:05:55   
    172.17.0.8:3000     *BB9080011AC4202   172.17.0.8:3000   C-3.12.1         7   8DBD43898C508D41   True        BB9080011AC4202   none             6   00:05:52   
    6168421deffe:3000   BB9060011AC4202    172.17.0.6:3000   C-3.12.1         7   8DBD43898C508D41   True        BB9080011AC4202   none             8   00:05:56   
    Number of rows: 7
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Namespace Information~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Namespace                Node   Avail%   Evictions                 Master                Replica     Repl     Stop             Pending       Disk    Disk     HWM        Mem     Mem    HWM      Stop   
            .                   .        .           .   (Objects,Tombstones)   (Objects,Tombstones)   Factor   Writes            Migrates       Used   Used%   Disk%       Used   Used%   Mem%   Writes%   
            .                   .        .           .                      .                      .        .        .             (tx,rx)          .       .       .          .       .      .         .   
    test        172.17.0.2:3000     99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        172.17.0.3:3000     99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        172.17.0.4:3000     99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        172.17.0.5:3000     99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        172.17.0.7:3000     99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        172.17.0.8:3000     99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        6168421deffe:3000   99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test                                       0.000     (0.000  ,0.000  )      (0.000  ,0.000  )                        (0.000  ,0.000  )   0.000 B                    0.000 B                             
    Number of rows: 8
    

    Note: Tools like AMC or asadm , may not be able to see the full cluster if running outside of a docker container on the host machine. In such use case, you may need to try a docker host network and different listening ports in aerospike.conf or the alternative is to run AMC in a container.

    6) If using --network=host then you will need to modify the listening ports in aerospike.conf. Each instance running on the same host with same ip address should use a different port when using host network.

    Example:

    cat makecluster.sh 
    docker build -t "aerospike/aerospike-server" .
    for i in {6..9} ; do
    echo $i;
    docker stop aerospike${i}
    docker rm aerospike${i}
    docker run -tid --name aerospike${i} -v /root/docker/aerospike-server.docker/aerospike${i}:/etc/aerospike --network host -p ${i}000:${i}000 -p ${i}001:${i}001 -p ${i}002:${i}002 -p ${i}003:${i}003 aerospike/aerospike-server
    done;
    

    Sample config directory and file:

    cat aerospike7/aerospike.conf 
    # Aerospike database configuration file.
    
    # This stanza must come first.
    service {
        user root
        group root
        paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1.
        pidfile /var/run/aerospike/asd.pid
        service-threads 4
        transaction-queues 4
        transaction-threads-per-queue 4
        proto-fd-max 15000
    }
    
    logging {
    
        # Log file must be an absolute path.
        file /var/log/aerospike/aerospike.log {
            context any info
        }
    
        # Send log messages to stdout
        console {
            context any info 
        }
    }
    
    network {
        service {
            # Add interface name for network card used by host
            address br0 
            # Modify port to be used by your aerospike container
            port 7000
    
            # Uncomment the following to set the `access-address` parameter to the
            # IP address of the Docker host. This will the allow the server to correctly
            # publish the address which applications and other nodes in the cluster to
            # use when addressing this node.
            # access-address <IPADDR>
        }
    
        heartbeat {
    
    
                mode multicast
                multicast-group 239.1.99.2
                port 9918
    
    
            interval 150
            timeout 10
        }
    
        fabric {
            # Modify port to be used by your aerospike container
            port 7001
        }
    
        info {
            # Modify port to be used by your aerospike container
            port 7003
        }
    }
    
    namespace test {
        replication-factor 2
        memory-size 1G
        default-ttl 5d # 5 days, use 0 to never expire/evict.
    
        #   storage-engine memory
    
        # To use file storage backing, comment out the line above and use the
        # following lines instead.
        storage-engine device {
            file /opt/aerospike/data/test.dat
            filesize 4G
            data-in-memory true # Store data in memory in addition to file.
        }
    }
    

    asadm output:

    asadm -p 7000
    Aerospike Interactive Shell, version 0.1.9
    
    Found 4 nodes
    Online:  192.168.100.148:9000, 192.168.100.148:7000, 192.168.100.148:8000, 192.168.100.148:6000
    
    Admin> info
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Network Information~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                         Node                Node                     Ip      Build   Cluster            Cluster     Cluster          Principal   Rackaware   Client     Uptime   
                            .                  Id                      .          .      Size                Key   Integrity                  .        Mode    Conns          .   
    node.local:6000   177160DE04CA0568    192.168.120.148:6000   C-3.12.1         4   5009B1D835FA3C06   True        232960DE04CA0568   none             3   00:28:37   
    node.local:7000   1B5960DE04CA0568    192.168.120.148:7000   C-3.12.1         4   5009B1D835FA3C06   True        232960DE04CA0568   none             3   00:28:34   
    node.local:8000   1F4160DE04CA0568    192.168.120.148:8000   C-3.12.1         4   5009B1D835FA3C06   True        232960DE04CA0568   none             3   00:28:30   
    node.local:9000   *232960DE04CA0568   192.168.120.148:9000   C-3.12.1         4   5009B1D835FA3C06   True        232960DE04CA0568   none             4   00:28:25   
    Number of rows: 4
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Namespace Information~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Namespace                        Node   Avail%   Evictions                 Master                Replica     Repl     Stop             Pending       Disk    Disk     HWM        Mem     Mem    HWM      Stop   
            .                           .        .           .   (Objects,Tombstones)   (Objects,Tombstones)   Factor   Writes            Migrates       Used   Used%   Disk%       Used   Used%   Mem%   Writes%   
            .                           .        .           .                      .                      .        .        .             (tx,rx)          .       .       .          .       .      .         .   
    test        node.local:6000   99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        node.local:7000   99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        node.local:8000   99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test        node.local:9000   99         0.000     (0.000  ,0.000  )      (0.000  ,0.000  )      2        false    (0.000  ,0.000  )   0.000 B    0       50      0.000 B    0       60     90        
    test                                               0.000     (0.000  ,0.000  )      (0.000  ,0.000  )                        (0.000  ,0.000  )   0.000 B                    0.000 B