使用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;