Я использую веб-сайт с 2 серверами для кода сайта (в PHP) и 1 сервером в качестве балансировщика нагрузки. Все 3 также работают с экземплярами couchbase, как часть одного кластера.
В PHP-коде я использовал ведра couchbase следующим образом:
$cluster = new \CouchbaseCluster('http://127.0.0.1:8091');
$greyloftWebbucket = $cluster->openBucket('some_bucket');
$query = \CouchbaseViewQuery::from('abcd', 'pqrs');
Это расположение отлично работает, когда все экземпляры couchbase работают. Когда любой из них закрывается, и я пытаюсь получить доступ к корзинам, я получаю случайную ошибку:
[2015-07-17 13:46:08] production.ERROR: exception 'CouchbaseException' with message 'Generic network failure. Enable detailed error codes (via LCB_CNTL_DETAILED_ERRCODES, or via `detailed_errcodes` in the connection string) and/or enable logging to get more information' in [CouchbaseNative]/CouchbaseBucket.class.php:282
Stack trace:
#0 [CouchbaseNative]/CouchbaseBucket.class.php(282): _CouchbaseBucket->http_request(1, 1, '/_design/abcd...', NULL, 1)
#1 [CouchbaseNative]/CouchbaseBucket.class.php(341): CouchbaseBucket->_view(Object(_CouchbaseDefaultViewQuery))
#2 /var/www/greyloft-laravel/app/couchbasemodel.php(25): CouchbaseBucket->query(Object(_CouchbaseDefaultViewQuery))
#3 /var/www/greyloft-laravel/app/Http/Controllers/Listing.php(42): App\couchbasemodel::listings()
#4 [internal function]: App\Http\Controllers\Listing->index()
То есть, один раз страница будет загружаться правильно и показывать содержимое сегмента, а затем один раз покажет мне ошибку выше. Не имеет значения, получаю ли я доступ к балансировщику нагрузки или к любому серверу напрямую.
Кроме того, автовыключение в enabled
с репликацией, установленной на 1
в диване. На всех 3 серверах я установил LCB_LOGLEVEL=5
Что происходит? Это проблема в Couchbase PHP SDK или что-то еще? Я был бы признателен за любую помощь на всех.
Обновить:
Согласно mnunberg-х предложение, я использую новую строку подключения
$cluster = new \CouchbaseCluster('http://127.0.0.1:8091?detailed_errcodes=1');
При этом сообщение об ошибке сейчас. Это все еще появляется случайно (примерно в половине случаев):
CouchbaseException in CouchbaseBucket.class.php line 74: The remote host refused the connection. Is the service up?
Автовыключение происходит. В журнале консоли Couchbase:
Failed over 'ns_1@<ip_address>': ok
Node ('ns_1@<ip_address>') was automatically failovered.
Мне кажется, что SDK все еще пытается прочитать отказавший узел. Почему это происходит? Любое возможное решение?
Задача ещё не решена.
Других решений пока нет …