작은 배경
나는 수년간 멀티 테넌시 앱을 실행하기 위해 Apartment gem 을 사용해 왔습니다. 이제는 데이터베이스를 별도의 호스트로 확장해야 할 필요성에 도달했으며 DB 서버는 더 이상 유지할 수 없습니다 (읽기와 쓰기가 너무 많이 걸리는 경우). 그렇습니다. 하드웨어를 최대로 확장했습니다 (전용 하드웨어, 64 코어, RAID 10의 12 Nvm-e 드라이브, 384Gb 램 등).
이 테넌트 별 (1 테넌트 = 1 데이터베이스 연결 구성 / 풀)을 수행하는 것을 고려하고 number-of-tenants
있었습니다. 이는 애플리케이션 코드 변경 작업을 수행하지 않고도 용량을 최대로 늘릴 수있는 "간단하고"효율적인 방법이기 때문 입니다.
이제 레일 4.2 atm.을 실행 중이며 곧 5.2로 업그레이드하고 있습니다. Rails 6은 모델 별 연결 정의에 대한 지원을 추가하지만 20 개 테넌트 각각에 대해 완전히 미러링 된 데이터베이스 스키마를 가지고 있기 때문에 실제로 필요한 것은 아닙니다. 일반적으로 요청 (미들웨어) 또는 백그라운드 작업 (sidekiq 미들웨어) 당 "데이터베이스"를 전환하지만, 이는 search_path
Postgresql에서 설정 하고 실제 연결을 실제로 변경하지 않기 때문에 현재는 사소하고 처리 되지 않습니다. 테넌트 호스팅 전략으로 전환 할 때 요청마다 전체 연결을 전환해야합니다.
질문 :
ActiveRecord::Base.establish_connection(config)
요청 / 백그라운드 작업을 수행 할 수 있다는 것을 알고 있습니다. 그러나 또한 완전히 새로운 데이터베이스 연결 핸드 셰이크가 발생하고 새로운 DB 풀이 레일에 생성됩니다. 내 응용 프로그램에 대한 모든 단일 요청에서 이러한 종류의 오버 헤드를 만드는 성능 자살이 될 것입니다.- 따라서 누구나 처음부터 (예 : 응용 프로그램 부팅시) 여러 (총 20 개의) 데이터베이스 연결 / 풀을 사전 설정 한 레일을 사용하여 옵션을 볼 수 있는지 궁금한 경우 요청 당 해당 풀 사이를 전환하면됩니까? 따라서 db 연결이 이미 작성되었으며 사용할 준비가되었습니다.
- 이 모든 것이 나쁜 나쁜 생각일까요? 대신 다른 접근법을 찾아야합니까? 예 : 하나의 앱 인스턴스 = 하나의 특정 테넌트에 대한 하나의 특정 연결. 또는 다른 것.
master
. Rails Egde를 실행하는 것이 현재 Rails 버전에 대한 옵션입니까?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
은 매번 완전히 새로운 연결을 만드는 대신 풀을 다시 사용한다는 것을 의미합니까?