Feeds:
文章
迴響

Archive for the ‘MongoDB’ Category

MongoDB 適合大量讀寫?

純粹個人經驗, 可能有錯, 大量並發應用環境

1. Centos7 64bits

2. MongoDB 3.4 Enterprise (WiredTiger Engine, 有分片處理)

3. 儲存的資料有 log, cache, session

 

PHP Driver 預設長連接

  1. 大量並發, 如果 php-fpm 數量過多, 會導致 mgo 連線數不夠
  2. 長連接無法手動斷線或重連
  3. 手動重編改成短連接, 可解決 mgo 連線數問題, 但是會產生大量 TIME_WAIT 需要優化, 否則會發生 mgo 連不上的問題

 

MongoDB 的 upsert=true 可能會發生 duplicate key

  1.  這個問題太冏了. 只能自己處理

 

MongoDB 頻繁更新/讀取相同資料效能低落

  1. 使用 w=majority, journal=false, timeout=1s, 會發生  “waiting for replication timed out"
  2. 使用 w=1,journal=false,timeout=0 會發生"Operation timed out"
  3. session 不適合存 mongodb
    1. 更新頻繁, 寫入操作緩慢需要排隊, 操作逾時
    2. 可能發生 duplicate key

 

 

Read Full Post »

Code: https://github.com/mongodb/mongo-php-driver/blob/4b49b1ad80a300000cc7beab927ea43bdc6673fb/php_phongo.c

 

// 模組初始化
PHP_GINIT_FUNCTION(mongodb)
{
    // 初始化 hash
    zend_hash_init_ex(&mongodb_globals->clients, 0, NULL, php_phongo_client_dtor, 1, 0);
}

static void php_phongo_client_dtor(zval *zv)
{
   // http://mongoc.org/libmongoc/1.4.0/mongoc_client_destroy.html
   // Release all resources associated with client and free the structure.
    mongoc_client_destroy((mongoc_client_t *) Z_PTR_P(zv));
}

// Manager 初始化
void phongo_manager_init(php_phongo_manager_t *manager, const char *uri_string, zval *options, zval *driverOptions TSRMLS_DC) /* {{{ */
{
    mongoc_client_t  *client_ptr;

   // 產生hash
    hash = php_phongo_manager_make_client_hash(uri_string, options, driverOptions, &hash_len TSRMLS_CC)
   
   // 找尋 hash 吻合的連線, 吻合返回快取
    if ((client_ptr = zend_hash_str_find_ptr(&MONGODB_G(clients), hash, hash_len)) != NULL) {
        manager->client = client_ptr;
        goto cleanup;
    }
   
   // 建立新的 client
    manager->client = php_phongo_make_mongo_client(uri, ssl_opt TSRMLS_CC);
   
   // 更新 hash
    zend_hash_str_update_ptr(&MONGODB_G(clients), hash, hash_len, manager->client);

}

// 模組卸載
PHP_MSHUTDOWN_FUNCTION(mongodb)
{
   // 釋放所有的連線 
   // 觸發 php_phongo_client_dtor()
    zend_hash_destroy(&MONGODB_G(clients));
   
    mongoc_cleanup();

    return SUCCESS;
}

Read Full Post »

雖然 MongoDB 屬於 Schema Free, 但還是會有想知道 Collection 儲存了那些欄位的需求, 有人開發了 variety 搭配 mongo 命令使用依據統計列出欄位和型別資訊, 效果如下

2016111701

另外也有提供命令列版本  variety-cli 其實就是把 mongo 指令也包在程式當中方便使用

2016110702

 

Read Full Post »