Centos7 搭建Mongodb 分片集群4.0——配置三成员副本集+读写分离+升级+卸载(二)

目录

      • 五(1)、三成员副本集部署架构
        • 5.1、主要有两个次要成员 (PSS)
        • 5.2、主节点和仲裁节点 (PSA)
      • 五(2)、部署三成员副本集(**PRIMARY-SECONDARY-ARBITER 架构**)
        • 5.1、准备数据目录&&创建log目录
        • 5.2、将成员添加到现有的副本集
        • 5.3、将仲裁器添加到副本集
        • 5.4、启动mongos、并检查添加的分片副本集成员。
      • 六、读写分离
        • 1、ReadPreference读偏好模式
        • 2、secondary-shard 查询报错
        • 3、在副本节点上设置setSlaveOk;
        • 4、应用读写分离(以python为例)
      • 七、MongoDB升级
        • 1、功能兼容版本
        • 2、新版本添加存储库
          • 2.1、创建配置包管理系统(yum)
          • 2.2、解除禁用mongo升级
          • 2.3、使用包管理器升级到 4.2。
        • 3、禁用balancer
        • 4、升级config服务器
          • 4.1、一次升级一个副本集的SECONDARY成员:
          • 4.2、在主副本集上进行降级操作。
        • 5、升级shard
          • 5.1、一次升级一个碎片且一次升级一个副本集的SECONDARY成员:
          • 5.2、注意:如果shard副本集中有`arbiter`成员别忘了升级
          • 5.3、在主副本集上进行降级操作。
        • 6、升级`mongos`实例
        • 7、重新启用平衡器
        • 8、启用向后不兼容的 4.2 功能
        • 9、升级4.2到4.4,参考重复以上(1-8)步骤即可(以下步骤仅供参考)
          • 1、添加yum源
          • 2、指定版本安装
          • 3、安装
          • ansible执行安装
          • 4、为防止意外升级,请固定包
          • 5、禁用balancer
          • 6、升级config服务器、升级shard、升级mongos
          • 7、重启balancer
          • 8、启用向后不兼容的4.4功能
      • 卸载

Centos7 搭建Mongodb 分片集群4.0(一)

五(1)、三成员副本集部署架构

5.1、主要有两个次要成员 (PSS)

具有三个存储数据的成员的副本集具有:

  • One primary.
  • Two secondary 成员.两个辅助节点都可以成为选举中的主节点。

Centos7 搭建Mongodb 分片集群4.0——配置三成员副本集+读写分离+升级+卸载(二)_第1张图片

这些部署除了主要部署之外,始终提供数据集的两个完整副本。这些副本集提供了额外的容错性和高可用性。如果主节点不可用,则副本集选择辅助节点作为主节点并继续正常操作。旧的主节点在可用时重新加入集合。

Centos7 搭建Mongodb 分片集群4.0——配置三成员副本集+读写分离+升级+卸载(二)_第2张图片

5.2、主节点和仲裁节点 (PSA)

具有两个存储数据的成员的三成员副本集具有:

  • One primary.
  • One secondary 成员. 次要可以在选举中成为主要。
  • One arbiter .仲裁者只在选举中投票。

Centos7 搭建Mongodb 分片集群4.0——配置三成员副本集+读写分离+升级+卸载(二)_第3张图片

由于仲裁器不保存数据副本,因此这些部署仅提供数据的一个完整副本。仲裁器需要更少的资源,但代价是更有限的冗余和容错。

但是,具有主节点、辅助节点和仲裁器的部署可确保在主节点辅助节点不可用时副本集仍然可用。如果主节点不可用,则副本集将选择从节点作为主节点。

Centos7 搭建Mongodb 分片集群4.0——配置三成员副本集+读写分离+升级+卸载(二)_第4张图片

