2012-02-20 3 views
0

나는 만들고있는 응용 프로그램과 함께 바위와 어려운 장소에 갇혀 있어요. 기본적으로이 프로그램은 매우 큰 데이터 세트를 생성합니다 (10 기가 이상이고 서버의 메모리를 초과하며 나중에이 데이터 세트를 사전에서 다른 서버로 전송하기가 어렵습니다). 데이터베이스를 사용하여 데이터를 저장하기로 결정했지만 더 많은 프로세스를 생성 할 때 사용 가능한 코어의 10 % 이상을 사용하지는 않지만 mysql 서비스는 항상 60-100 % 정도의 문제가 발생합니다.mysql이 대량의 동시 쓰기를 처리하도록하는 방법이 있습니까?

mysql을 사용하는 코어는 60-100 % 사이에서 실행됩니다. 나는 기본적인 mysql 코스를 가져 왔지만 그것에 대한 전문가는 아니며 단지 프로그램의 로컬 변수를 저장/배포하기 위해 사용하고있다. 어떻게 문제를 해결할 수 있는지 또는이 문제를 해결할 수 있는지에 대한 제안? 내가 가진 한 가지 생각은 내 메모리가 내가 쓸 계획 인 전체 데이터베이스를 저장할 수는 없지만 서버가 일부 메모리를 사용하여 일부 요청을 처리 한 다음 메모리가 가득 찼을 때 쓰기를 원합니다. (지금은 mysql이 1보다 작습니다. 서버 메모리의 %).

내 목표를 잘 알고 있기 때문에 특정 유형의 시스템에 충성하지 않아서 mysql이 좋은 해결책이 아닌 경우 다른 도구를 사용해 보니 기쁘다. (나는 hbase를 사용할 것이지만 mysql로드를 사용했다. 먼저). 더 좋은 것이 있으면 알려주세요.

답변

1

모두 실제로 수행하려고하는 작업에 따라 다르지만 좋은 조언을 얻으려면 더 많은 정보를 제공해야합니다.

많은 수의 쓰기로 무엇을 의미합니까? 10? 100? 1000? 초당?

쓰려는 스키마는 무엇입니까? 스키마에 구현 된 인덱스는 무엇입니까?

글을 쓸 때 독서가 많습니까? 아니면이 글을 쓰고 있습니까?

글쓰기 중에 무엇을하고 있습니까? 그것은 당신이 쓰고있는 하나의 행입니까, 아니면 트랜잭션으로 싸여진 많은 연산입니까?

서버 구성이란 무엇입니까? 기억? 디스크? mySQL의 버전.

데이터베이스에 Innodb를 사용하고 있습니까?

이제 한 가지 시도해 볼 수있는 것은 SHOW FULL PROCESSLIST;를 실행하는 것입니다. 이렇게하면 어떤 유형의 잠금이 발생했는지를 알 수 있습니다. 잠긴 상태에서 많은 프로세스를 볼 수 있다면 잠기지 않은 프로세스 중 하나를 찾아 잠금을 유발하는지 확인하십시오. 이 명령에 대한 자세한 정보는 http://dev.mysql.com/doc/refman/5.0/en/show-processlist.html을 참조하십시오.

+0

나는 8 개의 프로세서를 생성하므로 8 초가 씁니다. 테이블에는 현재 하나의 열만 있습니다 (고유해야합니다). 인덱스가 없습니다 (읽기와 쓰기가 도움이된다는 생각은 아무 것도하지 않았습니다). 그것의 진짜로 2 개의 가동, 그것의 a는 데이타베이스에 쓸 것이다 존재하지 않는 경우에. 버전은 5.1.61입니다. 설정에 대해서는 잘 모르겠다. 기본값 인 centos 6과 Innodb를 사용하고있다. 잠긴 proceses를 보았을 때 11 행의 결과가 있었고 그 중 2 가지는 잠겨 있지 않았습니다 (하나는 사용 권한을 확인하고 다른 하나는 그물에 쓰는 중입니다). – Lostsoul

