范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

02MongoDB集群环境搭建配置

  MongoDB集群环境搭建配置
  li_zliang
  1. 概述
  1.1 主从复制
  1.2 副本集
  1.3 分片
  2. 副本集集群搭建
  2.1 Primary和Secondary搭建的Replica Set
  2.1.1 规划
  2.1.2 安装
  2.1.2 创建目录
  2.1.3 配置文件
  2.1.4 安全认证
  2.1.5 启动节点
  2.1.6 配置
  2.1.7 验证
  2.2 加入Arbiter搭建Replica Set
  2.2.1 规划
  2.2.2 配置
  2.3 集群基本操作
  3. 分片集群搭建
  3.1 概述
  3.2 规划
  3.3 分片Shard Server
  3.3.1 计划修改(以108为例)
  3.3.2 发现问题(续前节)
  3.3.3 实际修改(续前节)
  3.3.4 修改其他服务器
  3.4 配置Config Server
  3.4.1 创建目录
  3.4.2 配置文件
  3.4.3 安全配置
  3.4.4 初始配置
  3.5 路由Router Server
  3.5.1 创建目录
  3.5.2 配置文件
  3.5.3 安全配置
  3.5.4 启动服务
  3.5.5 串联配置和路由
  3.5.6 用户操作
  3.7 测试-指定数据库集合分片
  3.8 测试-客户端连接
  3.8 登陆用户说明
  3.9 安全认证说明
  3.10 关闭启动说明
  1. 概述
  MongoDB 有三种集群部署模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。Master-Slaver 是一种主从副本的模式,目前已经不推荐使用。Replica Set 模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。Sharding 模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
  Sharding 模式追求的是高性能,而且是三种集群中最复杂的。在实际生产环境中,通常将 Replica Set 和 Sharding 两种技术结合使用。
  1.1 主从复制
  副本集代替,不再赘述;
  1.2 副本集
  此集群拥有一个主节点和多个从节点,这一点与主从复制模式类似,且主从节点所负责的工作也类似,但是副本集与主从复制的区别在于:当集群中主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接新的主节点,而且这个过程对应用是透明的。
  主节点负责数据的写入和更新,并在更新数据的同时,将操作信息写入名为 oplog 的日志文件当中。
  从节点会定时轮询读取 oplog 日志,根据日志内容同步更新自身的数据,保持与主节点一致。
  副本集中的各节点会通过心跳信息来检测各自的健康状况,当主节点出现故障时,多个从节点会触发一次新的选举操作,并选举其中一个作为新的主节点。为了保证选举票数不同,副本集的节点数保持为奇数。
  当然,还可以加入仲裁者(Arbiter),该节点不存储数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。
  因此综上,副本集集群搭建有两种:
  第一种: 主节点(1个) + 多个副本节点, 即奇数个数据节点构成的Replica Set;
  第二种: 主节点(1个) + 多个副本节点 + 仲裁节点,即偶数个数据节点,加一个Arbiter节点构成的Replica Set;
  默认情况下,副本节点不能读写;
  若副本节点宕机,不受影响;若主节点宕机,则会进行选举;
  1.3 分片
  当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。这就需要用到 MongoDB 的分片(Sharding)技术。
  构建一个 MongoDB 的分片集群,需要三个重要的组件,分别是分片服务器(Shard Server)、配置服务器(Config Server)和路由服务器(Route Server)。
  Shard Server
  每个 Shard Server 都是一个 mongod 数据库实例,用于存储实际的数据块。整个数据库集合分成多个块存储在不同的 Shard Server 中。
  在实际生产中,一个 Shard Server 可由几台机器组成一个副本集来承担,防止因主节点单点故障导致整个系统崩溃。
  Config Server
  这是独立的一个 mongod 进程,保存集群和分片的元数据,在集群启动最开始时建立,保存各个分片包含数据的信息。
  Route Server
  这是独立的一个 mongos 进程,Route Server 在集群中可作为路由使用,客户端由此接入,让整个集群看起来像是一个单一的数据库,提供客户端应用程序和分片集群之间的接口。
  Route Server 本身不保存数据,启动时从 Config Server 加载集群信息到缓存中,并将客户端的请求路由给每个 Shard Server,在各 Shard Server 返回结果后进行聚合并返回客户端。
  2. 副本集集群搭建
  为了后续章节(分片集群搭建),我这里就采用1台服务器模拟副本集搭建,就是在一台服务器上启动3个mongod实例;
  2.1 Primary和Secondary搭建的Replica Set
  2.1.1 规划
  计算机名
  IP
  节点
  端口
  目录
  名称
  mongodb1
  192.168.25.107
  主节点Primary
  27017
  2.1.2 安装   按照<01_MongoDB安装配置>,先安装好MongoDB并配置环境变量;   2.1.2 创建目录   # mkdir -p /usr/local/mongodb/shard1/data   # mkdir -p /usr/local/mongodb/shard1/logs   # mkdir -p /usr/local/mongodb/shard1/etc   # mkdir -p /usr/local/mongodb/shard1/tmp   # mkdir -p /usr/local/mongodb/shard2/data   # mkdir -p /usr/local/mongodb/shard2/logs   # mkdir -p /usr/local/mongodb/shard2/etc   # mkdir -p /usr/local/mongodb/shard2/tmp   # mkdir -p /usr/local/mongodb/shard3/data   # mkdir -p /usr/local/mongodb/shard3/logs   # mkdir -p /usr/local/mongodb/shard3/etc   # mkdir -p /usr/local/mongodb/shard3/tmp   # chown -R mongod:mongod /usr/local/mongodb/shard1 # root用户时不执行   # chown -R mongod:mongod /usr/local/mongodb/shard2 # root用户时不执行   # chown -R mongod:mongod /usr/local/mongodb/shard3 # root用户时不执行   2.1.3 配置文件   vim /usr/local/mongodb/shard1/etc/mongod.conf   vim /usr/local/mongodb/shard2/etc/mongod.conf   vim /usr/local/mongodb/shard3/etc/mongod.conf   编制3个配置文件,注意:dbpath属性分别配置为shard 1、shard 2、shard 3的data路径;logpath属性分别配置为shard 1、shard 2、shard 3的log文件;port属性分别配置为27017、27018、27019;pidFilePath属性分别配置shard 1 mongo_27017.pid、、shard 2 mongo_27018.pid、shard 3 mongo_27019.pid;配置security.keyFile分别配置shard 1、shard 2、shard 3的keyFile文件;配置replication;   其中node1的配置文件如下:   实际配置时建议删除不需要的配置;删除中文注释,行内不注释,仅保留必须的注释;   # 日志配置   systemLog:   destination: file   path: /usr/local/mongodb/shard1/logs/mongodb.log   logAppend: true   # 网络配置   net:   maxIncomingConnections: 5000   port: 27017   bindIp: 0.0.0.0   serviceExecutor : adaptive   # 存储配置   storage:   dbPath: /usr/local/mongodb/shard1/data   journal:   enabled: true   commitIntervalMs: 100   # 启动配置   processManagement:   fork: true   pidFilePath: /usr/local/mongodb/shard1/tmp/mongo_27017.pid   # 安全配置   security:   authorization: "enabled" # 启用验证   keyFile: /usr/local/mongodb/shard1/etc/replica_set.key # 指定分片或副本集成员之间身份验证的key文件存储位置   clusterAuthMode: "keyFile" # 指定分片或副本集成员之间身份验证模式   # 副本集集群配置   replication:   oplogSizeMB: 65536 #64GB # 默认硬盘的5%,指定oplog的最大尺寸   replSetName: rs1 # 指定副本集的名称   # secondaryIndexPrefetch: "all" # 指定副本集成员在接收oplog之前是否加载索引到内存,all加载所有(默认),none不加载,_id_only仅加载_id   # 分片集群配置   #sharding:   # clusterRole: shardsvr # 指定当前分片在集群中的角色,shardsvr是shard节点,configsvr是config server节点   # archiveMovedChunks: false   # configDB: configReplSet/ip:port,ip:port,ip:port # 告诉mongos节点config server的地址信息   2.1.4 安全认证   如果没有配置安全认证(security.keyFile)的话,在启动节点时会出现:   security.keyFile is required when authorization is enabled with replica sets   因为副本集的各个节点成员之间通信要内部身份验证; 启用节点间身份验证可以使用密钥文件或x.509证书,本文使用密钥文件;   安全认证在mongod.conf中配置如下:   # 安全配置   security:   authorization: "enabled" # 启用验证   keyFile: /usr/local/mongodb/shard1/etc/replica_set.key # 指定分片或副本集成员之间身份验证的key文件存储位置   clusterAuthMode: "keyFile" # 指定分片或副本集成员之间身份验证模式   在keyfile身份验证中,副本集中的每个mongod实例都使用keyfile的内容作为共享密码,只有具有正确密钥文件的mongod或者mongos实例可以连接到副本集。密钥文件的内容必须在6到1024个字符之间,并且在unix/linux系统中文件所有者必须有对文件至少有读的权限;   所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限;   首先在第一个节点上生成keyFile:   # 进入第一个节点   # cd /usr/local/mongodb/shard1/etc   //生成keyFile   # openssl rand -base64 756 > replica_set.key   //设置权限   # chmod 600 replica_set.key   然后将生成的keyFile复制到其他节点目录,如果节点是不同服务器,则需要下载上传复制;   这里采用同一个服务器模拟三个节点,直接cp复制了;   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/shard2/etc/   # chmod 600 /usr/local/mongodb/shard2/etc/replica_set.key   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/shard3/etc/   # chmod 600 /usr/local/mongodb/shard3/etc/replica_set.key   2.1.5 启动节点   依次启动三个节点:   # mongod -f /usr/local/mongodb/shard1/etc/mongod.conf   # mongod -f /usr/local/mongodb/shard2/etc/mongod.conf   # mongod -f /usr/local/mongodb/shard3/etc/mongod.conf   # ps -ef | grep mongod   2.1.6 配置   输入mongo -port 27017,连接到第一个节点,执行以下内容;权重priority(有效取值是0~1000,可为小数,默认为1)高的节点会被选为Primary;   # mongo -port 27017   > use admin   > config = {   _id: "rs1",   members: [   {_id: 0, host: "192.168.25.107:27017", priority:3},   {_id: 1, host: "192.168.25.107:27018", priority:2},   {_id: 2, host: "192.168.25.107:27019", priority:1}   ]   }   > rs.initiate(config)   查看:   //查看配置   > rs.config()   //查看状态   > rs.status()   注意,我们在配置文件中开启了认证模式authorization: "enabled", 在初始化时、查看配置rs.config()、查看状态rs.status()可能会提示权限问题;   详见<2.1.7验证>章节,可以先创建管理用户,登陆 >use admin >db.auth("user","pwd")后再操作;   如果初始化时提示权限,先在配置文件中关闭认证authorization: "disabled",添加配置并初始化后再启用认证;   //进入primary节点   # mongo -port 27017   //创建管理用户,用户必须具备clusterAdmin角色(进行复制集的管理(添加成员、查看状态等等))   > use admin   > db.createUser({user:"lizl", pwd:"123456", roles:[   {"role":"readWrite", db:"admin"},   {"role":"dbAdmin", db:"admin"},   {"role":"userAdminAnyDatabase", db:"admin"},   {"role":"readWriteAnyDatabase", db:"admin"},   {"role":"dbAdminAnyDatabase", db:"admin"},   {"role":"clusterAdmin", db:"admin"}   ]});   > use admin   > db.auth("lizl","123456")   至此,mongodb副本集集群搭建完毕;   2.1.7 验证   //进入primary节点,创建用户,如已创建可忽略   # mongo -port 27017   //创建管理用户,用户必须具备clusterAdmin角色(进行复制集的管理(添加成员、查看状态等等))   > use admin   > db.createUser({user:"lizl", pwd:"123456", roles:[   {"role":"readWrite", db:"admin"},   {"role":"dbAdmin", db:"admin"},   {"role":"userAdminAnyDatabase", db:"admin"},   {"role":"readWriteAnyDatabase", db:"admin"},   {"role":"dbAdminAnyDatabase", db:"admin"},   {"role":"clusterAdmin", db:"admin"}   ]});   > use admin   > db.auth("lizl","123456")   > rs.status()   //在主节点创建elsa数据库,创建test集合,并插入数据name="张三"   > use elsa   > db.test.insert({name:"张三"})   //进入secondary节点   # mongo -port 27018   //副本集之前会同步用户及数据   > use admin   > db.auth("lizl","123456")   > rs.status()   > use elsa   > db.test.find()   //会出现"errmsg" : "not master and slaveOk=false",是因为默认情况下secondary节点不能读写;   默认情况下secondary节点不能读写;可以通过以下命令设置副本节点允许查询;   > db.getMongo().setSlaveOk()   //关闭primary节点   # mongod -f /usr/local/mongodb/shard1/etc/mongod.conf --shutdown   # mongo -port 27018   //可以发现原来的secondary节点变成了primary节点;   //并可以登录用户查询数据了;   2.2 加入Arbiter搭建Replica Set   2.2.1 规划   计算机名   IP   节点   端口   目录   名称   mongodb1   192.168.25.107   主节点Primary   27017
  2.2.2 配置   采用Arbiter搭建Replica Set,根据上述章节,将第三个节点调整为仲裁节点Arbiter;   总体搭建过程与上述章节内容基本一致,差异的地方如下:   在配置配置部分第三个节点添加 arbiterOnly:true;必须的;   输入mongo -port 27017,连接到第一个节点,执行以下内容;   # mongo -port 27017   > config = {   _id: "rs1",   members: [   {_id: 0, host: "192.168.25.107:27017", priority:2},   {_id: 1, host: "192.168.25.107:27018", priority:1},   {_id: 2, host: "192.168.25.107:27019", arbiterOnly:true}   ]   }   > rs.initiate(config)   前述章节已经对当前服务器进行了rs.initiate(config),无法重复加载了; 故这里采用移除节点增加节点的方式进行操作:   在上述章节基础上修改,删除第三个节点,然后添加第三个节点为仲裁节点;   移除操作会使被移除节点服务停止,注意检查,需要启动;   如果启动失败后台日志出现:/usr/local/mongodb/shard3/data/mongod.lock;   则需要删除data/*.lock、tmp/mongod-27019.pid文件后启动;   其实捣鼓过一番,我是最终清空了data、tmp、logs目录后启动成功的;   //移除节点   > rs.remove("192.168.25.107:27019")   //添加仲裁节点   > rs.add({host:"192.168.25.107:27019",arbiterOnly:true})   或者   > rs.addArb("192.168.25.107:27019")   //移除操作会使第三个节点服务停止,注意检查,需要启动;   > rs.config()   > rs.status()   验证如下:   2.3 集群基本操作   注意操作如下内容,需要创建用户且用户必须具备clusterAdmin角色,并登录admin库;   # mongo -port xxxxx   # use admin   # db.auth("lizl","123456")   //初始化   > rs.initiate()   //添加节点成员   > rs.add("192.168.25.107:27018")   > rs.add("192.168.25.107:27019")   //查看状态   > rs.status()   //添加仲裁节点   > rs.add({host:"192.168.25.107:27019",arbiterOnly:true})   或者   > rs.addArb("192.168.25.107:27019")   //移除节点   > rs.remove("192.168.25.107:27019")   //节点降级从primary将为secondary   > rs.stepDown()   //查看配置   > rs.config()   //更新配置   > var config = rs.config()   //更新配置-设置优先级   > config.members[2].priority=2   //更新配置-更新节点   > conf.members[0].host="IP:PORT";   > rs.reconfig(config,{"force":true})   //停止服务   > db.shutdownServer()   3. 分片集群搭建   先参考<2. 副本集集群搭建>学会副本集集群搭建;   3.1 概述   在实际生产环境中,集群会结合副本集和分片机制保证生产过程的高可靠性和高可扩展性。   本章节即采用 副本集+切片 构建高可用集群;   每一个切片服务器(Shard Server)由一个包含三个 mongod 实例的副本集组成,避免了单一的 mongod 实例出现故障造成数据的丢失。   配置服务器(Config Server) 也可由多个 mongod 实例集群组成,保证集群中配置信息的可用性。   路由服务器(Router Server)也可使用多个 mongos 实例,来保证客户端的请求能得到及时的响应。   分片服务器(Shard Server)存储具体的分片数据。   配置服务器(Config Server)是普通的 mongod 服务器,保存着集群的配置信息:集群中有哪些分片、分片的是哪些集合,以及数据块的分布。   启动集群后,路由服务器(Route Server)加载 Config Server 中的分片信息, 客户端通过连接 Route Server 来获取集群中的数据信息。   3.2 规划1. 准备三台服务器107、108、109进行模拟;2. 每个服务器按照上述步骤模拟构建好三个成员的副本集集群,以保证数据的容错和冗余;   ( 基于192.168.25.107构建好 副本集集群后,将107虚拟机复制2份,形成108和109;) 3. 每个副本集作为整体构建一个分片(Shard Server);4. 每个服务器启动一个mongod实例构建Config Server,这里配置服务器也构成个副本集,在此副本集名称:rs-conf;5. 每个服务器启动一个mongos实例构建Route Server;   计算机名   IP   mongos   config server   Shard Server   shard   端口   名称   mongodb1   192.168.25.107   27000
  27001(rs-conf)   主节点Primary   27017
  rs1副本集   副本节点Secondary   27018
  副本节点Secondary   27019
  mongodb2   192.168.25.108   27000
  27001(rs-conf)   主节点Primary   27017
  rs2副本集   副本节点Secondary   27018
  副本节点Secondary   27019
  mongodb3   192.168.25.109   27000
  27001(rs-conf)   主节点Primary   27017
  rs3副本集   副本节点Secondary   27018
  副本节点Secondary   27019
  3.3 分片Shard Server   基于192.168.25.107构建好 副本集集群后,将107虚拟机复制2份,形成108和109;然后分别修改配置: 修改每个节点配置文件中sharding.clusterRole改为shardsvr(注意 107 108 109 都修改); 修改每个节点配置文件中replSetName改为rs1(107)、rs2(108)、rs3(109)(这里只改108 109即可); 重新配置下集群,因为rs.config()都是配置的IP;涉及的IP改为107、108、109(这里只改108 109即可);   这里重新配置集群做了很多尝试,终于成功修改了配置,详见下述章节:   <3.3.1计划修改>是做的尝试,但出现了<3.3.2发现问题>,最终按照<3.3.3实际修改>执行;   3.3.1 计划修改(以108为例)修改每个节点配置文件中replSetName改为rs2;   # vim /usr/local/mongodb/shard1/etc/mongod.conf   # vim /usr/local/mongodb/shard2/etc/mongod.conf   # vim /usr/local/mongodb/shard3/etc/mongod.conf   # 副本集集群配置   replication:   replSetName: rs1修改每个节点配置文件中sharding.clusterRole改为shardsvr;   # 分片集群配置   sharding:   clusterRole: shardsvr启动三个节点服务;   # mongod -f /usr/local/mongodb/shard1/etc/mongod.conf   # mongod -f /usr/local/mongodb/shard2/etc/mongod.conf   # mongod -f /usr/local/mongodb/shard3/etc/mongod.conf访问第一个节点服务并使用管理账号登录admin库;   # mongo -port 27017   > use admin   > db.auth("lizl","123456")采用移除节点添加节点方式重新配置下集群,因为rs.config()都是配置的IP;涉及的IP改为108;   # mongo -port 27017   //更新配置   > var config = rs.config()   //更新配置-更新节点   > config.members[0].host="192.168.25.108:27017"   > config.members[1].host="192.168.25.108:27018"   > config.members[2].host="192.168.25.108:27019"   > rs.reconfig(config,{"force":true})重启各个节点并验证;   3.3.2 发现问题(续前节)   这个时候发现了问题:rs.config()._id应该是rs2,但始终是rs1;怎么捣鼓都不行;   采用下述方式更新不起作用:   > var config = rs.config()   //更新配置-更新节点   > config._id = "rs2"   > rs.reconfig(config,{"force":true})   采用下述方式提示不能重复加载:   > config = {   _id: "rs2",   members: [   {_id: 0, host: "192.168.25.108:27017", priority:3},   {_id: 1, host: "192.168.25.108:27018", priority:2},   {_id: 2, host: "192.168.25.108:27019", priority:1}   ]   }   > rs.initiate(config)   后研究发现,配置信息是在local库,system.replset集合内;   尝试更新这个集合的数据,提示管理账号无权限; 后来想了想,关闭认证可能就不提示无权限了;   > db.system.replset.find()   > db.system.replset.update({"_id":"rs1"},{$set:{"_id":"rs2"}})   且研究发现,无法在local库添加用户;   无奈...;   然后继续,经查,按照下述章节执行成功;   3.3.3 实际修改(续前节)采用非配置文件方式启动三个节点服务(重要)   # mongod --dbpath /usr/local/mongodb/shard1/data --logpath /usr/local/mongodb/shard1/logs/mongodb.log --port 27017 --logappend --bind_ip 0.0.0.0 --fork   # mongod --dbpath /usr/local/mongodb/shard2/data --logpath /usr/local/mongodb/shard2/logs/mongodb.log --port 27018 --logappend --bind_ip 0.0.0.0 --fork   # mongod --dbpath /usr/local/mongodb/shard3/data --logpath /usr/local/mongodb/shard3/logs/mongodb.log --port 27019 --logappend --bind_ip 0.0.0.0 --fork访问节点服务并使用管理账号登录admin库;   # mongo -port 27017   > use admin   > db.auth("lizl","123456")   //进入local库   > use local   > db.system.replset.find()尝试更新_id=rs2无果   > db.system.replset.update({"_id":"rs1"},{$set:{"_id":"rs2"}})   干脆删除system.replset的数据,竟然成功了!   > db.system.replset.remove({"_id":"rs1"})   其他两个节点按照同样方式删除system.replset的数据;   # mongo -port 27018 //节点2   > use admin   > db.auth("lizl","123456")   //进入local库   > use local   > db.system.replset.remove({"_id":"rs1"})   # mongo -port 27019 //节点3   > use admin   > db.auth("lizl","123456")   //进入local库   > use local   > db.system.replset.remove({"_id":"rs1"})关闭三个节点服务   # mongod --dbpath /usr/local/mongodb/shard1/data --logpath /usr/local/mongodb/shard1/logs/mongodb.log --port 27017 --logappend --bind_ip 0.0.0.0 --fork --shutdown   # mongod --dbpath /usr/local/mongodb/shard2/data --logpath /usr/local/mongodb/shard2/logs/mongodb.log --port 27018 --logappend --bind_ip 0.0.0.0 --fork --shutdown   # mongod --dbpath /usr/local/mongodb/shard3/data --logpath /usr/local/mongodb/shard3/logs/mongodb.log --port 27019 --logappend --bind_ip 0.0.0.0 --fork --shutdown修改每个节点配置文件中replSetName改为rs2;   # vim /usr/local/mongodb/shard1/etc/mongod.conf   # vim /usr/local/mongodb/shard2/etc/mongod.conf   # vim /usr/local/mongodb/shard3/etc/mongod.conf   # 副本集集群配置   replication:   replSetName: rs2修改每个节点配置文件中sharding.clusterRole改为shardsvr;   # 分片集群配置   sharding:   clusterRole: shardsvr启动三个节点服务;   # mongod -f /usr/local/mongodb/shard1/etc/mongod.conf   # mongod -f /usr/local/mongodb/shard2/etc/mongod.conf   # mongod -f /usr/local/mongodb/shard3/etc/mongod.conf访问第一个节点服务并使用管理账号登录admin库;   # mongo -port 27017   > use admin   > db.auth("lizl","123456")   > rs.config() //会提示"NotYetInitialized"重新加载集群配置;   > config = {   _id: "rs2",   members: [   {_id: 0, host: "192.168.25.108:27017", priority:3},   {_id: 1, host: "192.168.25.108:27018", priority:2},   {_id: 2, host: "192.168.25.108:27019", priority:1}   ]   }   > rs.initiate(config)成功搞定!   3.3.4 修改其他服务器   按照上述章节修改其他服务器109,注意两个地方别改错了:修改每个节点配置文件中sharding.clusterRole改为shardsvr;---107 109;修改每个节点配置文件中replSetName改为rs3;重新加载集群配置;   > config = {   _id: "rs3",   members: [   {_id: 0, host: "192.168.25.109:27017", priority:3},   {_id: 1, host: "192.168.25.109:27018", priority:2},   {_id: 2, host: "192.168.25.109:27019", priority:1}   ]   }   > rs.initiate(config)   至此,三个分片Shard Server(每个为三个节点的副本集集群)搭建好了!   3.4 配置Config Server   3.4.1 创建目录   在集群中,Config Server 也通常配置成副本集模式来保证数据的可靠性(mongodb3.4以后要求配置服务器也创建副本集),在此副本集名称:rs-conf;   在三台服务器上分别创建配置服务的目录(同副本集创建方式):   mkdir -p /usr/local/mongodb/mongoconf/data   mkdir -p /usr/local/mongodb/mongoconf/logs   mkdir -p /usr/local/mongodb/mongoconf/etc   mkdir -p /usr/local/mongodb/mongoconf/tmp   # chown -R mongod:mongod /usr/local/mongodb/mongoconf # root用户时不执行   3.4.2 配置文件   在三台服务器上/usr/local/mongodb/mongoconf/etc目录,分别创建配置文件:mongod-conf.conf   注意几点:systemLog.path:路径及文件名storage.dbPath:路径net.port:端口security.keyFile:key文件目录及文件名,这里要和分片Shard Server的keyFile一样 replication.replSetName:副本集名sharding.clusterRole:配置角色   实际配置时建议删除不需要的配置;删除中文注释,行内不注释,仅保留必须的注释;   # cd /usr/local/mongodb/mongoconf/etc   # vim mongod-conf.conf   # 日志配置   systemLog:   destination: file   path: /usr/local/mongodb/mongoconf/logs/mongodb-conf.log   logAppend: true   # 网络配置   net:   maxIncomingConnections: 5000   port: 27001   bindIp: 0.0.0.0   serviceExecutor : adaptive   # 存储配置   storage:   dbPath: /usr/local/mongodb/mongoconf/data   journal:   enabled: true   commitIntervalMs: 100   # 启动配置   processManagement:   fork: true   pidFilePath: /usr/local/mongodb/mongoconf/tmp/mongo-conf_27001.pid   # 安全配置   security:   authorization: "enabled" # 启用验证   keyFile: /usr/local/mongodb/mongoconf/etc/replica_set.key # 指定分片或副本集成员之间身份验证的key文件存储位置   clusterAuthMode: "keyFile" # 指定分片或副本集成员之间身份验证模式   # 副本集集群配置   replication:   oplogSizeMB: 1000 # 默认硬盘的5%,指定oplog的最大尺寸   replSetName: rs-conf # 指定副本集的名称   # secondaryIndexPrefetch: "all" # 指定副本集成员在接收oplog之前是否加载索引到内存,all加载所有(默认),none不加载,_id_only仅加载_id   # 分片集群配置   sharding:   clusterRole: configsvr # 指定当前分片在集群中的角色,shardsvr是shard节点,configsvr是config server节点   # archiveMovedChunks: false   # configDB: rs-conf/192.168.25.107:27001,192.168.25.108:27001,192.168.25.109:27001 # 告诉mongos节点config server的地址信息   3.4.3 安全配置   所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限;   这里的配置服务的keyFile也要和Shard Server的keyFile一样;   然后将Shard Server的/shard1/etc/keyFile复制到107、108、109的/usr/local/mongodb/mongoconf/etc目录;   //107   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/mongoconf/etc/   //108   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/mongoconf/etc/   //109   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/mongoconf/etc/   3.4.4 初始配置   首先启动三个服务器的配置服务:   配置服务器是独立的 mongod 进程,所以可以像启动"普通的"mongod 进程一样启动配置服务器:   mongod -f /usr/local/mongodb/mongoconf/etc/mongod-conf.conf   然后访问配置服务27001,登陆mongo,进行配置服务器副本集初始化:   # mongo -port 27001   > use admin   > config = {_id:"rs-conf",members:[   {_id:0,host:"192.168.25.107:27001"},   {_id:1,host:"192.168.25.108:27001"},   {_id:2,host:"192.168.25.109:27001"}]   }   > rs.initiate(config);   > rs.config()   > rs.status()   如果提示"replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.25.108:27001 failed with Error connecting to 192.168.25.108:27001",关闭防火墙即可;   # systemctl stop firewalld.service   至此,三个配置config Server搭建好了!   3.5 路由Router Server   由于 mongos 需从配置服务器获取配置信息,因此配置服务器应先于任何 mongos 进程启动。   目前三台服务器的配置服务器和分片服务器均已启动,现在配置三台mongos服务器;   3.5.1 创建目录   在三台服务器上分别创建路由服务的目录:   mkdir -p /usr/local/mongodb/mongos/logs   mkdir -p /usr/local/mongodb/mongos/etc   mkdir -p /usr/local/mongodb/mongos/tmp   # chown -R mongod:mongod /usr/local/mongodb/mongos # root用户时不执行   3.5.2 配置文件   在三台服务器上/usr/local/mongodb/mongos/etc目录,分别创建配置文件:mongos.conf   注意几点:systemLog.path:路径及文件名storage:不需要配置,mongos 自身并不保存数据,它会在启动时从配置服务器加载集群数据net.port:端口security.keyFile:key文件目录及文件名security.authorization:不需要开启replication:不需要配置sharding.clusterRole:不需要配置sharding.configDB:配置配置服务器   实际配置时建议删除不需要的配置;删除中文注释,行内不注释,仅保留必须的注释;   # cd /usr/local/mongodb/mongos/etc   # vim mongos.conf   # 日志配置   systemLog:   destination: file   path: /usr/local/mongodb/mongos/logs/mongos.log   logAppend: true   # 网络配置   net:   maxIncomingConnections: 5000   port: 27000   bindIp: 0.0.0.0   serviceExecutor : adaptive   # 存储配置   #storage:   # dbPath: /usr/local/mongodb/mongos/data   # journal:   # enabled: true   # commitIntervalMs: 100   # 启动配置   processManagement:   fork: true   pidFilePath: /usr/local/mongodb/mongos/tmp/mongos_27000.pid   # 安全配置   security:   # authorization: "enabled" # 启用验证   keyFile: /usr/local/mongodb/mongos/etc/replica_set.key # 指定分片或副本集成员之间身份验证的key文件存储位置   clusterAuthMode: "keyFile" # 指定分片或副本集成员之间身份验证模式   # 副本集集群配置   #replication:   # oplogSizeMB: 1000 # 默认硬盘的5%,指定oplog的最大尺寸   # replSetName: rs-conf # 指定副本集的名称   # secondaryIndexPrefetch: "all" # 指定副本集成员在接收oplog之前是否加载索引到内存,all加载所有(默认),none不加载,_id_only仅加载_id   # 分片集群配置   sharding:   # clusterRole: configsvr # 指定当前分片在集群中的角色,shardsvr是shard节点,configsvr是config server节点   # archiveMovedChunks: false   configDB: rs-conf/192.168.25.107:27001,192.168.25.108:27001,192.168.25.109:27001 # 告诉mongos节点config server的地址信息   3.5.3 安全配置   然后将Shard Server的/shard1/etc/keyFile复制到107、108、109的/usr/local/mongodb/mongos/etc目录;   //107   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/mongos/etc/   //108   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/mongos/etc/   //109   # cp /usr/local/mongodb/shard1/etc/replica_set.key /usr/local/mongodb/mongos/etc/   3.5.4 启动服务   为了保障操作,此时要把相关服务启动起来:   首先启动三台服务器的配置服务config server,前述章节已经启动过,如启动不需要再启动:   mongod -f /usr/local/mongodb/mongoconf/etc/mongod-conf.conf   然后启动三台服务器的切片服务Shard Server(三个节点副本集),每个服务器有三个节点,都要启动,前述章节已经启动过,如启动不需要再启动;   mongod -f /usr/local/mongodb/shard1/etc/mongod.conf   mongod -f /usr/local/mongodb/shard2/etc/mongod.conf   mongod -f /usr/local/mongodb/shard3/etc/mongod.conf   最后启动三台服务器上的mongos服务:   # mongos -f /usr/local/mongodb/mongos/etc/mongos.conf   3.5.5 串联配置和路由   目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,但此时还不能使用分片功能,需要登录mongos启用分片;   登陆任意一台服务器mongos服务,进行串联:   # mongo --port 27000   > use admin   //串联路由服务器与分配副本集   > sh.addShard("rs1/192.168.25.107:27017,192.168.25.107:27018,192.168.25.107:27019")   > sh.addShard("rs2/192.168.25.108:27017,192.168.25.108:27018,192.168.25.108:27019")   > sh.addShard("rs3/192.168.25.109:27017,192.168.25.109:27018,192.168.25.109:27019")   //还可以写成   //> db.runCommand({addShard:"rs1/192.168.25.107:27017,192.168.25.107:27018,192.168.25.107:27019"})   //查看状态,要先参考<3.5.6用户操作>登陆mongos才可查看   sh.status()   --- Sharding Status ---   sharding version: {   "_id" : 1,   "minCompatibleVersion" : 5,   "currentVersion" : 6,   "clusterId" : ObjectId("61c046d4c8ff229e63a010c2")   }   shards:   { "_id" : "rs1", "host" : "rs1/192.168.25.107:27017,192.168.25.107:27018,192.168.25.107:27019", "state" : 1 }   { "_id" : "rs2", "host" : "rs2/192.168.25.108:27017,192.168.25.108:27018,192.168.25.108:27019", "state" : 1 }   { "_id" : "rs3", "host" : "rs3/192.168.25.109:27017,192.168.25.109:27018,192.168.25.109:27019", "state" : 1 }   active mongoses:   "4.4.10" : 1   autosplit:   Currently enabled: yes   balancer:   Currently enabled: yes   Currently running: no   Failed balancer rounds in last 5 attempts: 4   Last reported error: Could not find host matching read preference { mode: "primary" } for set rs2   Time of Reported error: Tue Dec 21 2021 09:57:20 GMT+0800 (CST)   Migration Results for the last 24 hours:   682 : Success   1 : Failed with error "aborted", from rs1 to rs3   databases:   { "_id" : "config", "primary" : "config", "partitioned" : true }   config.system.sessions   shard key: { "_id" : 1 }   unique: false   balancing: true   chunks:   rs1 342   rs2 341   rs3 341   too many chunks to print, use verbose if you want to force print   { "_id" : "elsa", "primary" : "rs1", "partitioned" : false, "version" : { "uuid" : UUID("dd777ca9-0843-4f8b-b28c-fe492590664d"), "lastMod" : 1 } }   3.5.6 用户操作   访问路由服务mongs 27000,用前面创建的管理账号lizl登陆时,发现认证不了:   访问配置服务mongod-conf 27001,用前面创建的管理账号lizl登陆时,也发现认证不了;   访问切片节点服务mongod 270017,用前面创建的管理账号lizl登陆时,可以登录;   管理账号lizl是在节点服务mongod 270017创建的;   看来在 在切片节点服务mongod 270017创建的账号,在配置服务mongod-conf 27001和路由服务mongs 27000都不能访问;   但是切片集群,客户端访问的路由服务mongs 27000;因此我们要在路由服务mongs 27000下创建账号;   首先路由服务mongs 27000下创建账号:   //访问任意服务器mongos   # mongo -port 27000   //创建管理用户   > use admin   > db.createUser({user:"mongos1", pwd:"123456", roles:[   {"role":"readWrite", db:"admin"},   {"role":"dbAdmin", db:"admin"},   {"role":"userAdminAnyDatabase", db:"admin"},   {"role":"readWriteAnyDatabase", db:"admin"},   {"role":"dbAdminAnyDatabase", db:"admin"},   {"role":"clusterAdmin", db:"admin"}   ]});   > db.auth("mongos1","123456");   > 登陆OK   然后删除原来的在节点创建的管理账号lizl:(三个服务器切片节都删除,仅在其中一个节点删除即可)   //访问任意服务器mongos   # mongo -port 27017   //创建管理用户   > use admin   > db.auth("lizl","123456");   > show users   > db.dropUser("lizl")   3.7 测试-指定数据库集合分片   不过应用程序连接到mongos路由服务器并不能自动使用分片机制,还需要设置分片配置,让让指定的数据库、指定的集合分片生效。   设置分片需要在admin数据库进行;   //登陆mongos   # mongo --port 27000   //必须在admin库进行   > use admin   > db.auth("mongos1","123456")   //指定testdb数据库分片生效   > db.runCommand({enablesharding:"testdb"})   //指定testdb数据库的collection1集合分片,根据id自动分片到shard1、shard2、...上面去   > db.runCommand({shardcollection:"testdb.collection1", key:{id:"hashed"}})   //查看collection1集合分片状态   > db.collection1.stats()   //登陆mongos   # mongo 192.168.25.107:27000   > use admin   > db.auth("mongos1","123456")   //使用测试库testdb   > use testdb   //插入数据   > for(var i = 1; i <= 100; i++) db.collection1.save({id:i, "test":"value"})   //查看分片   > db.collection1.stats();   3.8 测试-客户端连接   3.8 登陆用户说明   在本文中,我们在Shard Server分片节点创建了管理账号lizl,配置好切片集群后,发现用lizl无法登陆访问mongos!   后来发现集群不建议在每个单节点添加用户,并且建议单节点关闭初始添加账号的权限;   详见<3.5.6 用户调整>章节;   3.9 安全认证说明   关于内部身份认证+访问授权的说明:   副本集各个节点之间使用内部身份验证,用于内部各个实例的通信,只有相同keyfile才能相互访问,因此涉及副本集的节点都需要开启keyFile且必须一致;   配置服务config server、切片服务Shard Server、路由服务Router Server都是一样的,所以都要配置keyFile且必须相同;   mongos只做路由不保存数据,因此不需要开启开启访问数据的授权authorization:enabled;   所有的mongod(配置服务config server、切片服务Shard Server)才是真正的保存数据的分片,因此要开启访问数据的授权authorization:enabled;   配置服务config server、切片服务Shard Server的配置文件:   security:   keyFile: /path/xxxkeyFile.file   authorization: enabled   路由服务router server的配置文件   security:   keyFile: /path/xxxkeyFile.file   3.10 关闭启动说明   首先别忘了关闭防火墙!!!!!!   mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos;

