11 Bitrix24のMySQL「料理のレシピ」



新しい倧きなプロゞェクトであるBitrix24を蚭蚈、開発、および立ち䞊げる際に、チヌムワヌクおよび無料-最倧12ナヌザヌ向けの非垞にクヌルなサヌビスを䜜成するだけでなく、クラりドの運甚経隓を収集しお蓄積したいず考えたしたWebサヌビス。高負荷のフォヌルトトレラントプロゞェクトの開発胜力を「掻甚」し、最も重芁なこずは、この知識をパヌトナヌおよび「高負荷」のトピックに近いすべおのWeb開発者ず共有するこずです。 :)

もちろん、1぀の蚘事1぀でもないで、絶察にすべおのプロゞェクトに適した普遍的な「レシピ」を説明するこずは䞍可胜です。䞀郚の人にずっおは、生産性がより重芁です信頌性を損なう堎合もありたす。ずりわけ、どこかに倚くの小さなテヌブルがあり、どこかに倧量のデヌタがある...

特定の実甚的な問題を解決する䞊で、私たちの仕事に䜕床も圹立っおきた「ハむラむト」を説明しようずしたした。 それらが圹に立぀こずを願っおいたす。 :)

順番に始めたしょう。

Bitrix24が Amazonにデプロむされおいるこずをすでに䜕床も述べ、 曞いおいたす。 そしお、私たちはさたざたなクラりドサヌビスを愛し、積極的に䜿甚しおいるため、最初の質問...

1.なぜRDSを䜿甚しないのですか

Amazon Relational Database Service Amazon RDSはクラりドベヌスのデヌタベヌスです。 MS SQL、Oracle、および-私たちにずっお興味深いもの-MySQLのサポヌトがありたす。

私たちは長い間じっず芋぀めおいたしたが、プロゞェクトでそれを䜿いたいず思いたした...その結果、私たちはこの考えを捚おたした。 いく぀かの䞻な理由


これはすべお、RDSが䞍適切なサヌビスであるこずを意味するものではなく、䜿甚しないでください。 そうではありたせん。 圌は私たちに特に合っおいたせんでした。 そしお、おそらく、誰かがAmazonツヌルを䜿甚しお正確にスケヌリングずフォヌルトトレランスを提䟛する方がはるかに簡単になるでしょう。

2.マスタヌスレヌブですか いいえ、マスタヌマスタヌ

MySQLの暙準のマスタヌスレヌブレプリケヌションスキヌムは、倚くのプロゞェクトで長い間䜿甚され、いく぀かの問題を解決しおいたす。負荷スケヌリング読み取り専甚-スレヌブぞのク゚リSELECTの再配垃、フォヌルトトレランス。

しかし、決定-完党ではありたせん。

1.スケヌリングしお蚘録したい。
2.信頌できるフェむルオヌバヌを実珟し、事故が発生した堎合に自動的に動䜜し続けたいマスタヌでの事故の堎合のマスタヌ/スレヌブでは、手動モヌドたたは半自動モヌドでスレヌブの1぀をマスタヌの圹割に切り替える必芁がありたす

これらの問題を解決するために、「マスタヌ-マスタヌ」レプリケヌションを䜿甚したす。 繰り返したすが、最近、Habréの別の投皿がこの手法に圓おられおいたす。

3. MySQL いいえ、Percona Server

最初の数ヶ月プロトタむプ、開発プロセス、サヌビスのクロヌズドベヌタテストの開始時で、暙準MySQLに取り組みたした。 そしお、圌らが長く働くほど、圌らはさたざたなフォヌクをよく芋たした。 最も興味深いのは、私たちの意芋では、 Percona ServerずMariaDBでした。

最終的に、Perkonを遞択したした-もちろん、同様の「反転」ロゎがあるためです。 ;



...そしお、私たちにずっお非垞に重芁であるこずが刀明したいく぀かの機胜


完党なリストは、 Perconaサヌバヌ機胜の比范セクションの Webサむトにありたす 。

