专栏首页TensorbytesRTBkit 精准营销系统部署

RTBkit 精准营销系统部署

背景

项目地址: https://github.com/rtbkit/rtbkit/wiki/What-is-RTBkit%3F

RTBkit是一个开源软件包,通过将问题分解为明确定义的组件,可以完成创建实时广告投放的大部分困难的工程工作。其开放的、面向服务的架构可用于满足简单或者复杂的投放需求。RTBkit可以通过自定义配置文件或者开发接口的形式进行策略制定和扩展。

RTBkit架构

部署准备

操作系统:ubuntu:14.04.1

安装RTBkit:

apt-get -y update


apt-get install -y linux-tools-generic libbz2-dev python-dev scons unzip\
                       libtool liblzma-dev libblas-dev make automake \
                       ccache ant openjdk-7-jdk libcppunit-dev doxygen \
                       libcrypto++-dev libACE-dev gfortran liblapack-dev \
                       libevent-dev libssh2-1-dev libicu-dev libv8-dev \
                       g++ google-perftools libgoogle-perftools-dev \
                       zlib1g-dev git pkg-config valgrind autoconf \
                       libcurl4-openssl-dev cmake libsigc++-2.0-dev


mkdir -p $HOME/local/bin
PATH="$HOME/local/bin:$PATH"
 
mkdir -p $HOME/local/lib
export LD_LIBRARY_PATH="$HOME/local/lib:$LD_LIBRARY_PATH"
 
export PKG_CONFIG_PATH="$HOME/local/lib/pkgconfig/:$HOME/local/lib/pkg-config/"

source ~/.profile

env | grep PATH

git clone https://github.com/rtbkit/rtbkit-deps.git

cd rtbkit-deps

sed -i 's/git@github.com:/https:\/\/github.com\//g' .gitmodules

git submodule update --init

make all NODEJS_ENABLED=0

export PATH=/root/local/bin:$PATH

cd /

git clone https://github.com/rtbkit/rtbkit.git

cd rtbkit

cp jml-build/sample.local.mk local.mk

make compile NODEJS_ENABLED=0

export LD_LIBRARY_PATH='/root/local/share;/root/local/lib'

构建基于docker的服务

zookeeper集群服务

使用 docker-compose 来启动 ZK 集群,创建一个名为 docker-compose.yml 的文件:

version: '3'
services:
    zook1:
        image: zookeeper
        restart: always
        container_name: zk1
        networks:
            - rtbkit-network
        ports:
            - "2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888

    zook2:
        image: zookeeper
        restart: always
        container_name: zk2
        networks:
            - rtbkit-network
        ports:
            - "2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888

    zook3:
        image: zookeeper
        restart: always
        container_name: zk3
        networks:
            - rtbkit-network
        ports:
            - "2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
    
    redis:
        image: daocloud.io/library/redis:3.2.9
        restart: always
        container_name: redis02
        networks:
            - rtbkit-network
        ports:
            - "16379:6379"
        volumes:
            - "/home/dataspark/rtbcode/rtbkit/rtbkit/sample.redis.conf:/usr/local/etc/redis/redis.conf"
    
    Graphite:
        image: graphiteapp/graphite-statsd
        restart: always
        container_name: graphite_test
        networks:
            - rtbkit-network
        ports:
            - "6080:80"
            - "8003-8004:2003-2004"
            - "8023-8024:2023-2024"
            - "14125:8125/udp"
            - "14126:8126"
    
networks:
    rtbkit-network:
        driver: bridge

ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量, 其中 ZOO_MY_ID 表示 ZK 服务的 id, 它是1-255 之间的整数, 必须在集群中唯一. ZOO_SERVERS 是ZK 集群的主机列表.server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

运行docker compose: COMPOSE_PROJECT_NAME=rtbkit_cluster docker-compose -f rtbkit-compose.yml up -d

docker compose 会创建一个新的网桥rtbkit_cluster_default

修改sample.bootstrap.json文件中的zookeeper端口配置

"zookeeper-user":"localhost:2181"
改为
"zookeeper-user":"zk1:2181,zk2:2181,zk3:2181",

Graphite

docker run -d \ –name graphite \ –restart=always \ -p 5080:80 \ -p 7003-7004:2003-2004 \ -p 7023-7024:2023-2024 \ -p 13125:8125/udp \ -p 13126:8126 \ graphiteapp/graphite-statsd

修改sample.bootstrap.json文件中的carbon端口配置

"carbon-uri": ["carbon1.kittens.org:2003", "carbonA.kittens.org:2003"]
改为
"carbon-uri": ["graphite:2003"]

redis服务

