20200707のMySQLに関する記事は3件です。

Equalumがやって来た!(爆走編?)

さて、今回は何をするか・・・

前回の暴走編では、1000個のデータを一気に上流側のMySQLに挿入して、その変化を一気に下流側のMemSQLに反映させる検証を行いました。データの形式的には、間に何もオペレータを設定しない状況でしたので、流れ的には通常のレプリケーション作業になってしまうのですが、今回は暴走のさらに上を行く、「爆走編」と称して、少し複雑なオペレータを配置して、FLOW処理にも少し負荷を掛けた状態での検証を行ってみました。

FLOWの構成

今回設定したFLOWは以下の通りです。
(1)ルックアップ処理を2段(IDコードから製品名と価格、支店名を引っ張ってきて置き換える)
(2)トランスフォーム1(販売個数と価格から総計、消費税を計算し新しいカラムとして途中追加する)
(3)条件分岐(製品名で後段のポイント計算の式を割り振る)
(4)トランスフォーム2(商品に対応するポイント計算を行い、新規のカラムとして途中追加する)
(5)マージ処理

image.png

今回作成したGUI付きPythonの検証ツールで連続10000個(一万個)のデータ生成をリミッター無しで実施します。
スクリーンショット 2020-07-07 17.30.39.png

Equalumでの処理状況はこんな感じでした(先にテストで小規模なケースを行っています)
image.png

因みに今回の環境は・・・

今回は、MBP上に仮想環境(Equalumを稼働)とDocker(MySQLを2個稼働)を使って、同じ環境上からPythonを走らせて検証を実施しています。前回の場合は試用環境とはいえリッチな環境でもありましたので、今回はポータブル環境で何処まで行けるか・・・にも興味が有り企画してみました。

でっ、検証結果は??

本人的には、前回の検証とは違って「かなり負荷を掛けたつもり・・」だったのですが、想定外にサクッと終わってしまい約32秒で終了しました。前回の1000件が約2.3秒少々でしたので、まあコンピュータの性能差を考えて想定の範囲内。。。という事ですね。
取り敢えずは、スケール出来そうな感触なので推奨構成での運用に期待が持てると思います。

上流側のMySQL

 1|2020-07-07 17:29:22.830892|2020-07-07 17:29:22.0|         8|    8|      4|Discover        
 2|2020-07-07 17:29:22.834864|2020-07-07 17:29:22.0|         8|    6|      9|Cash            
 3|2020-07-07 17:29:22.837617|2020-07-07 17:29:22.0|         6|    1|      5|Cash            
 4|2020-07-07 17:29:22.840575|2020-07-07 17:29:22.0|         2|    6|      4|American Express
 5|2020-07-07 17:29:22.843461|2020-07-07 17:29:22.0|         8|    9|      1|Cash            
 6| 2020-07-07 17:29:22.84688|2020-07-07 17:29:22.0|         5|    3|      5|Mastercard      
 7|2020-07-07 17:29:22.850733|2020-07-07 17:29:22.0|         7|    5|      3|VISA 16 digit  
 8|2020-07-07 17:29:22.854262|2020-07-07 17:29:22.0|         8|    6|      7|Cash            
 9|2020-07-07 17:29:22.857108|2020-07-07 17:29:22.0|         3|    5|      8|Diners Club / Ca
10|2020-07-07 17:29:22.860963|2020-07-07 17:29:22.0|         7|    5|      7|JCB 16 digit    


 9990|2020-07-07 17:29:54.794126|2020-07-07 17:29:54.0|         3|    1|      7|JCB 16 digit               
 9991|2020-07-07 17:29:54.797143|2020-07-07 17:29:54.0|         7|    7|      1|Cash          
 9992|2020-07-07 17:29:54.800135|2020-07-07 17:29:54.0|         2|    1|      0|VISA 16 digit     
 9993| 2020-07-07 17:29:54.80318|2020-07-07 17:29:54.0|         5|    2|      9|Maestro    
 9994|2020-07-07 17:29:54.806082|2020-07-07 17:29:54.0|         6|    6|      9|Cash              
 9995| 2020-07-07 17:29:54.80908|2020-07-07 17:29:54.0|         6|    2|      3|JCB 15 digit    
 9996|2020-07-07 17:29:54.811969|2020-07-07 17:29:54.0|         1|    8|      9|Cash                
 9997|2020-07-07 17:29:54.815026|2020-07-07 17:29:54.0|         1|    4|      0|VISA 16 digit        
 9998|2020-07-07 17:29:54.818157|2020-07-07 17:29:54.0|         4|    3|      8|Cash                 
 9999|2020-07-07 17:29:54.821021|2020-07-07 17:29:54.0|         1|    4|      7|JCB 15 digit       
10000|2020-07-07 17:29:54.823901|2020-07-07 17:29:54.0|         4|    4|      8|Discover    

