master
710leo 4 years ago
parent 8379624581
commit ed35ddc388

2
.gitignore vendored

@ -45,9 +45,11 @@ _test
/src/modules/transfer/transfer
/src/modules/tsdb/tsdb
/src/modules/monapi/monapi
/src/modules/rdb/rdb
/web/node_modules
/web/.cache-loader
/web/yarn.lock
Makefile

@ -0,0 +1,237 @@
#!/bin/bash -x
# release version
version=3.0.0
CWD=$(cd $(dirname $0)/; pwd)
cd $CWD
usage()
{
echo $"Usage: $0 {start|stop|restart|status|build|pack} <module>"
exit 0
}
start_all()
{
test -x n9e-rdb && start rdb
test -x n9e-transfer && start transfer
test -x n9e-tsdb && start tsdb
test -x n9e-index && start index
test -x n9e-judge && start judge
test -x n9e-monapi && start monapi
test -x n9e-job && start job
test -x n9e-ams && start ams
test -x n9e-agent && start agent
}
start()
{
mod=$1
if [ "x${mod}" = "x" ]; then
usage
return
fi
if [ "x${mod}" = "xall" ]; then
start_all
return
fi
binfile=n9e-${mod}
if [ ! -f $binfile ]; then
echo "file[$binfile] not found"
exit 1
fi
if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -gt 0 ]; then
echo "${mod} already started"
return
fi
mkdir -p logs/$mod
nohup $CWD/$binfile &> logs/${mod}/stdout.log &
for((i=1;i<=15;i++)); do
if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -gt 0 ]; then
echo "${mod} started"
return
fi
sleep 0.2
done
echo "cannot start ${mod}"
exit 1
}
stop_all()
{
test -x n9e-monapi && stop monapi
test -x n9e-transfer && stop transfer
test -x n9e-tsdb && stop tsdb
test -x n9e-index && stop index
test -x n9e-judge && stop judge
test -x n9e-agent && stop agent
test -x n9e-ams && stop ams
test -x n9e-job && stop job
test -x n9e-rdb && stop rdb
}
stop()
{
mod=$1
if [ "x${mod}" = "x" ]; then
usage
return
fi
if [ "x${mod}" = "xall" ]; then
stop_all
return
fi
binfile=n9e-${mod}
if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -eq 0 ]; then
echo "${mod} already stopped"
return
fi
ps aux|grep -v grep|grep -v control|grep "$binfile"|awk '{print $2}'|xargs kill
for((i=1;i<=15;i++)); do
if [ $(ps aux|grep -v grep|grep -v control|grep "$binfile" -c) -eq 0 ]; then
echo "${mod} stopped"
return
fi
sleep 0.2
done
echo "cannot stop $mod"
exit 1
}
restart()
{
mod=$1
if [ "x${mod}" = "x" ]; then
usage
return
fi
if [ "x${mod}" = "xall" ]; then
stop_all
start_all
return
fi
stop $mod
start $mod
status
}
status()
{
ps aux|grep -v grep|grep "n9e"
}
build_one()
{
mod=$1
go build -ldflags "-X main.version=${version}" -o n9e-${mod} src/modules/${mod}/${mod}.go
}
build_docker()
{
mod=$1
go build -ldflags "-X main.version=${version}" -o bin/n9e-${mod} src/modules/${mod}/${mod}.go
}
build()
{
export GO111MODULE=on
mod=$1
if [ "x${mod}" = "x" ]; then
build_one monapi
build_one transfer
build_one index
build_one judge
build_one agent
build_one tsdb
build_one rdb
build_one ams
build_one job
return
fi
if [ "x${mod}" = "xdocker" ]; then
build_docker monapi
build_docker transfer
build_docker index
build_docker judge
build_docker agent
build_docker tsdb
build_docker rdb
build_docker ams
build_docker job
return
fi
build_one $mod
}
reload()
{
mod=$1
if [ "x${mod}" = "x" ]; then
echo "arg: <mod> is necessary"
return
fi
build_one $mod
restart $mod
}
pack()
{
v=$1
if [ "x${v}" = "x" ]; then
v=$(date +%Y-%m-%d-%H-%M-%S)
fi
tar zcvf n9e-$v.tar.gz control sql pub etc/service etc/nginx.conf etc/mysql.yml etc/address.yml \
n9e-agent etc/agent.yml \
n9e-tsdb etc/tsdb.yml \
n9e-index etc/index.yml \
n9e-judge etc/judge.yml \
n9e-transfer etc/transfer.yml \
n9e-monapi etc/monapi.yml
}
case "$1" in
start)
start $2
;;
stop)
stop $2
;;
restart)
restart $2
;;
status)
status
;;
build)
build $2
;;
reload)
reload $2
;;
pack)
pack $2
;;
*)
usage
esac

