Commit dd3db540 authored by frank.chen's avatar frank.chen

代码文档

parent 09aa4720
/doc-code/.vscode
## 系统环境
centos 7
## 库
### librdkafka
其他主机上找即可,一般在~/app 文件夹。
### lzma
yum install xz-devel
### stdc++
yum install glibc-static libstdc++-static
\ No newline at end of file
## 概述
- 服务器地址 192.168.0.47 180.76.188.27
- 有多个程序在这台服务器上运行:数据拉取落盘,数据修正
- 大数据端有程序执行
## 用户安装卸载数据落盘
- 从 redis 拉取数据,然后写到本地文件。
- 数据来源: 由ssp nginx 上的 php 脚本接收并放入 redis。
### 程序说明
- http://git.dt-dtg5.com/t1/tools.git
- 程序原来在 /data/appstore-api/sync_appstore_userdata,后来代码整理到git,程序改到 /data/appstore-api/tools/installer_sync
- 程序编译的可执行文件为 sync
- 程序以crontab方式被执行,启动脚本在 `/etc/cron.d/sync-userdata`
- crontab 每分钟调用一次 sh 脚本 `/data/appstore-api/shell/sync_appstore_userdata.sh`
- sync_appstore_userdata.sh 会隔几秒启动一次 sync
## 数据修正
- `http://git.dt-dtg5.com/frank.chen/update_oaid.git`
- update_oaid
- 源码位置 /root/frank/update_oaid
- redis集群的用户信息,以前接收的oaid,是个base64值,后来变为原始值。所以中间有部分数据冲突。某些数据为base64值,某些为原始oaid。
- 这个程序,前面执行过,将数据修正,就行了。后面几乎不会再用到。
## 概述
* 服务器地址 192.168.0.47 180.76.188.27
* 有多个程序在这台服务器上运行:数据拉取落盘,数据修正
## 数据拉取
* http://git.DT-DTG5.com/t1/tools.git
* 用户app安装与卸载,拉取 redis 数据,然后写到本地文件。
* 数据由ssp nginx 上的php脚本接收并放入redis。
### 程序说明
* 程序原来在 /data/appstore-api/sync_appstore_userdata,后来代码整理到git,程序改到 /data/appstore-api/tools/installer_sync
* 程序编译的可执行文件为 sync
* 程序以crontab方式被执行,启动脚本在/etc/cron.d/sync-userdata
* crontab 每分钟调用一次 sh 脚本 /data/appstore-api/shell/sync_appstore_userdata.sh
* sync_appstore_userdata.sh 会隔几秒启动一次 sync
* 做的比较绕,不直观。
## 数据修正
* http://git.DT-DTG5.com/frank.chen/update_oaid.git
* 程序名 update_oaid
* 源码位置 /root/frank/update_oaid
* redis集群的用户信息,以前接收的oaid,是个base64值,后来变为原始值。所以中间有部分数据冲突。某些数据为base64值,某些为原始oaid。
* update_oaid 用于刷新数据。
\ No newline at end of file
...@@ -58,7 +58,7 @@ Minute Hour Day Month Week command ...@@ -58,7 +58,7 @@ Minute Hour Day Month Week command
### check_process_alive ### check_process_alive
`*/10 * * * * root cd /data/appstore/nginx-watch/ && python check_process_alive.py` `*/10 * * * * root cd /data/appstore/nginx-watch/ && python check_process_alive.py`
- 关键进程检查 - 关键进程检查 nginx, Thriftc, php-fpm
### monitor ### monitor
...@@ -73,16 +73,16 @@ Minute Hour Day Month Week command ...@@ -73,16 +73,16 @@ Minute Hour Day Month Week command
#1 17 * * * root cd /data/appstore/shell/monitor/ && python ClearLogs.py > /var/log/monitor.log 2>&1 #1 17 * * * root cd /data/appstore/shell/monitor/ && python ClearLogs.py > /var/log/monitor.log 2>&1
``` ```
- UserdataServiceMonitor 访问 http://storedatasync.ad-survey.com/healthy - UserdataServiceMonitor 访问 http://storedatasync.ad-survey.com/healthy
- AppStoreLogMonitor 监控 avro 日志 - AppStoreLogMonitor 监控 avro 日志,滞留太多会报警。
- ProcessAliveMonitor 关键进程检查,和 check_process_alive 完全重复。可去掉 - ProcessAliveMonitor 关键进程检查,和 check_process_alive 完全重复。
- DataMonitor 监测 /data/ 文件夹大小。 - DataMonitor 监测 /data/ 文件夹大小。
- DiskMonitor 磁盘容量监测 - DiskMonitor 磁盘容量监测
- ClearLogs 在 nginx-1 上,功能注释了,清除一些日志文件。 - ClearLogs 在 nginx-1 上,功能注释了,清除一些日志文件。
### nginx-watch ### nginx-watch
`*/10 * * * * root cd /data/appstore/nginx-watch/ && python run.py` `*/10 * * * * root cd /data/appstore/nginx-watch/ && python run.py`
- nginx 进程检查,和 check_process_alive 有重复,可考虑去掉。 - nginx 进程检查,和 check_process_alive 有重复,准备删掉。
### thrift_watch ### thrift_watch
`*/1 * * * * root /usr/local/bin/thrift_watch > /var/log/thrift_watch 2>&1` `*/1 * * * * root /usr/local/bin/thrift_watch > /var/log/thrift_watch 2>&1`
......
## 概述
- 原打算推掉 ssp-stg,业务迁移到 adx-stg。
- 后来因系统版本差异,迁移失败,ss-stg 服务器保留。
## 代码 ## 代码
- gcc4.8.5 编译检查更严格,删掉部分变量 - gcc4.8.5 编译检查更严格,删掉部分变量
- cppjson 一些用法修改。 - cppjson 一些用法修改。
......
## ADX Adsource
- 第一个字段是固定值:adx。
| 序号 | 字段 | 含义和例子 |
| ---- | -------------- | ----------------------------------- |
| 1 | adx_tag | 固定值 adx |
| 2 | logid | 一次广告匹配 |
| 3 | campaignid_id | 活动ID |
| 4 | strategyId | 策略ID |
| 5 | creativeId | 创意ID |
| 6 | posId | 广告位ID |
| 7 | price | DSP竞胜价格,即DSP应支付价格 |
| 8 | mediaId | 媒体ID |
| 9 | appId | 所投广告的appid,如 12573 |
| 10 | Timestamp | 生成adsource时的时间戳 1577176516 |
| 11 | chargeType | 广告结算类型,如4 |
| 12 | thresholdValue | 目前无值 |
| 13 | voucherFlag | 目前无值 |
| 14 | ctrClass | 目前无值 |
| 15 | dspId | 35 |
| 16 | dsp_sid | 我们的广告位关联到 dsp 那边广告位id |
### 更新日志
- 2023-10-25,增加 dsp_sid
## SSP Adsource
### 基础结构
| 序号 | 字段 | 含义 |
| ---- | ------------------ | -------------------------------------- |
| 1 | RefId | 对应匹配记录的id |
| 2 | Campaign_id | 订单ID |
| 3 | Strategy_id | 策略ID |
| 4 | Creative_id | 创意ID |
| 5 | Pos_id | 广告位ID |
| 6 | Deal_price | 成交价格 |
| 7 | Media_id | 媒体ID |
| 8 | App_id | appID |
| 9 | timestamp | 时间戳 |
| 10 | Charge_type | 结算类型 |
| 11 | day_budget | 活动日预算 |
| 12 | Voucher_flag | 虚拟币优先标志 |
| 13 | Ctr_class | Ctr来源 |
| 14 | User_id | 用户ID |
| 15 | advertiser_balance | 广告主余额 |
| 16 | data_ver | 下一个二进制字段(data)的版本号 |
| 17 | data | avro的二进制,经过base64编码后的字符串 |
### data 字段内容:
| 名称 | 类型 | 含义 |
| --------------- | ------ | ------------------------------------- |
| batchLogId | string | 一次广告请求的唯一ID,由鹏泰生成 |
| pkgname | string | 来自url参数pkgname |
| sourceAppID | string | 广告app包名 |
| ctrClass | int | 预测模型ID |
| sourceKeyWords | string | url里的关键字源串(最大存50个字符长度) |
| matchKeyWords | string | 匹配到的关键词 |
| userDeviceModel | string | 设备型号 |
| userIp | string | IP地址 |
| userDisplaySize | string | 屏幕分辨率 |
| appVer | string | url参数vc |
| userOs | string | url里的dos参数 |
| userNetwork | string | 网络连接方式 |
| page | string | 这里有点冗余,可通过广告位推出 |
## adx adsource
- 第一个字段是固定值:adx。
| 序号 | 字段 | 含义和例子 |
| --- | -------------- | -------------------------- |
| 1 | adx_tag | 固定值 adx |
| 2 | logid | 一次广告匹配 |
| 3 | campaignid_id | 活动ID |
| 4 | strategyId | 策略ID |
| 5 | creativeId | 创意ID |
| 6 | posId | 广告位ID |
| 7 | price | DSP竞胜价格 |
| 8 | mediaId | 媒体ID |
| 9 | appId | 所投广告的appid,如 12573 |
| 10 | Timestamp | 生成adsource时的时间戳 1577176516 |
| 11 | chargeType | 广告结算类型,如4 |
| 12 | thresholdValue | 目前无值 |
| 13 | voucherFlag | 目前无值 |
| 14 | ctrClass | 目前无值 |
| 15 | dspId | 35 |
| 16 | dsp_sid | 我们的广告位关联到 dsp 那边广告位id |
## 2023-10-25
- 增加 dsp_sid
## 数据说明
- `cptdsp$1.0.1$二进制avro打包数据`
- 将以上数据进行 base64 编码,就是 feed 的 adsource。
| 名称 | 类型 | 含义 |
| ------------------ | ------------ | ------------------------------ |
| req_id | string | 广告请求ID |
| match_id | string | 唯一标识一次匹配 |
| uid | string | 用户ID |
| st_id | long | 策略ID |
| cr_id | long | 创意ID |
| pos_id | long | 广告位ID |
| cat_id | string | 首次加入时,是给浏览器信息流使用,表示广告位属于哪个栏目ID |
| pay_price | long | 广告竞胜价,即广告主应支付给我们的价格 |
| media_id | int | 媒体ID |
| app_id | long | 广告 app id |
| timestamp | long | 广告匹配时的时间戳 |
| charge_type | int | 结算类型 |
| day_budget | long | 活动日预算 |
| advertiser_balance | long | 广告主余额 |
| ctr_class | int | ctr来源,预测 模型 id |
| ctr | double | 点击率 |
| cvr | double | 转化率 |
| ecpm | long | 排序时用到的ecpm |
| ocpx_stage | int | 处于 ocpx 第几阶段 |
| keywords | string array | 请求里的搜索关键词,数组 |
| ua | string | |
| dbrand | string | 品牌 |
| dmodel | string | 设备型号 |
| ip | string | |
| dis_width | int | 屏幕宽 |
| dis_height | int | 屏幕高 |
| vc | string | 媒体 app 版本号 |
| os | string | 操作系统名称 |
| conn | int | 网络连接方式 |
| oaid | string | |
| idfa | string | |
| caid | string | |
| android_id | string | |
| advertiser_id | long | 广告主id |
### 一些数值定义
```
ConnTypeUnknown ConnType = 0
ConnTypeEthernet ConnType = 1
ConnTypeWIFI ConnType = 2
ConnTypeCell ConnType = 3
ConnTypeCell2G ConnType = 4
ConnTypeCell3G ConnType = 5
ConnTypeCell4G ConnType = 6
ConnTypeCell5G ConnType = 7
```
## schema
```
{"type":"record",
"name":"cpt_ad_source",
"fields":[
{"name": "req_id", "type": "string"},
{"name": "match_id", "type": "string"},
{"name": "uid", "type": "string"},
{"name": "st_id", "type": "long"},
{"name": "cr_id", "type": "long"},
{"name": "pos_id", "type": "long"},
{"name": "cat_id", "type": "string"},
{"name": "pay_price", "type": "long"},
{"name": "media_id", "type": "int"},
{"name": "app_id", "type": "long"},
{"name": "timestamp", "type": "long"},
{"name": "charge_type", "type": "int"},
{"name": "day_budget", "type": "long"},
{"name": "advertiser_balance", "type": "long"},
{"name": "ctr_class", "type": "int"},
{"name": "ctr", "type": "double"},
{"name": "cvr", "type": "double"},
{"name": "ecpm", "type": "long"},
{"name": "ocpx_stage", "type": "int"},
{"name": "keywords", "type": {
"type": "array",
"items": "string"
}},
{"name": "ua", "type": "string"},
{"name": "dbrand", "type": "string"},
{"name": "dmodel", "type": "string"},
{"name": "ip", "type": "string"},
{"name": "dis_width", "type": "int"},
{"name": "dis_height", "type": "int"},
{"name": "vc", "type": "string"},
{"name": "os", "type": "string"},
{"name": "conn", "type": "int"},
{"name": "oaid", "type": "string"},
{"name": "idfa", "type": "string"},
{"name": "caid", "type": "string"},
{"name": "android_id", "type": "string"}
]}
```
\ No newline at end of file
## ssp adsource 基础结构
| 序号 | 字段 | 含义 |
| --- | ------------------ | ------------------------ |
| 1 | RefId | 对应匹配记录的id |
| 2 | Campaign_id | 订单ID |
| 3 | Strategy_id | 策略ID |
| 4 | Creative_id | 创意ID |
| 5 | Pos_id | 广告位ID |
| 6 | Deal_price | 成交价格 |
| 7 | Media_id | 媒体ID |
| 8 | App_id | appID |
| 9 | timestamp | 时间戳 |
| 10 | Charge_type | 结算类型 |
| 11 | day_budget | 活动日预算 |
| 12 | Voucher_flag | 虚拟币优先标志 |
| 13 | Ctr_class | Ctr来源 |
| 14 | User_id | 用户ID |
| 15 | advertiser_balance | 广告主余额 |
| 16 | data_ver | 下一个二进制字段(data)的版本号 |
| 17 | data | avro的二进制,经过base64编码后的字符串 |
### data 字段内容:
| 名称 | 类型 | 含义 |
| --------------- | ------ | ---------------------- |
| batchLogId | string | 一次广告请求的唯一ID,由鹏泰生成 |
| pkgname | string | 来自url参数pkgname |
| sourceAppID | string | 广告app包名 |
| ctrClass | int | 预测模型ID |
| sourceKeyWords | string | url里的关键字源串(最大存50个字符长度) |
| matchKeyWords | string | 匹配到的关键词 |
| userDeviceModel | string | 设备型号 |
| userIp | string | IP地址 |
| userDisplaySize | string | 屏幕分辨率 |
| appVer | string | url参数vc |
| userOs | string | url里的dos参数 |
| userNetwork | string | 网络连接方式 |
| page | string | 这里有点冗余,可通过广告位推出 |
## 代码表
| 助记符 | 代码 | 描述 |
| ----------------- | --------- | ----------------------------------------------- |
| NoRet | 1 | dsp 未返回 |
| AdItemFormat | 20 | dsp返回的广告,格式不对 |
| AdTypeNoSupport | 21 | 返回的广告类型,不支持投放 |
| BidFloor | 22 | 广告价格低于底价 |
| Creative | 23 | 创意素材匹配失败,无法生成adm |
| AppNotInCache | 24 | dsp返回的包,不在我们库里 |
| PriceSort | 25 | 相同包的广告,价格比其他低 |
| BlackListCre | 26 | 创意在黑名单里 |
| 进入引擎 | - | - |
| AdFull | 100 | 广告已满,来不及匹配,广告解析出来,若无问题,丢给竞价引擎,应该是该值 |
| Repeat | 101 | 已选中相同广告 |
| NotInPkgs | 102 | `ssp 暂无此过滤` 媒体提供了需要的包名白名单(参数pkgs),广告不在白名单则不投 |
| OneDspPriceDefeat | 103 | adx那边,当只有一家三方dsp时,对价格有特殊限制。ssp这里,多家dsp也做价格优化 |
| DownloadURL | 104 | 无法生成下载地址 |
| AdFilter | 105 | 这是个泛化的错误码,经过ROI排序,到达广告过滤时,被多种因素过滤掉,都会填这个码。后期再细化 |
| Dislike | 106 | 用户主动标识,对创意不感兴趣 |
| AdNum | 107 | 我们配置广告位限制了 dsp 的投放数 |
| DownloadTimes | 108 | 下载次数限制 |
| RTA | 109 | 被 RTA 机制干掉了 |
| INSTALL_1 | 110 | app 已安装,第一种判断逻辑 |
| INSTALL_2 | 111 | app 已安装,第二种判断逻辑 |
| INSTALL_3 | 112 | app 已安装,第二种判断逻辑 |
| KeywordBlack | 113 | app 设置了关键词黑名单 |
| KeywordWhite | 114 | app 设置了关键词白名单 |
| OSBit | 115 | app 32 位 或 64 位 不兼容。 |
| 2xx 主要是 ssp 这边的 | - | - |
| RollLoss | 201 | 根据活动设置的某个字段,进行摇骰子 |
| NoUserAgreement | 202 | 用户不同意 |
| KeywordFullMatch | 203 | 某些配置要求,关键词要完全匹配 |
| INDUSTRY | 204 | 行业限制 |
| 创意错误 | - | - |
| CreativeErr | 0x1000002 | 按创意过滤时,匹配失败 |
## 额外说明
### 创意级错误
```
基础值: 0x1000000
创意错误码:
#define NBR_CREATIVE_BASE 0x1000000
#define MATCH_CRE_TYPE 0x1 // 广告位限制了创意类型
#define MATCH_CRE_REPEAT_APP 0x2 // app 重复
#define MATCH_CRE_REPEAT_TEXT 0x4 // 文本类创意 重复
#define MATCH_CRE_GAME 0x8 // 游戏类型不匹配
```
- 若错误码特别大,请先转为16进制表示。
- 对于大于 0x1000000的错误码,则表示一个创意级错误。
- 按 ssp 那边活动配置,一个活动有多个创意,每个创意匹配失败后,错误码通过与操作(|)塞入 0x1000000 中。
- 但针对 dsp 的活动,只应该设置一个创意。所以这里最可能出现的是 0x1000002
\ No newline at end of file
## redis
- key `feed:ad_rule`
- 类型为字符串
## 概述
- 首先,最直观,可以分为两大块,ssp-nginx 和 adx-cn。
- ssp-nginx 是一个nginx二次开发,使用nginx模块开发。业务为面向三星流量。
- adx-cn 架构比较复杂,可以接收三方媒体流量,也能接第三方dsp。
- 除了以上两块外,还有些小工具,比如定时任务清理程序日志,整理广告数据。
- 代码使用git管理,有一些小工具没有放进git。
- 程序部署,采用fabric,是一个python工具。也未放入git。
\ No newline at end of file
## 模块
- 主体 nginx
- thriftc
- thrift_watch
- 整理 ctr
- ssp-notify
- 接收下载安装通知
## nginx
- 接口
```
/store/match
/store/impression
/store/action
/ss/match
/ss/impression
/ss/action
```
## thriftc
- 接收广告数据,存入共享内存
## thrift_watch
- 查看共享内存中的数据
## 整理 ctr
## 接收下载安装通知
## ssp-notify
\ No newline at end of file
{
"workbench.colorCustomizations": {
"window.activeBorder": "#6dad4fad",
"editor.lineHighlightBorder": "#95363671",
"editor.selectionBackground": "#1a2cce65",
"editor.selectionHighlightBackground": "#1c2ed478",
"activityBar.background": "#15276A",
"titleBar.activeBackground": "#1D3794",
"titleBar.activeForeground": "#FCFCFE"
}
}
\ No newline at end of file
## redis 地址
- prd
```
ADX_REDIS_ADDRESS ("redis.rubmzgfdnfoi.scs.bj.baidubce.com");
SSP_REDIS_ADDRESS ("redis.gvsdcennvpny.scs.bj.baidubce.com");
CLUSTER_REDIS_ADDRESS ("redis.iooiirmcjbap.scs.bj.baidubce.com");
CLUSTER2_REDIS_ADDRESS ("redis.pdghwriucukg.scs.bj.baidubce.com");
CLUSTER3_REDIS_ADDRESS ("redis.trgmrptmzmwg.scs.bj.baidubce.com");
CACHELOG_REDIS_ADDRESS ("redis.higzkyksnfkv.scs.bj.baidubce.com");
USER_APPS_REDIS_ADDRESS("redis.cxpputczptip.scs.bj.baidubce.com")
```
- stg
```
其他共用 redis.porqbbjumgcs.scs.bj.baidubce.com
USER_APPS_REDIS_ADDRESS("redis.cxpputczptip.scs.bj.baidubce.com")
```
## key
### ssp redis
- `adreq_monitor_[ip地址]`
- 写入
- 自己使用
- 记录单台服务器接收到的请求数
- SerFuncConf
- 写入
- 自己使用
- 记录服务器状态。
- ssp:sensitives
- 读取
- 搜索时,敏感词判断
- ssp:page_info
- 读取
- 获取广告位的page信息,经过查看代码,目前似乎不在使用。
- ssp:ctr:keywords
- 读取
- 由 IntimeStat python 脚本生成
- ssp:recomend:adpos_categories
- 读取
- 经过查看 redis 发现这里一直无值。
- baidu_pkgs iflytek_pkgs iqiyi_pkgs kuaishou_pkgs oppo_pkgs pangolin_pkgs ylh_pkgs
- 上面多个key
- 写入
- 缓存广告信息,当 dsp 的包不在我们库里时。由张旭那边读取
- ssp:dmp:flow_rule
- 读取
- 预测时的分流规则:头条,zzy 的占比
- media:tencent:business:key
- 读取
- 应用宝的 business key
- ssp:adpos_info
- 读取
- 广告位信息
- ssp:adpos_info_ex
- 读取
- 广告位信息,加强版。
- `PKG:APID_[pkg]`
- 读取
- 包拥有哪些 appid
- ssp:app:filter:installed
- 读取
- 是否需要过滤已安装
- rta_app
- 读取
- 需要执行 rta 的 app id
- ssp:search:appname:filter
- 读取
- 未被使用,作用未知。
- ssp:app_info
- 读取
- app 信息
- app_pkg_name
- 读取
- 包名获取应用名
- defeat_apps
- 读取
- 投放时,根据价格做优化。
- dsp:info
- 读取
- dsp 配置信息
- ssp:dsp:flow_rule
- 读取
- dsp 分流规则
- INTIME_STAT_ALL
- 读取
- 实时 ctr
- 由 IntimeStat python 脚本生成
- keyword:union
- 读取
- app 设置的关联关键词
- ssp:strategy_app_keywords_adpos
- 读取
- 广告位设置了关键字app白名单
- map_api_level_2_android_ver
- 读取
- app ver 对应的 安卓版本
- ssp:strategy:yingyongbao
- 读取
- 应用宝的活动
- ssp:strategy:ascribe
- 读取
- 需要归因的活动
- tt_competing_app
- 读取
- 头条广告的竞品 app
- rewards:user:apps
- 读取
- 星钻相关的已安装app
- dsp:return:ad
- 写入
- 当dsp有广告返回时,记录我们的媒体流量的url
- 个人自己使用
- pos:return:ad
- 写入
- 媒体请求某个广告位时,若返回了广告,则缓存最后的url
- 个人自己使用
- `pos:put:ad_[日期]`
- 例如:pos:put:ad_2024-7-1-16
- 写入
- 广告位匹配了多少次某个活动
- 个人自己使用
- `rta_[日期]`
- 例如:rta_2024-07-01_16_1
- 写入
- 统计rta次数
### adx redis
- `dsprecord_[时间]`
- key 例子:dsprecord_2024-07-01_16_3
- 写入
- 统计 dsp 返回广告。
### cachelog redis
- dsp:notify
- 写入
- dsp win loss 通知
- adx:dsp-log
- 写入
- dsp 匹配日志,由 adx-cron 拉取,并落盘。
- `nbr_ssp_[日期]`
- 例如:nbr_ssp_2024-6-6-10_20
- 写入
- 广告匹配的 nbr 信息
### userApps redis
- `userapps:[uid]`
- 读取
- 用户已安装app
### cluster redis
- `SSP:UID:OAID:[uid]`
- 写入
- 缓存 oaid,归因相关
### cluster2 redis
- `InTime_INST_APP_[uid]`
- 读取
- 用户已安装app
### cluster3 redis
- `cache_[reqid]`
- 写入,读取
- 缓存 dsp tracking url
## kafka
- kafka.bj.baidubce.com:9091
- topic: ea6464f767744f6496c1665102a6984c__user_behavior_ad
- 广告tracking数据
- prd 使用分区 0 ~ 29
- 开发阶段测试,使用分区 30
- stg 使用分区 31
## 通用
- stg redis: `redis-cnlf9hm5qs56dc7cz.redis.ivolces.com`
## 安装库
```
yum install -y bison byacc flex
```
### thrift
- 版本比 ssp nginx 上的新,为 0.12.0
- 使用旧版,ssp-core 不能编译通过
```
./configure --with-cpp --with-boost=/usr/local/include/boost --without-csharp --without-erlang --without-perl --without-php --without-php_extension --without-ruby --without-haskell --with-go --without-lua
编译提示 /libboost_unit_test_framework.a: No such file or directory,可跳过,此时thrift已编译完成,这里是测试不通过。
```
### cmake
```
下载最新的cmake源码
./bootstrap --prefix=/usr
make -j7
make install
```
### avro
拷贝源码安装
### glags
```
解压源码
make build && cd build
cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON -DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON ..
ldconfig
```
## appstore-thrift
- 需要使用 thrift 程序,生成 协议代码。
- jsoncpp 的头文件,原来在百度云上不标准,现在火山云是标准安装
- 需要改 appstore-thrift 的 CMakeLists.txt
- FMT_HEADER_ONLY 定义重复,保留 CMakeLists.txt的,去掉 CombineLogger.h 中的定义。
- 这个不管火山云还是百度云,都会出现编译警告。
- 编译安装后
- 增加配置,拷贝 Ipp文件。
- /data/appstore/cached/Ipp2.txt
- 可以从别的机器上拷贝。比如 nginx-test
### 加服务
- appstore-thrift.service
```
[Unit]
Description=Thriftc daemon
[Service]
LimitCORE=infinity
LimitNOFILE=102400
LimitNPROC=65535
Type=simple
WorkingDirectory=/data/appstore/appstore-thrift/
ExecStart=/data/appstore/appstore-thrift/bin/Thriftc -f conf/app.ini
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
```
- 加配置 `/data/appstore/appstore-thrift/conf/app.ini`
```
[log]
LOG_DIR = /data/appstore/appstore-thrift/logs
```
- Ipp文件
```
root 下执行
scp nginx-test:/data/appstore/cached/Ipp2.txt /data/appstore/cached/
cd /data/appstore/cached/
chown adx-user Ipp2.txt
chgrp adx-user Ipp2.txt
```
- 启动服务
sudo systemctl start appstore-thrift
systemctl enable appstore-thrift.service
## ssp-web
```
adx-user下
mkdir -p /data/adx/release/ssp-web && cd /data/adx/release/ssp-web
mkdir bin conf logs
```
- 编译 ssp-web,拷贝到刚创建的 bin 下
- 拷贝配置文件 app-stg.ini 到 conf 下执
- 修改 app-stg.ini 中的 redis 地址。redis-cnlf9hm5qs56dc7cz.redis.ivolces.com
- 服务文件 ssp-web.service
```
[Unit]
Description = Ssp-Web Service
[Service]
User=adx-user
Group=adx-user
LimitCORE=infinity
LimitNOFILE=102400
LimitNPROC=65535
Type=simple
WorkingDirectory=/data/adx/release/ssp-web
ExecStart=/data/adx/release/ssp-web/bin/ssp-web -conf conf/app-stg.ini
KillSignal=SIGINT
Restart=on-failure
StandardOutput=null
[Install]
WantedBy=multi-user.target
```
sudo systemctl start ssp-web.service
systemctl enable ssp-web.service
## ssp-core
- 服务文件 ssp-core.service
```
[Unit]
Description=ssp-core daemon
[Service]
User=adx-user
Group=adx-user
LimitCORE=infinity
LimitNOFILE=102400
LimitNPROC=65535
Type=simple
WorkingDirectory=/data/adx/release/ssp-core
ExecStart=/data/adx/release/ssp-core/bin/ssp-core -f conf/settings-stg.ini
Restart=always
RestartSec=1
StandardOutput=null
[Install]
WantedBy=multi-user.target
```
- 源码里包含 gen-cpp
- 拷贝可执行文件到安装路径
- 拷贝配置文件。
- 修改 redis 地址
sudo systemctl start ssp-core.service
sudo systemctl enable ssp-core.service
## ssp-notify
- 服务文件 vi ssp-notify.service
```
[Unit]
Description = ssp-notify Service
[Service]
LimitCORE=infinity
LimitNOFILE=102400
LimitNPROC=65535
User=adx-user
Group=adx-user
Type=simple
WorkingDirectory=/data/adx/release/ssp-notify
ExecStart=/data/adx/release/ssp-notify/bin/ssp-notify -conf conf/app-stg.ini
KillSignal=SIGINT
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
systemctl enable ssp-notify.service
```
cd /data/adx/release/
mkdir ssp-notify && cd ssp-notify && mkdir bin conf logs
```
- 编译代码,拷贝可执行文件,配置。
- 修改配置里的,redis 地址。
- 确保 ssp nginx 的代码已修改。
## cpt-bid
- 服务文件 vi cpt-bid.service
```
[Unit]
Description = cpt-bid Service
[Service]
User=adx-user
Group=adx-user
LimitCORE=infinity
LimitNOFILE=102400
LimitNPROC=65535
Type=simple
WorkingDirectory=/data/dsp/release/cpt-bid
ExecStart=/data/dsp/release/cpt-bid/bin/cpt-bid -conf conf/app-stg.ini
KillSignal=SIGINT
Restart=on-failure
StandardOutput=null
[Install]
WantedBy=multi-user.target
```
systemctl enable cpt-bid.service
## /var/spool/cron/root
```
# 这里只在 nginx-1 使用
*/5 * * * * cd /data/appstore/IntimeStat/ && python main.py > /data/log/IntimeStat.log 2>&1
*/5 * * * * cd /data/appstore/IntimeStat/ && python ctr-keywords.py > /data/log/ctrKeywords.log 2>&1
```
## /etc/cron.d/monitor
*/5 * * * * root cd /data/appstore/shell/monitor/ && python UserdataServiceMonitor.py >> /var/log/monitor.log 2>&1
*/5 * * * * root cd /data/appstore/shell/monitor/ && python AppStoreLogMonitor.py >> /var/log/monitor.log 2>&1
*/5 * * * * root cd /data/appstore/shell/monitor/ && python ProcessAliveMonitor.py >> /var/log/monitor.log 2>&1
*/5 * * * * root cd /data/appstore/shell/monitor/ && python DataMonitor.py >> /var/log/monitor.log 2>&1
*/5 * * * * root cd /data/appstore/shell/monitor/ && python DiskMonitor.py >> /var/log/monitor.log 2>&1
*/5 * * * * root cd /data/appstore/shell/monitor/ && python CheckFolderSize.py >> /var/log/monitor.log 2>&1
## /etc/cron.d/thrift_watch
*/1 * * * * root /usr/local/bin/thrift_watch > /var/log/thrift_watch 2>&1
## 概述
### nginx-1
- 设置 coredump 生成。待10台都部署好以后,再整理
```
nginx.conf 增加配置
worker_rlimit_core 2048m;
working_directory core_files;
```
- 数据盘处理
- /data/appstore/cached/ 下的文件
- i.gif
- Ipp2.txt
- 待部署完10台后,再开启 nginx-1 的 IntimeStat 定时任务。
- /etc/logrotate.d/intime 日志压缩
- 日志压缩
- 定时任务
- thrift_watch 待改造
- 里头有设置redis和读取redis
### 迁移导致 dsp url 数据错位处理
- 接收到通知时,与匹配时不在一个云上,导致 redis 找不到 dsp 通知 url
- 找不到时,把请求内容倒给另外的云
### 部署系统
- 装在 ssp stg 环境
- Fabric
```
从 百度云的 adx-stg 上找到安装文件 /home/adx-user/tmp/fabric-1.14.0.tar.gz
解压后,执行 python setup.py install
但执行 fab --version 时,提示出错了
执行如下两行
pip install --upgrade pip
pip install --upgrade setuptools
再次执行 fab --version 就没问题了
```
### dmp 失败率邮件
### zzy 地址变更
- ssp nginx
- cpt-bid
### clb
- cpt-bid
- adx-web 的配置要改为新的 clb 内网地址。(待稳定以后再改)
### 数据测试
- ssp nginx
- kafka
- cpt-bid
- kafka
- ssp-core
- avro
-ssp-notify
- kafka
- dmp 通知,dsp 通知
## 挂载数据盘
- root 下
```
fdisk -l
fdisk /dev/vdb
n
p
回车 回车 回车
w
partprobe && mkfs -t ext4 /dev/vdb1
创建 /data 并初步 mount
mount /dev/vdb1 /data && rm /data/lost+found/ -rf && ll /data
设置开机自动mount
blkid 命令
/dev/vdb1: UUID="17bd6c0f-da89-49a1-9e52-a2b0d6e4de22" TYPE="ext4"
修改/etc/fstab, 末尾加新行
UUID=17bd6c0f-da89-49a1-9e52-a2b0d6e4de22 /data ext4 defaults,errors=remount-ro 0 2
```
## 新文件夹和配置数据文件
- 在挂载/data数据盘成功后执行
```
cd /data && mkdir appstore log frank
cd appstore && mkdir appstorelog nginx product
mkdir -p /data/log/appstore-thrift
cd /data/appstore/appstorelog && mkdir action impre match
chown nobody action impre match && chgrp nobody action impre match
mkdir -p /data/appstore/product/appstore-nginx/ && mkdir -p /data/appstore/product/backup && mkdir /data/deploy
```
- nginx stg 的 /etc/hosts 下添加 IP
- nginx stg 下执行
- scp -r /data/appstore/cached/ nginx-3:/data/appstore/
## thriftc
cd ~/frank
git clone http://frank.chen:Qwer%401234@git.dt-dtg5.com/t1/appstore-thrift.git
cd appstore-thrift/src && git checkout frank2 && thrift --gen cpp synch_service.thrift
mkdir build && cd build
cmake .. && make -j7 && make install
- 配置 systemctl
cd /usr/lib/systemd/system
vi appstore-thrift.service
```
[Unit]
Description=Thriftc daemon
[Service]
LimitCORE=infinity
LimitNOFILE=102400
LimitNPROC=65535
Type=simple
User=root
WorkingDirectory=/data/log/appstore-thrift
ExecStart=/usr/local/bin/Thriftc
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
```
systemctl enable appstore-thrift.service
systemctl start appstore-thrift.service && xps Thriftc
## thrift_watch
- 使用 fabric 脚本来执行
## 定时任务
### nginx-1
由于要做镜像,所以没开启定时任务
## 基本
### 10台投放服务器
- ssp nginx
- Thriftc
- php
- IntimeStat 部署在 nginx-1 单条
### 3台cpt
- ssp-web ssp-core Thriftc
- cpt-bid cpt-tracking
### appstoreapi 服务器
- 安装卸载数据落盘
- 部署 action-report 待定
### adx-trace
- 部署 ssp-notify
### proxy
- 新买一台服务器
- 配置 nginx
- 超时统计脚本
## 额外
- IntimeStat 只部署 nginx-1,无需 stg
- dsp-notify 已有,待验证
- ops-notify 在 stg 阶段部署,需验证
\ No newline at end of file
## 购买硬件
- 原 stg 为 500G + 20G
- 新的可直接500G
- 包年包月,可用区A,自动续费
- 通用型g3i: 8 vCPU,32GB 内存,500GB SSD
- 公共镜像,CentOS 7.9,安全加固
- 公网 5mb
- 内网,使用 emr-vpc 下的子网 ad_a
## 配置
### bashrc
vi ~/.bashrc
增加内容:
```
alias ll='ls -lh'
alias gp='git pull'
alias gf='git fetch'
alias gs='git status'
alias gl='git log'
alias xps='ps o pid,lstart,rss,user,cmd -C'
alias prdadxredis='redis-cli -h redis-cnlflyo8lhn3noc6a.redis.ivolces.com --raw'
alias envcat='cat nginx_adsurvey_module/core/publish/env.h'
alias envim='vim nginx_adsurvey_module/core/publish/env.h'
```
### ssh
```
cd ~/.ssh
ssh-keygen -t rsa 然后一直回车
```
### 创建目录
```
root下
mkdir /data && cd /data && mkdir appstore log frank
cd appstore && mkdir appstorelog nginx product
mkdir -p /data/log/appstore-thrift
cd /data/appstore/appstorelog && mkdir action impre match
chown nobody action impre match && chgrp nobody action impre match
mkdir -p /data/appstore/product/appstore-nginx/ && mkdir -p /data/appstore/product/backup && mkdir /data/deploy
```
### yum 安装
```
yum -y update
yum -y install gcc-c++
yum -y install git redis tree
yum -y install pcre-devel cppunit-devel
yum -y install libcurl-devel libzip-devel bzip2-devel
yum -y install openssl openssl-devel
yum -y install glibc-static libstdc++-static
yum -y install autoconf automake libtool
yum -y install jsoncpp jsoncpp-devel
yum -y install snappy-devel
yum -y install libxml2-devel xz-devel
yum -y install bison byacc flex
```
### pip
- 获取pip安装源码,放到 /data/soft/get-pip.py
- 执行 python /data/soft/get-pip.py
### Fabric
- 使用源码安装
### hosts
```
180.76.51.115 git.dt-dtg5.com
```
### 手动安装开发库
- 某些库可通过 yum 安装
- boost
```
yum 安装的boost版本过低,为1.53,thrift要求至少1.54,原百度云上,安装的是1.55,所以手动安装。
./bootstrap.sh --with-libraries=all --with-toolset=gcc
./b2 -j7 toolset=gcc
./b2 install
```
- avro
- 百度云的 nginx-stg 下,/data/soft 里有源码。
- 可能有 liblzma 的报错,不用管。
- 将 /usr/local/lib 加入到 /etc/ld.so.conf 末尾,并执行 ldconfig
- protobuf
```
注意,现在gcc版本是4.8.5,版本过低,不支持太高的protobuf版本,暂时使用protobuf3.1.0
- 准备好源码,stg下,在/data/soft
- 注意把 gmock 文件夹拷贝进来,否则 autogen.sh 会卡住。
- ./autogen.sh # 生成 configure 文件
- ./configure
- make -j7
- make install
- ldconfig
```
- golang
```
下载:https://golang.google.cn/dl/go1.22.4.linux-amd64.tar.gz
解压,将解出来的go文件夹,移到 /use/local/ 路径下。
编辑 /etc/profile,增加内容:
PATH=/usr/local/go/bin:$PATH
export GOPROXY=https://goproxy.cn,direct
编辑 ~/.bash_profile,增加内容:
GOPATH=~/go
export GOPATH
PATH=$PATH:$HOME/bin:$GOPATH/bin
export PATH
安装 golint
git clone https://github.com/golang/lint.git
cd lint/golint/ && go install
```
- thrift
```
注意,依赖 boost
./bootstrap.sh
./configure --with-cpp --with-boost=/usr/include/boost --without-csharp --without-erlang --without-perl --without-php --without-php_extension --without-ruby --without-haskell --with-go --without-lua
make -j7 && make install
```
- librdkafka
```
拷贝源码,注意 lds-gen.py 和 configure 两个文件,需要 chmod u+x
./configure && make -j7 && make install
```
- hiredis
```
拷贝源码
make -j7 && make install
```
- libevent
```
thrift 需要用到
找到源码
./configure -prefix=/usr
make -j7 && make install
```
- glog
```
在原服务器上的头文件里,找不到glog版本,通过 /usr/local/lib64/cmake/glog/ 里的 cmake 文件,找到版本号。
版本 0.3.5
获取源码
./configure
可能需要运行 autoreconf -ivf
make -j7 && make install &&ldconfig
```
- cmake
```
下载最新的cmake源码
./bootstrap --prefix=/usr
make -j7
make install
```
- spdlog
```
huitoutiao的 Thriftc 需要
要求较新的cmake
cmake -DSPDLOG_BUILD_EXAMPLE=OFF .. 编译例子时出错,加参数不编译例子。
```
- php
```
这里没指定安装路径,导致配置文件路径怪异。
最好加上安装路径
./configure --enable-fpm --with-openssl --with-zlib --with-curl --enable-zip --prefix=/usr
make -j7 && make install
装完之后,需要配置 php-fpm 相关配置
/usr/local/etc/php-fpm.d/ 路径下,将 www.conf.default 复制,命名为 www.conf,并参考旧配置做适当修改
同理
/usr/local/etc/php-fpm.conf.default 也做类似操作。
```
- php 的库 laravel
```
下载 composer的安装脚本:https://getcomposer.org/installer
使用 php 执行:`php installer` 可能有点慢
mv composer.phar /usr/local/bin/composer
在 php 源码(/var/www/appstore-adsurvey)下执行:
composer install
composer update
composer install
php artisan key:generate
可能需要重启 php-fpm
```
### 编译 ssp
```
git clone http://frank.chen:Qwer%401234@git.dt-dtg5.com/t1/appstore-nginx.git
ssh configure.sh
make -j7
make install
cd /data/appstore/nginx
./sbin/nginx
chmod nobody logs
```
- 代码调整
```
ssp-notify 地址:NOTIFY_FORWARD_URL 的定义
redis 地址
代理服务器IP
kafka 地址
ZZY 的预测 IP
搜索一遍 getContext 查看都有哪些http请求。
```
- 允许 coredump
```
修改limits.conf文件
/etc/security/limits.conf
* soft core unlimited
* hard core unlimited
```
### 编译 Thriftc
```
git clone http://frank.chen:Qwer%401234@git.dt-dtg5.com/t1/appstore-thrift.git
以cmake方式编译,需要 make install
以nohup方式执行:
nohup Thriftc &
注意,先手动改代码里的 redis 地址。
```
### 定时任务
- 在 /var/spool/cron/ 下 的 root
```
/data/appstore/shell/nginxLogRotate.sh # 这里找不到 py 脚本,所以不用了
0 0 * * * sh /data/appstore/shell/cleanNginxHistory.py # 这里找不到 py 脚本,所以不用了
*/1 * * * * cd /data/appstore/IntimeStat/ && python main.py > /data/log/IntimeStat.log 2>&1
0 0 1,15 * * sh /data/appstore/nginx/restart.sh # 这里由于修复了内存泄漏,不需要定时重启了。
```
## 安全设置
- 访问redis 需要白名单
- 将新购服务器的内网ip地址,加入 白名单里的 广告投放组。
## stg-nginx 服务器
- 购买
- 环境准备
- 部署 Thriftc
- 部署 thrift_watch
- 部署 ssp nginx代码
- 部署 php
- 部署 定时任务
- 部署 Fabric
- 修改 hosts,ssh key
## proxy 服务器
- 购买服务器,也可能直接用原来的
- 检查 nginx 配置
- 部署 超时率 脚本
## adx-stg
- 部署 ssp-notify
- 部署 cpt-bid
- 部署 cpt-tracking
- 部署 ssp-web ssp-core Thriftc
- 部署 action-report
## 其他
- ops-notify 已部署到 log 服务器上
- dsp-notify 业务运行后,检查是否成功转发。
--------------------------------------------
## 详细
- 待zzy部署完,做测试
- adx-web 改配置
- 请求 25 50 51 的,url换内网ip+端口
- 加了新代理服务器
- 整理 nginx-stg 上的工具
- cpt-bid 修改配置,kafka地址、 zzy 地址
\ No newline at end of file
## 百度云上
192.168.16.201,
:9778/predict/recommend
:9777/predict/search
:9779/predict/cpc/display
:9777/predict/display
:9777/predict/related
:8081/predict/callback
ocpx的预测,
测试环境 http://192.168.48.19:9781/predict/cvr/ 云服务器
正式环境 http://192.168.0.23:9781/predict/cvr/ 负载均衡
麻烦再发一下 火山云的对应机器 ip
## 调整
百度云
ocpx负载均衡,192.168.0.23
包括的机器 192.168.48.20 192.168.16.48
普通预测负载均衡,192.168.16.201
包括的机器 192.168.16.49 192.168.48.20 192.168.16.50 192.168.16.48
火山云
ocpx负载均衡,192.168.2.12
包括的机器 192.168.30.6 192.168.30.40
普通预测负载均衡,192.168.2.13
包括的机器 192.168.30.42 192.168.30.6 192.168.30.44 192.168.30.40
## 云服务器映射
192.168.16.48 -> 192.168.30.40
192.168.16.49 -> 192.168.30.42
192.168.16.50 -> 192.168.30.44
192.168.48.19 -> 192.168.30.26
192.168.48.20 -> 192.168.30.6
## ab 压测
ab -n 10000 -c 10 '180.184.61.244/store/match?gps=116.3912x39.906&original=&keywords=&apps=&uid=Yjg0OWY1ZTgxYWY5OTc3MzQ0NzRlMjhkYmE0N2Y2MmMzMzIyOTQyZGY3MzM1N2I4NTljNjU5OTdkZmJhNjRiNA==&sid=161&lan=zh&ip=109.129.40.20&nt=WiFi&dis=1080x1920&db=Samsung&dt=SM-C9000&dos=33&force=0&oaid=9c7ba72d2f5ce06ac3fa46cd329cac2f957cb0552b505ead22a43e97e155fd58&timestamp=1618304922227&vc=4.5.26.2ua=TW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEzOyBTQU1TVU5HIFNNLUc5OTYwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYW1zdW5nQnJvd3Nlci8xOS4xIENocm9tZS8xMDIuMC41MDA1LjEyNSBNb2JpbGUgU2FmYXJpLzUzNy4zNg==&debug=1&imei=cchhxmeenn'
## 过度阶段
- galaxystore1.ad-survey.com 指向 clb-rs3jfmb47ls0v0x58gttljd
- storedatasync1.ad-survey.com 指向 clb-rs3jfmb47ls0v0x58gttljd
- dsptracking1.ad-survey.com 指向 clb-mimaqx6brs3k5smt1b8k09am
## huitoutiao
- 使用 cpt bid这个 clb,url为 http://192.168.2.11:8080
- 火山 clb-mimbdg412by85smt1a00vxd8 192.168.2.11
## stg ssp
- stg-storedatasync.ad-survey.com 数据接收
- storeservice.ad-survey.com 广告投放、通知
- 火山 clb-miv4v7fuhgxs5smt1adlu81b 180.184.61.41 192.168.2.3
- 百度 lb-cb8f6728 180.76.248.252 192.168.16.54
## prd ssp
- storedatasync.ad-survey.com 数据接收
- galaxystore.ad-survey.com 广告投放、通知
- 火山 clb-rs3jfmb47ls0v0x58gttljd 180.184.61.195 192.168.2.6
- 百度 lb-225a6701 180.76.179.251 192.168.16.57
## cpt bid
- 无域名
- 火山 clb-mimbdg412by85smt1a00vxd8 192.168.2.11
- 百度 lb-7541f622 114.111.24.69 192.168.0.11
## dsp tracking
- dsptracking.ad-survey.com
- 火山 clb-mimaqx6brs3k5smt1b8k09am 101.126.95.15 192.168.2.10 2406:d440:101:cf00:cd48:2913:6d06:b347
## stg dsp tracking
- stg-dsptracking.ad-survey.com
- 火山 clb-miw1h4ypv1fk5smt1b2ivsw5 101.126.30.241 192.168.20.45
## stg adx
- stg-adx.ad-survey.com
- 火山 clb-miybg7wmips05smt1azrh0vg 180.184.56.166 192.168.20.31
## stg adx tracking
- stg-adxtracking.ad-survey.com
- 火山 clb-rrh1lxtocsu8v0x58d8p4lk 180.184.56.165 192.168.20.32
## adx
- adx.ad-survey.com
- 火山 clb-rrjdiszkp2psv0x58yqhdgf 180.184.61.175 192.168.20.43 2406:d440:101:cf46:22cf:72ab:9cc2:31a0
## adx tracking
- adxtracking.ad-survey.com
- 火山 clb-mivcq7rk37r45smt1bih4h8o 180.184.61.24 192.168.20.42 2406:d440:101:cf46:dec7:2a7c:f3d2:e977
## 配置
### adx
- ssp clb 内网 ip
- prd 192.168.2.6
- stg 192.168.2.3
- hui clb 内网 ip
- cpt-bid 内网 ip
### ssp
- 生成的 tracking 域名
- ssp notify 转发
- prd 192.168.2.14
- stg 192.168.20.26 (adx-stg)
### hui
-
### cpt-bid
- 生成的 tracking 域名
## 概述
- 三星媒体端,将安装与卸载数据发送给我们。
- 我们使用 ssp nginx 上的 php 模块来接收媒体数据。
- 初次接到数据,会存入redis。
- appstoreapi服务器上,有个c++程序,读取 redis 数据,并落盘。
## 流程
- ssp nginx 通过域名 storedatasync.ad-survey.com 接收数据.
- 注意,这里stg配置有问题,估计无实际数据。
- 收到的数据,经过解析,存入 ssp redis,key: `appstore:user_data`
- appstore-api 服务器上的 sync 程序,从 redis 拉取数据,落盘,并更新另一台redis。
### 数据
- 媒体数据一条
```
storedatasync.ad-survey.com/userdata
{
"uid" : "OGY1OTE0MTFlYTU5OGJmZQ==",
"devicemodel" : "SM-G9910",
"applist" : [
{
"packagename" : "com.xiaoshuo.yueluread",
"timestmap" : "1719972025684",
"event" : "0"
}
],
"imei" : "d41d8cd98f00b204e9800998ecf8427e",
"oaid" : "OGY1OTE0MTFlYTU5OGJmZQ==",
"new_uid" : "OGY1OTE0MTFlYTU5OGJmZQ=="
}
```
- 落盘数据一条
```
d41d8cd98f00b204e9800998ecf8427e,OGY1OTE0MTFlYTU5OGJmZQ==,SM-G9910,com.xiaoshuo.yueluread|1719972025684|0;com.dj.sevenRead|1719972025684|0;bubei.tingshu|1719972025684|0;com.phoenix.read|1719972025684|0;com.kmxs.reader|1719972025684|0;com.jtxm.pipi.wallpaper|1719972025684|0;com.xs.fm|1719972025684|0;com.tencent.qqpimsecure|1719972025684|0;com.jerry.floatwindow|1719972025684|0;com.baidu.searchbox.lite|1719972025684|0;com.ss.android.homed|1719972025684|0;com.sec.android.easyMover|1719972025684|0;com.ushaqi.zhuishushenqi|1719972025684|0;tv.danmaku.bili|1719972025684|0;com.yhzygs.yesereadyh|1719972025684|0;com.dudu.compass|1719972025684|0,OGY1OTE0MTFlYTU5OGJmZQ==,OGY1OTE0MTFlYTU5OGJmZQ==
```
- 数据文件大小
```
-rw-r--r-- 1 root root 50M Aug 7 00:59 userinfo-00.txt
-rw-r--r-- 1 root root 49M Aug 7 01:59 userinfo-01.txt
-rw-r--r-- 1 root root 38M Aug 7 02:59 userinfo-02.txt
-rw-r--r-- 1 root root 49M Aug 7 03:59 userinfo-03.txt
-rw-r--r-- 1 root root 18M Aug 7 04:59 userinfo-04.txt
-rw-r--r-- 1 root root 18M Aug 7 05:59 userinfo-05.txt
-rw-r--r-- 1 root root 9.1M Aug 7 06:59 userinfo-06.txt
-rw-r--r-- 1 root root 19M Aug 7 07:59 userinfo-07.txt
-rw-r--r-- 1 root root 23M Aug 7 08:59 userinfo-08.txt
-rw-r--r-- 1 root root 33M Aug 7 09:59 userinfo-09.txt
-rw-r--r-- 1 root root 8.7M Aug 7 10:59 userinfo-10.txt
-rw-r--r-- 1 root root 10M Aug 7 11:59 userinfo-11.txt
-rw-r--r-- 1 root root 13M Aug 7 12:59 userinfo-12.txt
-rw-r--r-- 1 root root 16M Aug 7 13:59 userinfo-13.txt
-rw-r--r-- 1 root root 12M Aug 7 14:59 userinfo-14.txt
-rw-r--r-- 1 root root 5.2M Aug 7 15:59 userinfo-15.txt
-rw-r--r-- 1 root root 206K Aug 7 16:59 userinfo-16.txt
-rw-r--r-- 1 root root 120K Aug 7 17:59 userinfo-17.txt
-rw-r--r-- 1 root root 29K Aug 7 18:17 userinfo-18.txt
```
## php代码模块
- 源码文件夹拷贝到 /var/www
- 注意配置文件:/var/www/appstore-adsurvey/.env
- git 的代码, master 分支是 prd 配置, stg 需要改 `.env` 文件中的 redis 地址。
- 改完之后,需要执行 php artisan key:generate
- 之前代码未放入 git,之后放到我的个人空间,再之后,fork 到 ops 下。
- ops 路径下的代码:http://git.dt-dtg5.com/ops/appstore-adsurvey.git
## 概览
- ssp-nginx php thriftc
- ssp-notify
- ssp-web ssp-core thriftc
- intimestat
- cpt-bid cpt-trace
- action-report
- proxy status [dsp dmp]
### 被动牵涉
- adx-web
- 访问 ssp-nginx
- 访问 ssp-web
- 访问 cpt-bid
### 数据服务
- 各个 redis
- kafka
- mysql
## 概述
### ssp
- 10台
- nginx
- Thriftc, thrift_watch
- php
### kafka
- ssp nginx
- cpt-bid
### ssp nginx-1 单台
- IntimeStat
### huitoutiao
- 3台
- cpt-bid
- cpt-tracking
- ssp-web ssp-core Thriftc
### appstoreapi
- 安装卸载数据,落盘。
### proxy3
- 新买一台
- action-report 这个 火山prd已有,在 log 服务器
- ops-notify 部署到火山的 log
- dsp-notify 这个已在火山proxy-1
- dmp 超时率统计
- 头条 dmp 的统计,也使用新脚本,旧的计划废弃。
### adx-trace
- ssp-notify
- 2台
ssp-notify
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-miqnp0pxbcow5smt1b82nkyo&tab=server
dspbid
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-mimbdg412by85smt1a00vxd8&tab=info
dsptracking
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-mimaqx6brs3k5smt1b8k09am&tab=info
ssp prd
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-rs3jfmb47ls0v0x58gttljd&tab=info
stg-dsptracking
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-miw1h4ypv1fk5smt1b2ivsw5&tab=info
ssp stg
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-miv4v7fuhgxs5smt1adlu81b&tab=info
adx v6
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-rrjdiszkp2psv0x58yqhdgf&tab=info
adx v4
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-mji5584fzlz45smt1a374s19&tab=info
adx stg
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-miybg7wmips05smt1azrh0vg&tab=info
adx tracking v6
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-mivcq7rk37r45smt1bih4h8o&tab=info
adx tracking v4
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-rrv7u9mlvxmov0x57cjadq9&tab=info
adx tracking stg
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-rrh1lxtocsu8v0x58d8p4lk&tab=info
feed
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-rrxd7736a51cv0x58cuuo9n&tab=info
feed tracking
https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer/detail?id=clb-13f5xg4y9d7uo3n6nu4p18cxf&tab=info
upstream toutiao {
server rec-b.volcengineapi.com;
keepalive 10;
}
server {
listen 8001;
resolver 119.29.29.29 valid=600s;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/toutiao-access.log tt_debug;
location / {
proxy_redirect off;
proxy_pass http://toutiao;
proxy_set_header Host "rec-b.volcengineapi.com";
proxy_http_version 1.1;
proxy_set_header Connection "";
client_max_body_size 1m;
client_body_buffer_size 64k;
# proxy_connect_timeout 80ms;
proxy_read_timeout 120ms;
proxy_send_timeout 120ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
upstream zzy_9777 {
server 192.168.16.201:9777;
keepalive 300;
}
server {
listen 8002;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/toutiao-access.log main;
location / {
proxy_redirect off;
proxy_pass http://zzy_9777;
proxy_http_version 1.1;
proxy_set_header Host "192.168.16.201";
proxy_set_header Connection "";
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 80ms;
proxy_read_timeout 120ms;
proxy_send_timeout 120ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream zzy_9779 {
server 192.168.16.201:9779;
keepalive 300;
}
server {
listen 8004;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/toutiao-access.log main;
location / {
proxy_redirect off;
proxy_pass http://zzy_9779;
proxy_http_version 1.1;
proxy_set_header Host "192.168.16.201";
proxy_set_header Connection "";
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 80ms;
proxy_read_timeout 120ms;
proxy_send_timeout 120ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream samsung_dmp {
server rec.bigdata.samsung.com.cn:443;
keepalive 10;
}
server {
listen 8003;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/samsung-proxy-access.log main;
location / {
proxy_redirect off;
proxy_pass https://samsung_dmp;
proxy_set_header Host "rec.bigdata.samsung.com.cn";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 80ms;
proxy_read_timeout 120ms;
proxy_send_timeout 120ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream samsung_dmp_search {
server rec.bigdata.samsung.com.cn:8443;
keepalive 10;
}
server {
listen 8008;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/samsung-proxy-access.log main;
location / {
proxy_redirect off;
proxy_pass https://samsung_dmp_search;
proxy_set_header Host "rec.bigdata.samsung.com.cn";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 80ms;
proxy_read_timeout 120ms;
proxy_send_timeout 120ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream yingyongbao {
server maapi.3g.qq.com:8080;
keepalive 300;
}
server {
listen 8005;
server_name 192.168.20.10;
access_log /var/log/nginx/yyb-access.log main;
location / {
proxy_redirect off;
proxy_pass http://yingyongbao;
proxy_http_version 1.1;
proxy_set_header Host "maapi.3g.qq.com";
proxy_set_header Connection "";
client_max_body_size 1m;
client_body_buffer_size 128k;
proxy_connect_timeout 200ms;
proxy_read_timeout 300ms;
proxy_send_timeout 200ms;
proxy_buffering on;
proxy_buffers 128 128k;
proxy_temp_file_write_size 128k;
proxy_busy_buffers_size 256k;
}
}
upstream yyb_stg {
server devmaapi.3g.qq.com;
keepalive 10;
}
server {
listen 8006;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/yyb-stg.log main;
location / {
proxy_redirect off;
proxy_pass http://yyb_stg;
proxy_set_header Host "devmaapi.3g.qq.com";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 150ms;
proxy_read_timeout 300ms;
proxy_send_timeout 200ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream pangolin_ad {
server dsp.toutiao.com:443;
keepalive 100;
}
server {
listen 8007;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/pangolin-access.log main;
location / {
proxy_redirect off;
proxy_pass https://pangolin_ad;
proxy_set_header Host "dsp.toutiao.com";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 600ms;
proxy_read_timeout 600ms;
proxy_send_timeout 600ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream baidu_ad {
server ndsp.baidu.com;
keepalive 300;
}
server {
listen 8009;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/baidu-access.log main;
location / {
proxy_redirect off;
proxy_pass http://baidu_ad;
proxy_set_header Host "ndsp.baidu.com";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 600ms;
proxy_read_timeout 850ms;
proxy_send_timeout 600ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream baidu_ad_debug {
server debug.mobads.baidu.com;
keepalive 300;
}
server {
listen 18009;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/baidu-access-debug.log main;
location / {
proxy_redirect off;
proxy_pass http://baidu_ad_debug;
proxy_set_header Host "debug.mobads.baidu.com";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 600ms;
proxy_read_timeout 850ms;
proxy_send_timeout 600ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
upstream kuaishou_ad {
server open.e.kuaishou.com:443;
keepalive 100;
}
server {
listen 8010;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/kuaishou-access.log main;
location / {
proxy_redirect off;
proxy_pass https://kuaishou_ad;
proxy_set_header Host "open.e.kuaishou.com";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 128k;
proxy_connect_timeout 600ms;
proxy_read_timeout 800ms;
proxy_send_timeout 800ms;
proxy_buffers 128 128k;
proxy_temp_file_write_size 128k;
}
}
upstream oppo_ad {
server uapi.ads.heytapmobi.com:443;
keepalive 100;
}
server {
listen 8011;
server_name 192.168.20.10;
#charset koi8-r;
access_log /var/log/nginx/oppo-access.log main;
location / {
proxy_redirect off;
proxy_pass https://oppo_ad;
proxy_set_header Host "uapi.ads.heytapmobi.com";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 128k;
proxy_connect_timeout 600ms;
proxy_read_timeout 800ms;
proxy_send_timeout 800ms;
proxy_buffers 128 128k;
proxy_temp_file_write_size 128k;
}
}
upstream iflytek_ad {
server mt.voiceads.cn;
keepalive 300;
}
server {
listen 8012;
server_name 192.168.0.12;
#charset koi8-r;
access_log /var/log/nginx/iflytek-access.log main;
location / {
proxy_redirect off;
proxy_pass http://iflytek_ad;
proxy_set_header Host "mt.voiceads.cn";
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 1m;
client_body_buffer_size 64k;
proxy_connect_timeout 600ms;
proxy_read_timeout 600ms;
proxy_send_timeout 600ms;
proxy_buffers 128 64k;
proxy_temp_file_write_size 64k;
}
}
180.76.51.115 git.DT-DTG5.com
192.168.20.3 adx-1
192.168.20.25 adx-2
192.168.20.27 adx-3
192.168.20.28 trace-1
192.168.20.29 trace-2
192.168.20.10 proxy-1
192.168.20.24 proxy-2
192.168.20.5 log
\ No newline at end of file
## adx-web
* adx1.ad-survey.com
* 部署到 adx
* TODO crontab
* 模拟请求,dsp成功返回:oppo通过
## adx-cron
* 部署到 log
* 配置 conf
* 验证 ssp db 和 adx_db 是否 成功获取数据,并存入redis,adx-core 才需要这部分数据,这里不用考虑。
## adx-trace
* adxtracking1.ad-survey.com
* 部署到 adx
* 测试 trace
* kafka,根据代码来看,不需要kafka
## dsp-notify
* 部署到 proxy
* 验证,查看日志,是否存在发送
## nginx proxy
* NOTE 让 dsp 添加 ip 白名单,整理文档,有哪些dsp需要白名单
* NOTE 超时监控,待数据量大之后再上。
## redis
* NOTE 集群开启了 keys 命令,待过了调试阶段,要关掉。
* 验证 pega cluster 是否有 dsp trace url
## 变更
adx-blb 原来 101.126.32.90 变更为 180.184.56.130 adx1.ad-survey.com
adx-trace-blb 原来 101.126.33.134 变更为 180.184.56.131 adx1tracking.ad-survey.com
proxy 原来 101.126.45.126 变更为 180.184.56.132
adx 原来 101.126.42.254 变更为 180.184.56.133
## 调试
```
101.126.42.254:8080/api/v0?slot=1100&debug=7998444
{"app":{"bundle":"LockScreen"},"device":{"connectiontype":3,"devicetype":1,"ext":{"csc":"CHC","db":"samsung","imei":"","mcc":"460","mnc":"11","oaid":"d544470c20c96d389e74a1992015246262f69caa32c09872680bafdaba1e1383","orient":0,"sdkVerAndroid":"33"},"h":2316,"ifa":"d4f2dd753e377d96","ip":"","ipv6":"","ip":"210.46.222.81","make":"samsung","model":"SM-S9180","os":"Android","osv":"13","ppi":450,"ua":"Mozilla/5.0 (Linux; Android 13; SM-S9180 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36","w":1080},"id":"6391e273-36fe-44b9-bd12-01c05994a4d5","imp":[{"bidfloor" : 0.1,"ext":{"rec":0,"searchWords":["dou"]},"id":"c467042a-eb00-4ce5-ab0f-61b318cd3d5e","native":{"request":"{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"img\":{\"h\":504,\"type\":3,\"w\":1440},\"required\":1}]}"}}],"user":{"id":"d544470c20c96d389e74a1992015246262f69caa32c09872680bafdaba1e1383"}}
带 download_refetch
180.184.56.130/api/v0?slot=415&debug=7998444
180.184.56.133:8080/api/v0?slot=415&debug=7998444
adx1.ad-survey.com/api/v0?slot=415&debug=7998444
{
"app":{"bundle":"zhiliangunion"},"device":{"connectiontype":1,"devicetype":4,"ext":{"csc":"CHC","db":"samsung","imei":"YWRhc2RmYUhLRklFV0ZIRUlXUkZFV1JSVw==","mcc":"460","mnc":"01","oaid":"1e3a2f9a859741379e81eb5833c55333c4ba27a4f73e4d2eafca4858d00f84ab","sdkVerAndroid":"22"},"ifa":"d4f2dd753e377d96","ip":"14.142.149.66","ipv6":"2001:0db8:85a3:0000:0000:8a2e:0370:7334","make":"samsung","model":"S8","os":"Android","osv":"6.0","ua":"Mozilla/5.0 (Linux; Android 9; SAMSUNG SM-G9650 Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/9.4 Chrome/67.0.3396.87 Mobile Safari/537.36"},"id":"f3a9e81b-01b6-4b52-88ad-34ccf7d0b1e4","imp":[{"ext":{"pkgs":"com.wuba,com.ss.android.article.lite,com.duowan.mobile,com.ss.android.article.news,com.wuba.bangjob,com.baidu.searchbox,com.youdian.twzw.samsung,com.baidu.searchbox.lite,com.anjuke.android.app,com.dragon.read,com.smile.gifmaker,com.ss.android.homed,com.sup.android.superb,com.gf.client,com.duxiaoman.wallet,com.youxiang.soyoungapp","searchWords":[]},"id":"371ecea9-40c8-4133-b976-7588e4671d0c","native":{"request":"{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"w\":256,\"h\":256}}]}"}}]
}
```
\ No newline at end of file
## 火山云 redis 信息
redis-cnlflyo8lhn3noc6a.redis.ivolces.com 广告素材 ad_matter
redis-cnlfuuvu9nglr1sez.redis.ivolces.com 日志缓存 catch_log
redis-cnlfqzc1kxdcesrmz.redis.ivolces.com 集群 redis_cluster
## adx
### RedisClust
- hsy 用 redis_cluster 接替
Alliance_[uid] 缓存设备信息
### RedisClust3 RedisClust4
未使用,可删除代码
### RedisPega
alliance_cache_[logid] 缓存 dsp 的 trace url
dsp:notify dsp的赢价通知
### RedisCacheLog
setting.DownloadAddrLogKey 缓存广告日志
setting.RequestLogKey
setting.MatchLogKey
### RedisCountLog
dsp:return:ad dsp 有返回时的媒体请求body
dsprecord_[时间] 统计 dsp 请求次数
adreq_monitor_adx_[时间] 统计广告位请求次数
### adx redis
ssp:creative
adx:alliance_mapping
ssp:apk:durl
setting.NoticeCbKey
halomobi_adlist
fallback_source
ssp:dsp:flow_rule
ssp:dmd5 废弃
dsprecord_**** [dsp 访问记录, 下划线后是日期]
adreq_monitor_adx_**** [广告位请求次数记录] 将废弃
### ssp redis
media:tencent:business:key
ssp:creative:base
ssp:adpos_info
ssp:adpos_info_ex
ssp:app_info
ssp:app_info_ex
dsp:info
baidu_pkgs
iflytek_pkgs
iqiyi_pkgs
kuaishou_pkgs
oppo_pkgs
pangolin_pkgs
## ssp
### ssp redis
pos:put: 记录广告投放活动次数
pos:return:ad 记录有返回的请求信息
adreq_monitor_ 记录广告请求次数
ssp:ctr:keywords
ssp:recomend:adpos_categories
ssp:dmp:flow_rule
ssp:sensitives
ssp:page_info
ssp:app_info
media:tencent:business:key
ssp:adpos_info
PKG:APID_*
ssp:app:filter:installed
ssp:search:appname:filter
app_pkg_name
defeat_apps
dsp:info
INTIME_STAT_ALL
keyword:union
ssp:strategy_app_keywords_adpos
map_api_level_2_android_ver
ssp:strategy:yingyongbao
tt_competing_app
rewards:user:apps
baidu_pkgs
iflytek_pkgs
iqiyi_pkgs
kuaishou_pkgs
oppo_pkgs
pangolin_pkgs
### adx redis
ssp:action:event 写入
## 概述
- 火山云最初构建 ssp-nginx 服务器时,用了 系统盘 + 数据盘 的模式,做镜像只能做系统盘的。
- 原先的多硬盘模式,在新购机器时,若使用镜像初始化,则后续数据盘有很多工作要做。
- 考虑到数据没太多变化,所以改变为一个盘,以后新购机器,则用单盘模式,比之前要方便。
## 购机信息
- 服务器所在区,和之前一样
- 8核 | 32GB | 500GB SSD | eip 5M
- 安全组: Default、ad-debug
- 暂时不改 主机名,目前为 iv-ydnmk5nri8wh2youj1ye,待镜像做好后再改。
- 以后新购服务器后,要改 主机名。
## 购机后环境配置
### 新建用户和组
```
groupadd adminuser
useradd adminuser -g adminuser
usermod -G wheel adminuser
passwd adminuser
# sudo 免密
chmod u+w /etc/sudoers
vi /etc/sudoers #
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
大约在这里,去掉 %wheel 前的注释
chmod u-w /etc/sudoers
su adminuser
mkdir ~/.ssh && chmod 700 ~/.ssh && cd .ssh
vi authorized_keys # 增加 stg 的 pub key
chmod 600 authorized_keys
# adminuser 的 .bashrc 增加
alias gp='git pull'
alias gf='git fetch'
alias gs='git status'
alias gl='git log'
alias xps='ps o pid,lstart,rss,user,cmd -C'
alias ll='ls -lh'
alias vmail='vim /var/spool/mail/root'
alias envcat='cat nginx_adsurvey_module/core/publish/env.h'
alias envim='vim nginx_adsurvey_module/core/publish/env.h'
```
### /data
保证几个重要路径存在
```
cd /data && mkdir appstore deploy log monitor
cd appstore && mkdir appstorelog
cd appstorelog/
mkdir action impre match
chown nobody action
chown nobody impre
chown nobody match
chgrp nobody action
chgrp nobody impre
chgrp nobody match
```
## 代码
### appstore-thrift
- `http://frank.chen:Qwer%401234@git.dt-dtg5.com/t1/appstore-thrift.git`
### thrift_watch
### ssp nginx
```
git clone http://frank.chen:Qwer%401234@git.dt-dtg5.com/t1/appstore-nginx.git release
cd release
sh configure.sh
make -j7
sudo make install
sudo /data/appstore/nginx/sbin/nginx
```
- 访问url来模拟广告请求 `180.184.26.81/store/match?uid=Yjg0OWY1ZTgxYWY5OTc3MzQ0NzRlMjhkYmE0N2Y2MmMzMzIyOTQyZGY3MzM1N2I4NTljNjU5OTdkZmJhNjRiNA==&sid=351&lan=zh&ip=109.129.40.11&nt=WiFi&dis=1080x1920&original=&db=Samsung&dt=SM-C9000&dos=33&gps=116.3912x39.906&keywords=滴滴出行&apps=&force=0&timestamp=1618304922227&vc=4.5.26.2&debug=1&imei=cchhxmeenn&oaid=9c7ba72d2f5ce06ac3fa46cd329cac2f957cb0552b505ead22a43e97e155fd58`
## 检查
### 进程存在
- php-fpm
- nginx
- Thriftc
### 日志
- nginx log,投放模块和php模块
- ad match log
- Thriftc log
## adx stg
- 现有服务保持不变,增加 ssp nginx服务。
## ssp stg
- nginx 迁移至 adx-stg
- 迁移完通知大数据,然后测试
- 推掉服务器
## 域名
- stg-adxtracking.ad-survey.com
- 端口 8180
- stg-adx.ad-survey.com
- 端口 8888
## redis
- 火山云买一个redis [over]
## dsp-notify
- 更新 redis 配置 [over]
## 测试用例
```
180.184.56.136:8888/api/v0?slot=822&with_nbr=1&debug=7998444
{
"id":"0b4db478-79d6-4a8e-97b4-1af31d700fbf1",
"imp":[
{
"id":"3bfc542e-88ac-4421-a2c4-fe3ca041c68f",
"native":{
"request":"{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"w\":200,\"h\":200}}]}"
},
"ext":{
"searchWords":[""],
"pkgs":""
}
}
],
"app":{
"bundle":"galaxystoreapp"
},
"device":{
"ip":"14.142.149.66",
"ipv6":"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"devicetype":1,
"make":"huawei",
"model":"S81",
"os":"Android",
"osv":"6.0",
"connectiontype":1,
"w":1080,
"h":1290,
"ext":{
"csc":"CHC",
"db":"samsung1",
"imei":"",
"oaid":"d4f2dd753e377d96d4f2dd753e377d964",
"mcc":"460",
"mnc":"01",
"networktype":1,
"sdkVerAndroid":"22"
},
"ifa":"",
"ua":"Mozilla/5.0 (Linux; Android 9; SAMSUNG SM-G9650 Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/9.4 Chrome/67.0.3396.87 Mobile Safari/537.36",
"user":{
}
}
}
```
\ No newline at end of file
## 代码
- git 新建分支,针对移植硬件变更,做代码调整。
- 暂不考虑合入master。
### adx-web
* 具体修改处,参考git上相关分支的提交记录。
* 修改 app-prd.ini
* 修改 代理服务器 ip 地址。
* 编译安装后,依靠 systemctl 运行。
## 服务器
### 地址
192.168.20.3 180.184.56.133 EYCFsjd2017!!@#%* adx adx-user密码 Bgc@#41_gwewq098
192.168.20.10 180.184.56.132 EYCFsjd2017!!@#%* 代理请求 dsp-proxy
192.168.20.5 101.126.37.44 EYCFsjd2017!!@#%* 日志采集落盘 log
### 部署计划
* 只部署adx-web
* huitoutiao 的blb,需要提供对外访问,购买 eip ( 120.48.169.244 按流量 后付费)
## 操作
### git
* yum install git
* /etc/hosts 设置 git 服务器
* 添加 180.76.51.115 git.DT-DTG5.com
* git clone adx-cn
### bashrc
vi ~/.bashrc
增加内容:
```
alias ll='ls -lh'
alias gp='git pull'
alias gf='git fetch'
alias gs='git status'
alias gl='git log'
alias xps='ps o pid,lstart,rss,user,cmd -C'
alias prdadxredis='redis-cli -h redis-cnlflyo8lhn3noc6a.redis.ivolces.com --raw'
```
### 安装 go
* 下载golang,解压,移动到 /usr/local/go
* 软链接
* ln -s /usr/local/go/bin/go /usr/bin/go
* ln -s /usr/local/go/bin/gofmt /usr/bin/gofmt
* 配置
* 编辑 /etc/profile,增加内容:
PATH=/usr/local/go/bin:$PATH
export GOPROXY=https://goproxy.cn,direct
* 编辑 ~/.bash_profile,增加内容:
GOPATH=~/go
export GOPATH
PATH=$PATH:$HOME/bin:$GOPATH/bin
export PATH
* mkdir ~/go && cd ~/go && mkdir src bin pkg
* git clone https://github.com/golang/lint.git
* cd lint/golint/ && go install
### linux 用户 adx-user
* groupadd adx-user && useradd -g adx-user adx-user
* root 下执行
* mkdir /data && chown adx-user /data && chgrp adx-user /data
* adx-user 下执行
mkdir -p /data/adx/release
### sudo
```
chmod u+w /etc/sudoers
vim /etc/sudoers
root 配置下(约文件末尾),添加一行:
adx-user ALL=(ALL) NOPASSWD: ALL
重新设置权限,chmod u-w /etc/sudoers
```
## 购买 redis
购买后,需要:
- 参数配置里,修改参数,disabled-commands 项的运行值里,去掉 keys
- 连接管理里,开启免密访问
- 数据安全里,绑定白名单,添加访问者的ip
广告素材
redis-cnlflyo8lhn3noc6a.redis.ivolces.com
redis-cnlflyo8lhn3noc6a.redis.volces.com 外网访问 角色名 bcc 密码 Pengtai_%$1
日志缓存
redis-cnlfuuvu9nglr1sez.cn-beijing.redis.ivolces.com
集群
redis-cnlfqzc1kxdcesrmz.redis.ivolces.com
redis-cnlfqzc1kxdcesrmz-direct.redis.ivolces.com 直连地址
## 数据库
实例名称:adx_db
实例id:mysql-b269aac43324
私网地址/端口:mysql10a1171b5b39.rds.ivolces.com:3306
公网地址/端口:mysql-10a1171b5b39-public.rds.volces.com:3306
admin:
userName: adxRoot
password: AdxWSXQAZ@$^*)
## dsp 请求代理
### nginx
- yum install nginx
- 参考 百度云上的代理服务器上的 nginx 配置
- 修改 nginx.conf
- 拷贝 conf.d/default.conf 到 windows 上,替换 本机 内网ip 地址为 火山云机器的 内网ip 地址。
- 执行 nginx -t 然后启动 nginx
### 监控
* 云平台添加监控警报。
## 0 服务器概述
- adx 3台
- trace 2台
- proxy 2台
- log 1台
## 1. adx
### 1.1 adx-web
```
r.GET("/store/match", api.GetStoreMatch)
r.POST("/api/store/match", api.GetAPIStoreMatch)
r.GET("/sdk/match", sdk.TrackMatch)
r.GET("/store/impression", handler.OnImpressionEvent)
r.GET("/sdk/impression", handler.OnImpressionEvent_SDK)
r.GET("/store/action", handler.OnActionEvent)
r.GET("/sdk/action", handler.OnActionEvent_SDK)
r.GET("/yyb_track", handler.OnYYBTrack)
r.GET("/store/config", handler.GetConfig)
r.POST("/api/v0", handler.Get_Api_V0)
r.GET("store/event", handler.OnVideoEvent)
// 初始需求是,星钻这个需求,广告受众下载app时,需要从我们这边获取下载地址
r.GET("/store/adinfo/download_addres", handler.DownloadAddress)
//某些CPA类广告,apk存鹏泰这里,我们做了cdn加速,且做了防盗链,设置了有效期
r.GET("/apk_download", handler.APKCDNDownloadAddress)
// 隐私政策
r.StaticFS("/privacy", http.Dir("./web/privacy/"))
// 文件上传
r.GET("OnUpload", h5_deploy.OnUpload)
r.StaticFS("/h5/", http.Dir(setting.H5_DIR))
```
## 2 trace
### 2.1 adx-trace
```
r.GET("/store/impression", handler.OnImpressionEvent)
r.GET("/sdk/impression", handler.OnImpressionEvent_SDK)
r.GET("/store/action", handler.OnActionEvent)
r.GET("/sdk/action", handler.OnActionEvent_SDK)
r.GET("store/event", handler.OnVideoEvent)
```
## 3 proxy
### 3.1 dsp-notify
- 只部署于 proxy-1
- 从 redis 取数据,分解数据得到url,访问url发送 dsp 广告通知。
### 3.2 统计dsp超时率
- 需要在原来代码上拉分支,并修改代码。
### 3.2 nginx
- 配置代理请求 dsp 广告
## 4 log
### 4.1 adx-cron
- 从 redis 读取广告日志,落盘
- 从 mysql 读取数据,写入 redis
## 5 测试
blb
- 广告请求 180.184.56.130
- tracking 180.184.56.131
### 5.1 adx-web
- GET store/match
`180.184.56.130/store/match?uid=Njk3NWZmZTgxZmEzMDFjYzNmODFiYzA3MDBjNTBhYTdlZjRiMjMzODJmOTQ0YTM0MGJhODFhOWRkYzhiZjNiZg%3D%3D&androidid=NjcxNWE2ZTgxODViMjIzOQ%3D%3D&sid=1257&oaid=MTQ0OTVkOTY4NTlmMDA0MzI0OTIwOGExNmJlMmMyZjc0NTZiYjBiNGY2ODAxZjE1NjRlNjY3Njg1MmZkZmU0ZQ%3D%3D&lan=cn&db=Samsung&timestamp=1695631620341&keywords=51&dt=SM-S9080&dos=Android13`
- 可正常返回广告
- 返回的广告通知地址,为 galaxystore.ad-survey.com,不需要进一步测试广告通知
## 域名
- adx.ad-survey.com 对外公布
- adxtracking.ad-survey.com 不公布
- galaxystore.ad-survey.com 对外公布
## 基本概念
### 广告请求
* ADX GET POST SDK GET POST
会转给 ssp nginx
* api v0
### 广告通知
* 服务端上报,我们收到后,做转发。
### dsp
## adx 用到的服务器
### 广告投放 5台
* 提供对外接口
* adx-web adx-core
### 惠头条 3台
* 不对外
* ssp-web ssp-core
* 记录 avro 日志
### 广告通知 2台
* adx-trace 对外,但不公布
* 通知 dsp,直接请求 url,大流量网卡。
### 代理请求 2台
- nginx 请求 dsp 广告
- dsp-notify 转发 dsp 的 win loss 通知。
### 日志 1台
- 广告通知,dsp 通知
## 广告媒体
### adx 非 api v0
- 请求直接转给 ssp nginx
- 返回内容,广告通知里,有adx的,也有ssp的
### api v0
- 请求会转给 ssp nginx,huitoutiao,三方dsp
-
## 优化
- 从日常使用看,这些可以优化。不过考虑的高业务量时,可能内存占用会变大,比如 huitoutiao 3台,请求大时,cpu和内存占用都很大。
* proxy 共4台,2台 降配,去掉1台
* huitoutiao 3台 降配
* adx 5台 降配
* adx-log 降配,且可将 notify-log 合入 adx-log
* ssp nginx 10台 降配
## clb
- 健康检查,异常数 >= 1 报警。
\ No newline at end of file
## 通用
- 大部分使用定时任务 crontab
- 查看 crontab 任务: `sudo ls -l /var/spool/cron /etc/cron.d`
## 服务器
### adx-web 所在服务器
- 定时执行 python 脚本 `/data/adx/shell/AdxMonitor`
### adx-trace 所在服务器
- 无监控
### ssp nginx 服务器
- 进程监控、日志文件监控
\ No newline at end of file
参考
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el9/gitlab-ce-17.2.2-ce.0.el9.x86_64.rpm
1、停止gitlab
gitlab-ctl stop
2、卸载gitlab(注意这里写的是gitlab-ce)
rpm -e gitlab-ce
3、查看gitlab进程
ps aux | grep gitlab
4、杀掉第一个进程(就是带有好多…的进程)
杀掉后,在ps aux | grep gitlab确认一遍,还有没有gitlab的进程。若还存在,可以把它的主要组件的进程也杀一边。
日志的进程不用管。
5、删除所有包含gitlab文件
find / -name gitlab | xargs rm -rf
当然若你没有全杀权限。那么可以可以把这三个目录给干掉也可以:
rm -rf /opt/gitlab
rm -rf /etc/gitlab
rm -rf /var/log/gitlab
## 安装
- `https://golang.google.cn/dl/` 这里找一个合适的版本,复制 download url
- 如 1.23.4 的 linux 64 位版本:`https://golang.google.cn/dl/go1.23.4.linux-amd64.tar.gz`
- 本地下载,再ssh到服务器上,或者直接服务器上下载。
- 解压缩,比如 `tar -zxvf go1.23.4.linux-amd64.tar.gz`
- 将解压缩出来的文件夹,移动到 `/usr/local/`,那么 go 可执行程序路径为 `/usr/local/go/bin/go`
- 配置环境变量
- 安装 golint
- 代码: `https://github.com/golang/lint.git`
- 若 git 获取不到,可以执行 `go install github.com/golang/lint@latest`,代码会放入 `go/pkg/mod`
- 下载好代码后,`cd golint && go install`
- 这里要确认 go bin 配置好环境变量,一般可设置为 `$GOPATH/bin`
## 环境变量
### /etc/profile
```
PATH=/usr/local/go/bin:$PATH
export GOPROXY=https://goproxy.cn,direct
```
### .bash_profile
```
GOPATH=~/go
export GOPATH
PATH=$PATH:$HOME/bin:$GOPATH/bin
```
\ No newline at end of file
180.184.56.132 180.184.56.134 180.184.61.63 180.184.56.138 180.184.56.139 180.184.56.136 180.184.61.244
3个代理服务器,用于dsp广告请求、广告预测
2台trace通知,合作者:dsp、广告预测
2台 stg
ssp、adx。其中adx的stg服务器,还会发给合作伙伴,dsp、广告预测
\ No newline at end of file
## 1. stg redis
- redis-cnlf9hm5qs56dc7cz.redis.ivolces.com
### win loss
`dsp:notify`
### trace
stg-adx:request-log
stg-adx:match-log
stg-adx:impre-log
stg-adx:click-log
stg-adx:enterhome-log
stg-adx:download-log
stg-adx:install-log
stg-adx:win-log
stg-adx:activation-log
stg-adx:adx-download-addr-log
stg-adx:sdk-match-log
stg-adx:sdk-impre-log
stg-adx:sdk-click-log
stg-adx:sdk-download-log
stg-adx:sdk-install-log
stg-adx:video-event-log
stg-adx:dsp-notify-send-log
stg-adx:dmp-notify-send-log
stg-adx:dsp-log
### 某特殊媒体
ssp:action:event
## 2. adx_redis-cache-log
- redis-cnlfuuvu9nglr1sez.cn-beijing.redis.ivolces.com
### win loss
`dsp:notify`
### trace
adx:request-log
adx:match-log
adx:impre-log
adx:click-log
adx:enterhome-log
adx:download-log
adx:install-log
adx:win-log
adx:activation-log
adx:adx-download-addr-log
adx:sdk-match-log
adx:sdk-impre-log
adx:sdk-click-log
adx:sdk-download-log
adx:sdk-install-log
adx:video-event-log
adx:dsp-notify-send-log
adx:dmp-notify-send-log
adx:dsp-log
## 3. adx_redis-cach_ad_match
- redis-cnlfqzc1kxdcesrmz.redis.ivolces.com
### win loss
`dsp:notify`
## 4. ad_config
- redis-cnlflyo8lhn3noc6a.redis.ivolces.com
### 某特殊媒体
- 掌阅?
ssp:action:event
### dsp 的包不在我们库
pangolin_pkgs
baidu_pkgs
domob_pkgs
iflytek_pkgs
iqiyi_pkgs
kuaishou_pkgs
oppo_pkgs
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment