当前位置:Gxlcms > 数据库问题 > MongoDB高可用集群配置方案

MongoDB高可用集群配置方案

时间:2021-07-01 10:21:17 帮助过:7人阅读

Relica Set副本集方式

Mongodb的Replica Set即副本集方式主要有两个目的,一个是数据冗余做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。

另一个是做读写分离,读的请求分流到副本上,减轻主(Primary)的读压力。

1.Primary和Secondary搭建的Replica Set

  技术图片 image

Replica Set是mongod的实例集合,它们有着同样的数据内容。包含三类角色:

(1)主节点(Primary)

接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。

(2)副本节点(Secondary)

与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。

(3)仲裁者(Arbiter)

不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。

注意,一个自动failover的Replica Set节点数必须为奇数,目的是选主投票的时候要有一个大多数才能进行选主决策。

(4)选主过程

其中Secondary宕机,不受影响,若Primary宕机,会进行重新选主:

  技术图片 image

2.使用Arbiter搭建Replica Set

偶数个数据节点,加一个Arbiter构成的Replica Set方式:

  技术图片 image

Relica Set副本集方式整体大概如图:


  技术图片  

下面为副本集高可用方案搭建过程(此高可用方案也不推荐使用,只做参考):
1)机器环境
182.48.115.236 master-node(主节点)
182.48.115.237 slave-node1(从节点)
182.48.115.238 slave-node2(从节点)

MongoDB 安装目录:/usr/local/mongodb
MongoDB 数据库目录:/usr/local/mongodb/data
MongoDB 日志目录:/usr/local/mongodb/log/mongo.log
MongoDB 配置文件:/usr/local/mongodb/mongodb.conf

对以上三台服务器部署Mongodb的副本集功能,定义副本集名称为:hqmongodb
关闭三台服务器的iptables防火墙和selinux

2)确保三台副本集服务器上的配置文件完全相同(即三台机器的mongodb.conf配置一样,除了配置文件中绑定的ip不一样)。下面操作在三台节点机上都要执行:

编写配置文件,不同的机器修改bind_ip就可以了

  1. <code class=" language-bash">[root@master-node ~]# cat /usr/local/mongodb/mongodb.conf
  2. port=27017
  3. bind_ip = 182.48.115.236 //这个最好配置成本机的ip地址。否则后面进行副本集初始化的时候可能会失败!
  4. dbpath=/usr/local/mongodb/data
  5. logpath=/usr/local/mongodb/log/mongo.log
  6. pidfilepath=/usr/local/mongodb/mongo.pid
  7. fork=true
  8. logappend=true
  9. shardsvr=true
  10. directoryperdb=true
  11. oplogSize=10000
  12. noprealloc=true
  13. #auth=true
  14. #keyFile =/usr/local/mongodb/keyfile
  15. replSet =shard002
  16. </code>

........................具体配置........................

  1. <code class=" language-ruby"> <span class="token comment"># master.conf
  2. dbpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/data<span class="token operator">/master
  3. logpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/master<span class="token punctuation">.log
  4. pidfilepath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/master<span class="token punctuation">.pid
  5. directoryperdb<span class="token operator">=<span class="token keyword">true
  6. logappend<span class="token operator">=<span class="token keyword">true
  7. replSet<span class="token operator">=ynzw
  8. bind_ip<span class="token operator">=<span class="token number">10.211<span class="token number">.55<span class="token number">.10
  9. port<span class="token operator">=<span class="token number">27017
  10. oplogSize<span class="token operator">=<span class="token number">10000
  11. fork<span class="token operator">=<span class="token keyword">true
  12. noprealloc<span class="token operator">=<span class="token keyword">true
  13. <span class="token comment"># slaver1.conf
  14. dbpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/data<span class="token operator">/slaver1
  15. logpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/slaver1<span class="token punctuation">.log
  16. pidfilepath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/slaver1<span class="token punctuation">.pid
  17. directoryperdb<span class="token operator">=<span class="token keyword">true
  18. logappend<span class="token operator">=<span class="token keyword">true
  19. replSet<span class="token operator">=ynzw
  20. bind_ip<span class="token operator">=<span class="token number">10.211<span class="token number">.55<span class="token number">.10
  21. port<span class="token operator">=<span class="token number">27018
  22. oplogSize<span class="token operator">=<span class="token number">10000
  23. fork<span class="token operator">=<span class="token keyword">true
  24. noprealloc<span class="token operator">=<span class="token keyword">true
  25. <span class="token comment"># slaver2.conf
  26. dbpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/data<span class="token operator">/slaver2
  27. logpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/slaver2<span class="token punctuation">.log
  28. pidfilepath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/slaver2<span class="token punctuation">.pid
  29. directoryperdb<span class="token operator">=<span class="token keyword">true
  30. logappend<span class="token operator">=<span class="token keyword">true
  31. replSet<span class="token operator">=ynzw
  32. bind_ip<span class="token operator">=<span class="token number">10.211<span class="token number">.55<span class="token number">.10
  33. port<span class="token operator">=<span class="token number">27019
  34. oplogSize<span class="token operator">=<span class="token number">10000
  35. fork<span class="token operator">=<span class="token keyword">true
  36. noprealloc<span class="token operator">=<span class="token keyword">true
  37. <span class="token comment"># arbiter.conf
  38. dbpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/data<span class="token operator">/arbiter
  39. logpath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/arbiter<span class="token punctuation">.log
  40. pidfilepath<span class="token operator">=<span class="token operator">/opt<span class="token operator">/mongodb<span class="token operator">/logs<span class="token operator">/arbiter<span class="token punctuation">.pid
  41. directoryperdb<span class="token operator">=<span class="token keyword">true
  42. logappend<span class="token operator">=<span class="token keyword">true
  43. replSet<span class="token operator">=ynzw
  44. bind_ip<span class="token operator">=<span class="token number">10.211<span class="token number">.55<span class="token number">.10
  45. port<span class="token operator">=<span class="token number">27020
  46. oplogSize<span class="token operator">=<span class="token number">10000
  47. fork<span class="token operator">=<span class="token keyword">true
  48. noprealloc<span class="token operator">=<span class="token keyword">true
  49. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

启动4个节点

  1. <code class=" language-undefined"> /opt/mongodb/bin/mongod -f /opt/mongodb/conf/master.conf
  2. /opt/mongodb/bin/mongod -f /opt/mongodb/conf/slaver1.conf
  3. /opt/mongodb/bin/mongod -f /opt/mongodb/conf/slaver2.conf
  4. /opt/mongodb/bin/mongod -f /opt/mongodb/conf/arbiter.conf
  5. </code>

配置主,备,仲裁节点
客户端连接master、slaver中任意一个节点mongodb

  1. <code class=" language-bash">/opt/mongodb/bin/mongo 10.211.55.10:27017 #ip和port是某个节点的地址
  2. </code>

开始配置

  1. <code class=" language-bash">> use admin
  2. > cfg = {_id: "ynzw",members:[{_id: 0,host: ‘10.211.55.10:27017‘,priority: 3},{_id: 1,host: ‘10.211.55.10:27018‘,priority: 2},{_id: 2,host: ‘10.211.55.10:27019‘,priority: 1},{_id: 3,host: ‘10.211.55.10:27020‘,arbiterOnly: true}]};
  3. > rs.initiate(cfg) #使配置生效
  4. </code>

cfg是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的10.211.55.10:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。

检验
配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到如下信息:

  1. <code class=" language-bash"> ynzw:SECONDARY> rs.status()
  2. {
  3. "set" : "ynzw",
  4. "date" : ISODate("2017-05-26T06:47:32.069Z"),
  5. "myState" : 1,
  6. "term" : NumberLong(8),
  7. "heartbeatIntervalMillis" : NumberLong(2000),
  8. "members" : [
  9. {
  10. "_id" : 0,
  11. "name" : "10.211.55.10:27017",
  12. "health" : 1,
  13. "state" : 1,
  14. "stateStr" : "PRIMARY",
  15. "uptime" : 24,
  16. "optime" : {
  17. "ts" : Timestamp(1495781239, 2),
  18. "t" : NumberLong(8)
  19. },
  20. "optimeDate" : ISODate("2017-05-26T06:47:19Z"),
  21. "electionTime" : Timestamp(1495781239, 1),
  22. "electionDate" : ISODate("2017-05-26T06:47:19Z"),
  23. "configVersion" : 1,
  24. "self" : true
  25. },
  26. {
  27. "_id" : 1,
  28. "name" : "10.211.55.10:27018",
  29. "health" : 1,
  30. "state" : 2,
  31. "stateStr" : "SECONDARY",
  32. "uptime" : 18,
  33. "optime" : {
  34. "ts" : Timestamp(1495781239, 2),
  35. "t" : NumberLong(8)
  36. },
  37. "optimeDate" : ISODate("2017-05-26T06:47:19Z"),
  38. "lastHeartbeat" : ISODate("2017-05-26T06:47:31.424Z"),
  39. "lastHeartbeatRecv" : ISODate("2017-05-26T06:47:31.247Z"),
  40. "pingMs" : NumberLong(0),
  41. "syncingTo" : "10.211.55.10:27017",
  42. "configVersion" : 1
  43. },
  44. {
  45. "_id" : 2,
  46. "name" : "10.211.55.10:27019",
  47. "health" : 1,
  48. "state" : 2,
  49. "stateStr" : "SECONDARY",
  50. "uptime" : 18,
  51. "optime" : {
  52. "ts" : Timestamp(1495781239, 2),
  53. "t" : NumberLong(8)
  54. },
  55. "optimeDate" : ISODate("2017-05-26T06:47:19Z"),
  56. "lastHeartbeat" : ISODate("2017-05-26T06:47:31.424Z"),
  57. "lastHeartbeatRecv" : ISODate("2017-05-26T06:47:31.734Z"),
  58. "pingMs" : NumberLong(0),
  59. "syncingTo" : "10.211.55.10:27018",
  60. "configVersion" : 1
  61. },
  62. {
  63. "_id" : 3,
  64. "name" : "10.211.55.10:27020",
  65. "health" : 1,
  66. "state" : 7,
  67. "stateStr" : "ARBITER",
  68. "uptime" : 18,
  69. "lastHeartbeat" : ISODate("2017-05-26T06:47:31.424Z"),
  70. "lastHeartbeatRecv" : ISODate("2017-05-26T06:47:30.437Z"),
  71. "pingMs" : NumberLong(0),
  72. "configVersion" : 1
  73. }
  74. ],
  75. "ok" : 1
  76. }
  77. ynzw:PRIMARY>
  78. </code>

如果配置正在生效,其中会包含如下信息:"stateStr" : "RECOVERING"

附录
mongodb配置文件具体属性解释

  1. <code class=" language-bash"> dbpath:数据存放目录
  2. logpath:日志存放路径
  3. pidfilepath:进程文件,方便停止mongodb
  4. directoryperdb:为每一个数据库按照数据库名建立文件夹存放
  5. logappend:以追加的方式记录日志
  6. replSet:replica set的名字
  7. bind_ip:mongodb所绑定的ip地址
  8. port:mongodb进程所使用的端口号,默认为27017
  9. oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
  10. fork:以后台方式运行进程
  11. noprealloc:不预先分配存储
  12. </code>

Sharding分片技术

当数据量比较大的时候,我们需要把数据分片运行在不同的机器中,以降低CPU、内存和IO的压力,Sharding就是数据库分片技术。

MongoDB分片技术类似MySQL的水平切分和垂直切分,数据库主要由两种方式做Sharding:垂直扩展和横向切分。

垂直扩展的方式就是进行集群扩展,添加更多的CPU,内存,磁盘空间等。

横向切分则是通过数据分片的方式,通过集群统一提供服务:

  技术图片 image

(1)MongoDB的Sharding架构

  技术图片 image

(2)MongoDB分片架构中的角色

A.数据分片(Shards)

用来保存数据,保证数据的高可用性和一致性。可以是一个单独的mongod实例,也可以是一个副本集。

在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。所有Shard中有一个PrimaryShard,里面包含未进行划分的数据集合:

  技术图片 image

B.查询路由(Query Routers)

路由就是mongos的实例,客户端直接连接mongos,由mongos把读写请求路由到指定的Shard上去。

一个Sharding集群,可以有一个mongos,也可以有多mongos以减轻客户端请求的压力。

C.配置服务器(Config servers)

保存集群的元数据(metadata),包含各个Shard的路由规则。

Sharding分片技术(混合模式)高可用方案的大体架构图:

  技术图片  

 

Sharding分片技术(混合模式)高可用方案架构下向mongodb写数据的流程图:

  技术图片  

 

Sharding分片技术(混合模式)高可用方案架构下向mongodb读数据的流程图:

  技术图片  

 

下面为Sharding分片高可用方案搭建过程(推荐使用此方案):

1、MongoDB机器信息

192.168.252.121192.168.252.122192.168.252.123
mongos mongos mongos
config server config server config server
shard server1 主节点 shard server1 副节点 shard server1 仲裁
shard server2 仲裁 shard server2 主节点 shard server2 副节点
shard server3 副节点 shard server3 仲裁 shard server3 主节点