+0

앱을 데이터베이스와 동일한 서버에서 실행하고 있습니다. 필요한 경우 이동할 수 있습니다.서버는 8 코어를 가지고 있지만 SQL은 1을 넘었고 앱은 10 %를 덜 받아 각각의 코어는 90을 MySQL에 가지고 있습니다. – Lostsoul

+0

그건 정말 볼륨 측면에서 아무것도 아닙니다 - mySQL은 간단한 랩탑 컴퓨터에서 잠을 잘 수 있습니다. 인덱스가없는 것은 좋은 일이 아닙니다. 특히, 쓰기 전에 읽기를 수행하는 경우 - 인덱스가 없으면 mysql이 각 삽입 (해당 스캔 동안 관련 잠금 포함)에 대해 전체 테이블 스캔을 수행합니다 - 거대한 데이터 세트에서 초당 x6 정말 당신의 프로세스를 씹을 수 있습니다. 처음에 검색하는 필드에 인덱스를 추가하고 이것이 경합을 줄이는 데 도움이되는지 확인하는 것이 좋습니다. – AlexGad

1

코드에 의해 생성 (또는 수신)되는 많은 데이터를 유지하려는 경우 (코드의이 부분에서 자주 가져 오기를 원하지 않는 것 같습니다) 그렇다면 데이터 생성 속도가 너무 빠르기 때문에 MySQL 대신 MongoDB와 같은 NoSQL 데이터베이스를 사용하는 것이 좋습니다. 이들은 방대한 양의 데이터 세트를 위해 만들어졌으며 클러스터에 준비되어 있으며 ... (단지 문서화로 이동).

+0

나는 많은 데이터를 유지해야한다면 NoSQL db를 사용할 수 있다는 가정에 동의하지 않을 것입니다. 얼굴을 보자. 페이스 북은 mySQL에 많은 양의 데이터를 저장하지 않고서는 어디로 가지 않았는가? 내 경험에 비추어 볼 때, mySQL은 많은 양의 데이터를 처리 할 수 ​​있지만, 다른 모든 것들처럼 올바르게 사용되어야합니다. 필자는 MongoDB와 Redis를 사용했으며 특정 영역에서 두 가지 모두 탁월한 편 이었지만 이미 mySQL이 설치되어 있다면 문제가있는 다른 것으로 옮겨 가기 전에 무엇이 잘못되었는지 알아내는 것이 더 좋은 생각이 아닌가? ? – AlexGad

+0

나는 또한 데이터가 메모리에 적합하지 않다고 언급했음을 덧붙인다. 작업 세트가 MongoDB의 메모리에도 적합하지 않을 가능성이 높습니다.그렇다면 Mongo가 모든 것을 기억할 수 없다면 정말 바람을 피우는만큼 성능이 더 떨어집니다. 게다가, 높은 쓰기는 Mongo의 전역 쓰기 잠금의 영향을받을 수 있습니다. 그걸 해결하는 방법은 샤딩 (sharding)과 관련이 있지만, 이제 상황은 더욱 복잡해지고 있습니다. 앞에서 언급했듯이 다른 곳을 찾기 전에 mySQL 구현을 통해 실제 문제가 무엇인지 파악하는 것이 좋습니다. – AlexGad

+0

귀하의 조언 모두 주셔서 감사합니다. 난 정말 (불꽃 전쟁이나 아무것도 시작하려고하지) 고맙지 만, 정말 어떤 특정 솔루션에 첨부 파일이 내 요구에 맞는 무언가를 원한다. 나는 hbase에게 시도를 줄 예정 이었지만 mysql에서 수정해야 할 것이 있는지 또는 다른 것이 더 나은지 확실하지 않았다. 나는 moogodb을보고 @ AlexGad의 질문에 대답 할 것이다. mysql 데이터베이스를 살펴본 후 그걸 알아 낸다. – Lostsoul

관련 문제