@ -0,0 +1,46 @@
---
rdb:
http: 0.0.0.0:8000
ams:
http: 0.0.0.0:8002
addresses:
- 127.0.0.1
job:
http: 0.0.0.0:8004
rpc: 0.0.0.0:8005
addresses:
- 127.0.0.1
monapi:
http: 0.0.0.0:8006
addresses:
- 127.0.0.1
transfer:
http: 0.0.0.0:8008
rpc: 0.0.0.0:8009
addresses:
- 127.0.0.1
tsdb:
http: 0.0.0.0:8010
rpc: 0.0.0.0:8011
addresses:
- 127.0.0.1
index:
http: 0.0.0.0:8012
rpc: 0.0.0.0:8013
addresses:
- 127.0.0.1
judge:
http: 0.0.0.0:8014
rpc: 0.0.0.0:8015
addresses:
- 127.0.0.1
agent:
http: 0.0.0.0:2080

@ -0,0 +1,65 @@
logger:
dir: logs/agent
level: INFO
keepHours: 24
enable:
mon: false
job: false
report: false
job:
metadir: ./meta
interval: 2
report:
# 调用ams的接口上报数据需要ams的token
token: ams-builtin-token
# 上报周期,单位是秒
interval: 10
# physical物理机virtual虚拟机container容器switch交换机
cate: physical
# 使用哪个字段作为唯一KEY即作为where条件更新对应记录
# 一般使用sn虚机的话把uuid当做sn即可不同IaaS平台获取方式可能不同
uniqkey: sn
# 如果是虚拟机应该是获取uuid
sn: dmidecode -s system-serial-number | tail -n 1
fields:
cpu: cat /proc/cpuinfo | grep processor | wc -l
mem: cat /proc/meminfo | grep MemTotal | awk '{printf "%dGi", $2/1024/1024}'
disk: df -m | grep '/dev/' | grep -v '/var/lib' | grep -v tmpfs | awk '{sum += $2};END{printf "%dGi", sum/1024}'
sys:
# timeout in ms
# interval in second
timeout: 1000
interval: 20
ifacePrefix:
- eth
- em
- ens
# ignore disk mount point
mountIgnore:
prefix:
- /var/lib
- /run
# collect anyway
exclude: []
ignoreMetrics:
- cpu.core.idle
- cpu.core.util
- cpu.core.sys
- cpu.core.user
- cpu.core.nice
- cpu.core.guest
- cpu.core.irq
- cpu.core.softirq
- cpu.core.iowait
- cpu.core.steal

@ -0,0 +1,12 @@
logger:
dir: logs/ams
level: INFO
keepHours: 24
http:
mode: release
cookieDomain: ""
cookieName: ecmc-user
tokens:
- ams-builtin-token

@ -0,0 +1,16 @@
- system: 资产管理系统
groups:
- title: 主机设备
ops:
- en: ams_host_mgr_menu
cn: 主机设备管理菜单
- en: ams_host_delete
cn: 主机设备删除
- en: ams_host_modify
cn: 主机设备信息修改
- title: 网络设备
ops:
- en: ams_netware_mgr_menu
cn: 网络设备管理菜单
- en: ams_netware_modify
cn: 网络设备信息修改

