1.MongoDB分布式集群架构(一)Master-SlaverReplication模式(Master-SlaverReplication)这种模式从3.6版本开始就被废弃了。这种方式比单节点的可用性要好很多,可以用于备份、故障恢复、读扩展等。集群中的主从节点都运行MongoDB实例来完成数据的存储、查询和修改操作。主从复制模式的集群中只能有一个主节点。主节点提供所有的增、删、查、改服务。节点压力。另外,每个从节点都需要知道主节点的地址,主节点记录了对它的所有操作。从节点定期轮询主节点获取这些操作,然后在自己的数据副本上执行这些操作,从而保证从节点的数据与主节点相同。在主从复制集群中,当主节点出现故障时,只能手动干预指定新的主节点,而从节点不会自动升级为主节点。同时,在这段时间内,集群架构只能处于只读状态。(2)副本集模式(ReplicaSet)取代了Master-Slaver模式,是相互的主从关系。副本集复制并保存数据的多个副本。不同的服务器保存相同的数据,发生故障时自动切换。实施故障转移。这个集群有一个主节点和多个从节点,类似于主从复制模式,主从节点的工作也类似,但是副本集和主从复制的区别是:当集群中的主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接到新的主节点上,这个过程对应用程序是透明的。可以说MongoDB的副本集是一个主从复制,自带故障转移功能。MongoDB副本集采用N个mongod节点构建的高可用方案,具有自动容错和自动恢复功能。在副本集中,任何一个节点都可以是主节点,但是为了保持数据的一致性,主节点只能有一个。主节点负责写入和更新数据,并在更新数据的同时将操作信息写入名为oplog.log的日志文件中。主节点还负责指定其他节点为从节点,并设置从节点数据的可读性,使从节点分担集群读取数据的压力。另外,从节点会定时轮询读取oplog日志,根据日志内容同步更新自己的数据,与主节点保持一致。在某些场景下,用户还可以使用副本集来扩展读取性能。客户端有能力向不同的服务器发送读写操作,也可以在不同的数据中心获取不同的副本,扩展分布式应用的能力。副本集中还有一个额外的仲裁节点(不需要使用专用的硬件设备),负责在primary节点失效时参与选举新节点作为primary节点。副本集中的每个节点都会通过心跳信息检查自己的健康状态。当主节点出现故障时,多个从节点会触发新的选举操作,选举其中一个作为新的主节点。为了保证选举票数不同,副本集中的节点数保持为奇数。(3)分片模式(Sharding)副本集可以解决主节点故障导致的数据丢失或不可用的问题,但是当遇到需要存储海量数据时,副本集机制就束手无策了。副本集中的单个机器可能不足以存储数据,或者集群可能不够大以提供可接受的读写吞吐量。这就需要使用到MongoDB的分片(Sharding)技术,这是MongoDB的另一种集群部署方式。分片是指将数据拆分并存储在不同机器上的过程。分区有时也用来表示这个概念。通过将数据分布到不同的机器上,可以存储更多的数据并处理更大的负载,而不需要功能强大的大型计算机。2、Docker部署MongoDB集群(ReplicaSet模式-单机)mongodb版本信息:MongoDBshell版本v5.0.5MongoDB服务器版本:5.0.5单个shell脚本集成,多套分离,一步到位。Mongodb集群搭建(1)镜像下载dockerpullmongo:5.0.5(2)备份原数据库数据(如果需要)如原数据库启动命令:dockerrun-eTZ=Asia/Shanghai-d--namemongodb--restartalways\-p27017:27017\-v/opt/mongodb/data/configdb:/data/configdb\-v/opt/mongodb/data/db:/data/db\-v/opt/mongodb/backup:/data/backup\--log-optmax-size=10m\--log-optmax-file=1\mongo:5.0.5--auth1.进入原来的mongo容器:dockerexec-itmongodbbash2。备份原来的mongoRepository:mongodump--host127.0.0.1--port27017-uroot-pdb_root_password-o/data/backup--authenticationDatabaseadmin3.停止原来的mongo容器(如果部署在同一个端口冲突,停止第一):dockerstopmongodb4。复制备份文件:mkdir/opt/mongo/mongo_mastercp/opt/mongodb/backup-r/opt/mongo/mongo_master(3)建立集群网络,在27018_mongo-master27019_mongo-salve27020_mongo-arbiter中为conf建立集群;do\echo"conflen=${#conf},port=${conf:0:5},name=${conf:6:${#conf}}";如果[${conf:0:5}==27018]然后dockernetworkcreatemongo-networkecho"createmongo-network"fidockerrun-d--restart=always\-p${conf:0:5}:27017\--name${conf:6:${#conf}}\-v/opt/mongo/${conf:6:${#conf}}/configdb/:/data/configdb\-v/opt/mongo/${conf:6:${#conf}}/db/:/data/db\-v/opt/mongo/${conf:6:${#conf}}/backup:/data/backup\--net=mongo-network\mongodb:5.0.5\mongod--dbpath/data/db--replSetmongoreplsetdone(4)配置集群1.在master容器中输入mongo:dockerexec-itmongo-mastermongo2。配置集群:IP为部署数据库的服务器IP,例如IP为10.9.21.12config={_id:"mongoreplset",version:1,members:[{_id:0,host:"10.9.21.12:27018",priority:5},{_id:1,host:"10.9.21.12:27019",priority:2},{_id:2,host:"10.9.21.12:27020",priority:3}]}rs.initiate(配置)3。出口:出口4。验证集群配置:dockerexec-itmongo-mastermongo将有以下提示:mongoreplset:PRIMARY>dockerexec-itmongo-salvemongo将有以下提示:mongoreplset:SECONDARY>dockerexec-itmongo-arbitermongo将有如下提示:mongoreplset:SECONDARY>(5)加载备份数据(如有必要)1.进入master容器:dockerexec-itmongo-masterbash2。加载备份数据:mongorestore--host127.0.0.1--port27017/data/backup/3。退出:exit(6)如果不需要加载备份数据,需要创建数据库用户1、在master容器中输入mongo:dockerexec-itmongo-mastermongo2。创建用户:使用admindb.createUser({user:"root",pwd:"db_root_password",roles:["root"]})db.auth("root","Synjones2021")db.createUser({user:"user01",pwd:"db_user01_password",roles:["readWriteAnyDatabase"]})exit(7)删除??mongo-mastermongo-salvemongo-arbiter中文件夹的已部署集群容器;do\dockerrm-f${文件夹};echo"删除${folder}完成";done(8)在27018_mongo-master27019_mongo-salve27020_mongo-arbiter中部署conf权限的集群;do\if[${conf:0:5}==27018]然后dockernetworkcreatemongo-networkecho"createmongo-networkcomplete"mkdir/opt/mongo/mongo-keyopensslrand-base64756>/opt/mongo/mongo-key/mongo-replication.keychmod400/opt/mongo/mongo-key/mongo-replication.keysudochown999:999/opt/mongo/mongo-key/mongo-replication.keyecho"createmongo-replication.keycomplete"fidockerrun-d--restart=always\-p${conf:0:5}:27017\--name${conf:6:${#conf}}\-v/opt/mongo/${conf:6:${#conf}}/configdb/:/data/configdb\-v/opt/mongo/${conf:6:${#conf}}/db/:/data/db\-v/opt/mongo/${conf:6:${#conf}}/backup:/data/backup\-v/opt/mongo/mongo-key/:/data/key\--net=mongo-network\mongodb:5.0.5\mongod--dbpath/data/db--replSetmongoreplset\--oplogSize128\--auth--keyFile=/data/key/mongo-replication.keydone(9)mongodb集群的连接地址如下:mongodb://user01:db_user01_password@10.9.21.12:27018,10.9.21.12:27019,10.9.21.12:27020(10)工具验证也可以使用Studio3TforMongoDB软件导出导入数据3、Docker部署MongoDB集群(ReplicaSet模式-多套)假设有两台机器:10.9.21.13(master)和10.9.21.11(slave)(1)备份原始数据库数据(如果需要),如作为原始数据库启动命令:dockerrun-eTZ=Asia/Shanghai-d--namemongodb--restartalways\-p27017:27017\-v/opt/mongodb/data/configdb:/data/configdb\-v/opt/mongodb/data/db:/data/db\-v/opt/mongodb/backup:/data/backup\--log-optmax-size=10m\--log-optmax-file=1\dining-mongo:1.0--auth1.进入原来的mongo容器:dockerexec-itmongodbbash2。备份原来的mongo库:mongodump--host127.0.0.1--port27017-uroot-pdb_root_password-o/data/backup--authenticationDatabaseadmin3。停止掉原来的mongo容器(如果部署在同一个端口先停止):dockerstopmongodb4。复制备份文件(-v/opt/mongodb/backup:/data/backup):复制备份文件进行备份(2)建立数据库集群网络假设有两台机器:10.9.21.13(master)和10.9。21.11(slave),两台机器都需要创建mongo-networkdockernetworklsdockernetworkcreatemongo-network(3)建立集群假设有两台机器:10.9.21.13(master),10.9.21.11(slave)10.9.21.13(master)dockerrun-d--restart=always\-p27017:27017\--namemongo-master\-v/opt/mongo/mongo_master/configdb/:/data/configdb\-v/opt/mongo/mongo_master/db/:/data/db\-v/opt/mongo/mongo_master/backup:/data/backup\--net=mongo-network\mongo:5.0.5\mongod--dbpath/data/db--replSetmongoreplset10.9.21.11(from)将备份文件复制到-v/opt/mongo/mongo-salve/backup中(如果需要)参考:输入备份文件文件夹备份:zip-rttt.zip*跨机复制:scp/opt/x/backup/tt.zip@10.9.21.13:/opt/mongo/mongo_master/backup解压:unziptt.zipdockerrun-d--restart=always\-p27018:27017\--namemongo-salve\-v/opt/mongo/mongo-salve/configdb/:/data/configdb\-v/opt/mongo/mongo-salve/db/:/data/db\-v/opt/mongo/mongo-salve/backup:/data/backup\--net=mongo-network\mongo:5.0.5\mongod--dbpath/data/db--replSetmongoreplsetdockerrun-d--restart=always\-p27019:27017\--namemongo-arbiter\-v/opt/mongo/mongo-arbiter/configdb/:/data/configdb\-v/opt/mongo/mongo-arbiter/db/:/data/db\-v/opt/mongo/mongo-arbiter/backup:/data/backup\--net=mongo-network\mongo:5.0.5\mongod--dbpath/data/db--replSetmongoreplset(四)配置集群1、进入master容器:dockerexec-itmongo-masterbash2。输入mongo:mongo3。配置集群:IP为部署数据库的服务器IPconfig={_id:"mongoreplset",version:1,members:[{_id:0,host:"10.9.21.13:27017",priority:5},{_id:1,host:"10.9.21.11:27018",priority:2},{_id:2,host:"10.9.21.11:27019",priority:3}]}rs.initiate(config)4.退出mongo:exit5。加载旧数据库的备份数据(如果需要,将3.1备份的数据复制到宿主机对应的挂载目录下):mongorestore--host127.0.0.1--port27017/data/backup/6。退出容器:exit7。验证集群:10.9.21.13(master)dockerexec-itmongo-mastermongo会有如下提示:mongoreplset:PRIMARY>10.9.21.11(from)dockerexec-itmongo-salvemongo会有如下提示:mongoreplset:SECONDARY>10.9.21.11(from)dockerexec-itmongo-arbitermongo会有如下提示:mongoreplset:SECONDARY>(5)建立集群Permissionfile1.在10.9.21.13(primary)上,生成节点通信密钥:mkdir/opt/mongo/mongo-keyopensslrand-base64756>/opt/mongo/mongo-key/mongo-replication.key2.复制集群授权文件到10.9.21.11(slave)10.9.21.11(slave)创建目录/opt/mongo/mongo-keymkdir/opt/mongo/mongo-key10.9.21.13(master)执行下一个命令:scp/opt/mongo/mongo-key/mongo-replication.key@10.9.21.11:/opt/mongo/mongo-key/3。修改10.9.21.13(main)上的key权限chmod400/opt/mongo/mongo-key/mongo-replication.keysudochown999:999/opt/mongo/mongo-key/mongo-replication.key4.修改key权限on10.9.21.11(from)chmod400/opt/mongo/mongo-key/mongo-replication.keysudochown999:999/opt/mongo/mongo-key/mongo-replication.key(6)删除部署的集群容器dockerrm-fmongo-masterdockerrm-fmongo-salvedockerrm-fmongo-arbiter(7)以权限部署集群dockerrun-eTZ=Asia/Shanghai-d--restartalways\-p27017:27017\--namemongo-master\-v/opt/mongo/mongo_master/configdb/:/data/configdb\-v/opt/mongo/mongo_master/db/:/data/db\-v/opt/mongo/mongo_master/backup/:/data/backup\-v/opt/mongo/mongo-key/:/data/key\--net=mongo-network\--log-optmax-size=10m\--log-optmax-file=1\mongo:5.0.5\mongod--dbpath/data/db--replSetmongoreplset\--oplogSize128\--auth--keyFile=/data/key/mongo-replication.keydockerrun-eTZ=亚洲/上海-d--restartalways\-p27018:27017\--namemongo-salve\-v/opt/mongo/mongo-salve/configdb/:/data/configdb\-v/opt/mongo/mongo-salve/db/:/data/db\-v/opt/mongo/mongo-salve/backup/:/data/backup\-v/opt/mongo/mongo-key/:/data/key\--net=mongo-network\--log-optmax-size=10m\--log-optmax-file=1\mongo:5.0.5\mongod--dbpath/data/db--replSetmongoreplset\--oplogSize128\--auth--keyFile=/data/key/mongo-replication.keydockerrun-eTZ=Asia/Shanghai-d--restartalways\-p27019:27017\--namemongo-arbiter\-v/opt/mongo/mongo-arbiter/configdb/:/data/configdb\-v/opt/mongo/mongo-arbiter/db/:/data/db\-v/opt/mongo/mongo-arbiter/backup/:/data/backup\-v/opt/mongo/mongo-key/:/data/key\--net=mongo-network\--log-optmax-size=10m\--log-optmax-file=1\mongo:5.0。5\mongod--dbpath/data/db--replSetmongoreplset\--oplogSize128\--auth--keyFile=/data/key/mongo-replication.key
