15 June 2016

因业务需要,需要在centos安装一个mongodb集群做测试,折腾了一天,把坑都记下来,免得忘了。 mongodb集群搭建有三种方式:Replica Set / Sharding / Master-Slaver。本文使用Replica Set 方式。 Replica Set 就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务, 提供的前提就是数据需要和主节点一致,结构图如下:

结构图

Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。 客户端同时连接主节点与备节点,不连接仲裁节点。

默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务, 这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes, 同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。

仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点, 所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。 本问就是用这种方式搭建mongodb集群

准备三台机器:

oss2:主节点 oss1:备节点 dataengine1:仲裁节点

解压安装

将安装包拷贝到三台机器的/opt/目录下 安装目录为:/opt/mongodb-3.2.4/ 准备工作目录,主要用于存放mongodb工作的数据文件,日志,进程文件 新建目录/opt/mongo/ 并且在mongo下新建一个db目录,用于存放数据文件

###配置文件 新建配置文件/opt/mongodb-3.2.4/mongdb.conf,三台机器上配置文件确保一致:


	#数据库文件所在位置(默认)
    dbpath=/opt/mongo/db
    #日志所在位置(默认)
    logpath=/opt/mongo/mongod.log
    #pid所在位置(默认)
    pidfilepath = /opt/mongo/mongod.pid
    #keyFile所在位置,生成方式在后面(添加)
    keyFile=/opt/mongo/key
    #启用授权
    auth=true
    #端口(默认)
    port=27017
    
    #每次启动后日志追加在后面,不会新建日志文件(默认)
    logappend=true
    #用deamon方式启动(添加)
    fork=true
    #打开操作日志,用于故障恢复和持久化(默认)
    journal=true
    #replica set的名字(添加)
    replSet=test-set

	

KeyFile的设置

KeyFile是机器间用来进行权限认证的,如果没有设置KeyFile,在rs.initiate()的时候,会提示有其他机器没有ready. 创建Key File用下面的语句:

openssl rand -base64 755 

如果有权限的问题,可以先创建一个文件:key,然后将上述命令的执行结果的一长串粘贴到key文件中。

注意mongod.conf配置文件中keyFile的路径要配置正确。

启动mongod

三台机器上分别执行下面命令启动mongodb sudo numactl –interleave=all /opt/mongodb-3.2.4/bin/mongod -f /opt/mongodb-3.2.4/mongod.conf

配置replica set节点

使用mongo命令行登录一台服务器输入下面命令

 
     [ops@oss2 bin]$ ./mongo
     MongoDB shell version: 3.2.4
     connecting to: test
     > config = {_id:"dataengine-adod",members:[{_id:0,host:'192.168.10.201:27017',priority :2},{_id:1,host:'192.168.10.200:27017',priority:1},{_id:2,host:'192.168.10.210:27017',priority:1}]} 
     {
        "_id" : "dataengine-adod",
        "members" : [
            {
                "_id" : 0,
                "host" : "192.168.10.201:27017",
                "priority" : 2
            },
            {
                "_id" : 1,
                "host" : "192.168.10.200:27017",
                "priority" : 1
            },
            {
                "_id" : 2,
                "host" : "192.168.10.210:27017",
                "priority" : 1
            }
        ]
     }
     > rs.initiate(config);
     { "ok" : 1 }

查看节点状态


    dataengine-adod:OTHER> rs.status();
    {
        "set" : "dataengine-adod",
        "date" : ISODate("2016-06-23T09:22:20.239Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
            {
                "_id" : 0,
                "name" : "192.168.10.201:27017",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 561,
                "optime" : {
                    "ts" : Timestamp(1466673510, 2),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2016-06-23T09:18:30Z"),
                "electionTime" : Timestamp(1466673510, 1),
                "electionDate" : ISODate("2016-06-23T09:18:30Z"),
                "configVersion" : 1,
                "self" : true
            },
            {
                "_id" : 1,
                "name" : "192.168.10.200:27017",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 241,
                "optime" : {
                    "ts" : Timestamp(1466673510, 2),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2016-06-23T09:18:30Z"),
                "lastHeartbeat" : ISODate("2016-06-23T09:22:18.437Z"),
                "lastHeartbeatRecv" : ISODate("2016-06-23T09:22:19.397Z"),
                "pingMs" : NumberLong(0),
                "syncingTo" : "192.168.10.201:27017",
                "configVersion" : 1
            },
            {
                "_id" : 2,
                "name" : "192.168.10.210:27017",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 241,
                "optime" : {
                    "ts" : Timestamp(1466673510, 2),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2016-06-23T09:18:30Z"),
                "lastHeartbeat" : ISODate("2016-06-23T09:22:18.437Z"),
                "lastHeartbeatRecv" : ISODate("2016-06-23T09:22:19.389Z"),
                "pingMs" : NumberLong(0),
                "syncingTo" : "192.168.10.201:27017",
                "configVersion" : 1
            }
        ],
        "ok" : 1
    }
    dataengine-adod:PRIMARY> 

用户管理

  • 切换到admin张华:

      use admin
    
  • 创建超级用户:

      db.createUser({user:"superadmin",pwd:"superadminpwd",roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase"]})   创建成功会返回:
    
      Successfully added user: {
      	"user" : "superadmin",
      	"roles" : [
      		"clusterAdmin",
      		"userAdminAnyDatabase",
      		"dbAdminAnyDatabase",
      		"readWriteAnyDatabase"
      	]
      }
    
  • 创建应用用户

      use myapp
      db.createUser(
       {
         user: "appuser",
         pwd: "password",
         roles: [
            { role: "readWrite", db: "myapp" }
         ]
       }
      )
    

操作过程中如果提示没有权限操作,比如下面这类错误:

    Error: couldn't add user: not authorized on adod to execute command

检查配置文件mongod.conf中是否配置了auth=ture,如果没有配置,则进行配置,并且重启mongodb

启动mongodb的时候注意,不要使用kill -9 去删除进程重启。而要用 kill -2 或者 db.shutdownServer(); 此时权限缺少的时候使用db.shutdownServer()也是无法关闭服务器的,所以基本上就只能使用kill来删进程,记得不要 -9即可。





Fork me on GitHub