@ -0,0 +1,9 @@
# 用来做心跳给服务端上报本机ip
ip:
specify: ""
shell: ifconfig `route|grep '^default'|awk '{print $NF}'`|grep inet|awk '{print $2}'|head -n 1
# MON、JOB的客户端拿来做本机标识
ident:
specify: ""
shell: ifconfig `route|grep '^default'|awk '{print $NF}'`|grep inet|awk '{print $2}'|head -n 1

@ -0,0 +1,4 @@
logger:
dir: logs/index
level: WARNING
keepHours: 2

@ -0,0 +1,15 @@
logger:
dir: logs/job
level: INFO
keepHours: 24
http:
mode: release
cookieDomain: ""
cookieName: ecmc-user
output:
# database | remote
comeFrom: database
remotePort: 2080

@ -0,0 +1,18 @@
query:
connTimeout: 1000
callTimeout: 2000
indexCallTimeout: 2000
redis:
addrs:
- 127.0.0.1:6379
pass: ""
# timeout:
# conn: 500
# read: 3000
# write: 3000
logger:
dir: logs/judge
level: WARNING
keepHours: 2

@ -0,0 +1,66 @@
- system: 用户资源库
groups:
- title: 人员授权
ops:
- en: rdb_perm_grant
cn: 权限分配
- title: 节点类操作
ops:
- en: rdb_node_create
cn: 创建节点
- en: rdb_node_modify
cn: 修改节点
- en: rdb_node_delete
cn: 删除节点
- title: 资源类操作
ops:
- en: rdb_resource_view
cn: 资源信息查看
- en: rdb_resource_bind
cn: 资源挂载节点
- en: rdb_resource_unbind
cn: 资源解挂节点
- en: rdb_resource_modify
cn: 资源信息修改
- system: 任务执行中心
groups:
- title: 任务模板相关
ops:
- en: job_tpl_view
cn: 查看任务模板
- en: job_tpl_create
cn: 创建任务模板
- en: job_tpl_modify
cn: 修改任务模板
- en: job_tpl_delete
cn: 删除任务模板
- title: 任务执行相关
ops:
- en: task_run_use_root_account
cn: 使用root账号运行脚本
- en: task_run_use_gene_account
cn: 使用普通账号运行脚本
- system: 监控告警系统
groups:
- title: 告警策略
ops:
- en: mon_stra_write
cn: 告警策略配置权限
- title: 采集策略
ops:
- en: mon_collect_write
cn: 采集策略配置权限
- title: 大屏操作
ops:
- en: mon_screen_write
cn: 监控大屏配置权限
- en: mon_screen_read
cn: 监控大屏查看权限
- title: 指标计算
ops:
- en: mon_aggr_write
cn: 指标计算配置权限
- title: 告警历史
ops:
- en: mon_event_write
cn: 告警历史屏蔽、认领、忽略

