MongoDB 切换方案

要解决问题: Mongo每天数据增量太大   准备2台mongo做轮转, 实施轮转可能需要考虑的问题如下 :  

一、

    1、保持目前2台mongo的规模,1台做冷备 

         对于查询需求:

          1)、查询历史 , 可以开放权限

          2)、查询当天记录 需要控制,避免加索引影响写的效率

    2、再加一套mongo主从( 此方案解决不了分离线上业务和线下查询需求)


二、 切换方案

   1、 目前链接mongo使用的IP:

          基于IP链接切换:  php需要修改环境变量,java需要修改配置文件重新发布

   2、 建议修改域名方式连接mongo

         切换需要修改hosts


定论:采用方案2

 php采用短连接,不需要修改代码。  切换时修改hosts 并切队php-fpm进行reload操作才能生效;

 java连接mongo使用连接池,mongo切换后不会主动断开连接  需要修改代码提供更新mongo地址接口(已完成);

<think>嗯,用户想了解如何在Docker中切换MongoDB的端口并实现双开。首先,我需要确保自己理解这两个需求。切换端口通常是为了避免端口冲突,而双开则是指同时运行两个MongoDB实例。使用Docker的话,可以通过不同的容器配置来实现。 首先,切换MongoDB的端口。默认情况下,MongoDB使用27017端口。在Docker中运行容器时,可以通过-p参数来映射机端口和容器端口。比如,把机的27018映射到容器的27017,这样外部访问27018就能连接到MongoDB。但用户可能需要修改MongoDB容器内部的配置,使其监听其他端口。不过,通常更简单的方法是直接映射端口,而容器内的MongoDB还是使用默认端口,只是对外暴露不同的机端口。 然后是双开,也就是同时运行两个MongoDB实例。这时候需要确保两个容器使用不同的机端口,并且数据存储目录也要分开,避免数据冲突。每个容器应该有自己的数据卷或者绑定目录,这样数据不会互相覆盖。另外,网络方面,如果使用默认的桥接网络,容器之间可以通过IP通信,或者用户自定义网络更方便管理。 接下来要考虑Docker命令的具体写法。比如,第一个容器可以用-p 27017:27017,第二个用-p 27018:27017,但是这样容器内的MongoDB都监听27017,机端口不同。或者,如果用户确实需要修改容器内部的MongoDB端口,可能需要通过环境变量或者自定义配置文件。不过MongoDB的Docker镜像支持通过环境变量MONGO_INITDB_PORT来修改端口,但可能需要确认官方镜像是否支持这个变量。如果不支持,可能需要自己构建镜像,或者在运行容器时传入自定义的配置文件。 另外,数据持久化是关键,需要使用-v参数将机目录挂载到容器的/data/db,这样即使容器停止,数据也不会丢失。对于双开,每个容器应有独立的目录,比如mongo_data1和mongo_data2。 可能遇到的问题包括端口冲突、数据目录权限问题,以及如何连接两个实例。比如,第二个容器如果映射机端口27018到容器的27017,那么客户端连接时需要指定端口27018。同时,如果容器需要互相访问,可能需要使用Docker网络,让它们在同一网络下,通过容器名访问。 需要验证步骤是否正确,比如运行容器后,使用docker ps查看端口映射,然后尝试用mongo shell连接不同的端口,确认两个实例是否正常运行,并且数据独立。 可能用户没有提到的是身份验证的问题,如果MongoDB启用了认证,双开的时候需要分别设置用户和密码,或者使用相同的配置,但数据目录分开的话,可能需要在每个容器中初始化用户。 总结下来,步骤应该是:1. 创建数据目录。2. 运行第一个容器,映射机端口27017,指定数据卷。3. 运行第二个容器,映射机端口27018,指定另一个数据卷。4. 验证连接和数据独立性。可能还需要处理配置文件或者环境变量,如果默认镜像不支持改端口的话,需要自定义配置。</think>好的,我来分步骤说明如何通过Docker实现MongoDB端口切换与双开: ----- ### 一、基础概念 1. **端口映射原理** Docker通过`-p 宿机端口:容器端口`实现端口转发 2. **双开核心思路** 创建两个独立容器,使用不同宿机端口+独立数据卷 ----- ### 二、单实例切换端口操作 ```bash # 停止原容器 docker stop mongo # 创建新数据目录(防止数据覆盖) mkdir ~/mongo_newdata # 启动新端口容器 docker run -d \ --name mongo_new \ -p 27018:27017 \ # 修改左侧宿机端口 -v ~/mongo_newdata:/data/db \ mongo:latest ``` ----- ### 三、双开实现方案 #### 方案1:不同宿机端口(推荐) ```bash # 实例1(默认端口) docker run -d \ --name mongo1 \ -p 27017:27017 \ -v mongo_data1:/data/db \ mongo # 实例2(新端口) docker run -d \ --name mongo2 \ -p 27018:27017 \ # 映射到不同宿机端口 -v mongo_data2:/data/db \ mongo ``` #### 方案2:修改容器内部端口(需自定义配置) 1. 创建自定义配置文件`mongod_custom.conf`: ```yaml net: port: 27018 # 修改容器内部监听端口 ``` 2. 启动容器: ```bash docker run -d \ --name mongo_custom \ -p 27019:27018 \ # 内外端口同时修改 -v ./mongod_custom.conf:/etc/mongod.conf \ -v mongo_custom_data:/data/db \ mongo --config /etc/mongod.conf ``` ----- ### 四、连接验证 ```bash # 连接第一个实例 mongo --port 27017 # 连接第二个实例 mongo --port 27018 # 容器内检查端口 docker exec -it mongo2 netstat -tuln | grep 27017 ``` ----- ### 五、注意事项 1. **数据隔离** 必须为每个容器单独挂载数据卷(`-v`参数不同) 2. **资源分配** 双开时建议限制内存: ```bash --memory 2g --memory-swap 4g # 给每个容器添加内存限制 ``` 3. **网络模式** 如需容器间通信,建议创建自定义网络: ```bash docker network create mongo-net docker run ... --network mongo-net ``` ----- ### 六、故障排查 1. 端口冲突时检查占用: ```bash lsof -i :27018 ``` 2. 查看容器日志: ```bash docker logs mongo2 ``` 3. 检查数据卷状态: ```bash docker volume inspect mongo_data2 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值