MongoDB HostName/URI Конфигурация
Обратите внимание, что это выглядит долго, но предоставляет контекст и перечисляет мои основные вопросы внизу. Я исследовал все части и включил ссылки.
Я использовал Google Cloud Launcher для создания базы данных Mongo. Это создало набор реплик двух серверов Mongo (основного и дополнительного) и арбитра на трех отдельных виртуальных машинах. Я не менял никаких конфигураций ВМ (кроме открытия брандмауэра). У меня есть SSH'd на обоих серверах, и я убедился, что Mongo работает с репликацией, как и ожидалось. Я изменяю внешние IP-адреса с xxxx на FIRST.EXTERNAL.IP и SECOND.EXTERNAL.IP, чтобы сделать сообщение более читабельным (и безопасным).
Я сейчас пытаюсь подключиться к базе данных через Java MongoClient:
MongoClientOptions.Builder mongoClientOptions = MongoClientOptions.builder().connectionsPerHost(40)
.writeConcern(WriteConcern.ACKNOWLEDGED).readPreference(ReadPreference.secondaryPreferred())
.readConcern(ReadConcern.LOCAL).socketTimeout(60000).threadsAllowedToBlockForConnectionMultiplier(1500);
MongoClientURI mongoClientURI = new MongoClientURI("mongodb://FIRST.EXTERNAL.IP:27017,SECOND.EXTERNAL.IP:27017", mongoClientOptions);
mongoClient = new MongoClient(mongoClientURI);
Я хотел убедиться, что в URI должен быть включен как первичный внешний IP, так и вторичный внешний IP. Я не включил арбитра, поскольку MongoClient не имеет смысла напрямую взаимодействовать с арбитром.
Ниже показано исключение Java, когда я пытаюсь найти (). Insert() создает ту же ошибку, кроме как с WritePreferenceServerSelector вместо ReadPref..
1449 [main] INFO org.mongodb.driver.cluster - Cluster created with settings {hosts=[SECOND.EXTERNAL.IP:27017, FIRST.EXTERNAL.IP:27017], mode=MULTIPLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=60000}
1449 [main] INFO org.mongodb.driver.cluster - Adding discovered server SECOND.EXTERNAL.IP:27017 to client view of cluster
1558 [main] INFO org.mongodb.driver.cluster - Adding discovered server FIRST.EXTERNAL.IP:27017 to client view of cluster
1579 [main] INFO org.mongodb.driver.cluster - No server chosen by ReadPreferenceServerSelector{readPreference=ReadPreference{name=secondaryPreferred}} from cluster description ClusterDescription{type=UNKNOWN, connectionMode=MULTIPLE, serverDescriptions=[ServerDescription{address=SECOND.EXTERNAL.IP:27017, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=FIRST.EXTERNAL.IP:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
1743 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:2, serverValue:12}] to FIRST.EXTERNAL.IP:27017
1766 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-SECOND.EXTERNAL.IP:27017] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:1, serverValue:9}] to SECOND.EXTERNAL.IP:27017
1790 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Monitor thread successfully connected to server with description ServerDescription{address=FIRST.EXTERNAL.IP:27017, type=REPLICA_SET_PRIMARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 4, 1]}, minWireVersion=0, maxWireVersion=5, maxDocumentSize=16777216, roundTripTimeNanos=41160155, setName='rs0', canonicalAddress=my-project-name-mongo-server-1:27017, hosts=[my-project-name-mongo-server-1:27017, my-project-name-mongo-server-2:27017], passives=[], arbiters=[my-project-name-mongo-arbiter-1:27017], primary='my-project-name-mongo-server-1:27017', tagSet=TagSet{[]}, electionId=7fffffff0000000000000003, setVersion=3, lastWriteDate=Fri Jan 27 02:30:26 PST 2017, lastUpdateTimeNanos=165366848909779}
1791 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Discovered cluster type of REPLICA_SET
1791 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Adding discovered server my-project-name-mongo-server-1:27017 to client view of cluster
1793 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Adding discovered server my-project-name-mongo-server-2:27017 to client view of cluster
1794 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Adding discovered server my-project-name-mongo-arbiter-1:27017 to client view of cluster
1796 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Server SECOND.EXTERNAL.IP:27017 is no longer a member of the replica set. Removing from client view of cluster.
1797 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Server FIRST.EXTERNAL.IP:27017 is no longer a member of the replica set. Removing from client view of cluster.
1798 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-FIRST.EXTERNAL.IP:27017] INFO org.mongodb.driver.cluster - Canonical address my-project-name-mongo-server-1:27017 does not match server address. Removing FIRST.EXTERNAL.IP:27017 from client view of cluster
1799 [cluster-ClusterId{value='588b214418786c23f4fcf845', description='null'}-my-project-name-mongo-server-1:27017] INFO org.mongodb.driver.cluster - Exception in monitor thread while connecting to server my-project-name-mongo-server-1:27017
com.mongodb.MongoSocketException: my-project-name-mongo-server-1: unknown error
at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:188)
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57)
at com.mongodb.connection.SocketStream.open(SocketStream.java:58)
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115)
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.UnknownHostException: my-project-name-mongo-server-1: unknown error
//(then it just repeats the socket exception through connection retries I believe)
Моя текущая теория заключается в том, что конфигурацию имени хоста, изначально установленную в Google Cloud Launcher, необходимо обновить с помощью внешних IP-адресов. Это будет означать изменение my-project-name-mongo-server-1 на FIRST.EXTERNAL.IP и то же самое для второго сервера, как видно из документации Mongo. Если это правильно, я должен просто оставить имя хоста арбитра? (Примечание: как разрешается my-project-name-mongo-server-1:27017? Это внутренний IP-адрес в Google Cloud?)
Насколько я могу сказать, это решило бы мою проблему и исключение Canonical address my-project-name-mongo-server-1:27017 does not match server address
,
Чтобы повторить каждый из моих вопросов о моей проблеме:
- Какие IP-адреса следует включить в URI Java MongoClient?
- Должен ли я перенастроить имена узлов участников на внешние IP-адреса? Если да, то какие?
- По желанию было бы полезно объяснить, является ли my-project-name-mongo-server-1:27017 локальным именем хоста.
- Поскольку вы знаете мой дизайн приложения, будет ли лучший способ подключить к сети мое внешнее соединение?
1 ответ
Обновление имен хостов до внешних IP-адресов устранило проблему канонических адресов. Я до сих пор не совсем уверен, что лучше для URI, но из того, что я могу сказать, безопаснее всего включить все серверы из набора реплик.
Свойства spring.data.mongodb.host и spring.data.mongodb.port не поддерживаются в драйвере Java Mongo 3.0.
Поэтому используйте spring.data.mongodb.uri, чтобы предоставить всю конфигурацию следующим образом:
spring.data.mongodb.uri=mongodb://username:password@mongodbIp:portnumber