端口分配:

  1. <code class=" language-undefined">mongos:20000
  2. config:21000
  3. shard1:27001
  4. shard2:27002
  5. shard3:27003
  6. </code>

下载并且安装

  1. <code class=" language-bash">wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.2.tgz
  2. tar -xzvf mongodb-linux-x86_64-amazon-3.6.2.tgz -C /usr/local/
  3. </code>

所有版本二进制文件,自行下载

  1. <code class=" language-ruby">https<span class="token punctuation">:<span class="token operator">/<span class="token operator">/www<span class="token punctuation">.mongodb<span class="token punctuation">.org<span class="token operator">/dl<span class="token operator">/win32<span class="token operator">/x86_64<span class="token operator">-<span class="token number">2008plus<span class="token operator">-ssl<span class="token operator">?_ga<span class="token operator">=<span class="token number">2.87139544<span class="token number">.1567998244<span class="token number">.1517190032<span class="token operator">-<span class="token number">1153843332.1517190032<span class="token operator">&_gac<span class="token operator">=<span class="token number">1.204211492<span class="token number">.1517212002<span class="token punctuation">.<span class="token constant">EAIaIQobChMI44v9_9b82AIV1AcqCh0lcABIEAAYASAAEgKI1_D_BwE
  2. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

改名

  1. <code class=" language-bash">cd /usr/local/
  2. mv mongodb-linux-x86_64-amazon-3.6.2 mongodb
  3. </code>

分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。

  1. <code class=" language-bash">mkdir -p /usr/local/mongodb/conf mkdir -p /usr/local/mongodb/mongos/log mkdir -p /usr/local/mongodb/config/data mkdir -p /usr/local/mongodb/config/log mkdir -p /usr/local/mongodb/shard1/data mkdir -p /usr/local/mongodb/shard1/log mkdir -p /usr/local/mongodb/shard2/data mkdir -p /usr/local/mongodb/shard2/log mkdir -p /usr/local/mongodb/shard3/data mkdir -p /usr/local/mongodb/shard3/log
  2. </code>

配置环境变量

  1. <code class=" language-bash">vi /etc/profile
  2. # MongoDB 环境变量内容
  3. export MONGODB_HOME=/usr/local/mongodb
  4. export PATH=$MONGODB_HOME/bin:$PATH
  5. </code>

使立即生效

  1. <code class=" language-bash">source /etc/profile
  2. </code>

2、config server配置服务器

mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。
(三台机器)添加配置文件

  1. <code class=" language-bash">vi /usr/local/mongodb/conf/config.conf
  2. ## 配置文件内容
  3. pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
  4. dbpath = /usr/local/mongodb/config/data
  5. logpath = /usr/local/mongodb/config/log/congigsrv.log
  6. logappend = true
  7. bind_ip = 0.0.0.0
  8. port = 21000
  9. fork = true
  10. #declare this is a config db of a cluster;
  11. configsvr = true
  12. #副本集名称
  13. replSet = configs
  14. #设置最大连接数
  15. maxConns = 20000
  16. </code>

启动三台服务器的config server

  1. <code class=" language-bash">mongod -f /usr/local/mongodb/conf/config.conf
  2. </code>

登录任意一台配置服务器,初始化配置副本集
连接 MongoDB

  1. <code class=" language-undefined">mongo --port 21000
  2. </code>

config 变量

  1. <code class=" language-objectivec">config <span class="token operator">= <span class="token punctuation">{
  2. _id <span class="token punctuation">: <span class="token string">"configs"<span class="token punctuation">,
  3. members <span class="token punctuation">: <span class="token punctuation">[
  4. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:21000" <span class="token punctuation">}<span class="token punctuation">,
  5. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:21000" <span class="token punctuation">}<span class="token punctuation">,
  6. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:21000" <span class="token punctuation">}
  7. <span class="token punctuation">]
  8. <span class="token punctuation">}
  9. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

初始化副本集

  1. <code class=" language-css">rs.<span class="token function">initiate<span class="token punctuation">(config<span class="token punctuation">)
  2. </span></span></span></code>

