IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Centos7 搭建Mongodb 分片集群4.0——三成员副本集(二) -> 正文阅读

[大数据]Centos7 搭建Mongodb 分片集群4.0——三成员副本集(二)

五(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的数据目录到新成员服务器上

# 参考,目录在自己的shard配置文件中可以找到<storage.dbPath>
# 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副本

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 "egayong"
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 "egayong"
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)

创建用户

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副本集,创建所需的文件夹

# 配置文件<arbiter26.conf>需要和创建的文件夹一致
[root@leojiang123]# mkdir -p /var/opt/mongodb/arbiter/arbiter26/log
# 创建仲裁器数据目录,该目录用户存储配置数据,不会保存数据集。配置文件<arbiter26.conf>需要和创建的文件夹一致
[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 "egayong"
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 "egayong"
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 "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
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:08:39  更:2022-04-01 00:12:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:54:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码