加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 系统 > 正文

详细介绍MongoDB复制集

发布时间:2023-10-25 15:06:16 所属栏目:系统 来源:
导读:何为复制集?

复制集是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断的服务进行恢复。

复制集主从同步的原理和mysql类似,主节点记录
何为复制集?
 
复制集是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断的服务进行恢复。
 
复制集主从同步的原理和mysql类似,主节点记录在其上的所有操作到oplog中,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
 
复制集的优势如下:
 
(1)让数据更安全
 
(2)高数据可用性(24*7)
 
(3)灾难恢复
 
(4)无停机维护(如备份、索引重建、故障转移)
 
(5)读缩放(额外的副本读取)
 
(6)副本集对应用程序是透明。
 
.mongodb的复制集至少需要两个节点。其中一个是主节点(Primary),负责处理客户端请求,其余的都是从节点(Secondary),负责复制主节点上的数据。
 
mongodb各个节点常见的搭配方式为:一主一从或一主多从。
 
客户端在主节点写入数据,在从节点读取数据,主节点与从节点进行数据交互,保障数据的一致性。如果其中一个节点出现故障,其他节点马上会将业务接过来而无需停机操作
 
详解MongoDB复制集
 
复制集的特点:
 
1.N 个节点的集群
 
2.任何节点可作为主节点
 
3.所有写入操作都在主节点上
 
4.自动故障转移
 
5.自动恢复
 
MongoDB复制集部署
 
在一台CentOS7主机上使用yum在线安装Mongodb,并创建多实例,进行部署MongoDB复制集
 
首先配置网络YUM源,baseurl(下载路径)指定为mongodb官网提供的yum仓库
 
vim /etc/yum.repos.d/mongodb.repo
 
[mongodb-org]
 
name=MongoDB Repository
 
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/             #指定获得下载的路径
 
gpgcheck=1                     #表示对从这个源下载的rpm包进行校验
 
enabled=1                   #表示启用这个源。
 
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
 
重新加载yum源,并使用yum命令下载安装mongodb
 
yum list
 
yum -y install mongodb-org
 
准备4个实例,暂时开启3个, 1主2从    再额外添加群集(追加实例)也可以撤销实例
 
创建数据文件和日志文件存储路径,并赋予权限
 
[root@localhost ~]# mkdir -p /data/mongodb{2,3,4}
 
[root@localhost ~]# mkdir /data/logs
 
[root@localhost ~]# touch /data/logs/mongodb{2,3,4}.log
 
[root@localhost ~]# chmod 777 /data/logs/mongodb*
 
[root@localhost ~]# ll /data/logs/
 
总用量 0
 
-rwxrwxrwx. 1 root root 0 9月  15 22:31 mongodb2.log
 
-rwxrwxrwx. 1 root root 0 9月  15 22:31 mongodb3.log
 
-rwxrwxrwx. 1 root root 0 9月  15 22:31 mongodb4.log
 
编辑4个MongoDB实例的配置文件
 
先编辑yum安装的默认实例的配置文件/etc/mongod.conf,指定监听IP,端口默认为27017,开启replication参数配置,replSetName:true(自定义)
 
[root@localhost ~]# vim /etc/mongod.conf
 
# mongod.conf
 
# for documentation of all options, see:
 
#   http://docs.mongodb.org/manual/reference/configuration-options/  
 
# where to write logging data.
 
systemLog:
 
  destination: file
 
  logAppend: true
 
  path: /var/log/mongodb/mongod.log
 
# Where and how to store data.
 
storage:
 
  dbPath: /var/lib/mongo
 
  journal:
 
    enabled: true
 
#  engine:
 
#  mmapv1:
 
#  wiredTiger:
 
# how the process runs
 
processManagement:
 
  fork: true  # fork and run in background
 
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
 
  timeZoneInfo: /usr/share/zoneinfo
 
# network interfaces
 
net:
 
  port: 27017                    #默认端口         
 
  bindIp: 0.0.0.0             #监听任意地址
 
#security:
 
#operationProfiling:
 
replication:                   #去掉前面的“#”注释,开启该参数设置
 