孔融被满门抄斩,乞求曹操放过儿子,9岁儿子说了8个字成千古名言提起孔融,不少人可能首先想到的就是他四岁让梨的故事。那么孔融长大后都取得了哪些成就?他的结局又是怎样的呢?可能不少人就不知道了。孔融是孔子的第二十世孙,他的父亲曾担任过太山都尉,这补阴汤,一个补五脏之阴的方子,应对咽干口燥五心烦热耳鸣大家好,我是李医生中医常说瘦人多火,水常不足,什么意思?就是说身体消瘦的人,多是体内津液不足了,而导致津液不足的原因则是体内火旺,把身体内的水分都蒸发掉了,所以这样的人平常一般会出智能电视为何会跌下神坛,渐渐被冷落了?过来人道出五个原因电视机,不夸张地说,它是我们几代人的回忆。记得儿时,一家人围着在客厅,一起看电视节目的场景,还历历在目。随着科技的发展,传统电视机也升级换代为现在的智能电视。目前来说,传统的非智能2016年里约奥运会,郎平带领中国女排夺冠,有个重要原因是许家印2016年8月21日,中国女排的姑娘们第三次走上奥运会的最高领奖台。你可以为这场胜利找出一百个理由,但有个很重要的原因是许家印!2009年郎平离开美国女排主教练的岗位后,刚刚宣布自BNB链成为公链界的天花板,取得成功的原因是什么?BNB链简介BNB链(BinanceChain),简称BC,是以太坊的替代品,自成立以来发展迅速。出于多种原因,它成功地保持了其作为世界上最有价值的加密资产之一的地位。以太坊网络的55年叶剑英核对授衔名单时,看到一个名字出现了两次,这是何原因在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持!前言1955年,叶剑英正在核对授衔名单。可当他看到名单上的两个名字后,又不禁看了强大的X1级太阳耀斑已经从太阳喷发出来太阳发出了强烈的太阳耀斑,整个活动周期在2022年10月2日美国东部时间下午4点25分(太平洋时间下午1点25分)达到顶峰。美国宇航局的太阳动力学观测站不断观察太阳,捕捉到了该事件研究发现即使是少量的运动也能极大地增加大脑的体积锻炼使身体和心灵都保持健康,但对于体育锻炼如何以及在哪些方面影响我们的大脑却知之甚少。在以前的研究中,大脑通常被视为一个整体,神经科学家和当前研究的主要作者FabienneFox说今日冷门巴黎圣日耳曼(欧冠)今晚又是备受关注的欧冠之夜,厂长经过一番猛烈的研究,认为巴黎圣日耳曼将会爆出冷门!且听我娓娓道来。每天下午都发,先关注一下防止想看时找不到哦!大巴黎欧冠之梦延续巴黎圣日耳曼总身价8今日中超沧州雄狮65分钟打卡下班武汉三镇赛季第二败体育说吧今天中超联赛进行第21轮的5场比赛!河北德比河北队05沧州雄狮!这场比赛是在山西大同进行的,也是河北队本赛季的首次回到主场进行的比赛。上半场第12分钟,苏恩祖助攻臧一锋破门绝地求生同黎明杀机跨界合作变身为恐怖生存游戏迎接万圣节的到来,绝地求生官方最近宣布了与不对称多人游戏黎明杀机的跨界活动,绝地变身为一款恐怖游戏,并开放许多道具奖励。活动时间为10月21日至11月7日,所有PUBG玩家可从游戏
人生真奇潭朋友在二十多年前讲过一个怪事那天去登山,他们几朋友在一座祖坟前经过,他却停下了脚步,仔细欣赏这坟的好处土星出脉,前面千米外文笔尖峰高耸。喂,这坟后人富贵啊!想听故事无?把那包五叶神美国前总统唐纳德特朗普的第一任妻子伊万娜特朗普在家中死亡据美国媒体2022年7月16日报道,唐纳德特朗普的第一任妻子被发现死在曼哈顿的公寓里,胸部严重受伤。唐纳德特朗普的第一任妻子伊万娜的死亡情况尚未澄清。然而,一名美国医疗官员表示,她感谢不演之恩!原定主角辞演,换角后意外成经典的6部剧前几天,一则关于乐视的新闻引起热议。一直以为已经破产的乐视,竟然还有400多个员工,还过着神仙日子,靠着甄嬛传等影视剧的版权自给自足,没有老板,没有996的福报。不少人觉得他们真好8年后再看正阳门下,才发现里面的配角个个大有来头2011年,刚拍完年代剧傻春不久,导演刘家成又拿到了一个好剧本情满四合院,讲述的是老北京四合院里家长里短的故事。从小在四合院长大的刘家成,一看到这个剧本就特别喜欢,觉得这戏拍了肯定以浓夏惊雷,对年少勇敢物随心转,境同心造,炎夏里每一寸的光阴都有不自在,亦或每一寸的光景都是夏凉。凡事无多想,先做起来,自是有因有果,有得有失有感想。喜欢少年的行动力,喜欢少年不计后果只问梦想01hr晨人民日报每日金句摘录(2022年7月15日)备豫不虞,为国常道。研训先严训,问战先明责。生活就是人民,人民就是生活。为英雄立传,也是为时代画像。信仰激发力量,忠诚铸就未来。时代舞台广阔,青年大有可为。针尖大的窟窿能漏过斗大的经常肩膀酸痛,可能是肩周炎在作怪,一文了解什么是肩周炎什么是肩周炎?肩周炎,全称为肩关节周围炎,又叫冻结肩,五十肩,好发于50岁左右的女性,预后良好,痊愈后也可再复发。其主要症状是肩部疼痛。疼痛可为钝痛或刀割样痛,夜间尤重,甚至痛醒,波波维奇邓肯是我光辉岁月的开始,文班亚马是我临别依依的赠礼格雷格波波维奇作为NBA历史上最著名的主教练之一,在2022年3月12日,迎来了执教生涯常规赛的第1336场胜利,成功超越老尼尔森,独占NBA历史第一的宝座!加上执教生涯中的170吸毒又怎样,哥哥照样拿影帝滚!这可能是2022年最魔幻的事昔日吸毒坐牢的劣迹艺人,如今摇身一变成了影帝。更可笑的是,消息一出,他的粉丝们便开始狂欢毒不毒的不谈,我真的很吃他的颜。他已经知错了,为什么揪着不放呢?易烊千玺翻车,究竟得罪了谁?易烊千玺,遇见麻烦了。前几天,一条易烊千玺考编的词条登顶热搜,粉丝前脚刚祝贺哥哥上岸,后脚路人的怒火便烧到了易烊千玺身上。事情的起源是易烊千玺罗一舟胡先煦三人都考上了国家话剧院,其罗马诺确认阿贾克斯将以500万欧签下波尔图19岁中场孔塞桑直播吧7月16日讯意大利记者罗马诺确认,阿贾克斯将以500万欧的转会费签下波尔图19岁中场弗朗西斯科孔塞桑。此前葡萄牙媒体记录报称孔塞桑将转会阿贾克斯,罗马诺确认了这一消息,他指出