이름은 거창한데 별거 없다.
일단 검색이라고 하면 무언가 어딘가에 저장되어있는 것을 가져온다는 것이 기본 베이스로 시작된다.
그럼 저장은 어떤 구조로 되는걸까?
저장을 생각하려면 DataBase가 나오지 않을 수 없다.
데이터는 DB에 담아놓으니까.
DB는 2가지의 방향으로 또 갈라지게 된다.
마치 엑셀과도 같은 모양을 가진 관계형 데이터베이스(SQL)
통째로 꾸겨넣어서 사용하는 비관계형 데이터베이스 (NOSQL)
그리고 이 둘의 차이점은 인덱스를 하는 방식에 차이를 둔다.
SQL 같은 경우에는 PK, FK등을 인덱스(고유 값)을 가지는데 반하여
NOSQL같은 경우에는 역인덱스라는 이름으로 저장되는 문장을 단어 단위로 쪼개서 저장하는 방식을 택하고 있다.
그러다보니 SQL 같은 경우 PK, FK가 아닌 것은 풀 테이블 스캔을 활용하여 검색을 하는 과정이 느려지고
NOSQL 같은 경우에는 전부 다 쪼개놔서 조건을 제대로 입력만 해온다면 빠른 속도로 가져올 수 있다는 특징이 있다.
대충 두개의 차이를 알았으니 내가 만들어놓은 검색 로직의 흐름을 올려놓고 설명을 덧붙여볼까 한다.
원래 생각은 데이터가 저장이 될 경우 logstash에서 EL과 Redis로 한번에 데이터를 넣어주는 것을 생각하고 있었는데
이 경우에 필터링 작업을 거칠 수가 없는 것 같아서 바로 Redis에 냅다 꽂아버리는 것은 포기했다.
애초에 output에 Redis 플러그인 있어서 좀 써보려니까 오류가 무슨(....)
그래서 나온 결론 위의 로직 흐름과 같다.
단지 업데이트 된 것은 그림으로만 표현이 되어있어서 이해가 힘들 수도 있는데 큰 차이는 없다.
logstash에서 EL로 저장을 할 경우 각각 Unique한 값을 index(색인)를 박아버린 상태로 저장을 하고
새롭게 업데이트 된 내용이 EL 속 index가 동일한 값이 있다면 덮어쓰기 하는식으로 로직을 구현해놨다.
하지만 문제가 하나 있었는데, 바로 Redis에서 데이터를 살려두는 시간이였다.
데이터는 계속 업데이트가 될 것이고, 그럴 경우 EL은 동기화작업이 있어서 값이 변하게 된다.
하지만 누군가 요청을 해서 만들어진 Redis의 값에 업데이트가 된 내용이 필요가 없는 것일 수도 있고
새롭게 추가된 내용이 불필요한 내용일 수도 있다.
그러나 Redis의 값을 갱신을 시켜주지 않는다면 유저는 현재의 데이터가 아닌 과거의 데이터를 열람할 수 밖에 없게 되는데...
이것을 어떻게 처리를 해야할지 고민을 좀 하고 있다.
새로 생성되는 값의 ttl을 낮게 설정해두는게 최선이라고 생각하는데, 어떻게 해야할지 잘 모르겠다@_@
동기화 관련 문제는 그냥 모두가 생각하는 고민인 것 같아서..... 고민을 해본다고 답이 나올지 걱정이다.
열심히 찾아서 적용을 시킬까 하다가도 검색에 사용되는 불필요한 정보인지 아닌지 구분을 하는게 어려울 것 같다.