重芁なポむント-暙準のMySQLからPercona Serverぞの移行では、コヌドやアプリケヌションロゞックを倉曎する必芁はありたせんでした。

そしお、ここで、「移動」のプロセスは非垞に興味深いものでした。 たた、「マスタヌ-マスタヌ」レプリケヌションでスキヌムを䜿甚したおかげで、ナヌザヌにはたったく気付かれたせんでした。 単にダりンタむムはありたせんでした。

移動スキヌムは次のずおりです。



4. MyISAM InnoDB

ここではすべおが簡単です。


* * *

アヌキテクチャの問題からより実甚的な問題に移行したす。 :)

5.すべおのデヌタを耇補する必芁がありたすか いいえ、すべおではありたせん。

ほずんどすべおのプロゞェクトには、損倱が重芁なデヌタたたは回埩可胜なデヌタがありたす。 含む-およびデヌタベヌス内。

私たちの堎合、そのようなデヌタはセッションでした。 すべおを耇補するこずの䜕が問題になりたしたか


このデヌタをレプリケヌションから陀倖するこずで、問題は完党に解決したした。

陀倖する方法は さたざたな方法がありたす。

1.アプリケヌションレベルで、レプリケヌションから陀倖するテヌブルを操䜜しおいる接続で、以䞋を実行したす。

SET sql_log_bin = 0; 

2.より簡単で盎感的な方法は、MySQL構成ファむルで䟋倖を指定するこずです。

 replicate-wild-ignore-table = %.b_sec_session 

この蚭蚈では、すべおのデヌタベヌスのb_sec_sessionテヌブルがレプリケヌションから陀倖されたす。

より耇雑なロゞックが必芁な堎合、すべおが少し耇雑になりたす。 たずえば、 dbデヌタベヌスを陀くすべおのデヌタベヌスでテヌブルテヌブルをレプリケヌトしないでください。

この堎合、オプションの適切な組み合わせであるフィルタヌを䜜成するには、MySQLが提䟛するような回路図を䜜成する必芁がありたす。


6.レプリケヌションのタむプ。

倚くの論争により、STATEMENTベヌスのレプリケヌションを䜿甚するのか、ROWベヌスのレプリケヌションを䜿甚するのかずいう疑問が生じたす。 それず他のオプションは䞡方ずもプラスずマむナスの䞡方を持っおいたす。

デフォルトでは、MySQLPercona5.5はSTATEMENTベヌスのレプリケヌションを䜿甚したす。

この構成のアプリケヌションでは、ログで次の行を定期的に確認したした。 「ステヌトメントはステヌトメント圢匏でログむンしおも安党ではない可胜性がありたす」 。

さらに、マスタヌ耇補マスタヌの2぀のデヌタベヌスを比范するず、デヌタに矛盟がある可胜性がありたす。 もちろん、これは受け入れられたせんでした。

MySQLには私たちに完党に合った興味深い゜リュヌションがありたす-MIXED binlog圢匏を䜿甚しおください

 binlog-format = mixed 

この堎合、デフォルトでは、レプリケヌションはSTATEMENTモヌドであり、そのような安党でない操䜜の堎合にのみROWに切り替わりたす。

7.耇補が壊れおいたす。 どうする

耇補がただ䞭断する堎合がありたす。 特に怖い最初は:)「マスタヌマスタヌ」で䜜業するずきに聞こえたす。

実際、心配するこずはありたせん。 真実は。 :)

たず、 説明されおいるマスタヌ-マスタヌ耇補スキヌムは、実際には2぀の通垞のマスタヌ-スレヌブ耇補であるこずに泚意しおください。 はい、いく぀かのニュアンスがありたすが、暙準スキヌムで䜿甚されるほずんどのプラクティスはここで機胜したす。

最も単玔な最も頻繁に発生する問題は、 「1062 Error 'Duplicate entry'」ずいう圢匏の゚ラヌです。

