RTBkit 精准营销系统部署

背景

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

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

RTBkit架构

部署准备

操作系统:ubuntu:14.04.1

安装RTBkit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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 的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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端口配置

1
2
3
"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端口配置

1
2
3
"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

所有账号的汇总信息

shikanon wechat
欢迎您扫一扫,订阅我滴↑↑↑的微信公众号!