docker run -p 6379:6379 -v /home/dataspark/rtbcode/rtbkit/rtbkit/sample.redis.conf:/usr/local/etc/redis/redis.conf –name redis01 -d daocloud.io/library/redis:3.2.9 redis-server /usr/local/etc/redis/redis.conf

修改rtbkit/sample.launch.json里面的’banker’ 将其参数”-B”, “rtbkit/sample.bootstrap.json”, “-r”, “localhost:6379” 改为 “redis02:6379”

启动主服务rtbkit

docker run -it –name rtbkit01 –link graphite:graphite –link redis01:redis -p 5212:22 rtbkit bash

./build/x86_64/bin/launcher –node localhost –script ./launch.sh –bin ./build/x86_64/bin –launch rtbkit/sample.launch.json

Banker模块的JSON API说明

GET /

类似于help命令,用法:curl http://localhost:9985/

GET /ping

检查Banker服务是否对HTTP有效,有效返回“pong”

GET /v1/accounts

获取用户账号信息,如果没有参数默认返回全部,后面参数可以跟maxDepthaccountPrefix。 maxDepth: an integer describing the maximum length at which keys will be sought (default: unlimited) accountPrefix: a string that specifies the prefix against which the returned account names will be matched

POST /v1/accounts

POST为创建用户。后面参数跟accountTypeaccountName

GET /v1/accounts/

返回指定用户的信息

POST,PUT /v1/accounts//balance

从父账号转换预算给子账号以平衡请求数量 参数为accountType,POST内容为”{ “USD/1M”: 金额 }” body: The body for that command must contain an amount encoded in a JSON Object. For example:: “{ “USD/1M”: 123456 }” (123456 micro USD)

parameters: accountType: If the account does not exist, this parameter defines the type of account to be created (“spend” or “budget”)

POST,PUT /v1/accounts//budget

通过请求为用户设置预算金额,只允许为顶级账户设置。 POST内容为 “{ “USD/1M”: 金额 }” ,表示加入XX美元。 用法:curl http://localhost:9985/v1/accounts/hello/budget -d ‘{ “USD/1M”: 123456789 }’

GET /v1/accounts//children

返回指定账户的子账号列表。参数为depth表示返回深度,默认为不限。(效果未知)

POST,PUT /v1/accounts//shadow

更新响应的支付账号的spend和commitment body: The body for that command must contain a representation of the shadow account in JSON.

GET /v1/accounts//subtree

返回指定账号和其子账号的属性表示。参数为depth表示返回深度,默认为不限。

GET /v1/accounts//close

关闭一个账号和其所有子账号。

GET /v1/accounts//summary

账号的汇总信息

GET /v1/summary

所有账号的汇总信息

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试前必须要知道的Redis面试题

    在前面学习我们都知道Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键...

    好好学java
  • Redis分片机制

    前两篇文章对Redis主从复制和主从切换的知识点进行了介绍,但是也很明显的有一点小弊端:

    逆月翎
  • Tair分布式缓存

    Redis很好用,相比memcached多了很多数据结构,支持持久化。但是在很长一段时间里,原生是不支持分布式的。后来就出现了很多redis集群类产品,...

    王炸
  • 数据是啥?数据都去哪儿了?

    大家应该都忙着给祖国庆生,根本无心上班,所以精心为各位打造一篇,一点都不用费脑的文章,一起聊聊数据及数据存储的那些事儿。敲黑板,讲重点,我们开始。

    一猿小讲
  • Redis集合类型

    今天我们了解一下Redis中的集合类型,也就是set集合。在Redis中set也是可以保存多个字符串的。那么set集合和list链表到底有什么不同呢?下面我们重...

    吉林乌拉
  • 基于设备指纹零感验证系统

    作者: 我是小三 博客: http://www.cnblogs.com/2014asm/ 由于时间和水平有限,本文会存在诸多不足,希望得到您的及时反馈与指正,多...

    我是小三
  • 想不到!面试官问我:Redis 内存满了怎么办?

    我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。

    芋道源码
  • 怎么实现单点登录?面试必问!

    单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同...

    Java技术栈
  • Redis哈希类型的使用场景

    在上一篇我们详细介绍了Redis哈希类型的使用命令及内部编码,那么在这一篇中,我们将了解了解Redis哈希类型的实际使用场景。大家都知道Redis最核心功能就是...

    吉林乌拉
  • SpringBoot系列教程之Redis集群环境配置

    之前介绍的几篇redis的博文都是基于单机的redis基础上进行演示说明的,然而在实际的生产环境中,使用redis集群的可能性应该是大于单机版的redis的,那...

    小灰灰

扫码关注云+社区

领取腾讯云代金券