其中,"_id" : "configs"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port
响应内容如下

  1. <code class=" language-python"><span class="token operator">> config <span class="token operator">= <span class="token punctuation">{
  2. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. _id <span class="token punctuation">: <span class="token string">"configs"<span class="token punctuation">,
  3. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. members <span class="token punctuation">: <span class="token punctuation">[
  4. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:21000" <span class="token punctuation">}<span class="token punctuation">,
  5. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:21000" <span class="token punctuation">}<span class="token punctuation">,
  6. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:21000" <span class="token punctuation">}
  7. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">]
  8. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">}
  9. <span class="token punctuation">{
  10. <span class="token string">"_id" <span class="token punctuation">: <span class="token string">"configs"<span class="token punctuation">,
  11. <span class="token string">"members" <span class="token punctuation">: <span class="token punctuation">[
  12. <span class="token punctuation">{
  13. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">0<span class="token punctuation">,
  14. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.121:21000"
  15. <span class="token punctuation">}<span class="token punctuation">,
  16. <span class="token punctuation">{
  17. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">1<span class="token punctuation">,
  18. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.122:21000"
  19. <span class="token punctuation">}<span class="token punctuation">,
  20. <span class="token punctuation">{
  21. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">2<span class="token punctuation">,
  22. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.123:21000"
  23. <span class="token punctuation">}
  24. <span class="token punctuation">]
  25. <span class="token punctuation">}
  26. <span class="token operator">> rs<span class="token punctuation">.initiate<span class="token punctuation">(config<span class="token punctuation">)<span class="token punctuation">;
  27. <span class="token punctuation">{
  28. <span class="token string">"ok" <span class="token punctuation">: <span class="token number">1<span class="token punctuation">,
  29. <span class="token string">"operationTime" <span class="token punctuation">: Timestamp<span class="token punctuation">(<span class="token number">1517369899<span class="token punctuation">, <span class="token number">1<span class="token punctuation">)<span class="token punctuation">,
  30. <span class="token string">"$gleStats" <span class="token punctuation">: <span class="token punctuation">{
  31. <span class="token string">"lastOpTime" <span class="token punctuation">: Timestamp<span class="token punctuation">(<span class="token number">1517369899<span class="token punctuation">, <span class="token number">1<span class="token punctuation">)<span class="token punctuation">,
  32. <span class="token string">"electionId" <span class="token punctuation">: ObjectId<span class="token punctuation">(<span class="token string">"000000000000000000000000"<span class="token punctuation">)
  33. <span class="token punctuation">}<span class="token punctuation">,
  34. <span class="token string">"$clusterTime" <span class="token punctuation">: <span class="token punctuation">{
  35. <span class="token string">"clusterTime" <span class="token punctuation">: Timestamp<span class="token punctuation">(<span class="token number">1517369899<span class="token punctuation">, <span class="token number">1<span class="token punctuation">)<span class="token punctuation">,
  36. <span class="token string">"signature" <span class="token punctuation">: <span class="token punctuation">{
  37. <span class="token string">"hash" <span class="token punctuation">: BinData<span class="token punctuation">(<span class="token number">0<span class="token punctuation">,<span class="token string">"AAAAAAAAAAAAAAAAAAAAAAAAAAA="<span class="token punctuation">)<span class="token punctuation">,
  38. <span class="token string">"keyId" <span class="token punctuation">: NumberLong<span class="token punctuation">(<span class="token number">0<span class="token punctuation">)
  39. <span class="token punctuation">}
  40. <span class="token punctuation">}
  41. <span class="token punctuation">}
  42. configs<span class="token punctuation">:SECONDARY<span class="token operator">>
  43. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

此时会发现终端上的输出已经有了变化。

  1. <code class=" language-cpp"><span class="token comment">//从单个一个
  2. <span class="token operator">>
  3. <span class="token comment">//变成了
  4. configs<span class="token operator">:SECONDARY<span class="token operator">>
  5. </span></span></span></span></span></code>

查询状态

  1. <code class=" language-css"><span class="token property">configs<span class="token punctuation">:SECONDARY> rs.<span class="token function">status<span class="token punctuation">(<span class="token punctuation">)
  2. </span></span></span></span></span></code>

3. 配置分片副本集

3.1 设置第一个分片副本集

(三台机器)设置第一个分片副本集
配置文件

  1. <code class=" language-bash">vi /usr/local/mongodb/conf/shard1.conf
  2. #配置文件内容
  3. #——————————————–
  4. pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid
  5. dbpath = /usr/local/mongodb/shard1/data
  6. logpath = /usr/local/mongodb/shard1/log/shard1.log
  7. logappend = true
  8. bind_ip = 0.0.0.0
  9. port = 27001
  10. fork = true
  11. #副本集名称
  12. replSet = shard1
  13. #declare this is a shard db of a cluster;
  14. shardsvr = true
  15. #设置最大连接数
  16. maxConns = 20000
  17. </code>

启动三台服务器的shard1 server

  1. <code class=" language-bash">mongod -f /usr/local/mongodb/conf/shard1.conf
  2. </code>

登陆任意一台服务器,初始化副本集(除了192.168.252.123)
连接 MongoDB

  1. <code class=" language-undefined">mongo --port 27001
  2. </code>

使用admin数据库

  1. <code class=" language-php"><span class="token keyword">use <span class="token package">admin
  2. </span></span></code>

定义副本集配置

  1. <code class=" language-objectivec">config <span class="token operator">= <span class="token punctuation">{
  2. _id <span class="token punctuation">: <span class="token string">"shard1"<span class="token punctuation">,
  3. members <span class="token punctuation">: <span class="token punctuation">[
  4. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:27001" <span class="token punctuation">}<span class="token punctuation">,
  5. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:27001" <span class="token punctuation">}<span class="token punctuation">,
  6. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:27001" <span class="token punctuation">, arbiterOnly<span class="token punctuation">: true <span class="token punctuation">}
  7. <span class="token punctuation">]
  8. <span class="token punctuation">}
  9. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

初始化副本集配置

  1. <code class=" language-css">rs.<span class="token function">initiate<span class="token punctuation">(config<span class="token punctuation">)
  2. </span></span></span></code>

响应内容如下

  1. <code class=" language-python"><span class="token operator">> use admin
  2. switched to db admin
  3. <span class="token operator">> config <span class="token operator">= <span class="token punctuation">{
  4. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. _id <span class="token punctuation">: <span class="token string">"shard1"<span class="token punctuation">,
  5. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. members <span class="token punctuation">: <span class="token punctuation">[
  6. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:27001" <span class="token punctuation">}<span class="token punctuation">,
  7. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:27001" <span class="token punctuation">}<span class="token punctuation">,
  8. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:27001" <span class="token punctuation">, arbiterOnly<span class="token punctuation">: true <span class="token punctuation">}
  9. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">]
  10. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">}
  11. <span class="token punctuation">{
  12. <span class="token string">"_id" <span class="token punctuation">: <span class="token string">"shard1"<span class="token punctuation">,
  13. <span class="token string">"members" <span class="token punctuation">: <span class="token punctuation">[
  14. <span class="token punctuation">{
  15. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">0<span class="token punctuation">,
  16. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.121:27001"
  17. <span class="token punctuation">}<span class="token punctuation">,
  18. <span class="token punctuation">{
  19. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">1<span class="token punctuation">,
  20. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.122:27001"
  21. <span class="token punctuation">}<span class="token punctuation">,
  22. <span class="token punctuation">{
  23. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">2<span class="token punctuation">,
  24. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.123:27001"<span class="token punctuation">,
  25. <span class="token string">"arbiterOnly" <span class="token punctuation">: true
  26. <span class="token punctuation">}
  27. <span class="token punctuation">]
  28. <span class="token punctuation">}
  29. <span class="token operator">> rs<span class="token punctuation">.initiate<span class="token punctuation">(config<span class="token punctuation">)
  30. <span class="token punctuation">{ <span class="token string">"ok" <span class="token punctuation">: <span class="token number">1 <span class="token punctuation">}
  31. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

此时会发现终端上的输出已经有了变化。

  1. <code class=" language-cpp"><span class="token comment">//从单个一个
  2. <span class="token operator">>
  3. <span class="token comment">//变成了
  4. shard1<span class="token operator">:SECONDARY<span class="token operator">>
  5. </span></span></span></span></span></code>

查询状态

  1. <code class=" language-css"><span class="token property">shard1<span class="token punctuation">:SECONDARY> rs.<span class="token function">status<span class="token punctuation">(<span class="token punctuation">)
  2. </span></span></span></span></span></code>

3.2 设置第二个分片副本集

设置第二个分片副本集
配置文件

  1. <code class=" language-bash">vi /usr/local/mongodb/conf/shard2.conf
  2. #配置文件内容
  3. #——————————————–
  4. pidfilepath = /usr/local/mongodb/shard2/log/shard2.pid
  5. dbpath = /usr/local/mongodb/shard2/data
  6. logpath = /usr/local/mongodb/shard2/log/shard2.log
  7. logappend = true
  8. bind_ip = 0.0.0.0
  9. port = 27002
  10. fork = true
  11. #副本集名称
  12. replSet=shard2
  13. #declare this is a shard db of a cluster;
  14. shardsvr = true
  15. #设置最大连接数
  16. maxConns=20000
  17. </code>

启动三台服务器的shard2 server

  1. <code class=" language-bash">mongod -f /usr/local/mongodb/conf/shard2.conf
  2. </code>

连接 MongoDB

  1. <code class=" language-undefined">mongo --port 27002
  2. </code>

使用admin数据库

  1. <code class=" language-php"><span class="token keyword">use <span class="token package">admin
  2. </span></span></code>

定义副本集配置

  1. <code class=" language-objectivec">config <span class="token operator">= <span class="token punctuation">{
  2. _id <span class="token punctuation">: <span class="token string">"shard2"<span class="token punctuation">,
  3. members <span class="token punctuation">: <span class="token punctuation">[
  4. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:27002" <span class="token punctuation">, arbiterOnly<span class="token punctuation">: true <span class="token punctuation">}<span class="token punctuation">,
  5. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:27002" <span class="token punctuation">}<span class="token punctuation">,
  6. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:27002" <span class="token punctuation">}
  7. <span class="token punctuation">]
  8. <span class="token punctuation">}
  9. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

初始化副本集配置

  1. <code class=" language-css">rs.<span class="token function">initiate<span class="token punctuation">(config<span class="token punctuation">)
  2. </span></span></span></code>

响应内容如下

  1. <code class=" language-python"><span class="token operator">> use admin
  2. switched to db admin
  3. <span class="token operator">> config <span class="token operator">= <span class="token punctuation">{
  4. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. _id <span class="token punctuation">: <span class="token string">"shard2"<span class="token punctuation">,
  5. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. members <span class="token punctuation">: <span class="token punctuation">[
  6. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:27002" <span class="token punctuation">, arbiterOnly<span class="token punctuation">: true <span class="token punctuation">}<span class="token punctuation">,
  7. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:27002" <span class="token punctuation">}<span class="token punctuation">,
  8. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:27002" <span class="token punctuation">}
  9. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">]
  10. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">}
  11. <span class="token punctuation">{
  12. <span class="token string">"_id" <span class="token punctuation">: <span class="token string">"shard2"<span class="token punctuation">,
  13. <span class="token string">"members" <span class="token punctuation">: <span class="token punctuation">[
  14. <span class="token punctuation">{
  15. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">0<span class="token punctuation">,
  16. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.121:27002"<span class="token punctuation">,
  17. <span class="token string">"arbiterOnly" <span class="token punctuation">: true
  18. <span class="token punctuation">}<span class="token punctuation">,
  19. <span class="token punctuation">{
  20. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">1<span class="token punctuation">,
  21. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.122:27002"
  22. <span class="token punctuation">}<span class="token punctuation">,
  23. <span class="token punctuation">{
  24. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">2<span class="token punctuation">,
  25. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.123:27002"
  26. <span class="token punctuation">}
  27. <span class="token punctuation">]
  28. <span class="token punctuation">}
  29. <span class="token operator">> rs<span class="token punctuation">.initiate<span class="token punctuation">(config<span class="token punctuation">)
  30. <span class="token punctuation">{ <span class="token string">"ok" <span class="token punctuation">: <span class="token number">1 <span class="token punctuation">}
  31. shard2<span class="token punctuation">:SECONDARY<span class="token operator">> rs<span class="token punctuation">.status<span class="token punctuation">(<span class="token punctuation">)
  32. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

3.3 设置第三个分片副本集

  1. <code class=" language-bash">vi /usr/local/mongodb/conf/shard3.conf
  2. #配置文件内容
  3. #——————————————–
  4. pidfilepath = /usr/local/mongodb/shard3/log/shard3.pid
  5. dbpath = /usr/local/mongodb/shard3/data
  6. logpath = /usr/local/mongodb/shard3/log/shard3.log
  7. logappend = true
  8. bind_ip = 0.0.0.0
  9. port = 27003
  10. fork = true
  11. #副本集名称
  12. replSet=shard3
  13. #declare this is a shard db of a cluster;
  14. shardsvr = true
  15. #设置最大连接数
  16. maxConns=20000
  17. </code>

启动三台服务器的shard3 server

  1. <code class=" language-bash">mongod -f /usr/local/mongodb/conf/shard3.conf
  2. </code>

登陆任意一台服务器,初始化副本集(除了192.168.252.121)

  1. <code class=" language-undefined">mongo --port 27003
  2. </code>

使用admin数据库

  1. <code class=" language-php"><span class="token keyword">use <span class="token package">admin
  2. </span></span></code>

定义副本集配置

  1. <code class=" language-objectivec">config <span class="token operator">= <span class="token punctuation">{
  2. _id <span class="token punctuation">: <span class="token string">"shard3"<span class="token punctuation">,
  3. members <span class="token punctuation">: <span class="token punctuation">[
  4. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:27003" <span class="token punctuation">}<span class="token punctuation">,
  5. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:27003" <span class="token punctuation">, arbiterOnly<span class="token punctuation">: true<span class="token punctuation">}<span class="token punctuation">,
  6. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:27003" <span class="token punctuation">}
  7. <span class="token punctuation">]
  8. <span class="token punctuation">}
  9. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

初始化副本集配置

  1. <code class=" language-css">rs.<span class="token function">initiate<span class="token punctuation">(config<span class="token punctuation">)
  2. </span></span></span></code>

响应内容如下

  1. <code class=" language-python"><span class="token operator">> use admin
  2. switched to db admin
  3. <span class="token operator">> config <span class="token operator">= <span class="token punctuation">{
  4. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. _id <span class="token punctuation">: <span class="token string">"shard3"<span class="token punctuation">,
  5. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. members <span class="token punctuation">: <span class="token punctuation">[
  6. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">0<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.121:27003" <span class="token punctuation">}<span class="token punctuation">,
  7. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">1<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.122:27003" <span class="token punctuation">, arbiterOnly<span class="token punctuation">: true<span class="token punctuation">}<span class="token punctuation">,
  8. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">{_id <span class="token punctuation">: <span class="token number">2<span class="token punctuation">, host <span class="token punctuation">: <span class="token string">"192.168.252.123:27003" <span class="token punctuation">}
  9. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">]
  10. <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">. <span class="token punctuation">}
  11. <span class="token punctuation">{
  12. <span class="token string">"_id" <span class="token punctuation">: <span class="token string">"shard3"<span class="token punctuation">,
  13. <span class="token string">"members" <span class="token punctuation">: <span class="token punctuation">[
  14. <span class="token punctuation">{
  15. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">0<span class="token punctuation">,
  16. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.121:27003"
  17. <span class="token punctuation">}<span class="token punctuation">,
  18. <span class="token punctuation">{
  19. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">1<span class="token punctuation">,
  20. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.122:27003"<span class="token punctuation">,
  21. <span class="token string">"arbiterOnly" <span class="token punctuation">: true
  22. <span class="token punctuation">}<span class="token punctuation">,
  23. <span class="token punctuation">{
  24. <span class="token string">"_id" <span class="token punctuation">: <span class="token number">2<span class="token punctuation">,
  25. <span class="token string">"host" <span class="token punctuation">: <span class="token string">"192.168.252.123:27003"
  26. <span class="token punctuation">}
  27. <span class="token punctuation">]
  28. <span class="token punctuation">}
  29. <span class="token operator">> rs<span class="token punctuation">.initiate<span class="token punctuation">(config<span class="token punctuation">)
  30. <span class="token punctuation">{ <span class="token string">"ok" <span class="token punctuation">: <span class="token number">1 <span class="token punctuation">}
  31. shard3<span class="token punctuation">:SECONDARY<span class="token operator">> rs<span class="token punctuation">.status<span class="token punctuation">(<span class="token punctuation">)
  32. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

3.4 配置路由服务器 mongos

(三台机器)先启动配置服务器和分片服务器,后启动路由实例启动路由实例:

  1. <code class=" language-ruby">vi <span class="token operator">/usr<span class="token operator">/local<span class="token operator">/mongodb<span class="token operator">/conf<span class="token operator">/mongos<span class="token punctuation">.conf
  2. <span class="token comment">#内容
  3. pidfilepath <span class="token operator">= <span class="token operator">/usr<span class="token operator">/local<span class="token operator">/mongodb<span class="token operator">/mongos<span class="token operator">/log<span class="token operator">/mongos<span class="token punctuation">.pid
  4. logpath <span class="token operator">= <span class="token operator">/usr<span class="token o </div>
  5. <div class=" "="">
  6. <ul class="m-news-opt fix">
  7. <li class="opt-item">
  8. <a href="/sql_question-390011.html" target="_blank"><p>< 上一篇</p><p class="ellipsis">重装系统,新安装IDEA启动项目后,classnotfound:com.mysql.jdbc.Driver</p></a>
  9. </li>
  10. <li class="opt-item ta-r">
  11. <a href="/sql_question-390013.html" target="_blank"><p>下一篇 ></p><p class="ellipsis">Oracle 索引失效</p></a>
  12. </li>
  13. </ul>
  14. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

人气教程排行