zoukankan      html  css  js  c++  java
  • CentOS6.8部署MongoDB集群及支持auth认证

     三个节点的副本集如下图所示:

     实验目的:

      配置MongoDB的3节点副本集

      3个节点的副本集都要开启auth认证,并且开启认证后,能互相通信 

     第一步 - 准备环境

    准备三个虚拟机,其中一个用作Primary,另外两个用作Secondary。如上图展示的那样 

    虚拟机信息如下:
    
        Primary:172.xx.xx.107 
    
        Secondary:172.xx.xx.105 和172.xx.xx.106    

     第二步 - yum安装Mongo

    /etc/yum.repos.d/目录下,创建一个mongodb.repo文件,指定MongoDB资源库即可。

    使用 vim /etc/yum.repos.d/mongodb.repo命令,创建并打开文件mongodb.repo 

    [mongodb-org-3.4]
    
    name=MongoDB Repository
    
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
    
    gpgcheck=1
    
    enabled=1
    
    gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
    

      

    ### 然后
    
    # yum repolist
    # yum install mongodb-org  

     第三步 - 配置副本集

    使用vim /etc/mongod.conf配置,每一台虚拟机上的Mongod配置文件。

    在replication选项中添加oplogSizeMB 和 replSetName两个属性

    # vim /etc/mongod.conf
    
    replication:
    
        oplogSizeMB: 1024
    
        replSetName: test 

    查看mongod.conf文件配置

    # cat /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
    
    # network interfaces
    net:
      port: 27017
      bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
    
    
    #security:
    
    #operationProfiling:
    
    replication:
      oplogSizeMB:  1024
      replSetName:  test
    
    
    #sharding:
    
    ## Enterprise-Only Options
    
    #auditLog:
    
    #snmp:   
    注意:
    
        3台虚拟机,MongoDB配置文件mongod.conf中的replSetName名字要保持一致,
    
        在本例中,replSetName的名字为test,这个名字可以随便取  

     

     第四步 - 启动

    配置好副本集之后,通过mongod --config /etc/mongod.conf 命令启动三个虚拟机中的Mongo服务

    [root@dev04 mongodb]# mongod --config /etc/mongod.conf 
    about to fork child process, waiting until server is ready for connections.
    forked process: 30799
    child process started successfully, parent exiting  

    因为107端口的虚拟机安装的MongoDB要用作Primary节点,所以,我们可以使用mongo命令来连接 

    [root@dev04 mongodb]# mongo
    MongoDB shell version v3.4.2
    connecting to: mongodb://127.0.0.1:27017
    MongoDB server version: 3.4.2
    
    ### 使用use admin, 切换到时admin数据库
    > use admin
    switched to db admin  

    然后通过config配置设置副本集节点成员

    config={_id:"test",members:[{_id:0,host:"172.xxx.xxx.107:27017"},{_id:1,host:"172.xxx.xxx.106:27017"},{_id:2,host:"172.xxx.xxx.105:27017"}]}
    
    注:
    
    _id:"test", test是副本集中取得名字。
    
    members中添加每个副本集Mongod的_id和host信息
    
    > config={_id:"test",members:[{_id:0,host:"172.xxx.xxx.107:27017"},{_id:1,host:"172.xxx.xxx.106:27017"},{_id:2,host:"172.xxx.xxx.105:27017"}]}
    {
    	"_id" : "test",
    	"members" : [
    		{
    			"_id" : 0,
    			"host" : "172.xxx.xxx.107:27017"
    		},
    		{
    			"_id" : 1,
    			"host" : "172.xxx.xxx.106:27017"
    		},
    		{
    			"_id" : 2,
    			"host" : "172.xxx.xxx.105:27017"
    		}
    	]
    }
    >  

    然后,执行配置初始化,看到{ "ok" : 1 },则表明初始化成功

    > rs.initiate(config)
    { "ok" : 1 }  

    使用rs.status()查看副本节点状态

    test:PRIMARY> rs.status() 
    {
    	"set" : "test",
    	"date" : ISODate("2017-02-17T01:30:53.128Z"),
    	"myState" : 1,
    	"term" : NumberLong(1),
    	"heartbeatIntervalMillis" : NumberLong(2000),
    	"optimes" : {
    		"lastCommittedOpTime" : {
    			"ts" : Timestamp(1487295047, 1),
    			"t" : NumberLong(1)
    		},
    		"appliedOpTime" : {
    			"ts" : Timestamp(1487295047, 1),
    			"t" : NumberLong(1)
    		},
    		"durableOpTime" : {
    			"ts" : Timestamp(1487295047, 1),
    			"t" : NumberLong(1)
    		}
    	},
    	"members" : [
    		{
    			"_id" : 0,
    			"name" : "172.xxx.xxx.107:27017",
    			"health" : 1,
    			"state" : 1,
    			"stateStr" : "PRIMARY",
    			"uptime" : 693,
    			"optime" : {
    				"ts" : Timestamp(1487295047, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDate" : ISODate("2017-02-17T01:30:47Z"),
    			"infoMessage" : "could not find member to sync from",
    			"electionTime" : Timestamp(1487294966, 1),
    			"electionDate" : ISODate("2017-02-17T01:29:26Z"),
    			"configVersion" : 1,
    			"self" : true
    		},
    		{
    			"_id" : 1,
    			"name" : "172.xxx.xxx.106:27017",
    			"health" : 1,
    			"state" : 2,
    			"stateStr" : "SECONDARY",
    			"uptime" : 96,
    			"optime" : {
    				"ts" : Timestamp(1487295047, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDurable" : {
    				"ts" : Timestamp(1487295047, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDate" : ISODate("2017-02-17T01:30:47Z"),
    			"optimeDurableDate" : ISODate("2017-02-17T01:30:47Z"),
    			"lastHeartbeat" : ISODate("2017-02-17T01:30:52.708Z"),
    			"lastHeartbeatRecv" : ISODate("2017-02-17T01:30:51.674Z"),
    			"pingMs" : NumberLong(0),
    			"syncingTo" : "172.xxx.xxx.107:27017",
    			"configVersion" : 1
    		},
    		{
    			"_id" : 2,
    			"name" : "172.xxx.xxx.105:27017",
    			"health" : 1,
    			"state" : 2,
    			"stateStr" : "SECONDARY",
    			"uptime" : 96,
    			"optime" : {
    				"ts" : Timestamp(1487295047, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDurable" : {
    				"ts" : Timestamp(1487295047, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDate" : ISODate("2017-02-17T01:30:47Z"),
    			"optimeDurableDate" : ISODate("2017-02-17T01:30:47Z"),
    			"lastHeartbeat" : ISODate("2017-02-17T01:30:52.708Z"),
    			"lastHeartbeatRecv" : ISODate("2017-02-17T01:30:51.745Z"),
    			"pingMs" : NumberLong(0),
    			"syncingTo" : "172.xxx.xxx.106:27017",
    			"configVersion" : 1
    		}
    	],
    	"ok" : 1
    test:PRIMARY> 
    

      

     第五步:副本集的认证

    副本集总体思路是用户名、密码和keyfile文件,keyfile需要各个副本集服务启动时加载而且要是同一文件,然后在操作库是需要用户名、密码
    KeyFile文件必须满足条件:

    • 至少6个字符,小于1024字节
    • 认证时候不考虑文件中空白字符
    • 连接到副本集的成员和mongos进成的keyfile文件内容必须一样
    • 必须是base64编码,但是不能有等号
    • 文件权限必须是x00,也就是说,不能分配任何权限给group成员和other成员
    ###  在107节点生成Keyfile
    [root@localhost ~]# openssl rand -base64 90 > /usr/local/mongodb/keyfiletest
    

      

    ### 然后该文件scp到105、106上面
    
    scp  /usr/local/mongodb/keyfile root@172.xxx.xxx.105[106]:/usr/local/mongodb/
    

      

    ###  修改配置文件

    # vim /etc/mongod.conf security: keyFile: /usr/local/mongodb/keyfiletest authorization: enabled

     

    # cat /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
    
    # network interfaces
    net:
      port: 27017
      bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
    
    
    security:
      keyFile: /usr/local/mongodb/keyfiletest
      authorization: enabled
    
    #operationProfiling:
    
    replication:
      oplogSizeMB:  1024
      replSetName:  test
    
    
    #sharding:
    
    ## Enterprise-Only Options
    
    #auditLog:
    
    #snmp: 

    重启mongod服务,认证OK  

     转载及借鉴博客地址:

    https://my.oschina.net/wangmengjun/blog/840997?from=timeline&isappinstalled=0

    http://www.cnblogs.com/xiaoit/p/4522218.html

    http://www.cnblogs.com/libingql/archive/2011/06/09/2076440.html

     

  • 相关阅读:
    Arrow-一个最好用的日期时间Python处理库
    悲观锁与乐观锁
    python中super的使用
    jquery的html,text,val
    spring与mybatis三种整合方法
    Android 在线SDK更新 和谐被墙解决
    转【】浅谈sql中的in与not in,exists与not exists的区别_
    tableview 里面的 必须配套使用的方法
    IOS发送Email的两种方法-备
    iOS基本的发短信和打电话调用
  • 原文地址:https://www.cnblogs.com/evescn/p/7098132.html
Copyright © 2011-2022 走看看