理由は異なる堎合がありたす。 たずえば、基地で事故が発生した堎合、トラフィックを別のDCに切り替えたす。 芁求がDC 1で既に実行されおいるが、DC 2でレプリケヌトされずに再床実行された堎合-はい、たさにこの゚ラヌが発生したす。

スレヌブで次のコマンドを実行するこずで凊理されたす。

 STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE; 

したがっお、远加のリク゚ストはスキップしたす。 次に、レプリケヌションステヌタスを確認したす。

 SHOW SLAVE STATUS\G 

必芁に応じお、手順を繰り返したす。

* * *

はい、珟圚、最も簡単なオプションを詳现に怜蚎しおいたす。 ファむルシステムが壊れたり、ファむルが壊れたりなど、すべおがさらに悪化したす。

「すべおを修正する方法」ずいう普遍的なレシピはありたせん。 ただし、次のこずに泚意するこずが垞に重芁です。


8.サヌバヌの1぀をバックアップからレプリケヌションマスタヌに䞊げる方法は

それで、2぀のマスタヌスキヌムで䜕かがうたくいかなかった堎合たずえば、 数日前にAmazonで事故が発生し 、耇数のサヌバヌ䞊のファむルシステムが䞍可逆的に砎損した堎合はどうすればよいでしょうか

「額に」゜リュヌション-あるサヌバヌから別のサヌバヌにデヌタを転送し、れロから耇補を開始する-長すぎる。

Amazonでは、 マシン党䜓にディスクスナップショットずむメヌゞングAMIメカニズムを䜿甚しおいたす。 これにより、たずえば数時間前など、目的のサヌバヌの完党なコピヌをすばやく展開できたす。

バックアップからマシンを展開する堎合、興味深い効果が埗られたす。「ラむブ」マスタヌbinlogからデヌタの読み取りを開始したすバックアップが䜜成された瞬間からが、デフォルトではレコヌドは同じサヌバヌのサヌバヌからであるため、それらの半分のみを読み取りたす。 idバックアップ時間に関する「未来」からは耇補されたせん。 これは、「マスタヌマスタヌ」の「ルヌプ」を回避するために行われたす。

これを行いたす

1.すべおのトラフィックは「ラむブ」DCに送られたす。 埩元するサヌバヌに負荷はありたせん。
2.バックアップから生成されたサヌバヌで、mysqldをすぐに停止し、構成に入力したす。

 skip-slave-start replicate-same-server-id #log-slave-updates = 1 ; ! 

3. mysqldを起動し、レプリケヌションを開始したす。
4.デヌタが同期された埌、蚭定を元の状態に戻したす。

 #skip-slave-start #replicate-same-server-id log-slave-updates = 1 

5.「マスタヌマスタヌ」があるため、逆方向にレプリケヌションを開始する必芁がありたす。 埩元したサヌバヌでレプリケヌションを停止し、次を実行したす。

 SHOW MASTER STATUS; 

レプリケヌションを停止しないず、デヌタが倉曎されたす。
6.目的の䜍眮から最初のラむブサヌバヌでレプリケヌションを開始したす。

 STOP SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS = ...; START SLAVE; 

パラグラフ5で取埗したデヌタを入力したす。
7. 2番目のサヌバヌでレプリケヌションを開始したす。

9.レプリケヌションのパフォヌマンスず信頌性のバランスはどうですか

MySQL / Perconaには、たずえば突然の再起動の堎合にデヌタの信頌性ず安党性を劇的に改善できる倚くのオプションがありたす。 それらのほずんどすべおが、システムの速床を劇的に䜎䞋させたす。

このオプションの組み合わせで、私たちは自分自身のバランスを芋぀けたした。
 sync_binlog = 1 sync_master_info = 0 sync_relay_log = 0 sync_relay_log_info = 0 innodb-flush-log-at-trx-commit = 2 

binlogは私たちにずっお重芁であるため、 sync_binlog = 1です。 ただし、同時に、binlogはシステム内の別のディスクに保存されるため、このディスクぞの曞き蟌みによっおシステム党䜓のパフォヌマンスが䜎䞋するこずはありたせん。

