답변:
우리는 MySQL 클러스터에 대해 상당히 광범위한 경험을 가지고 있으며 Percona는 복잡한 구성의 경계를 넓힐 때 여러 번 우리와 함께 작업했습니다.
Magento 는 기본적으로 다른 데이터베이스 서버로 읽기 / 쓰기를 분리 할 수 있습니다 (예 : EE 1.11과 같이 몇 가지 릴리스 된 경우 제외)- select
추가 (또는 그 이상의) 서버로로드를 오프셋 할 수 있습니다 . 모든 update/write
쿼리를 단일 마스터로 전달합니다 .
이것은 더 적절한 질문입니다. MageStack 과 같은 전용 Magento 운영 체제에서는 내장 된 서버 측 고급 캐싱 기술을 사용하고 쉽게 사용할 수있게되었습니다 (예 : Varnish 프론트 엔드 캐싱 및 Redis 백엔드 캐싱).
역사적으로 Magento는 MySQL이 아니라 PHP에 구속 된 적이 있습니다. 그러나 니스 및 전체 페이지 캐싱 (FPC)이 더 자주 사용됨에 따라 반복되는 작업 (카테고리 / 제품로드, 빈번한 검색)의 부담이 갑자기 흡수되고 PHP는 부담이 줄어 듭니다. 실제로 콘텐츠를 처음에 생성하거나 캐싱 할 수없는 시나리오를 완료하는 것 (장바구니에 추가, 주문 완료 등) 만 실제로 작동합니다. 설명을 위해 의도적으로 관리로드를 무시하고 있습니다.
우리는 여기 와 여기 모두 에서 볼 수 있듯이 MySQL이 대부분의 소매점에서 관심 분야가 아니라는 사실에 항상 섰 습니다 . 그러나 한 자리 또는 두 자리 숫자가 아닌 시간당 수백 개의 주문을 처리하는 지역에서 곧 최적화 영역이 될 것입니다.
더 작은 매장에 적합 (매일 25 만 명 미만의 순 방문자)
오프셋에서 올바른 하드웨어를 제안 할 수 있고 매장에 가장 적합한 방식으로 기계를 구성한 적절한 호스트를 찾는 데 더 중점을 둘 것입니다 . 마스터 / 슬레이브 또는 마스터 / 마스터 구성을 추구하는 데 시간을 낭비하지 마십시오. 성능상의 이점이 없으며 궁극적으로 지속적인 관심과 고급 MySQL 지식이 필요합니다.
궁극적으로 하드웨어 크기 및 선택은 MySQL 최적화보다 더 큰 역할을합니다.
그러나 더 큰 매장의 경우
상점이 커지기 시작하면서 변환 또는 트랜잭션로드는 복잡 inserts
하고 완료하는 반복 된 작업으로 인해 더 많은 부담이됩니다 updates
. 각각의 새로운 주문을 추가하면 카탈로그 재고가 감소하고, 지불 게이트웨이에서 콜백되고, EPOS / ERP 시스템에서 업데이트됩니다. 이를 각 제품 / 카테고리의 관련 캐시 제거와 결합하면 곧 MySQL로드가 불균형 적으로 증가하는 것을 볼 수 있습니다.
다중 마스터는 우리가 실행 가능한 옵션으로 권장하거나 고려하지 않는 솔루션은 아니지만 마스터 / 슬레이브는 읽기로드를 2 차 / 3 차 노드로 상쇄함으로써 이점을 얻을 수 있습니다 (엔터프라이즈 규모의 상점에서 스트레스를 줄 수 있습니다).
먼저 슬레이브를 구성하십시오. 우리는 Percona 유틸리티와 MySQL 브랜치를 지지합니다. 기존 DB의 innobackupex 를 핫 백업 하는 데 이상적인 툴입니다 . 여기에 좋은 글이 있습니다 .
마스터
$ TIMESTAMP를 바꾸거나 탭을 완료하십시오.
mysql
> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'$slaveip' IDENTIFIED BY '$slavepass';
> quit;
innobackupex --user=username --password=password /path/to/backupdir
innobackupex --user=username --password=password /
--apply-log /path/to/backupdir/$TIMESTAMP/
rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP TheSlave:/path/to/mysql/
scp /etc/mysql/my.cnf TheSlave:/etc/mysql/my.cnf
노예에서
/etc/init.d/mysql stop
mv /path/to/mysql/datadir /path/to/mysql/datadir_bak
mv /path/to/mysql/$TIMESTAMP /path/to/mysql/datadir
chown -R mysql:mysql /path/to/mysql/datadir
sed -i 's#server-id=1#server-id=2#g' /etc/mysql/my.cnf
/etc/init.d/mysql start
cat /var/lib/mysql/xtrabackup_binlog_info
> TheMaster-bin.000001 481
mysql
> CHANGE MASTER TO MASTER_HOST='$masterip', MASTER_USER='repl', MASTER_PASSWORD='$slavepass', MASTER_LOG_FILE='TheMaster-bin.000001', MASTER_LOG_POS=481;
> START SLAVE;
그런 다음 슬레이브가 작동하면 실제로 몇 줄의 코드 만 추가하면됩니다.
에서 ./app/etc/local.xml
<default_read>
<connection>
<use/>
<host><![CDATA[host]]></host>
<username><![CDATA[username]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[dbname]]></dbname>
<type>pdo_mysql</type>
<model>mysql4</model>
<initStatements>SET NAMES utf8</initStatements>
<active>1</active>
</connection>
</default_read>
출처
일반적으로 Magento는 데이터베이스 바운드가 아니라 CPU 바운드이며 대부분의 CPU 활동을 캐시 할 수 있으므로 varnish / nginx 설정에 대한 많은 자습서를 찾을 수 있습니다. 여기에 설명 된대로 관리자를 별도의 웹 노드로 이동할 수도 있습니다 .
일반적인 견고성을 위해 벅을위한 최고의 성능은 관리 형 MySQL 서비스입니다.
Amazon RDS에 대한 경험이 있지만 장애 조치, 백업, 업그레이드, 확장 / 축소 및 읽기 전용 복제본 생성을 자동화합니다. 따라서 자동 장애 조치 기능이있는 고 가용성 마스터 노드를 사용할 수 있습니다. Amazon은 슬레이브를 동기화 상태로 유지하기 위해 사용자 지정 바이너리 로그 복제를 사용하고 장애 조치는 일반적으로 2 분 미만으로 걸리며 읽기 복제본을 여러 개 만들 수 있습니다 보고 / 통합 요구에 맞게 확장해야합니다.
Magento의 아키텍처에서 매우 유용한 읽기 / 쓰기 분할을 살펴 보았지만 데이터베이스는 사용 사례에서 병목 현상이 없습니다. 최적화해야 할 것을 추측하는 대신 xhprof / xhgui 와 같은 프로파일 링을 사용하는 것이 좋습니다 . 프로파일 링의 첫 번째 규칙은 측정하는 것입니다.
나는이 어떤 생산 경험하지 않은,하지만 일부 파고 후 내가 발견 한 이 기사를. 이 기사에서는 누군가가 Magento에 대한 마스터-슬레이브 복제를 설정하는 방법을 설명하므로 유용 할 것입니다.
가장 중요한 비트 :
/app/etc/local.xml
<default_setup>
<connection>
<host><![CDATA[Master-host]]></host>
<username><![CDATA[user]]></username>
<password><![CDATA[pass]]></password>
<dbname><![CDATA[magentodb]]></dbname>
<active>1</active>
</connection>
</default_setup>
<default_read>
<connection>
<use/>
<host><![CDATA[Slave-host]]></host>
<username><![CDATA[user]]></username>
<password><![CDATA[pass]]></password>
<dbname><![CDATA[magento]]></dbname>
<type>pdo_mysql</type>
<model>mysql4</model>
<initStatements>SET NAMES utf8</initStatements>
<active>1</active>
</connection>
</default_read>
마스터 MySQL 서버 (/etc/mysql/my.cnf)의 구성은 파일의 아래 내용을 추가합니다 :
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = magento_demo
binlog_ignore_db = mysql
슬레이브 MySQL 서버 (/etc/mysql/my.cnf)에 대한 구성은 파일의 아래 내용을 추가합니다 :
[mysqld]
server-id=2
log-bin=mysql-bin
master-host=192.168.1.2
master-user=username
master-password=111111
master-port=3306
replicate-do-db=magento_demo
replicate-ignore-db=mysql
master-connect-retry=60
나중에 두 MySQL 서버를 다시 시작하십시오.
dns round-robin을 사용 하여 카탈로그 읽기를 슬레이브 서버로 분할 할 수 있습니다 .
따라서 MySQL에서 일반 마스터-> 슬레이브 복제를 설정하십시오.
그런 다음 Magento 설정에서 라운드 로빈 구성 dns 호스트에서 읽기를 수행하도록 카탈로그를 구성 할 수 있습니다. 쓰기는 마스터 데이터베이스에 유지됩니다.
당신은 이것을 할 수 있습니다 app/etc/local.xml
<catalog_read_setup>
<connection>
<host><![CDATA[round.robbin.dns.host]]></host>
<username><![CDATA[USERNAME]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[DATABASE]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</catalog_read_setup>
<catalog_read>
<connection>
<use>catalog_read_setup</use>
</connection>
</catalog_read>
동일한 방식으로 다른 MySQL 인스턴스를 사용하도록 모든 코어 (및 타사) 모듈을 리디렉션 할 수 있습니다.