五(2)、部署三成员副本集(PRIMARY-SECONDARY-ARBITER 架构

PSA将会完成的结构如下:
Centos7 搭建Mongodb 分片集群4.0——配置三成员副本集+读写分离+升级+卸载(二)_第5张图片

前提:

1、我们的集群没有配置副本;
2、在第【一】步的基础上继续部署;
3、一个副本集最多可以有七个投票成员。要将成员添加到已经有七个投票成员的副本集中,您必须将该成员添加 为非投票成员或从.existing member
4、MongoDB 默认不启用访问控制。--auth您可以使用或 设置启用授权security.authorization。启用内部身份验证也会启用客户端授权。启用访问控制后,用户必须进行身份验证。(参考一、6)
5、使用密钥文件访问控制添加新的副本集,将密钥文件复制到每个副本集成员,确保运行mongod实例的用户是文件的所有者并且可以访问密钥文件。
6、注意:要在启用访问控制的情况下启动副本集的每个成员

5.1、准备数据目录&&创建log目录

  • 确保新成员的dbPath数据目录不包含数据。新成员将从现有成员中复制数据。
  • 如果新成员处于恢复状态,则它必须退出并成为辅助成员,然后 MongoDB 才能将所有数据作为复制过程的一部分复制。此过程需要时间,但不需要管理员干预。

1、建议停止mongoDB集群再做数据目录复制。

1、只需要选择一台mongos执行sh.stopBalancer()即可
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
mongos> sh.stopBalancer()

2、但是所有mongos客户端都需要执行shutdownServer,
mongos> use admin
mongos> db.shutdownServer()

3. stop shard(stop secondary first then primary)
/usr/bin/mongod -f /var/opt/mongodb/shard/shard.conf -shutdown
4. stop config(stop secondary first then primary)
/usr/bin/mongod -f /var/opt/mongodb/config/mongo.conf -shutdown

2、必须在slaver-shard上创建log目录

mkdir -p /var/opt/mongodb/slaver/log

不创建log目录会报如下错误:

about to fork child process, waiting until server is ready for connections.
forked process: 5729
ERROR: child process failed, exited with error number 1
To see additional information in this output, start without the "--fork" option.

3、复制primary-shard的数据目录到新成员服务器上

# 参考,目录在自己的shard配置文件中可以找到
# eg 同一副本集shard1:
[root@leojiang126]$ scp -r /var/opt/mongodb/shard/data root@leojiang124:/var/opt/mongodb/slaver/
# eg 同一副本集shard2:
[root@leojiang127]$ scp -r /var/opt/mongodb/shard/data root@leojiang125:/var/opt/mongodb/slaver/

5.2、将成员添加到现有的副本集

执行顺序:【启动所有的config配置服务器】——>【然后启动主shard】——>【再启动需要添加的shard副本】

1、启动架构中所有的config——>然后启动架构中所有的primary-shard

1. start config
numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/config/mongo.conf
2. start primary-shard 
numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/shard/shard.conf

2、将replication.replSetName选项设置为需要添加的副本集名称。如果您的应用程序连接到多个副本集,则每个副本集必须具有不同的名称。(本文副本集为shard1 && shard2 两个)

​ ①服务器leojiang124中的slaver节点/var/opt/mongodb/slavershard.conf配置文件如下

processManagement:
   fork: true
   pidFilePath: /var/opt/mongodb/slaver/log/slaver1.pid
net:
   bindIp: 0.0.0.0
   ##should be changed after clusters stable
   port: 27001
   #maxIncomingConnections
   serviceExecutor: adaptive
   ##split net io and disk io, reuse network io and connection to reduce locks
storage:
   #indexBuildRetry set to false if mongod restart fail when there is rebuild index error
   dbPath: /var/opt/mongodb/slaver/data
   #directoryPerDB: true
   #directoryPerDB should be set when initial mongodb, can't use on existing db
   journal:
      enabled: true
      commitIntervalMs: 200
   #wiredTiger:
   #   collectionConfig:
   #     blockCompressor: zlib
   #   indexConfig:
   #     prefixCompression: true
      #none with highest query speed but snappy and zlib with lower IO, zlib will take more cpu and less IO than snappy
   #   engineConfig:
   #     directoryForIndexes: true
        #directoryForIndexes should be set when initial mongodb, can't use on existing db
replication:
   replSetName: shard1
sharding:
   clusterRole: shardsvr
systemLog:
   verbosity: 0
   #traceAllExceptions: true
   destination: file
   path: "/var/opt/mongodb/slaver/log/slaver1.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: ctime
#   component:
#     sharding:
#       verbosity: 0
#     write:
#       verbosity: 0
security:
   authorization: enabled
   #clusterAuthMode: keyFile
   keyFile: /var/opt/mongodb/mongodb-keyfile
   #clusterIpSourceWhitelist: for whitelist of clients
   #ldap configuration might be used when ITSAC and mongodb should be enterprise version

​ ②服务器leojiang125中的slaver节点/var/opt/mongodb/slaver/shard.conf配置文件参数replication.replSetName如下

……
# 根据自己的情况进行修改
replication:
   replSetName: shard2
……

3、启动需要添加的shard副本
添加的副本shard所在的服务器:leojiang124~125

3. start 副shard 
numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/slaver/shard.conf

4、把启动的shard副本添加到自己所需的副本集(我配置的副本集是shard1shard2),只能到连接到主节点时进行添加成员。如果您不知道哪个成员是master-shard成员,请登录到副本集的任何成员并发出db.hello()命令(4.0.21 版中的新功能)。

​ ①shard1副本集添加副shard:

# 连接到副本集的主节点leojiang126
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
shard1:PRIMARY> rs.status()
# 添加副shard到shard1副本集中,在主shard1上执行
shard1:PRIMARY> rs.add( { host: "leojiang124:27001", priority: 0, votes: 0 } )
# 检查添加情况
shard1:PRIMARY> rs.status()

​ ②shard2副本集添加副shard:

# 连接到副本集的主节点leojiang127
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
shard2:PRIMARY> rs.status()
# 添加副shard到shard1副本集中,在主shard1上执行
shard2:PRIMARY> rs.add( { host: "leojiang125:27001", priority: 0, votes: 0 } )
# 检查添加情况是否添加进去
shard2:PRIMARY> rs.status()

5、新添加的成员转换为 SECONDARY状态后,如果根据自身需要可以使用更新rs.reconfig()添加的成员。(跳过,以下操作强制选举,根据自己的需求进行操作)

var cfg = rs.conf();
cfg.members[1].priority = 1
cfg.members[1].votes = 1
rs.reconfig(cfg)

shell 方法可以强制当前主rs.reconfig()节点下台,从而导致选举。当主要步骤关闭时, mongod关闭所有客户端连接。虽然这通常需要 10-20 秒,但请尝试在计划的维护期间进行这些更改。

创建用户(可以不创建)

1、连接mongodb
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
2、设置admin用户,需要使用的mongos和shard分别添加root用户
use admin
db.createUser(
  {
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
  }
)

5.3、将仲裁器添加到副本集

  • 在某些情况下(例如您有一个主节点和一个辅助节点,但成本限制禁止添加另一个辅助节点),您可以选择将一个mongod实例添加到副本集作为 仲裁者在选举中投票。

  • 仲裁器是副本集的一部分但不保存数据(即不提供数据冗余)的mongod实例 。但是,他们可以参加选举。

  • 仲裁器的资源要求最低,不需要专用硬件。您可以在应用服务器或监控主机上部署仲裁器。

important:不要在同时托管副本集的主要或次要成员的系统上运行仲裁程序

1、添加shard1 && shard2副本集,创建所需的文件夹

# 配置文件需要和创建的文件夹一致
[root@leojiang123]$ mkdir -p /var/opt/mongodb/arbiter/arbiter26/log
# 创建仲裁器数据目录,该目录用户存储配置数据,不会保存数据集。配置文件需要和创建的文件夹一致
[root@leojiang123]$ mkdir -p /var/opt/mongodb/arbiter/arbiter26/data

[root@leojiang123]$ mkdir -p /var/opt/mongodb/arbiter/arbiter27/log
[root@leojiang123]$ mkdir -p /var/opt/mongodb/arbiter/arbiter27/data

2、arbiter节点配置文件如下

/var/opt/mongodb/arbiter/arbiter26/arbiter26.conf

processManagement:
   fork: true
   pidFilePath: /var/opt/mongodb/arbiter/arbiter26/log/arbiter.pid
net:
   bindIp: 0.0.0.0
   port: 27026
   serviceExecutor: adaptive
storage:
   dbPath: /var/opt/mongodb/arbiter/arbiter26/data
   journal:
      enabled: true
      commitIntervalMs: 200
replication:
   replSetName: shard1
sharding:
   clusterRole: shardsvr
systemLog:
   verbosity: 0
   destination: file
   path: "/var/opt/mongodb/arbiter/arbiter26/log/arbiter.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: ctime
security:
   authorization: enabled
   keyFile: /var/opt/mongodb/mongodb-keyfile

/var/opt/mongodb/arbiter/arbiter26/arbiter27.conf

processManagement:
   fork: true
   pidFilePath: /var/opt/mongodb/arbiter/arbiter27/log/arbiter.pid
net:
   bindIp: 0.0.0.0
   port: 27027
   serviceExecutor: adaptive
storage:
   dbPath: /var/opt/mongodb/arbiter/arbiter27/data
   journal:
      enabled: true
      commitIntervalMs: 200
replication:
   replSetName: shard2
sharding:
   clusterRole: shardsvr
systemLog:
   verbosity: 0
   destination: file
   path: "/var/opt/mongodb/arbiter/arbiter27/log/arbiter.log"
   logAppend: true
   logRotate: reopen
   timeStampFormat: ctime
security:
   authorization: enabled
   keyFile: /var/opt/mongodb/mongodb-keyfile

3、启动仲裁器(arbiter)

[root@leojiang123]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter26/arbiter26.conf
[root@leojiang123]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter27/arbiter27.conf

​ ①连接到主节点leojiang126并将仲裁器添加到shard1副本集。使用该rs.addArb()方法

# 连接到副本集的主节点
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
shard1:PRIMARY> rs.status()
# 添加副shard到shard1副本集中,在主shard1上执行
shard1:PRIMARY> rs.addArb("leojiang123:27026")
# 检查添加情况
shard1:PRIMARY> rs.status()

​ ②连接到主节点leojiang127添加到shard2副本集添加:

# 连接到副本集的主节点
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
shard2:PRIMARY> rs.status()
# 添加副shard到shard2副本集中,在主shard1上执行
shard2:PRIMARY> rs.addArb("leojiang123:27027")
# 检查添加情况
shard2:PRIMARY> rs.status()

4、检查:

# 查看副本集配置
rs.conf()
# 确保副本集具有主副本
rs.status()

5.4、启动mongos、并检查添加的分片副本集成员。

1、最后启动mongos(leojiang124~leojiang127)

# 随机选择mongos服务器登陆到mongos
1、start mongos(leojiang124~leojiang127)
numactl --interleave=all /usr/bin/mongos -f /var/opt/mongodb/mongos/mongos.conf
2.1、连接mongos(选择一个连接即可)
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
2.2、开启均衡器
mongos> sh.startBalancer()

2、将分片副本集添加到分片集群

mongos> use admin
mongos> db.runCommand( { listshards : 1 } )
{
        "shards" : [
                {
                        "_id" : "shard1",
                        "host" : "shard1/leojiang124:27001,leojiang126:27001",
                        "state" : 1
                },
                {
                        "_id" : "shard2",
                        "host" : "shard2/leojiang125:27001,leojiang127:27001",
                        "state" : 1
                }
        ],
……
mongos>

可以看到新增的secondary-shard已经添加到集群中

(完成)

六、读写分离

1、ReadPreference读偏好模式

在副本集Replica Set中才涉及到ReadPreference的设置,默认情况下,读写都是分发都Primary节点执行,但是对于写少读多的情况,我们希望进行读写分离来分摊压力,所以希望使用Secondary节点来进行读取,Primary只承担写的责任(实际上写只能分发到Primary节点,不可修改)。

MongoDB有5种ReadPreference模式:

  • primary: 主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
  • primaryPreferred:首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
  • secondary:从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
  • secondaryPreferred:首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
  • nearest:最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。

2、secondary-shard 查询报错

[root@leojiang124]$ mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
shard1:SECONDARY> show dbs
……
"errmsg" : "not master and slaveOk=false"
……

首先这是正常的,因为SECONDARY是不允许读写的, 在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。

为了在副本集上实现读写分离,我们需要实现以下两步:

3、在副本节点上设置setSlaveOk;

3.1、临时生效

# 临时生效
shard1:SECONDARY> rs.slaveOk()                               allow queries on secondary nodes
# or
shard1:SECONDARY> db.getMongo().setSlaveOk() allow queries on a replication slave server

3.2、永久生效

查找.mongorc.js文件,在文件里面添加一行:rs.slaveOk();

[root@leojiang]$ find / -name .mongorc.js
/root/.mongorc.js

一般这个文件都是空的,直接加上去。保存退出。之后退出mongo在进去就可以了。

cat > /root/.mongorc.js << LEO
rs.slaveOk();
LEO

4、应用读写分离(以python为例)

from pymongo import MongoClient
MongoClient('mongodb://user:[email protected]:27017,172.16.250.234:27017,172.16.250.237:27017/?readPreference=secondary')

七、MongoDB升级

前提:本文安装的时Mongodb4.0.9,需要升级到4.4.9,首先先升级到4.2

4.2、升级注意事项

1、要从 4.0 系列之前的版本升级,您必须连续升级主要版本,直到升级到 4.0 系列。例如,如果您运行的是 3.6 系列,则必须先 升级到 4.0 ,然后才能升级到 4.2。

2、更严格的count语法验证
count从版本 4.2 开始,MongoDB 对命令的选项名称实施了更严格的验证。如果您指定未知的选项名称,该命令现在会出错。pymongo-count参考
在以前的版本中,MongoDB 会忽略无效的选项名称。

4.4\升级注意事项

1、要将现有的 MongoDB 部署升级到4.4 ,您必须运行4.2 系列版本。

2、确认干净关机
在升级分片集群的成员之前,确认该成员已完全关闭。

1、功能兼容版本

4.0 分片集群必须 featureCompatibilityVersion设置为4.0。请连接到每个分片副本集成员每个配置服务器副本集成员,并检查featureCompatibilityVersion

提示:对于启用了访问控制的分片集群,要对分片副本集成员运行以下命令,您必须以分片本地用户身份连接到该成员。

# mongo --port 27000 --authenticationDatabase "admin" -u "root" -p "root123"
# mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

所有成员都应返回包含 ."featureCompatibilityVersion" : { "version" : "4.0" }

要设置或更新featureCompatibilityVersion,请在**每个分片副本集成员**和每个配置服务器副本集成员上运行以下命令:

# mongo --port 27000 --authenticationDatabase "admin" -u "root" -p "root123"
# mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
db.adminCommand( { setFeatureCompatibilityVersion: "4.0" } )

2、新版本添加存储库

注:分别在leojiang123~leojiang127服务器上执行

2.1、创建配置包管理系统(yum)
cat > /etc/yum.repos.d/mongodb-org-4.2.repo << LEO
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
LEO
2.2、解除禁用mongo升级

因为之前禁用了yum升级mongo

# cat /etc/yum.conf          # 之前添加了如下内容,现在因为升级的原因需要删除或是注释掉
exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

所有现在需要解除禁用,否则无法升级

sed -i 's/exclude/#exclude/' /etc/yum.conf
2.3、使用包管理器升级到 4.2。

我们指定版本安装

sudo yum install -y mongodb-org-4.2.18 mongodb-org-server-4.2.18 mongodb-org-shell-4.2.18 mongodb-org-mongos-4.2.18 mongodb-org-tools-4.2.18

3、禁用balancer

连接任意一台mongos使用命令sh.stopBalancer()禁用balancer

mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
mongos> sh.getBalancerState()
true
mongos> sh.stopBalancer()
mongos> sh.getBalancerState()
false

4、升级config服务器

注:分别在leojiang124~leojiang126服务器上执行

4.1、一次升级一个副本集的SECONDARY成员:

​ ①关闭config服务器的SECONDARY成员,然后再次启动,等待成员恢复到SECONDARY状态,然后再升级下一个辅助成员。rs.status()要检查成员的状态,请在mongoshell中发出。

[root@leojiang125 config]$ /usr/bin/mongod -f /var/opt/mongodb/config/mongo.conf -shutdown

​ ②启动:

[root@leojiang125 config]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/config/mongo.conf

注意要等待成员恢复到SECONDARY状态,然后再升级下一个SECONDARY成员。

4.2、在主副本集上进行降级操作。

​ ①将一个mongoshell 连接到主节点并使用它 rs.stepDown()来降低主节点并强制选举新的主节点:

[root@leojiang124 config]$ mongo --port 27000 --authenticationDatabase "admin" -u "root" -p "root123"
cfgReplSet:PRIMARY> rs.stepDown()
cfgReplSet:SECONDARY>

​ ②指定文件重新启动

[root@leojiang124 config]$ /usr/bin/mongod -f /var/opt/mongodb/config/mongo.conf -shutdown
[root@leojiang124 config]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/config/mongo.conf

5、升级shard

注:分别在leojiang123~leojiang125服务器上执行

5.1、一次升级一个碎片且一次升级一个副本集的SECONDARY成员:
[root@leojiang124 slaver]$ /usr/bin/mongod -f /var/opt/mongodb/slaver/shard.conf -shutdown
[root@leojiang124 slaver]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/slaver/shard.conf

等待成员恢复到SECONDARY状态,然后再升级下一个辅助成员。

5.2、注意:如果shard副本集中有arbiter成员别忘了升级

关闭arbiter成员

[root@leoajing123 arbiter]$ /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter26/arbiter26.conf -shutdown
[root@leoajing123 arbiter]$ /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter27/arbiter27.conf -shutdown

启动arbiter:

[root@leoajing123 arbiter]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter26/arbiter26.conf
[root@leoajing123 arbiter]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter27/arbiter27.conf
5.3、在主副本集上进行降级操作。

​ ①将一个mongoshell 连接到主节点并使用它 rs.stepDown()来降低主节点并强制选举新的主节点

[root@leojiang126 shard]$ mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
shard1:PRIMARY> rs.stepDown()

​ ②如果执行报错

……
"errmsg" : "No electable secondaries caught up as of 2022-04-01T17:11:39.391+0800Please use the replSetStepDown command with the argument {force: true} to force node to step down.",
……

​ ③解决方案如下,造成的原因是SECONDARY-shard的priority比较低无法参与选举,把SECONDARY-shard的priority配置和primary-shard一致既可以参加选举:

priority: 是优先级,默认为1,优先级0为被动节点,不能成为活跃节点。优先级不位0则按照有大到小选出活跃节点。

shard1:PRIMARY> var cfg = rs.conf();
shard1:PRIMARY> cfg.members[1].priority = 1
shard1:PRIMARY> cfg.members[1].votes = 1
shard1:PRIMARY> rs.reconfig(cfg)

​ ④再次使用它 rs.stepDown()来降低主节点并强制选举新的主节点

shard1:PRIMARY> rs.stepDown()
shard1:SECONDARY>

​ 成功可以看到已经改变PRIMARY——>SECONDARY

​ ⑤当rs.status() 显示主节点已下台且另一个成员已PRIMARY进入状态时,升级已降级的主节点

[root@leojiang126 shard]$ /usr/bin/mongod -f /var/opt/mongodb/shard/shard.conf -shutdown
[root@leojiang126 shard]$ numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/shard/shard.conf

6、升级mongos实例

注:分别在leojiang123~leojiang127服务器上执行

重新启动mongos

1、连接mongo-shell
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
2、但是所有mongos都需要执行shutdownServer,
use admin
db.shutdownServer()
exit
3、启动mongos
numactl --interleave=all /usr/bin/mongos -f /var/opt/mongodb/mongos/mongos.conf

7、重新启用平衡器

选择任意一台mongos启动即可:

mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
sh.startBalancer()

从 MongoDB 4.2 开始,sh.startBalancer()还为分片集群启用自动拆分。
如果您不希望在启用平衡器时启用自动拆分,则还必须运行sh.disableAutoSplit().

8、启用向后不兼容的 4.2 功能

复合哈希索引以及其他新版本的功能,需要将 featureCompatibilityVersion设置为新升级的版本4.2 or 4.4。

# 每个分片副本集成员和每个配置服务器副本集成员
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
shard1:PRIMARY> db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )

mongo --port 27000 --authenticationDatabase "admin" -u "root" -p "root123"
cfgReplSet:PRIMARY> db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )

