如何在 elixir 中连接到 mongo 副本集群
How to connect to mongo replica cluster in elixir
我创建了一个 mongo 副本集,我试图从中连接 elixir。我在副本集中创建了 3 个 mongo 实例,并在 /etc/hosts
中给出了主机名,所以问题是 mongo 终端中的一切工作正常,我能够与 mongo 正确连接副本集。
我在 NODE.JS
中编写代码以使用 mongodb
库从副本集中获取数据并且它也工作正常(这意味着 mongo 服务器中的配置和我的本地服务器就我所知是好的),但是当我尝试通过 elixir 连接它时,当我连接到该副本集时它会抛出错误。
我正在使用以下库与其连接。
https://github.com/ankhers/mongodb
在图书馆作者建议使用以下配置
{:ok, pid} = Mongo.start_link(database: "test", seeds: "hostname1.net:27017", "hostname2.net:27017")
这是抛出语法错误。
** (SyntaxError) iex:6: syntax error before: "hostname2.net:27017"
这是显而易见的错误。
当我使用这个配置时
worker(Mongo, [[name: :mongo,database: "yatender", topology: "replica_set_no_primary",seeds: ["xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017"] ,pool: DBConnection.Poolboy]])
注意:我已经将主机地址更改为 xxx 所以不要混淆它。
GenServer #PID<0.1436.0> terminating
** (stop) exited in: GenServer.call(#PID<0.1410.0>,
{:server_description, %{address: "xxx.xxx.xxx.xxx:27017", arbiters: [],
election_id: nil, error: nil, hosts: ["mongo.host1:27017",
"mongo.host2:27017", "mongo.host3:27017"],
last_update_time: -576460750248, last_write_date: %DateTime{calendar:
Calendar.ISO, day: 26, hour: 6, microsecond: {0, 3}, minute: 47, month:
7, second: 23, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0,
year: 2017, zone_abbr: "UTC"}, max_wire_version: 5, me:
"mongo.host3:27027", min_wire_version: 0, op_time: %{"t" =>
2, "ts" => #BSON.Timestamp<6446967716292067329>}, passives: [],
primary: "mongo.host2:27017", round_trip_time: 240, set_name:
"rs0", set_version: 4, tag_set: %{}, type: :rs_secondary}}, 30000)
当我在 worker 中使用以下配置时
{:ok, pid} = Mongo.start_link(database: "yatender", seeds: ["xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017"])
出现这个错误
[warn] Logger dropped 999 OTP/SASL messages as it exceeded the amount of 500 messages/second
** (EXIT from #PID<0.1410.0>) exited in: GenServer.call(#PID<0.1415.0>,
{:server_description, %{address: "xxx.xxx.xxx.xxx:27017", arbiters: [],
election_id: nil, error: nil, hosts: ["mongo.host1:27017",
"mongo.host2:27017", "mongo.host3:27027"],
last_update_time: -576460688733, last_write_date: %DateTime{calendar:
Calendar.ISO, day: 26, hour: 6, microsecond: {0, 3}, minute: 58, month:
7, second: 13, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0,
year: 2017, zone_abbr: "UTC"}, max_wire_version: 5, me:
"mongo.host1:27017", min_wire_version: 0, op_time: %{"t" => 2,
"ts" => #BSON.Timestamp<6446970508020809729>}, passives: [], primary:
"mongo.host2:27017", round_trip_time: 42, set_name: "rs0",
set_version: 4, tag_set: %{}, type: :rs_secondary}}, 30000)
** (EXIT) time out
当我直接连接到独立的 mongodb 服务器时,它不是
副本集的一部分,它工作正常。
# Starts an unpooled connection
{:ok, conn} = Mongo.start_link(database: "test",hostname: Application.get_env(:api, :api_env)[:mongo_host])
# Gets an enumerable cursor for the results
cursor = Mongo.find(conn, "test-collection", %{})
cursor
|> Enum.to_list()
|> IO.inspect
所以我被困在这里,我不知道我错过了什么。请有人指导我如何解决这个问题,我哪里错了。
提前致谢
经过如此多的打击和考验
而不是服务器 IP
{:ok, pid} = Mongo.start_link(database: "yatender", seeds: ["xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017"])
我们必须提供主机名
{:ok, pid} = Mongo.start_link(database: "yatender", seeds: ["mongo.host1:27017","mongo.host2:27017","mongo.host3:27017"])
我们也可以使用 poolboy。
我创建了一个 mongo 副本集,我试图从中连接 elixir。我在副本集中创建了 3 个 mongo 实例,并在 /etc/hosts
中给出了主机名,所以问题是 mongo 终端中的一切工作正常,我能够与 mongo 正确连接副本集。
我在 NODE.JS
中编写代码以使用 mongodb
库从副本集中获取数据并且它也工作正常(这意味着 mongo 服务器中的配置和我的本地服务器就我所知是好的),但是当我尝试通过 elixir 连接它时,当我连接到该副本集时它会抛出错误。
我正在使用以下库与其连接。
https://github.com/ankhers/mongodb
在图书馆作者建议使用以下配置
{:ok, pid} = Mongo.start_link(database: "test", seeds: "hostname1.net:27017", "hostname2.net:27017")
这是抛出语法错误。
** (SyntaxError) iex:6: syntax error before: "hostname2.net:27017"
这是显而易见的错误。
当我使用这个配置时
worker(Mongo, [[name: :mongo,database: "yatender", topology: "replica_set_no_primary",seeds: ["xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017"] ,pool: DBConnection.Poolboy]])
注意:我已经将主机地址更改为 xxx 所以不要混淆它。
GenServer #PID<0.1436.0> terminating
** (stop) exited in: GenServer.call(#PID<0.1410.0>,
{:server_description, %{address: "xxx.xxx.xxx.xxx:27017", arbiters: [],
election_id: nil, error: nil, hosts: ["mongo.host1:27017",
"mongo.host2:27017", "mongo.host3:27017"],
last_update_time: -576460750248, last_write_date: %DateTime{calendar:
Calendar.ISO, day: 26, hour: 6, microsecond: {0, 3}, minute: 47, month:
7, second: 23, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0,
year: 2017, zone_abbr: "UTC"}, max_wire_version: 5, me:
"mongo.host3:27027", min_wire_version: 0, op_time: %{"t" =>
2, "ts" => #BSON.Timestamp<6446967716292067329>}, passives: [],
primary: "mongo.host2:27017", round_trip_time: 240, set_name:
"rs0", set_version: 4, tag_set: %{}, type: :rs_secondary}}, 30000)
当我在 worker 中使用以下配置时
{:ok, pid} = Mongo.start_link(database: "yatender", seeds: ["xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017"])
出现这个错误
[warn] Logger dropped 999 OTP/SASL messages as it exceeded the amount of 500 messages/second
** (EXIT from #PID<0.1410.0>) exited in: GenServer.call(#PID<0.1415.0>,
{:server_description, %{address: "xxx.xxx.xxx.xxx:27017", arbiters: [],
election_id: nil, error: nil, hosts: ["mongo.host1:27017",
"mongo.host2:27017", "mongo.host3:27027"],
last_update_time: -576460688733, last_write_date: %DateTime{calendar:
Calendar.ISO, day: 26, hour: 6, microsecond: {0, 3}, minute: 58, month:
7, second: 13, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0,
year: 2017, zone_abbr: "UTC"}, max_wire_version: 5, me:
"mongo.host1:27017", min_wire_version: 0, op_time: %{"t" => 2,
"ts" => #BSON.Timestamp<6446970508020809729>}, passives: [], primary:
"mongo.host2:27017", round_trip_time: 42, set_name: "rs0",
set_version: 4, tag_set: %{}, type: :rs_secondary}}, 30000)
** (EXIT) time out
当我直接连接到独立的 mongodb 服务器时,它不是 副本集的一部分,它工作正常。
# Starts an unpooled connection
{:ok, conn} = Mongo.start_link(database: "test",hostname: Application.get_env(:api, :api_env)[:mongo_host])
# Gets an enumerable cursor for the results
cursor = Mongo.find(conn, "test-collection", %{})
cursor
|> Enum.to_list()
|> IO.inspect
所以我被困在这里,我不知道我错过了什么。请有人指导我如何解决这个问题,我哪里错了。
提前致谢
经过如此多的打击和考验 而不是服务器 IP
{:ok, pid} = Mongo.start_link(database: "yatender", seeds: ["xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017","xxx.xxx.xxx.xxx:27017"])
我们必须提供主机名
{:ok, pid} = Mongo.start_link(database: "yatender", seeds: ["mongo.host1:27017","mongo.host2:27017","mongo.host3:27017"])
我们也可以使用 poolboy。