replSetName: true          #设置复制集名称
 
复制配置文件给其他实例,并将mongodb2.conf 中的port参数配置为27018,mongod3.conf中的port参数配置为27019,mongod4.conf中的port参数配置为27020。 同样也将dbpath和logpath参数修改为对应的路径值
 
cp  /etc/mongod.conf /etc/mongod2.conf
 
cp /etc/mongod2.conf /etc/mongod3.conf
 
cp /etc/mongod2.conf /etc/mongod4.conf
 
实例2的配置文件mongodb2.conf 修改
 
vim /etc/mongod2.conf
 
systemLog:
 
  destination: file
 
  logAppend: true
 
  path: /data/logs/mongodb2.log    
 
storage:
 
  dbPath: /data/mongodb/mongodb2  
 
  journal:
 
enabled: true
 
port: 27018
 
bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
 
#security:
 
#operationProfiling:
 
replication:
 
replSetName: true
 
实例3的配置文件mongodb3.conf 修改
 
vim /etc/mongod3.conf
 
systemLog:
 
  destination: file
 
  logAppend: true
 
  path: /data/logs/mongodb3.log    
 
storage:
 
  dbPath: /data/mongodb/mongodb3
 
  journal:
 
enabled: true
 
port: 27019
 
bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
 
#security:
 
#operationProfiling:
 
replication:
 
replSetName: true
 
实例4的配置文件mongodb4.conf 修改
 
vim /etc/mongod4.conf
 
systemLog:
 
  destination: file
 
  logAppend: true
 
  path: /data/logs/mongodb4.log    
 
storage:
 
  dbPath: /data/mongodb/mongodb4  
 
  journal:
 
enabled: true
 
port: 27020
 
bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
 
#security:
 
#operationProfiling:
 
replication:
 
replSetName: true
 
启动mongodb各实例
 
[root@localhost ~]# mongod -f /etc/mongod.conf
 
about to fork child process, waiting until server is ready for connections.
 
forked process: 93576
 
child process started successfully, parent exiting
 
[root@localhost ~]# mongod -f /etc/mongod2.conf
 
about to fork child process, waiting until server is ready for connections.
 
forked process: 93608
 
child process started successfully, parent exiting
 
[root@localhost ~]# mongod -f /etc/mongod3.conf
 
about to fork child process, waiting until server is ready for connections.
 
forked process: 93636
 
child process started successfully, parent exiting
 
[root@localhost ~]# mongod -f /etc/mongod4.conf
 
about to fork child process, waiting until server is ready for connections.
 
forked process: 93664
 
child process started successfully, parent exiting
 
[root@localhost ~]# netstat -antp | grep mongod                        //查看mongodb进程状态
 
tcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      93636/mongod       
 
tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      93664/mongod       
 
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      93576/mongod       
 
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      93608/mongod
 
配置三个节点的复制集
 
[root@localhost ~]# mongo                     //进入其中一个实例
 
MongoDB shell version v3.6.7
 
connecting to: mongodb://127.0.0.1:27017
 
MongoDB server version: 3.6.7
 
> rs.status()                               //查看复制集状态,提示复制集还未配置
 