查询

shard1:PRIMARY> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

9、升级4.2到4.4,参考重复以上(1-8)步骤即可(以下步骤仅供参考)

1、添加yum源
cat > /etc/yum.repos.d/mongodb-org-4.4.repo << LEO
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
LEO
2、指定版本安装
sudo yum install -y mongodb-org-4.4.9 mongodb-org-server-4.4.9 mongodb-org-shell-4.4.9 mongodb-org-mongos-4.4.9 mongodb-org-tools-4.4.9
3、安装
[root@leojiang123 script]$ cat /var/opt/script/ansible_script/mongodb_update/configration_yum_repo.sh
#!/bin/bash
# Configure the package management system ( ).
cat > /etc/yum.repos.d/mongodb-org-4.4.repo << LEO
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
LEO

sudo yum install -y mongodb-org-4.4.9 mongodb-org-server-4.4.9 mongodb-org-shell-4.4.9 mongodb-org-mongos-4.4.9 mongodb-org-tools-4.4.9
ansible执行安装
[root@jleojiang123]$ cat /etc/ansible/hosts
[MDB]
leojiang123
leojiang124
leojiang125
leojiang126
leojiang127
[MDB_config]
leojiang124
leojiang125
# copy本地脚本到远程
[root@jleojiang123]$ ansible MDB -m shell -a 'mkdir -p /var/opt/script/ansible_script/mongodb_update'
[root@jleojiang123]$ ansible MDB -m copy -a 'src=/var/opt/script/ansible_script/mongodb_update/configration_yum_repo.sh dest=/var/opt/script/ansible_script/mongodb_update/configration_yum_repo.sh mode=755'
# 执行远程脚本
[root@jleojiang123]$ ansible MDB -m shell -a '/var/opt/script/ansible_script/mongodb_update/configration_yum_repo.sh'
4、为防止意外升级,请固定包
[root@jleojiang123]$ ansible MDB -m shell -a "sed -i 's/#exclude/exclude/' /etc/yum.conf"
[root@jleojiang123]$ ansible MDB -m shell -a "cat /etc/yum.conf|grep exclude"
5、禁用balancer
[root@jleojiang123]$ mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
mongos> sh.stopBalancer()
mongos> sh.isBalancerRunning()
false
mongos>
6、升级config服务器、升级shard、升级mongos

