btcpool礦池原始碼分析(8)-slparser

尹成發表於2018-05-20
# btcpool礦池-slparser(share log parser)模組解析

## 核心機制總結

* 支援三種功能:
  * 指定Date和UID,將列印指定日期指定使用者的share資訊到stdout
    * UID=0時,將列印指定日期所有使用者的share資訊
  * 指定Date但未指定UID,讀取指定日期sharelog,統計資料並寫入資料庫
    * 按Worker、user、pool三個維度統計:Accept1h、Accept1d、score1h、score1d、Reject1h、Reject1d
    * 資料庫僅保留最近3個月統計資料
  * 如果Date和UID均未指定,將監聽檔案變化,讀取share並統計資料,每15秒寫入資料庫
    * 同時啟動Httpd服務,開放ServerStatus和WorkerStatus

## slparser命令使用

```shell
slparser -c slparser.cfg -l log_dir
slparser -c slparser.cfg -l log_dir2 -d 20160830
slparser -c slparser.cfg -l log_dir3 -d 20160830 -u puid
#-c指定slparser配置檔案
#-l指定日誌目錄
#-d指定日期
#-u指定PUID(即userId),userId為0時dump all, >0時僅輸出指定userId的sharelog
```

## slparser.cfg配置檔案

```shell
slparserhttpd = {
#指定IP和埠
ip = "0.0.0.0";
port = 8081;

#每間隔15s寫庫
flush_db_interval = 15;
};

#指定sharelog檔案路徑
sharelog = {
data_dir = "/data/sharelog";
};

#資料庫配置,表為table.stats_xxxx
pooldb = {
host = "";
port = 3306;
username = "dbusername";
password = "dbpassword";
dbname = "";
};
```

## slparser流程圖




## bpool_local_stats_db資料庫結構

[bpool_local_stats_db.txt](bpool_local_stats_db.txt)

```c++
DROP TABLE IF EXISTS `stats_pool_day`;
CREATE TABLE `stats_pool_day` (
`day` int(11) NOT NULL,
`share_accept` bigint(20) NOT NULL DEFAULT '0',
`share_reject` bigint(20) NOT NULL DEFAULT '0',
`reject_rate` double NOT NULL DEFAULT '0',
`score` decimal(35,25) NOT NULL DEFAULT '0.0000000000000000000000000',
`earn` bigint(20) NOT NULL DEFAULT '0',
`lucky` double NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
UNIQUE KEY `day` (`day`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `stats_pool_hour`;
CREATE TABLE `stats_pool_hour` (
`hour` int(11) NOT NULL,
`share_accept` bigint(20) NOT NULL DEFAULT '0',
`share_reject` bigint(20) NOT NULL DEFAULT '0',
`reject_rate` double NOT NULL DEFAULT '0',
`score` decimal(35,25) NOT NULL DEFAULT '0.0000000000000000000000000',
`earn` bigint(20) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
UNIQUE KEY `hour` (`hour`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `stats_users_day`;
CREATE TABLE `stats_users_day` (
`puid` int(11) NOT NULL,
`day` int(11) NOT NULL,
`share_accept` bigint(20) NOT NULL DEFAULT '0',
`share_reject` bigint(20) NOT NULL DEFAULT '0',
`reject_rate` double NOT NULL DEFAULT '0',
`score` decimal(35,25) NOT NULL DEFAULT '0.0000000000000000000000000',
`earn` bigint(20) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
UNIQUE KEY `puid_day` (`puid`,`day`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `stats_users_hour`;
CREATE TABLE `stats_users_hour` (
`puid` int(11) NOT NULL,
`hour` int(11) NOT NULL,
`share_accept` bigint(20) NOT NULL DEFAULT '0',
`share_reject` bigint(20) NOT NULL DEFAULT '0',
`reject_rate` double NOT NULL DEFAULT '0',
`score` decimal(35,25) NOT NULL DEFAULT '0.0000000000000000000000000',
`earn` bigint(20) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
UNIQUE KEY `puid_hour` (`puid`,`hour`),
KEY `hour` (`hour`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `stats_workers_day`;
CREATE TABLE `stats_workers_day` (
`puid` int(11) NOT NULL,
`worker_id` bigint(20) NOT NULL,
`day` int(11) NOT NULL,
`share_accept` bigint(20) NOT NULL DEFAULT '0',
`share_reject` bigint(20) NOT NULL DEFAULT '0',
`reject_rate` double NOT NULL DEFAULT '0',
`score` decimal(35,25) NOT NULL DEFAULT '0.0000000000000000000000000',
`earn` bigint(20) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
UNIQUE KEY `puid_worker_id_day` (`puid`,`worker_id`,`day`),
KEY `day` (`day`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `stats_workers_hour`;
CREATE TABLE `stats_workers_hour` (
`puid` int(11) NOT NULL,
`worker_id` bigint(20) NOT NULL,
`hour` int(11) NOT NULL,
`share_accept` bigint(20) NOT NULL DEFAULT '0',
`share_reject` bigint(20) NOT NULL DEFAULT '0',
`reject_rate` double NOT NULL DEFAULT '0',
`score` decimal(35,25) NOT NULL DEFAULT '0.0000000000000000000000000',
`earn` bigint(20) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
UNIQUE KEY `puid_worker_id_hour` (`puid`,`worker_id`,`hour`),
KEY `hour` (`hour`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

相關文章