五(1)、三成员副本集部署架构
5.1、主要有两个次要成员 (PSS)
具有三个存储数据的成员的副本集具有:
- One primary.
- Two secondary 成员.两个辅助节点都可以成为选举中的主节点。
这些部署除了主要部署之外,始终提供数据集的两个完整副本。这些副本集提供了额外的容错性和高可用性。如果主节点不可用,则副本集选择辅助节点作为主节点并继续正常操作。旧的主节点在可用时重新加入集合。
5.2、主节点和仲裁节点 (PSA)
具有两个存储数据的成员的三成员副本集具有:
- One primary.
- One secondary 成员. 次要可以在选举中成为主要。
- One arbiter .仲裁者只在选举中投票。
由于仲裁器不保存数据副本,因此这些部署仅提供数据的一个完整副本。仲裁器需要更少的资源,但代价是更有限的冗余和容错。
但是,具有主节点、辅助节点和仲裁器的部署可确保在主节点或辅助节点不可用时副本集仍然可用。如果主节点不可用,则副本集将选择从节点作为主节点。
五(2)、部署三成员副本集(PRIMARY-SECONDARY-ARBITER 架构)
PSA将会完成的结构如下:
前提:
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 "egayong"
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的数据目录到新成员服务器上
[root@leojiang126]
[root@leojiang127]
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
port: 27001
serviceExecutor: adaptive
storage:
dbPath: /var/opt/mongodb/slaver/data
journal:
enabled: true
commitIntervalMs: 200
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
systemLog:
verbosity: 0
destination: file
path: "/var/opt/mongodb/slaver/log/slaver1.log"
logAppend: true
logRotate: reopen
timeStampFormat: ctime
security:
authorization: enabled
keyFile: /var/opt/mongodb/mongodb-keyfile
? ②服务器leojiang125 中的slaver节点/var/opt/mongodb/slaver/shard.conf配置文件参数replication.replSetName如下
……
replication:
replSetName: shard2
……
3、启动需要添加的shard副本
3. start 副shard
numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/slaver/shard.conf
4、把启动的shard副本添加到自己所需的副本集(我配置的副本集是shard1 和shard2 ),只能到连接到主节点时进行添加成员。如果您不知道哪个成员是master-shard成员,请登录到副本集的任何成员并发出db.hello()命令(4.0.21 版中的新功能)。
? ①shard1 副本集添加副shard:
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "egayong"
shard1:PRIMARY> rs.status()
shard1:PRIMARY> rs.add( { host: "leojiang124:27001", priority: 0, votes: 0 } )
shard1:PRIMARY> rs.status()
? ②shard2 副本集添加副shard:
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "egayong"
shard2:PRIMARY> rs.status()
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)
创建用户
1、连接mongodb
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "egayong"
2、设置admin用户,需要使用的mongos和shard分别添加root用户
use admin
db.createUser(
{
user: "root",
pwd: "egayong",
roles: [ { role: "root", db: "admin" } ]
}
)
5.3、将仲裁器添加到副本集
-
在某些情况下(例如您有一个主节点和一个辅助节点,但成本限制禁止添加另一个辅助节点),您可以选择将一个mongod实例添加到副本集作为 仲裁者在选举中投票。 -
仲裁器是副本集的一部分但不保存数据(即不提供数据冗余)的mongod实例 。但是,他们可以参加选举。 -
仲裁器的资源要求最低,不需要专用硬件。您可以在应用服务器或监控主机上部署仲裁器。
important:不要在同时托管副本集的主要或次要成员的系统上运行仲裁程序。
1、添加shard1 && shard2副本集,创建所需的文件夹
[root@leojiang123]
[root@leojiang123]
[root@leojiang123]
[root@leojiang123]
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]
[root@leojiang123]
? ①连接到主节点leojiang126 并将仲裁器添加到shard1副本集。使用该rs.addArb() 方法
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "egayong"
shard1:PRIMARY> rs.status()
shard1:PRIMARY> rs.addArb("leojiang123:27026")
shard1:PRIMARY> rs.status()
? ②连接到主节点leojiang127 添加到shard2副本集添加:
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "egayong"
shard2:PRIMARY> rs.status()
shard2:PRIMARY> rs.addArb("leojiang123:27027")
shard2:PRIMARY> rs.status()
4、检查:
rs.conf()
rs.status()
5.4、启动mongos、并检查添加的分片副本集成员。
1、最后启动mongos(leojiang124~leojiang127)
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 "egayong"
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:最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。
缩减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
|