@ -0,0 +1,237 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>夜莺告警通知</title>
<style type="text/css">
.wrapper {
background-color: #f8f8f8;
padding: 15px;
height: 100%;
}
.main {
width: 600px;
padding: 30px;
margin: 0 auto;
background-color: #fff;
font-size: 12px;
font-family: verdana,'Microsoft YaHei',Consolas,'Deja Vu Sans Mono','Bitstream Vera Sans Mono';
}
header {
border-radius: 2px 2px 0 0;
}
header .title {
font-size: 16px;
color: #333333;
margin: 0;
}
header .sub-desc {
color: #333;
font-size: 14px;
margin-top: 6px;
margin-bottom: 0;
}
hr {
margin: 20px 0;
height: 0;
border: none;
border-top: 1px solid #e5e5e5;
}
em {
font-weight: 600;
}
table {
margin: 20px 0;
width: 100%;
}
table tbody tr{
font-weight: 200;
font-size: 12px;
color: #666;
height: 32px;
}
.succ {
background-color: green;
color: white;
}
.fail {
background-color: red;
color: white;
}
table tbody tr th {
width: 80px;
text-align: right;
}
.text-right {
text-align: right;
}
.body {
margin-top: 24px;
}
.body-text {
color: #666666;
-webkit-font-smoothing: antialiased;
}
.body-extra {
-webkit-font-smoothing: antialiased;
}
.body-extra.text-right a {
text-decoration: none;
color: #333;
}
.body-extra.text-right a:hover {
color: #666;
}
.button {
width: 200px;
height: 50px;
margin-top: 20px;
text-align: center;
border-radius: 2px;
background: #2D77EE;
line-height: 50px;
font-size: 20px;
color: #FFFFFF;
cursor: pointer;
}
.button:hover {
background: rgb(25, 115, 255);
border-color: rgb(25, 115, 255);
color: #fff;
}
footer {
margin-top: 10px;
text-align: right;
}
.footer-logo {
text-align: right;
}
.footer-logo-image {
width: 108px;
height: 27px;
margin-right: 10px;
}
.copyright {
margin-top: 10px;
font-size: 12px;
text-align: right;
color: #999;
-webkit-font-smoothing: antialiased;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="main">
<header>
<h3 class="title">{{.Sname}}</h3>
<p class="sub-desc"></p>
</header>
<hr>
<div class="body">
<div class="body-text">
<div style="color: red">
{{if .IsUpgrade}}
注意,告警已触发升级!
{{end}}
</div>
</div>
<table cellspacing="0" cellpadding="0" border="0">
<tbody>
{{if .IsAlert}}
<tr class="fail">
<th>级别状态:</th>
<td>{{.Status}}</td>
</tr>
{{else}}
<tr class="succ">
<th>级别状态:</th>
<td>{{.Status}}</td>
</tr>
{{end}}
{{if .IsMachineDep}}
<tr>
<th>告警设备:</th>
<td>{{.Endpoint}}</td>
</tr>
<tr>
<th>挂载节点:</th>
<td>
{{range .Bindings}}
{{.}}<br />
{{end}}
</td>
</tr>
{{else}}
<tr>
<th>所属节点:</th>
<td>{{.CurNodePath}}</td>
</tr>
{{end}}
<tr>
<th>监控指标:</th>
<td>{{.Metric}}</td>
</tr>
<tr>
<th>tags</th>
<td>{{.Tags}}</td>
</tr>
<tr>
<th>当前值:</th>
<td>{{.Value}}</td>
</tr>
<tr>
<th>报警说明:</th>
<td>
{{.Info}}
</td>
</tr>
<tr>
<th>触发时间:</th>
<td>
{{.Etime}}
</td>
</tr>
<tr>
<th>报警详情:</th>
<td>{{.Elink}}</td>
</tr>
<tr>
<th>报警策略:</th>
<td>{{.Slink}}</td>
</tr>
{{if .HasClaim}}
<tr>
<th>认领报警:</th>
<td>{{.Clink}}</td>
</tr>
{{end}}
</tbody>
</table>
<hr>
<footer>
<div class="footer-logo">
<a href="https://n9e.didiyun.com">
<img src="https://s3-gz01.didistatic.com/n9e-pub/image/n9e-logo-bg-white.png" class="footer-logo-image" alt="">
</a>
</div>
<div class="copyright" style="font-style: italic">
我们希望与您一起,将监控这个事情,做到极致!
</div>
</footer>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,28 @@
---
tokens:
- monapi-internal-third-module-pass-fjsdi
logger:
dir: logs/monapi
level: WARNING
keepHours: 2
region:
- default
# read alert from redis
redis:
addr: 127.0.0.1:6379
pass: 1234
# timeout:
# conn: 500
# read: 3000
# write: 3000
notify:
p1: ["voice", "sms", "mail", "im"]
p2: ["sms", "mail", "im"]
p3: ["mail", "im"]
# addresses accessible using browser
link:
stra: http://ecmc.com/mon/strategy/%v
event: http://ecmc.com/mon/history/his/%v
claim: http://ecmc.com/mon/history/cur/%v

@ -0,0 +1,26 @@
---
rdb:
addr: "root:1234@tcp(127.0.0.1:3306)/n9e_rdb?charset=utf8&parseTime=True&loc=Asia%2FShanghai"
max: 16
idle: 4
debug: false
ams:
addr: "root:1234@tcp(127.0.0.1:3306)/n9e_ams?charset=utf8&parseTime=True&loc=Asia%2FShanghai"
max: 16
idle: 4
debug: false
job:
addr: "root:1234@tcp(127.0.0.1:3306)/n9e_job?charset=utf8&parseTime=True&loc=Asia%2FShanghai"
max: 16
idle: 4
debug: false
mon:
addr: "root:1234@tcp(127.0.0.1:3306)/n9e_mon?charset=utf8&parseTime=True&loc=Asia%2FShanghai"
max: 16
idle: 4
debug: false
hbs:
addr: "root:1234@tcp(127.0.0.1:3306)/n9e_hbs?charset=utf8&parseTime=True&loc=Asia%2FShanghai"
max: 16
idle: 4
debug: false

@ -0,0 +1,76 @@
logger:
dir: logs/rdb
level: INFO
keepHours: 24
http:
mode: release
cookieDomain: ""
cookieName: ecmc-user
sso:
enable: true
ssoAddr: "http://10.86.76.13:8071"
redirectURL: "http://10.86.76.13:8072/api/rdb/auth/callback"
clientId: ""
clientSecret: ""
apiKey: ""
tokens:
- uic-builtin-token
- hsp-builtin-token
- rdb-builtin-token
# for ldap authorization
ldap:
host: "ldap.example.org"
port: 389
baseDn: "dc=example,dc=org"
# AD: manange@example.org
bindUser: "cn=manager,dc=example,dc=org"
bindPass: "*******"
# openldap: (&(uid=%s))
# AD: (&(sAMAccountName=%s))
authFilter: "(&(uid=%s))"
attributes:
dispname: "cn"
email: "mail"
phone: "mobile"
im: ""
coverAttributes: false
autoRegist: true
tls: false
startTLS: false
# as queue for sender
redis:
enable: false
addr: 127.0.0.1:6379
pass: ""
idle: 5
timeout:
conn: 500
read: 3000
write: 3000
sender:
mail:
# three choice: smtp|shell|api
way: smtp
worker: 10
api: http://127.0.0.1:2008/mail
sms:
# two choice: shell|api
way: api
worker: 10
api: http://127.0.0.1:2008/sms
voice:
# two choice: shell|api
way: shell
worker: 10
api: http://127.0.0.1:2008/voice
im:
# two choice: shell|api
way: shell
worker: 10
api: http://127.0.0.1:2008/im

@ -0,0 +1,14 @@
{{if .IsUpgrade}}注意,告警已触发升级!{{end}}
级别状态:{{.Status}}
策略名称:{{.Sname}}
告警设备:{{.Endpoint}}
挂载节点:
{{range .Bindings}}{{.}}
{{end}}监控指标:{{.Metric}}
指标标签:{{.Tags}}
当前值:{{.Value}}
报警说明:{{.Info}}
触发时间:{{.Etime}}
报警详情:{{.Elink}}
报警策略:{{.Slink}}
{{if .HasClaim}}认领报警:{{.Clink}}{{end}}

@ -0,0 +1,34 @@
backend:
datasource: "tsdb"
tsdb:
enabled: true
name: "tsdb"
cluster:
tsdb01: 127.0.0.1:5821
influxdb:
enabled: false
username: "influx"
password: "admin123"
precision: "s"
database: "n9e"
address: "http://127.0.0.1:8086"
opentsdb:
enabled: false
address: "127.0.0.1:4242"
kafka:
enabled: false
brokersPeers: "192.168.1.1:9092,192.168.1.2:9092"
topic: "n9e"
aggr:
enabled: false
kafkaAddrs:
- ecmc-01.py:9092
- ecmc-02.py:9092
- ecmc-03.py:9092
kafkaAggrInTopic: aggrin
kafkaAggrOutTopic: aggrout
logger:
dir: logs/transfer
level: WARNING
keepHours: 2

@ -0,0 +1,54 @@
module github.com/didi/nightingale
go 1.12
require (
github.com/Shopify/sarama v1.19.0
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
github.com/cespare/xxhash v1.1.0
github.com/codegangsta/negroni v1.0.0
github.com/coreos/go-oidc v2.2.1+incompatible
github.com/dgryski/go-tsz v0.0.0-20180227144327-03b7d791f4fe
github.com/eapache/go-resiliency v1.2.0 // indirect
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect
github.com/eapache/queue v1.1.0 // indirect
github.com/garyburd/redigo v1.6.2
github.com/gin-contrib/pprof v1.3.0
github.com/gin-gonic/gin v1.6.3
github.com/go-ole/go-ole v1.2.4 // indirect
github.com/go-sql-driver/mysql v1.5.0
github.com/google/go-cmp v0.5.1 // indirect
github.com/google/uuid v1.1.2
github.com/gorilla/context v1.1.1 // indirect
github.com/gorilla/mux v1.6.2
github.com/hpcloud/tail v1.0.0
github.com/influxdata/influxdb v1.8.0
github.com/mattn/go-isatty v0.0.12
github.com/mattn/go-sqlite3 v1.14.0 // indirect
github.com/onsi/ginkgo v1.7.0 // indirect
github.com/onsi/gomega v1.4.3 // indirect
github.com/open-falcon/rrdlite v0.0.0-20200214140804-bf5829f786ad
github.com/pquerna/cachecontrol v0.0.0-20200819021114-67c6ae64274f // indirect
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect
github.com/robfig/go-cache v0.0.0-20130306151617-9fc39e0dbf62 // indirect
github.com/shirou/gopsutil v2.20.7+incompatible
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72
github.com/spf13/viper v1.7.1
github.com/stretchr/testify v1.6.1
github.com/toolkits/pkg v1.1.2
github.com/ugorji/go/codec v1.1.7
github.com/unrolled/render v1.0.3
go.uber.org/automaxprocs v1.3.0 // indirect
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ldap.v3 v3.1.0
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect
k8s.io/apimachinery v0.0.0-20190817020851-f2f3a405f61d
xorm.io/core v0.7.3
xorm.io/xorm v0.8.1
)

701
go.sum

File diff suppressed because it is too large Load Diff

@ -0,0 +1,30 @@
set names utf8;
drop database if exists n9e_ams;
create database n9e_ams;
use n9e_ams;
CREATE TABLE `host`
(
`id` int unsigned not null AUTO_INCREMENT,
`sn` char(128) not null default '',
`ip` char(15) not null,
`ident` varchar(128) not null default '',
`name` varchar(128) not null default '',
`cpu` varchar(255) not null default '',
`mem` varchar(255) not null default '',
`disk` varchar(255) not null default '',
`note` varchar(255) not null default 'different with resource note',
`cate` varchar(32) not null comment 'host,vm,container,switch',
`tenant` varchar(128) not null default '',
`clock` bigint not null comment 'heartbeat timestamp',
PRIMARY KEY (`id`),
UNIQUE KEY (`ip`),
UNIQUE KEY (`ident`),
KEY (`sn`),
KEY (`name`),
KEY (`tenant`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
/* 网络设备管理、机柜机架、配件耗材等相关的功能是商业版本才有的,表结构不要放到这里 */

@ -0,0 +1,29 @@
set names utf8;
drop database if exists n9e_hbs;
create database n9e_hbs;
use n9e_hbs;
create table `instance` (
`id` int unsigned not null auto_increment,
`module` varchar(32) not null,
`identity` varchar(255) not null,
`rpc_port` varchar(16) not null,
`http_port` varchar(16) not null,
`remark` text,
`ts` int unsigned not null,
primary key (`id`),
key(`module`,`identity`,`rpc_port`,`http_port`)
) engine=innodb default charset=utf8;
create table `detector` (
`id` int unsigned not null auto_increment,
`module` varchar(32) not null,
`node` varchar(16) not null,
`region` varchar(64) not null,
`ip` varchar(255) not null,
`port` varchar(16) not null,
`ts` int unsigned not null,
primary key (`id`),
key(`ip`,`port`)
) engine=innodb default charset=utf8;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save