検索

ホームページ  >  に質問  >  本文

并发 - redis队列里每天有超过一亿条数据,使用python如何高效的将其写入sql数据库?

使用python拉redis队列里的数据,如何确保完整高效不阻塞的把每天上亿条的数据写入mysql/oracle数据库?

PHPzPHPz2802日前876

全員に返信(6)返信します

  • 怪我咯

    怪我咯2017-04-17 18:03:11

    プロセス全体はキュー + 消費キューです。

    一連のアイデアを教えてください:

    1. monitor コマンドを使用して Redis イベントを監視するか、Redis バージョン (>=2.8) をアップグレードして Redis 変更イベントを監視します。

    2. 複数のプロセス/スレッド/コルーチンがイベントを処理します (バッファーに入れるなど)

    3. バッファ データはバッチでデータベースに挿入されます。 (mysql は一度に最大 5,000 個の項目を挿入できるようですが、よくわかりません。9999 個か 4999 個かもしれませんが、上限があります)、SQL データベースのトランザクション機能に依存しており、失敗した場合はロールバックされます。

    山の話シリーズ:

    4. このような大きなデータの場合は、列データベース、hbase などを検討できます。

    無責任シリーズ:

    5. 海外・国内含めたmongodbのデータ量カンファレンスや、私の周囲でテストした結論には問題があると言う人もいるようです。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 18:03:11

    どのデータベースが使用されていますか? MySQL と SQL Server のスタンドアロン バージョンのパフォーマンスは大きく異なります。 SQL Server / Oracle / DB2 のパフォーマンスは同じレベルです。オープンソースの MySQL のパフォーマンスはあまり良くありません。クラスターを考慮すると、postgresql の方が優れています。
    このような大量のデータをデータベースに移動する場合は、
    1) 適切なインデックスにより、書き込みパフォーマンスが大幅に向上する可能性があることを考慮する必要があります。
    2) データベースがマスター/スレーブ設計でない場合は、RAID または SSD の使用を検討してください。パフォーマンスは通常の機械式ハードドライブよりも少しも劣りません。
    3) MySQL を例として、異なるデータベース エンジンを使用しても、InnoDB と MyISAM の間には依然としてパフォーマンスの違いがあります。
    4) すべてのレコードをコミットしないでください。一元化されたコミットのパフォーマンスは 10 倍以上向上します。
    5) 読み取りと書き込みを分離すると、データの書き込みがデータの読み取りをブロックすることになります。

    毎日のデータ量が非常に大きい場合、SQL は適切ではありません。Hadoop + HBase を検討してください。
    実際、どのデータベースを使用するかはデータ形式に大きく依存します。たとえば、HDF5 はバイナリ データや空間データに適しています。

    返事
    0
  • PHPz

    PHPz2017-04-17 18:03:11

    このような大量のデータには mongodb を使用した方が速いでしょう

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 18:03:11

    Mysql はあまり使われていませんが、SQL Server には 1 秒で簡単に 10,000 を超えるバッチインポート機能があります。
    Mysqlには一括挿入の機能もあると思いますが、挿入後の後処理はサブデータベースとテーブルのマスタースレーブ型を考慮する必要があります。

    返事
    0
  • 迷茫

    迷茫2017-04-17 18:03:11

    毎日 1 億個のデータを mysql に挿入します。 。 。クエリの分析が問題です。 。しかし、それは単なる履歴データであるはずです

    返事
    0
  • PHPz

    PHPz2017-04-17 18:03:11

    1. [完了]: 検証メカニズムを使用します。

    2. [効率的]: バッチ読み取り、バッチ書き込み、または専用インターフェイスを使用します。

    3. [ブロックなし]: ブロックをまったく行わないことは不可能です。ブロック時間をできるだけ短くすることはできません。これには、タスクの分割とタイムシェアリングという 2 つのメカニズムを使用する必要があります。機械学習に基づくパフォーマンス曲線推定とリアルタイム負荷分散という 2 つの高度な処理方法を導入することもできます。

    返事
    0
  • キャンセル返事