下流側のMySQL

 1|2020-07-07 17:29:22.830892|2020-07-07 17:29:22.0|泡盛     | 1980|    8|西新町 |Discover
 2|2020-07-07 17:29:22.834864|2020-07-07 17:29:22.0|泡盛     | 1980|    6|古橋  |Cash    
 3|2020-07-07 17:29:22.837617|2020-07-07 17:29:22.0|スコッチ   | 3500|    1|一丁目 |Cash  
 4|2020-07-07 17:29:22.840575|2020-07-07 17:29:22.0|ビール    |  490|    6|西新町 |American
 5|2020-07-07 17:29:22.843461|2020-07-07 17:29:22.0|泡盛     | 1980|    9|三丁目 |Cash    
 6| 2020-07-07 17:29:22.84688|2020-07-07 17:29:22.0|白ワイン   | 2500|    3|一丁目 |Masterc
 7|2020-07-07 17:29:22.850733|2020-07-07 17:29:22.0|ブランデー  | 5000|    5|二丁目 |VISA 1
 8|2020-07-07 17:29:22.854262|2020-07-07 17:29:22.0|泡盛     | 1980|    6|佐島  |Cash    
 9|2020-07-07 17:29:22.857108|2020-07-07 17:29:22.0|芋焼酎    | 2000|    5|五本木 |Diners C
10|2020-07-07 17:29:22.860963|2020-07-07 17:29:22.0|ブランデー  | 5000|    5|佐島  |JCB 16 

 9990|2020-07-07 17:29:54.794126|2020-07-07 17:29:54.0|芋焼酎    | 2000|    1|佐島  |JCB 16 digit 
 9991|2020-07-07 17:29:54.797143|2020-07-07 17:29:54.0|ブランデー  | 5000|    7|三丁目 |Cash                      
 9992|2020-07-07 17:29:54.800135|2020-07-07 17:29:54.0|ビール    |  490|    1|旭町  |VISA 16 digit
 9993| 2020-07-07 17:29:54.80318|2020-07-07 17:29:54.0|白ワイン   | 2500|    2|古橋  |Maestro   
 9994|2020-07-07 17:29:54.806082|2020-07-07 17:29:54.0|スコッチ   | 3500|    6|古橋  |Cash       
 9995| 2020-07-07 17:29:54.80908|2020-07-07 17:29:54.0|スコッチ   | 3500|    2|二丁目 |JCB 15 digit  
 9997|2020-07-07 17:29:54.815026|2020-07-07 17:29:54.0|バーボン   | 2500|    4|旭町  |VISA 16 digit 
 9998|2020-07-07 17:29:54.818157|2020-07-07 17:29:54.0|赤ワイン   | 3000|    3|五本木 |Cash           
 9999|2020-07-07 17:29:54.821021|2020-07-07 17:29:54.0|バーボン   | 2500|    4|佐島  |JCB 15 digit   
10000|2020-07-07 17:29:54.823901|2020-07-07 17:29:54.0|赤ワイン   | 3000|    4|五本木 |Discover      

今回のまとめ

今回は、短編検証として10000個の連続挿入に対してEqualumがどの様に動くか・・・を見てみました。
検証環境も性能範囲を縮小気味にして実施し、間に多段の処理ステップを設定しましたが、依然としてTIMESTAMP(6)では差が出てこない状況・・・(汗)、次回以降では少しこの辺を検討してみたいと思います。

Equalumの神髄は、

ストリーミングしながらデータ処理を行い、

着地した瞬間から次の作業が開始できる・・

という点にあります。
レプリケーションを実施する目的も幾つか存在しているかとは思いますが、複製してから処理をするのではなく、しながら処理を行うという点で新しいデータ・コンピューティングの可能性を与えてくれるのではないでしょうか?
kafkaに加えてSpark連携を最大限に活用できる・・・・この点もEqualumのアドバンテージになると確信できた検証でした。

何とか詐欺状態になりましたが、次回こそは番外編としてEqualumにもれなく付いてくるバッチ系の簡単な検証を追加して前半戦を終了させて頂こうかと思います。

謝辞

本検証は、Equalum社の特別の許可を得て実施しています。この貴重な機会を設定して頂いたEqualum社に対して感謝の意を表すると共に、本内容とEqualum社の公式ホームページで公開されている内容等が異なる場合は、Equalum社の情報が優先する事をご了解ください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのテーブルを壊す方法

構成

Version : MySQL5.5.28
Engine : MyISAM

方法

MySQLのテーブルチェックスクリプトを作るに当たり、
テーブルが壊れている状態を作り出したかったため、テスト環境で意図的に壊してみました。

テーブルの実体ファイルがあるディレクトリに行きます。

