加速建索引

This commit is contained in:
gotoeasy 2024-07-29 17:23:54 +08:00
parent a8de6aee42
commit f8be2558b8
2 changed files with 19 additions and 14 deletions

View File

@ -51,6 +51,7 @@ var minioPassword string
var minioBucket string var minioBucket string
var enableUploadMinio bool var enableUploadMinio bool
var goMaxProcess int var goMaxProcess int
var goMaxProcessIdx int
var enableCors bool var enableCors bool
var pageSize int var pageSize int
var nearSearchSize int var nearSearchSize int
@ -61,7 +62,6 @@ var aryWhite []string
var aryBlack []string var aryBlack []string
var ipAddCity bool var ipAddCity bool
var enableChatAi bool var enableChatAi bool
var createIndexSync bool
func init() { func init() {
UpdateConfigByEnv() UpdateConfigByEnv()
@ -101,18 +101,13 @@ func UpdateConfigByEnv() {
minioBucket = cmn.GetEnvStr("GLC_MINIO_BUCKET", "") // 【X】MINIO桶名默认“” minioBucket = cmn.GetEnvStr("GLC_MINIO_BUCKET", "") // 【X】MINIO桶名默认“”
enableUploadMinio = cmn.GetEnvBool("GLC_ENABLE_UPLOAD_MINIO", false) // 【X】是否开启上传备份至MINIO服务器默认false enableUploadMinio = cmn.GetEnvBool("GLC_ENABLE_UPLOAD_MINIO", false) // 【X】是否开启上传备份至MINIO服务器默认false
goMaxProcess = getGoMaxProcessConf(cmn.GetEnvInt("GLC_GOMAXPROCS", -1)) // 使用的最大CPU数量默认是最大CPU数量设定值不在实际数量范围是按最大看待 goMaxProcess = getGoMaxProcessConf(cmn.GetEnvInt("GLC_GOMAXPROCS", -1)) // 使用的最大CPU数量默认是最大CPU数量设定值不在实际数量范围是按最大看待
goMaxProcessIdx = getGoMaxProcessConf(cmn.GetEnvInt("GLC_GOMAXPROCS_IDX", -1)) // 创建索引使用的最大协程数量默认是最大CPU数量设定值不在实际数量范围是按最大看待
enableCors = cmn.GetEnvBool("GLC_ENABLE_CORS", false) // 是否允许跨域默认false enableCors = cmn.GetEnvBool("GLC_ENABLE_CORS", false) // 是否允许跨域默认false
pageSize = getPageSizeConf(cmn.GetEnvInt("GLC_PAGE_SIZE", 100)) // 每次检索件数默认100有效范围1~1000 pageSize = getPageSizeConf(cmn.GetEnvInt("GLC_PAGE_SIZE", 100)) // 每次检索件数默认100有效范围1~1000
nearSearchSize = getNearSearchSizeConf(cmn.GetEnvInt("GLC_NEAR_SEARCH_SIZE", 200)) // 定位相邻检索的查询件数默认200有效范围50~1000 nearSearchSize = getNearSearchSizeConf(cmn.GetEnvInt("GLC_NEAR_SEARCH_SIZE", 200)) // 定位相邻检索的查询件数默认200有效范围50~1000
mulitLineSearch = cmn.GetEnvBool("GLC_SEARCH_MULIT_LINE", false) // 是否检索日志的全部行日志可能有换行默认false仅第一行 mulitLineSearch = cmn.GetEnvBool("GLC_SEARCH_MULIT_LINE", false) // 是否检索日志的全部行日志可能有换行默认false仅第一行
testMode = cmn.GetEnvBool("GLC_TEST_MODE", false) // 是否测试模式默认false testMode = cmn.GetEnvBool("GLC_TEST_MODE", false) // 是否测试模式默认false
enableChatAi = cmn.GetEnvBool("GLC_ENABLE_CHATAI", true) // 是否开启GLC智能助手默认true enableChatAi = cmn.GetEnvBool("GLC_ENABLE_CHATAI", true) // 是否开启GLC智能助手默认true
createIndexSync = cmn.GetEnvBool("GLC_CREATE_INDEX_SYNC", false) // 是否同步创建索引默认false
}
// 取配置: 是否同步创建索引
func IsCreateIndexSync() bool {
return createIndexSync
} }
// 取配置: 是否开启GLC智能助手 // 取配置: 是否开启GLC智能助手
@ -188,6 +183,11 @@ func IsEnableCors() bool {
return enableCors return enableCors
} }
// 取配置: 创建索引使用的最大协程数量默认是最大CPU数量设定值不在实际数量范围是按最大看待
func GetGoMaxProcessIdx() int {
return goMaxProcessIdx
}
// 取配置: 使用的最大CPU数量可通过环境变量“GLC_GOMAXPROCS”设定默认最大CPU数量 // 取配置: 使用的最大CPU数量可通过环境变量“GLC_GOMAXPROCS”设定默认最大CPU数量
func GetGoMaxProcess() int { func GetGoMaxProcess() int {
return goMaxProcess return goMaxProcess

View File

@ -34,6 +34,8 @@ type LogDataStorage struct {
closing bool // 是否关闭中状态 closing bool // 是否关闭中状态
mu sync.Mutex // 锁 mu sync.Mutex // 锁
wg sync.WaitGroup // 计数 wg sync.WaitGroup // 计数
muIdx sync.Mutex // 建索引锁
} }
var zeroUint32Bytes []byte = cmn.Uint32ToBytes(0) var zeroUint32Bytes []byte = cmn.Uint32ToBytes(0)
@ -133,12 +135,11 @@ func (s *LogDataStorage) readyGo() {
break break
} }
s.saveLogData(data) // 保存日志数据 s.saveLogData(data) // 保存日志数据
if conf.IsCreateIndexSync() {
s.createInvertedIndex() // 按配置要求同步生成反向索引
}
default: default:
// 空时再生成索引,一次一条日志,有空则生成直到全部完成 // 空时再生成索引,多协程跑起来加快速度,再来一次单条同步用于判断,有空则生成直到全部完成
for i := 0; i < conf.GetGoMaxProcessIdx()-1; i++ {
go s.createInvertedIndex() // 多协程跑起来加快速度
}
n := s.createInvertedIndex() // 生成反向索引 n := s.createInvertedIndex() // 生成反向索引
// 索引生成完成后,等待接收保存日志 // 索引生成完成后,等待接收保存日志
@ -178,17 +179,21 @@ func (s *LogDataStorage) saveLogData(model *LogDataModel) {
// 创建日志索引(一次建一条日志的索引),没有可建索引时返回0 // 创建日志索引(一次建一条日志的索引),没有可建索引时返回0
func (s *LogDataStorage) createInvertedIndex() int { func (s *LogDataStorage) createInvertedIndex() int {
s.muIdx.Lock() // 索引锁,建索引略需时间,手动控制不做全称锁
// 索引信息和日志数量相互比较,判断是否继续创建索引 // 索引信息和日志数量相互比较,判断是否继续创建索引
if s.TotalCount() == 0 || s.indexedCount >= s.TotalCount() { if s.TotalCount() == 0 || s.indexedCount >= s.TotalCount() {
s.muIdx.Unlock()
return 0 // 没有新的日志需要建索引 return 0 // 没有新的日志需要建索引
} }
s.indexedCount++ // 下一条要建索引的日志id docm, err := s.GetLogDataModel(s.indexedCount + 1) // 取出日志模型数据
docm, err := s.GetLogDataModel(s.indexedCount) // 取出日志模型数据
if err != nil { if err != nil {
s.muIdx.Unlock()
cmn.Error("取日志模型数据失败:", s.indexedCount, err) cmn.Error("取日志模型数据失败:", s.indexedCount, err)
return 2 return 2
} }
s.indexedCount++ // 下一条要建索引的日志id
s.muIdx.Unlock()
// 整理生成关键词 // 整理生成关键词
var adds []string var adds []string