升级到4.4.9可能遇到的问题1:

BadValue: Value of logTimestampFormat must be one of iso8601-utc or iso8601-local; not "ctime".

原因:从 MongoDB 4.4 开始,–timeStampFormat不再支持ctime. ctime格式化日期的一个例子是: Wed Dec 31 18:17:54.811。作为一种解决方法,将此类数据库的时间戳格式设置为 iso8601-utc或 iso8601-local。

价值 描述
iso8601-utc 以 ISO-8601 格式以协调世界时 (UTC) 显示时间戳。例如,对于新纪元开始时的纽约:1970-01-01T00:00:00.000Z
iso8601-local 以 ISO-8601 格式显示本地时间的时间戳。例如,对于新纪元开始时的纽约: 1969-12-31T19:00:00.000-05:00

需要修改mongos、shard、config中关于log的配置文件,修改位置如下:

# 修改所有的mongos服务配置文件
[root@jleojiang123]$ ansible MDB -m shell -a "sed -i 's/ctime/iso8601-local/' /var/opt/mongodb/mongos/mongos.conf"
# 查看结果
[root@jleojiang123]$ ansible MDB -m shell -a "cat /var/opt/mongodb/mongos/mongos.conf |grep timeStampFormat"

# 修改所有的config服务配置文件
[root@jleojiang123]$ ansible MDB_config -m shell -a "sed -i 's/ctime/iso8601-local/' /var/opt/mongodb/config/mongo.conf"
[root@jleojiang123]$ ansible MDB_config -m shell -a "cat /var/opt/mongodb/config/mongo.conf |grep timeStampFormat"

