使用Docker准备超高速事务处理功能的MongoDB

为繁忙的人准备的摘要报告(MongoDB 4.1.9)

docker run --rm --name コンテナ名 -d mongo:4.1.9-bionic mongod --replSet レプリカセット名

docker run --rm mongo:4.1.9-bionic mongo --host コンテナのIPアドレス --eval "rs.initiate({'_id':'レプリカセット名', members:[{_id:0, host:'コンテナのIPアドレス'}]})"

选项根据您的喜好选择。

MongoDB很不错!

MongoDB是非常方便的。我个人认为它是我使用过最有趣的数据库。最近MongoDB也加入了事务功能,对于个人的小应用来说,SQL类型的数据库似乎已经不再需要了。但对于大型开发项目来说,我觉得还是SQL数据库更合适,尤其是AWS的Aurora太方便了。

MongoDB虽然加入了事务,但是只能在副本集配置中使用,并且存在一些限制,安装和配置过程相对繁琐,所以最终我还是选择用SQL系列的数据库(就像我这样的人)。

实际上并没有那么麻烦吧?我突然改变了想法,在这里将最短的构建步骤正确记录下来,以后在个人开发中我想要更多地使用MongoDB!

从docker-hub上获取MongoDB并启动。

那么,我们来实际启动一个可用的MongoDB事务吧。

首先,MongoDB官方的Docker镜像存放位置在https://hub.docker.com/_/mongo。

只要普通地在docker中拉取MongoDB,官方映像就会下载下来,但事务是从版本4开始的功能,所以要确保使用较新的标签来拉取。

docker pull mongo:4.1.9-bionic

接下来是启动。在官方的”如何使用这个图片”部分。

docker run --name some-mongo -d mongo:tag

尽管这里写着,但事实上只有在副本集配置下才可以使用事务。并不是说单纯具备副本配置就需要两个或更多的台实例,只要是副本集配置中的一台,就可以使用事务。

要设置副本集,只需在运行mongod时加上 –replSel选项即可。

docker run --name some-mongo -d mongo:tag mongod --replSet レプリカセット名

以下是一个例子,以所述的形式。请随意命名容器和副本名称,并附加–rm选项进行执行。

docker run --rm --name transaction-mongo -d mongo:4.1.9-bionic mongod --replSet transaction-set

然而,仅仅这样还只是一个普通的启动。只有执行rs.initiate()才能使副本集生效。

设置复制品的设定

使用相同的映像在Mongo容器中执行mongo命令,并执行rs.initiate()在容器内的MongoDB中。

首先确认复刻品尚未正常运作。

docker run --rm mongo:4.1.9-bionic mongo --host コンテナのIPアドレス --eval "rs.status()"

如果尚未设置副本集,则将输出一个较短的JSON,并包含错误消息”没有replset设置”。

    "errmsg" : "no replset config has been received",

那么现在我们要进行复制品的设置。

docker run --rm mongo:4.1.9-bionic mongo --host コンテナのIPアドレス --eval "rs.initiate({'_id': 'transaction-set', members:[{_id:0, host:'コンテナのIPアドレス'}]})"

再次运行`rs.status()`以确认设置是否正确。将会输出一个较长的JSON格式,其中没有`errmsg`字段。

在这种状态下执行容器的Mongo客户端时,提示符将显示为复制集提示符而不是“>”提示符。

docker exec -it transaction-mongo mongo
transaction-set:PRIMARY> 

如果你确认提示符已经设为副本用的,你可以选择通过exit退出,或者继续在命令中尝试和玩弄事务。

MongoDB官方文档中的事务API介绍
https://docs.mongodb.com/manual/core/transactions/#transactions-api

使用事务时,请不要忘记通过会话传递。

db.コンテナ名.insert()

如果这样做,事务功能将被忽略。请注意,要使事务生效,必须通过 session.getDatabase() 来访问,就像官方文档中的示例一样。

eventsCollection = session.getDatabase("reporting").events;
广告
将在 10 秒后关闭
bannerAds