[root@server test_schema]# ls -l
合計 36
-rw-rw---- 1 mysql mysql   62  7月  7 15:45 db.opt
-rw-rw---- 1 mysql mysql    0  7月  7 16:00 test_table_bar.MYD
-rw-rw---- 1 mysql mysql 1024  7月  7 16:00 test_table_bar.MYI
-rw-rw---- 1 mysql mysql 8592  7月  7 15:47 test_table_bar.frm
-rw-rw---- 1 mysql mysql    0  7月  7 16:00 test_table_foo.MYD
-rw-rw---- 1 mysql mysql 1024  7月  7 16:00 test_table_foo.MYI
-rw-rw---- 1 mysql mysql 8592  7月  7 15:46 test_table_foo.frm

MYDファイルにデタラメなデータを入れます。
※MYIファイルでもOK。

[root@server test_schema]# echo aaaaa > test_table_bar.MYD

mysqlcheckを掛けると、壊れたのが確認できます。

[root@server test_schema]# mysqlcheck -c -uroot -p test_schema
Enter password:
test_schema.test_table_bar
warning  : Size of datafile is: 6       Should be: 0
error    : Wrong bytesec: 97-97-97 at linkstart: 0
error    : Corrupt
test_schema.test_table_foo                         OK

以上。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MAC:node.jsでmysqlへ接続する

node.js から mysqlに接続するのに苦労しましたので覚書をします。

環境

macOS : 10.15.5 (Catalina)
node.js : v14.3.0
mysql : ver 8.0.19

mysqlインストール

shell
$ brew install mysql

でインストールされました。
(他の情報でmpnを使用するやり方が書いてありましたが、私の環境では起動ができませんでした)

コネクションを実行するコード

mysqlconnection.js
//------------------------------------------------------------
//      my sql connection
//------------------------------------------------------------
var mysql = require('mysql');

//DBの定義
var dbConfig = {
  host     : 'localhost', //接続先ホスト
  user     : 'root',      //ユーザー名
  password : '******',    //パスワード
  database : '******'     //DB名
};

var connection;

function handleDisconnect() {
    console.log('create mysql connection');
    connection = mysql.createConnection(dbConfig); //接続する準備

    //接続
    connection.connect(function(err) {
        if(err) {
            console.log('error when connecting to db:', err);
            setTimeout(handleDisconnect, 2000); //2秒待ってから処理
        }
    });

    //error時の処理
    connection.on('error', function(err) {
        console.log('db error', err);
        if(err.code === 'PROTOCOL_CONNECTION_LOST') {
            handleDisconnect();
        } else {
            throw err;
        }
    });

    module.exports = connection; //connectionを(他のファイルから)requireで呼び出せるようにする
}

handleDisconnect();

実行するにはシェル(ターミナル)に以下を入力します

shell
   $ node mysqlconnection.js

エラー発生

私の環境では上記を実行してもエラーが出ました。

  1. mysqlが起動していない場合のエラー
 errno: -61,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 3306,
  fatal: true

このエラーの対処は

shell
  $ mysql.server start

とします。

2.認証方法エラー
新しいmysqlで認証方法が変更になっていてnode.jsからは古い認証方法でアクセスするためにそれに合わせる必要があるようです。

ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

この対処は以下を参照しました。

Node.jsでMySQL 8.0へ接続しようとする時に発生するエラー

ですがこれをこのままやってもうまくいかず

mysqlの初期パスワードをクリアする必要がありました。
他のサイトではvar/log/mysqld.log に初期パスワードが残っているとの情報があったのですが、私の環境ではありませんでした。
それで以下の記事

Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法

を参考にて、
1.サーバーを停止
$ mysql.server stop
2.MySQLをセーフモードで起動する。
$ mysqld_safe --skip-grant-tables &
3.rootユーザのパスワード無し状態でログインする。(同じターミナルで大丈夫でした)
$ mysql -u root
4.rootユーザーのパスワードを空に設定する。
mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
5.セーフモードで開いたMySQLを閉じる
mysql> exit
6.セーフモードで動作しているMySQLをkillする。
$ mysql.server status
SUCCESS! MySQL running (XXXXX)
$ kill XXXXX

7.通常モードでMySQLを起動する。
$ mysql.server restart
8.rootでmysqlを起動する。(パスワード要求されるがENTERをおす。)
$ mysql -u root -p
9.パスワードを再設定する。
mysql> USE mysql;
10.ここで先ほどの
Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法
に書いてあるSQLを実行します

mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

passwordの部分はrootでログインを行う際の任意のパスワードです。

ここまで実行するとこのエラーはなくなります。

その他注意

・node.jsからmysqlへアクセスするにはmysqlにdbを作成する必要があります。

mysql
 mysql>create db _test

・mysqlconnection.jsは作成したdbと、設定パスワードを記述する必要があります

mysqlconnection.js
var dbConfig = {
  host     : 'localhost', //接続先ホスト
  user     : 'root',      //ユーザー名
  password : '******',    //パスワード
  database : '******'     //DB名
};
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む