# 修改所有的shard服务配置文件

问题2

对于authorization启用的系统,用户只能 在通过数据库db.shutdownServer()身份验证admin 或通过未启用身份验证的系统上的 localhost 接口时发出。

# mongod使用以下方法从mongoshell关闭db.shutdownServer():
use admin
db.shutdownServer()
7、重启balancer
[root@jleojiang123]$ mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
mongos> sh.startBalancer()
mongos>
8、启用向后不兼容的4.4功能
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

(完成)

卸载

1、停止 MongoDB。
mongod通过发出以下命令停止该过程:

sudo service mongod stop

2
删除软件包。
删除您之前安装的任何 MongoDB 包。

sudo yum erase $(rpm -qa | grep mongodb-org)

3
删除数据目录。
删除 MongoDB 数据库和日志文件。

sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongo

缩减config参考地址

官网参考地址

启动警告

2022-01-29T16:37:52.813+0900 W NETWORK  [replSetDistLockPinger] Unable to reach primary for set cfgReplSet
2022-01-29T16:37:52.813+0900 W SHARDING [replSetDistLockPinger] pinging failed for distributed lock pinger :: caused by :: FailedToSatisfyReadPreference: Could not find host matching read preference { mode: "primary" } for set cfgReplSet
2022-01-29T16:37:54.537+0900 I NETWORK  [initandlisten] Marking host 192.1.40.60:27000 as failed :: caused by :: NetworkInterfaceExceededTimeLimit: timed out

你可能感兴趣的:(MongoDB,mongodb)