{
 
    "info" : "run rs.initiate(...) if not yet done for the set",
 
    "ok" : 0,
 
    "errmsg" : "no replset config has been received",
 
    "code" : 94,
 
    "codeName" : "NotYetInitialized",
 
    "operationTime" : Timestamp(0, 0),
 
    "$clusterTime" : {
 
        "clusterTime" : Timestamp(0, 0),
 
        "signature" : {
 
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
 
            "keyId" : NumberLong(0)
 
        }
 
    }
 
> cfg={"_id":"true","members":[{"_id":0,"host":"192.168.195.137:27017"},{"_id":1,"host":"192.168.195.137:27018"},{"_id":2,"host":"192.168.195.137:27019"}]}                    // 定义cfg初始化参数                    
 
{
 
    "_id" : "true",
 
    "members" : [
 
        {
 
            "_id" : 0,
 
            "host" : "192.168.195.137:27017"
 
        },
 
        {
 
            "_id" : 1,
 
            "host" : "192.168.195.137:27018"
 
        },
 
        {
 
            "_id" : 2,
 
            "host" : "192.168.195.137:27019"
 
        }
 
    ]
 
}
 
> rs.initiate(cfg)                    //初始化并启动复制集
 
{"ok" : 1}
 
true:PRIMARY> rs.status()               //再次查看复制集的状态信息
 
{
 
    "set" : "true",
 
    "date" : ISODate("2018-09-15T15:39:48.426Z"),
 
    "myState" : 1,
 
    "term" : NumberLong(1),
 
    "syncingTo" : "",
 
    "syncSourceHost" : "",
 
    "syncSourceId" : -1,
 
    "heartbeatIntervalMillis" : NumberLong(2000),
 
    "optimes" : {
 
        "lastCommittedOpTime" : {
 
            "ts" : Timestamp(1537025984, 1),
 
            "t" : NumberLong(1)
 
        },
 
        "readConcernMajorityOpTime" : {
 
            "ts" : Timestamp(1537025984, 1),
 
            "t" : NumberLong(1)
 
        },
 
        "appliedOpTime" : {
 
            "ts" : Timestamp(1537025984, 1),
 
            "t" : NumberLong(1)
 
        },
 
        "durableOpTime" : {
 
            "ts" : Timestamp(1537025984, 1),
 
            "t" : NumberLong(1)
 
        }
 
    },
 
    "members" : [
 
        {
 
            "_id" : 0,
 
           "name" : "192.168.195.137:27017",
 
            "health" : 1,
 
            "state" : 1,
 
           "stateStr" : "PRIMARY",              //此节点成为主节点
 
            "uptime" : 1371,
 
            "optime" : {
 
                "ts" : Timestamp(1537025984, 1),
 
                "t" : NumberLong(1)
 
            },
 
....................
 
 
                  {
 
            "_id" : 1,
 
            "name" : "192.168.195.137:27018",
 
            "health" : 1,
 
            "state" : 2,
 
           "stateStr" : "SECONDARY",                //此节点为从节点
 
            "uptime" : 18,
 
            "optime" : {
 
                "ts" : Timestamp(1537025984, 1),
 
                "t" : NumberLong(1)
 
            },
 
            "optimeDurable" : {
 
                "ts" : Timestamp(1537025984, 1),
 
                "t" : NumberLong(1)
 
            },
 
...................
 
 
                 {
 
            "_id" : 2,
 
            "name" : "192.168.195.137:27019",
 
            "health" : 1,
 
            "state" : 2,
 
           "stateStr" : "SECONDARY",                   //此节点为从节点
 
            "uptime" : 18,
 
            "optime" : {
 
                "ts" : Timestamp(1537025984, 1),
 
                "t" : NumberLong(1)
 
            },
 
            "optimeDurable" : {
 
                "ts" : Timestamp(1537025984, 1),
 
                "t" : NumberLong(1)
 
            },
 
         
 
添加节点
 
true:PRIMARY> rs.add("192.168.195.137:27020")
 
true:PRIMARY> rs.status()
 
..............
 
{
 
            "_id" : 3,
 
            "name" : "192.168.195.137:27020",
 
            "health" : 1,
 
            "state" : 2,
 
            "stateStr" : "SECONDARY",
 
            "uptime" : 8,
 
            "optime" : {
 
                "ts" : Timestamp(1537026818, 1),
 
                "t" : NumberLong(1)
 
            },
 
            "optimeDurable" : {
 
                "ts" : Timestamp(1537026818, 1),
 
                "t" : NumberLong(1)
 
            },
 
.................
 
删除节点
 
true:PRIMARY> rs.remove("192.168.195.137:27020")
 
模拟故障自动转移切换
 
[root@localhost ~]# mongod -f /etc/mongod.conf --shutdown              //关闭主节点服务
 
killing process with pid: 93576
 
[root@localhost ~]# mongo --port 27018                      //进入其中一个从节点
 
MongoDB shell version v3.6.7
 
connecting to: mongodb://127.0.0.1:27018/
 
MongoDB server version: 3.6.7
 
true:PRIMARY> rs.status()                  //查看复制集信息
 
..............
 
 
    },
 
    "members" : [
 
        {
 
            "_id" : 0,
 
           "name" : "192.168.195.137:27017",                           //原来的主节点健康值为0
 
            "health" : 0,
 
            "state" : 8,
 
            "stateStr" : "(not reachable/healthy)",
 
            "uptime" : 0,
 
            "optime" : {
 
                "ts" : Timestamp(0, 0),
 
                "t" : NumberLong(-1)
 
            },
 
            "optimeDurable" : {
 
                "ts" : Timestamp(0, 0),
 
                "t" : NumberLong(-1)
 
            },
 
.................
 
 
                  {
 
            "_id" : 1,
 
           "name" : "192.168.195.137:27018",
 
            "health" : 1,
 
            "state" : 1,
 
           "stateStr" : "PRIMARY",                         //此节点切换成主节点
 
            "uptime" : 2657,
 
            "optime" : {
 
                "ts" : Timestamp(1537027275, 1),
 
                "t" : NumberLong(2)
 
            },
 
................
 
 
                    {
 
            "_id" : 2,
 
            "name" : "192.168.195.137:27019",
 
            "health" : 1,
 
            "state" : 2,
 
            "stateStr" : "SECONDARY",
 
            "uptime" : 1312,
 
            "optime" : {
 
                "ts" : Timestamp(1537027275, 1),
 
                "t" : NumberLong(2)
 
            },
 
            "optimeDurable" : {
 
                "ts" : Timestamp(1537027275, 1),
 
                "t" : NumberLong(2)
 
            },
 
          
 
手动进行主从切换
 
[root@localhost ~]# mongod -f /etc/mongod.conf           #开启刚才关闭的端口为27017的节点实例
 
about to fork child process, waiting until server is ready for connections.
 
forked process: 94723
 
child process started successfully, parent exiting
 
[root@localhost ~]# mongo --port 27018             #进入主节点服务器实例
 
MongoDB shell version v3.6.7
 
connecting to: mongodb://127.0.0.1:27018/
 
MongoDB server version: 3.6.7
 
true:PRIMARY> rs.freeze(30)                     //暂停30s不参与选举
 
true:PRIMARY> rs.stepDown(60.30)              //交出主节点位置,维持从节点状态不少于60秒,等待30秒使主节点和从节点日志同步  
 
true:SECONDARY> rs.status()             //可以看到本实例已经切换成从节点
 
................
 
 
    "members" : [
 
        {
 
            "_id" : 0,
 
            "name" : "192.168.195.137:27017",                // 端口27017的节点变成了主节点
 
            "health" : 1,
 
            "state" : 1,
 
            "stateStr" : "PRIMARY",                        
 
            "uptime" : 167,
 
            "optime" : {
 
                "ts" : Timestamp(1537027620, 1),
 
                "t" : NumberLong(3)
 
            },
 
            "optimeDurable" : {
 
                "ts" : Timestamp(1537027620, 1),
 
                "t" : NumberLong(3)
 
            },
 
..................
 
            
 
        {
 
            "_id" : 1,
 
            "name" : "192.168.195.137:27018",                    // 端口27018的节点变成了从节点         
 
            "health" : 1,
 
            "state" : 2,
 
            "stateStr" : "SECONDARY",
 
            "uptime" : 2997,
 
            "optime" : {
 
                "ts" : Timestamp(1537027620, 1),
 
                "t" : NumberLong(3)
 
            },
 
...................
 
          
 
        {
 
            "_id" : 2,
 
            "name" : "192.168.195.137:27019",
 
            "health" : 1,
 
            "state" : 2,
 
            "stateStr" : "SECONDARY",
 
            "uptime" : 1651,
 
            "optime" : {
 
                "ts" : Timestamp(1537027620, 1),
 
                "t" : NumberLong(3)
 
            },
 
            "optimeDurable" : {
 
                "ts" : Timestamp(1537027620, 1),
 
                "t" : NumberLong(3)
 
            },
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章