10.システムのパフォヌマンスを評䟡するにはどうすればよいですか

倧きな「重い」リク゚ストがある堎合は、もちろん、それらの実行の時間に぀いおはささいな方向に向いおいたす。

倚くの堎合そしお私たちの堎合-その方法です、システムは倚くの倚くの小さなリク゚ストを凊理したす。

もちろん、さたざたな暡擬テストを䜿甚しお、システムのパフォヌマンスを評䟡できたす。 そしお、圌らはいくらか感謝したす。 しかし、「戊闘で」䜿甚できる実際のむンゞケヌタヌできれば数字で衚瀺するこずをお勧めしたすが必芁です。

Percona Serverには玠晎らしいツヌルがありたす

 SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME; 

 +----------------+-------+----------------+ | time | count | total | +----------------+-------+----------------+ | 0.000001 | 0 | 0.000000 | | 0.000010 | 6555 | 0.024024 | | 0.000100 | 56132 | 2.326873 | | 0.001000 | 23165 | 6.686421 | | 0.010000 | 9755 | 39.737027 | | 0.100000 | 1437 | 40.831493 | | 1.000000 | 141 | 31.785571 | | 10.000000 | 9 | 17.891514 | | 100.000000 | 0 | 0.000000 | | 1000.000000 | 0 | 0.000000 | | 10000.000000 | 0 | 0.000000 | | 100000.000000 | 0 | 0.000000 | | 1000000.000000 | 0 | 0.000000 | | TOO LONG | 0 | TOO LONG | +----------------+-------+----------------+ 14 rows in set (0.00 sec) 

このようなク゚リ実行時間の分垃のヒストグラムは、システムの䞀般的な状態を評䟡するのに非垞に圹立ちたす。

たずえば、特定の重倧なしきい倀を決定したした-実行時間が0.01秒を超える党䜓の芁求の5以䞋です。

ダむナミクスでこの状態を远跡するために、この比率のグラフを描画するだけのMuninの簡単なプラグむンを䜜成したした。 これは非垞に䟿利であり、そしお最も重芁なこずは、明確で明確な指暙です。

11.メモリヌバランス。

MySQLの蚭定は、メモリ消費のバランスが取れるようにする必芁がありたす

それは単玔で理解可胜なルヌルのようですが、しばしば忘れられたす。 数回最初はプロトタむプで告癜したしたが、OOMOut of memoryを受け取り、その結果、オペレヌティングシステムによっおmysqldプロセスが「匷制終了」されたした。

理想的には、mysqldプロセスは完党にRAMに収たり、スワップでは動䜜しないような方法で動䜜するはずです。

必須 -すべおのシステムプロセスをメモリ+スワップに配眮する必芁がありたす。

倚くの堎合、mysqldが消費できるメモリ量の蚈算は、倚くの人には明らかではありたせん。

匏は次のようなものです。


本圓に考慮したくない堎合:)、mysqltuner.plスクリプトを䜿甚できたす。これは、この情報に加えお、システム、セキュリティ、パフォヌマンスなどに関する他の倚くのデヌタを衚瀺したす。

 # wget mysqltuner.pl # perl mysqltuner.pl 


* * *

この堎所を読んでくれおありがずう :)



Bitrix24の䜜業で䜿甚する実甚的な問題ず手法の䞀郚のみを怜蚎したした 。 圌らぞの感謝を含め、サヌビスは成長し、発展しおいたす。

私たちの経隓が、プロゞェクトの䜜成ず開発に圹立぀こずを願っおいたす。

そしお今、1぀の蚘事のボリュヌムが完党に䞍十分であるこずは明らかです。 近い将来、倧芏暡なプロゞェクトでMySQLを䜿甚するずいうトピックを継続し、新しいレシピを共有し、最も興味深く関連性のあるトピックをより詳现に説明しようずしたす。

Source: https://habr.com/ru/post/J147098/


All Articles