Реплика MongoDB отключена - драйвер Java ждет вечно - PullRequest
0 голосов
/ 04 ноября 2018

У меня установлена ​​реплика mongodb версии 3.4 с 3 серверами, Я хочу смоделировать проблему с сетевым подключением Мое приложение написано в Java с драйвером Монго Java

Когда я вытаскиваю кабель Ethernet из основного сервера, находясь в середине Операция записи, такая как вставка. Драйвер mongo всегда ждет восстановления соединения TCP, и мое приложение застревает, пока я не подключу обратно кабель Ethernet. Событие жесткой реплики mongodb уже выбрано новым основным сервером

Каковы мои варианты уведомления приложения, сервер mongodb не работает, и мне нужно повторно подключиться к новому основному серверу?

Я пытался изменить ОС tcp_keepalive_time, но это сильно повлияло на мою систему, потому что мне нужно очень короткое подтверждение.

Спасибо, Шарон

Дополнительная информация:

Строка подключения:

mongodb://192.168.12.31:27017,192.168.12.32:27017,192.168.12.33:27017

У меня только 3 сервера, без арбитра. У меня переменная MongoCollection<Document> collection, я делаю find операцию, которая занимает много времени, в середине, когда клиент ожидает ответа сервера, я вынимаю кабель Ethernet из основного сервера Монго. Водитель монго будет ждать вечно. команда:

collection.find(matchCriteria)

Если я логически ухожу с первичного уровня, я получаю MongoSocketReadException. Я не хочу минимизировать socketTimeOut драйвера, потому что у меня иногда бывают долгие операции, и я хочу иметь возможность вернуться к работе так быстро, как только смогу. Если при подключении всех серверов будут выбраны новые выборы и новый основной, текущая операция завершится неудачно, и следующая операция после новых выборов будет успешной с новым основным. Это rs.conf():

rs0:PRIMARY> rs.conf()
{
        "_id" : "rs0",
        "version" : 11,
        "protocolVersion" : NumberLong(1),
        "members" : [
                {
                        "_id" : 0,
                        "host" : "192.168.12.31:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 1,
                        "host" : "192.168.12.32:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 2,
                        "host" : "192.168.12.33:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 1000,
                "heartbeatTimeoutSecs" : 2,
                "electionTimeoutMillis" : 5000,
                "catchUpTimeoutMillis" : 60000,
                "getLastErrorModes" : {
                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("5bd6f31118b9c73f4dda22f8")
        }
}
...