资讯详情

资讯详情

Linux入门攻坚——95、MongoDB数据库安装使用初步-2

MongoDB的复制功能是将数据同步在多个服务器的过程。复制提供了数据的冗余备份并在多个服务器上存储数据副本提高了数据的可用性 并可以保证数据的安全性。同时可以实现读分离减轻主节点的读压力但写压力无法分离。复制原理mongodb的复制至少需要两个节点。其中一个是主节点负责处理客户端请求其余的都是从节点负责复制主节点上的数据。mongodb各个节点常见的搭配方式为一主一从、一主多从。主节点记录在其上的所有操作oplog从节点定期轮询主节点获取这些操作然后对自己的数据副本执行这些操作从而保证从节点的数据与主节点一致。两种类型master/slavereplica set: 复制集、副本集服务于同一数据集的多个mongodb实例主节点将数据修改操作保存至oplog中arbiter: 仲裁者副本集特征N 个节点的集群任何节点可作为主节点所有写入操作都在主节点上自动故障转移自动恢复工作特性至少三个且应该为奇数个节点可以使用arbiter来参与选举heartbeat2s, 自动失效转移通过选举方式实现复制集的中特殊类型的节点0优先级的节点冷备节点不会被选举成为主节点但可以参与选举被隐藏的从节点首先是一个0优先级的从节点且对客户端不可见延迟复制的从节点首先是一个0优先级的从节点且复制时间落后于主节点一个固定时长arbiter: 仲裁节点没有数据对于oplog大小固定的文件存储在local数据库副本集节点初始化过程的步骤基本分为以下三步初始同步(initial sync)回滚后追赶(post-rollback catch-up)切分块迁移(sharding chunk migrations)local: 存放了副本集的所有元数据和oplog用于存储oplog的是一个名为oplog.rs的collectionoplog.rs的大小依赖于OS及文件系统但可以自定义其大小oplogSizeMongo的数据同步类型初始同步节点没有任何数据时节点丢失副本复制历史复制初始同步的步骤1、克隆所有数据库2、应用数据集的所有改变复制oplog并应用于本地3、为所有collection构建索引MongoDB副本集创建测试mongodb的复制至少需要两个节点。其中一个是主节点负责处理客户端请求其余的都是从节点负责复制主节点上的数据。各个节点常见的搭配方式为一主一从、一主多从。主节点记录在其上的所有操作oplog从节点定期轮询主节点获取这些操作然后对自己的数据副本执行这些操作从而保证从节点的数据与主节点一致。MongoDB复制结构图如下所示1、环境准备三个节点node0:192.168.147.137、node1:192.168.147.134、node2:192.168.147.1332、各节点安装mongodb-org-server-7.0.40-1.el7.x86_64.rpm mongodb-org-shell-5.0.33-1.el7.x86_64.rpm mongodb-org-tools-4.2.25-1.el7.x86_64.rpmyum install mongodb-org-*.rpm3、准备数据存储目录/mongodb/data需要mongod用户及用户组权限install -o mongod -g mongod -d /mongodb/data4、配置文件准备/etc/mongod.conf配置文件中启用replication节配置只配置replSetName即可指定副本集的名字即可相同的副本集名称就可以加入到副本集集群中。5、启动mongodbsystemctl start mongod.service使用mongo命令连接进入MongoDB数据库使用help可以列出可用的子命令其中有rs.help()其会列出副本集可用的所有方法刚启动的节点即副本集还没有初始化。6、副本集初始化rs.initiate()查看状态可以看到初始化后本节点成为主节点集群成员即members中列出一个节点信息。查看local数据库中的collection7、启动其他节点并加入副本集节点rs.add(192.168.147.134)查看状态rs.status()又增加了一个成员8、主节点创建数据库插入数据测试此时到从节点查询无法查询不是主节点或者slaveOk为false所以还需要执行rs.secondaryOk()方法设置从节点可以执行查询高版本中使用secondaryOk代替了slaveOk此时可以在从节点查询。查看是否是主节点rs.isMaster()9、再添加一个节点rs.add(node2)#此处使用主机名添加对应节点上执行rs.secondaryOk()此时这个节点上也可以查询了 。从节点只能查询不能写入10、副本集的配置信息rs.conf()11、切换测试在主节点执行rs.stepDown()从其提示可看到由PRIMARY变为SECONDARY使用rs.status()查看发现192.168.147.134即node1变为主节点了查看oplog信息副本集的重新选举的影响条件心跳信息优先级optime网络连接网络分区选举机制 触发选举的事件新副本集初始化时从节点联系不到主节点时主节点“下台”时主节点收到stepDown()命令时某从节点有更高的优先级且已经满足成主节点其它所有条件主节点无法联系到副本集的“多数方”12、修改优先级以达到切换的目的测试在主节点上执行cfgrs.conf()cfg.members[2].priority2rs.reconfig(cfg)执行完毕后集群进行切换节点2成为主节点对于集群中如果某些节点主机的性能比较高可以设置较高的优先级使这些节点优先成为主节点发挥机器的性能。MongoDB的分片sharding在Mongodb里面存在另一种集群即分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时一台机器不足以存储数据也不足以提供可接受的读写吞吐量。这时就可以通过在多台机器上分散存储部分数据使得数据库系统能存储和处理更多的数据。使用分片的原因包括复制所有的写入操作到主节点延迟的敏感数据会在主节点查询单个副本集限制在12个节点当请求量巨大时会出现内存不足。本地磁盘不足垂直扩展价格昂贵分片集群结构分布分片架构中的角色也即三个主要组件mongosQuery Routers前端路由客户端由此接入且让整个集群看上去像单一数据库前端应用可以透明使用。config server: 元数据服务器mongod实例存储了整个 ClusterMetadata其中包括 chunk信息一般是三个节点防止单节点故障。shard 数据节点也称mongod实例用于存储实际的数据块实际生产环境中一个shard server角色可由几台机器组成一个replica set承担防止主机单点故障。分片架构需要借助zookeeper实现分片的分布式协同。一个大文件的切片示例分片是以索引为依据进行切片的分为几种类型基于范围切片 range基于列表切片 list即离散值基于hash切片 hash分片后要达到的目的是写离散读集中被依据的索引叫做分片键。配置分片集群测试环境四个节点node0:192.168.147.137、node1:192.168.147.134、node2:192.168.147.133、node3:192.168.147.128先配置config servernode0:192.168.147.137上配置文件中配置分片选项修改其监听端口为27019如果不配置默认值也为27019同时修改副本集名称为cfgrepl。使用clusterRoleconfigsvr指定本节点的集群角色为配置服务器在高版本的MongoDB中配置服务器必须配置成副本集以保证高可用因为配置服务器保存元数据是至关重要的数据。启动config serversystemctl start mongod.service登录到数据库mongo --port 27019初始化副本集rs.initiate()至此config server启动完毕安装配置启动mongosyum install mongodb-org-mongos-7.0.40-1.el7.x86_64mongos无需配置文件启动时使用选项指定config server即可语法--configdb replicaSetName/host1:port1,host2:port2,host3:port3mongos --configdb cfgrepl/192.168.147.137:27019 --bind_ip 192.168.147.128 --fork --logpath /var/log/mongos.log如果不配置--fork选项启动会在前台显示。此时可以登录到mongos上mongo --host 192.168.147.128此时可以查看分片相关方法的帮助分片的状态可以看到shards是空的还没有shard节点所以下一步就是增加shard节点配置文件/etc/mongod.conf对于高版本shard节点也必须是启用副本集集群所以需要设置replication项然后是启用sharding配置clusterRoleshardsvr指定启动为shard服务监听端口默认为27018第二个shard服务器其replSetNamesh2repl启动后需要对副本集集群初始化即rs.initiate()然后就是在mongos中添加分片服务器sh.addShard()sh.addShard(sh1repl/192.168.147.134:27018)因为初始化副本集时主节点添加的是node1:27018所以这里添加时需要一致起来sh.addShard(sh1repl/node1:27018)添加成功查看分片状态sh.status()已经添加了一个shard将第二个shard也添加进去sh.addShard(sh2repl/node2:27018)shard机制是在collection级别进行的即需要指定哪个数据库的哪个collection进行sharding所以要相应的使能数据库和collection因为如果一个表数据量很小没必要进行分片sh.enableSharding(dbname, shardName)dbname要启用分片的数据库名称。shardName可选指定该数据库的主分片。建议不指定此参数让集群自动选择。sh.shardCollection(fullName,key,unique,options)fullName集合的全名格式为 database.collection。key片键文档。例如 { userId: 1 }范围分片或 { userId: hashed }哈希分片。unique可选布尔值。如果为 true则强制片键索引唯一。options可选其他选项sh.enableSharding(testdb)sh.shardCollection(testdb.students,{age:1})在设置集合分片时要确保集合已经创建了相应的索引即先看一下索引情况db.newstd.getIndexes()如果没有索引创建索引db.newstd.createIndex({age: 1})然后设置集合分片。db.students.getShardDistribution()#可以查看分片情况
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →