2010-03-06 1 views
0

내 세션을 처리하기 위해 별도의 데이터베이스를 사용해야하는지 여부에 대한 조언을 찾고 있습니다.세션을 처리하기위한 다른 데이터베이스 ... 올바른 일을하고 있습니까?

여러 사용자가 로그인하여 계정 별 정보를 확인/업데이트 할 수있는 웹 앱을 작성 중입니다. 우리는 세션 정보를 저장하기 위해 웹 서버에서 파일 저장 방법을 사용하고 싶지 않았기 때문에 데이터베이스 (MySQL)를 사용하기로 결정했습니다. 괜찮 으면 좋겠지 만 생산에 들어갈 때 성능에 대해 궁금해합니다.

현재 두 개의 데이터베이스 (rst_sessions 및 rst)가 있습니다. "RST"데이터베이스는 모든 테이블이 webapp 용으로 저장되는 곳입니다 ... 그들은 테이블을 연결하기 위해 참조 무결성/외래 키를 사용하는 모든 MYSQL InnoDB입니다. "RST_SESSIONS"데이터베이스에는 단순히 하나의 테이블이 있으며 모든 세션 정보가 거기에 저장됩니다.

내 관심사 중 하나입니다. PHP 코드에서 "RST"에 대한 쿼리를 실행하려면 PHP 내부에서 데이터베이스를 선택해야합니다 ($ db-> select ("RST")) ... 쿼리가 끝나면 "RST_SESSIONS"($ db-> select ("RST_SESSIONS"))를 다시 선택해야합니다. 그렇지 않으면 세션 특정 정보가 설정되지 않습니다. 그래서, webapp을 통해 코드는 두 개의 데이터베이스를 선택하고 재 선택하는 작업을 많이하고 있습니다. 이로 인해 사용자 기반 (10,000 - 15,000)의 성능 문제가 발생할 가능성이 있습니까? 모든 선택을 피하기 위해 RST_SESSIONS 테이블을 RST 데이터베이스로 옮기는 것이 더 좋을까요?

우리가 처음 이런 식으로 설정 한 이유 중 하나는 별도의 데이터베이스 서버에 세션 정보를 저장할 수있어서 웹 응용 프로그램 데이터베이스의 작업을 방해하지 않았기 때문입니다.

두 가지 방법의 장점과 단점은 무엇이며 우리는 성능 향상을 위해 무엇을 제안합니까? 미리 감사드립니다.

답변

1

퍼포먼스가 걱정된다면 다른 대안은 데이터베이스에 세션을 저장하지 말고 memcached과 같은 것을 사용하는 것입니다. PHP 라이브러리는 memcached와 대화 할 때 세션 용 핸들러를 제공합니다.

사용되는 memcached의 장점 몇 :

  • 디스크에 없음 히트 : 모든
    • 은 물론,이 서버가 충돌하면 세션이 손실됩니다 의미 RAM에; 충돌이 발생하는 경우에, 당신은 아마 jsut 잃고 세션 이외의 다른 문제를 가지고 있습니다, 이것은 종종 많은 웹 사이트에 의해 생산에 사용
  • 일어날 가능성이 없습니다, 잘 작동 (나는 그것을 사용하고 있습니다 웹 사이트의 몇 가지)
  • 더 나은 확장 성 : 당신이 당신의 memcached를 클러스터에 대한 더 많은 RAM 이상의 CPU 전력을 필요로하는 경우, 단지
  • 서버의 몇 가지를 추가 내가 추가 할 : 당신이 memcached를 사용하기 시작하고 나면, 당신을 캐싱 메카니즘으로도 사용할 수 있습니다 ;-)


지금, 특정 질문에 대답 :

를 대신 DB를 선택하는, 내가 두 가지 연결을 사용합니다 : 응용 프로그램에 대한 사용의 DB를위한

  • 하나,
  • 그리고 하나를 세션에 사용되는 DB에 대한 기타 물론

, 이것은 서버 에 조금 더 부하를 의미 (그것은 열 연결의 수를 두 배로)하지만 필요할된다 하루, 당신은 이동 할 수 있습니다, 있는지 확인 "세션"데이터베이스를 다른 서버에 연결 : 연결 문자열을 다시 구성하면됩니다. 응용 프로그램이 이미 두 개의 별도 연결을 사용하기 때문에 여전히 잘 작동합니다.

+0

감사합니다. memcached를 살펴볼 것입니다 ... db 연결이 필요없고 디스크에 손댈 수없는 좋은 방법 같아요. 디스크를 어떻게 사용할 수 있는지 더 읽으 려합니다. – Ronedog

0

함께 살 수있는 경우 데이터베이스에 대한 두 번째 연결을 엽니 다. 그렇게하면 데이터베이스간에 전환 할 필요가 없습니다. 물론 이제는 두 배의 연결을 소비하므로 한도를 높이야 할 수도 있습니다.

0

인증 정보를 별도의 데이터베이스에 저장해야하는 몇 가지 중요한 이유가있는 경우가 아니면 나머지 데이터와 함께 저장하지 않으시겠습니까? 모든 것을 한 곳에 모으는 것이 편리 할 수 ​​있습니다.

또한 스키마 (데이터베이스) 이름과 같은 sql 쿼리의 테이블 이름을 한정 할 수 있습니다.

SELECT ACTIVE 
FROM RST_SESSIONS.SESSION 
WHERE SID=*whatever* 

두 서버가 동일한 서버에있는 경우 명시 적으로 스위치를 전환 할 필요가 없습니다.