MongoDB3.2.9分布式集群搭建

手把手搭建MongoDB集群

目标

搭建带有安全认证的mongodb集群准生产环境。
一共3个shard,每一个shard有3个replica set,replicat set采用primary、secondary、secondary方式。9个mongod实例,另外,3个config server,3个mongod实例,3个mongos实例。

mongodb版本 3.2.9 社区版本
Cores 4
OS Name CentOS release 6.6 (Final)
OS Version Linux version 2.6.32-504.3.3.el6.x86_64
RAM (MB) 3729

注意:关闭SELINUX
注意:服务器时间同步,比如用ntpdate,可以暂时略过不管。

最后会有核武。MongoDB Ops Manager

服务器准备:

服务器-ip
192.168.3.73
192.168.3.74
192.168.3.75

另外准备一台192.168.3.81用作MongoDB Ops Manager。

访问互通

比如在192.168.3.73机器上修改

vi /etc/hosts

192.168.3.73 73.dooioo.org
192.168.3.74 74.dooioo.org
192.168.3.75 75.dooioo.org
192.168.3.76 76.dooioo.org
192.168.3.81 81.dooioo.org
vi /etc/sysconfig/network
HOSTNAME=73.dooioo.org

生效

hostname 73.dooioo.org 

下载安装

登录到192.168.3.73

$ cd /root
$ wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.9.tgz
$ scp mongodb-linux-x86_64-rhel62-3.2.9.tgz root@192.168.3.74:/root
$ scp mongodb-linux-x86_64-rhel62-3.2.9.tgz root@192.168.3.75:/root
$ scp mongodb-linux-x86_64-rhel62-3.2.9.tgz root@192.168.3.76:/root
$ tar zxvf mongodb-linux-x86_64-rhel62-3.2.9.tgz

规划集群和分片

规划3个shard * 3个replicat set + 配置服务

shard rs name Primary Secondary Secondary port
fang-s-a a1 a2 a3 28111
fang-s-b b2 b1 b3 28112
fang-s-c c3 c1 c2 28113
fang-cs configserver1 configserver2 configserver3 28200

规划3个config server的mongod实例configserver1、configserver2、configserver3

hostname 实例
73.dooioo.org a1 b1 c1 configserver1
74.dooioo.org a2 b2 c2 configserver2
75.dooioo.org a3 b3 c3 configserver3

规划目录和配置文件

创建必要的目录和文件

#!/usr/bin/env bash
# 登录到192.168.3.73
# 创建db目录 日志目录 mongod配置文件
mkdir -p /mongodb/a1
mkdir -p /home/log/mongodb/a1
mkdir -p /mongodb/b1
mkdir -p /home/log/mongodb/b1
mkdir -p /mongodb/c1
mkdir -p /home/log/mongodb/c1

mkdir -p /mongodb/configserver1
mkdir -p /home/log/mongodb/configserver1

touch /mongodb/mongod-a1-config.yml
touch /mongodb/mongod-b1-config.yml
touch /mongodb/mongod-c1-config.yml
touch /mongodb/mongod-configserver1.yml

# 登录到192.168.3.74
mkdir -p /mongodb/a2
mkdir -p /home/log/mongodb/a2
mkdir -p /mongodb/b2
mkdir -p /home/log/mongodb/b2
mkdir -p /mongodb/c2
mkdir -p /home/log/mongodb/c2

mkdir -p /mongodb/configserver2
mkdir -p /home/log/mongodb/configserver2

touch /mongodb/mongod-a2-config.yml
touch /mongodb/mongod-b2-config.yml
touch /mongodb/mongod-c2-config.yml
touch /mongodb/mongod-configserver2.yml

# 登录到192.168.3.75
mkdir -p /mongodb/a3
mkdir -p /home/log/mongodb/a3
mkdir -p /mongodb/b3
mkdir -p /home/log/mongodb/b3
mkdir -p /mongodb/c3
mkdir -p /home/log/mongodb/c3

mkdir -p /mongodb/configserver3
mkdir -p /home/log/mongodb/configserver3

touch /mongodb/mongod-a3-config.yml
touch /mongodb/mongod-b3-config.yml
touch /mongodb/mongod-c3-config.yml
touch /mongodb/mongod-configserver3.yml

# 登录到192.168.3.73
# 生产和copy秘钥用户实例内部认证

openssl rand -base64 755 > /mongodb/keyfile
chmod 400 /mongodb/keyfile

scp /mongodb/keyfile root@192.168.3.74:/mongodb/
scp /mongodb/keyfile root@192.168.3.75:/mongodb/

列举mongod-a1-config.yml文件。

# yml
# mongod config

# 日志位置
systemLog:
  destination: file
  logAppend: true
  path: /home/log/mongodb/a1/mongodb.log


# Where and how to store data.
# db存储位置
storage:
  dbPath: /mongodb/a1
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
# fork : fork and run in background  后台运行
# pidFilePath:location of pidfile 
processManagement:
  fork: true
  pidFilePath: /var/run/mongod-a1.pid

# network interfaces
# Listen to local interface only, comment to listen on all interfaces.
net:
  port: 28111
  bindIp: 0.0.0.0

#security:  enabled  disabled
#security:
#  keyFile: /mongodb/keyfile
#  clusterAuthMode: keyFile

#operationProfiling:
operationProfiling:
   slowOpThresholdMs: 1000
   mode: slowOp

#replication:

replication:
  replSetName: fang-s-a

#sharding:

sharding:
  clusterRole: shardsvr

## Enterprise-Only Options

#auditLog:

#snmp:

刚才touch的文件按照名称修改配置,比如mongod-b1-config.yml需要修改的内容:a1全部替换问b1, fang-s-a替换为fang-s-b,端口按照规划的28111改为28112

configserver稍微有点不一样的是clusterRole,注意修改,一个为shardsvr,一个为configsvr,其他同理,不同服务器修改数据和配置。按照前面创建的文件名称,目录名称修改。也给出一个配置服务的例子

# yml
# mongod config

systemLog:
  destination: file
  logAppend: true
  path: /home/log/mongodb/configserver1/mongodb.log


# Where and how to store data.
storage:
  dbPath: /mongodb/configserver1
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
# fork : fork and run in background
# pidFilePath:location of pidfile
processManagement:
  fork: true
  pidFilePath: /var/run/mongod-configserver1.pid

# network interfaces
# Listen to local interface only, comment to listen on all interfaces.
net:
  port: 28200
  bindIp: 0.0.0.0


#security:  enabled  disabled
#security:
#  keyFile: /mongodb/keyfile
#  clusterAuthMode: keyFile

#operationProfiling:
operationProfiling:
   slowOpThresholdMs: 1000
   mode: slowOp

#replication:

replication:
  replSetName: fang-cs

#sharding:

sharding:
  clusterRole: configsvr

## Enterprise-Only Options

#auditLog:

#snmp:

启动实例

启动所有实例:

#  登录到192.168.3.73
cd /root/mongodb-linux-x86_64-rhel62-3.2.9/bin
./mongod -f /mongodb/mongod-a1-config.yml
./mongod -f /mongodb/mongod-b1-config.yml
./mongod -f /mongodb/mongod-c1-config.yml
./mongod -f /mongodb/mongod-configserver1.yml

# 其他两台类似,启动其他8个实例
#  登录到192.168.3.74
cd /root/mongodb-linux-x86_64-rhel62-3.2.9/bin
./mongod -f /mongodb/mongod-a2-config.yml
./mongod -f /mongodb/mongod-b2-config.yml
./mongod -f /mongodb/mongod-c2-config.yml
./mongod -f /mongodb/mongod-configserver2.yml

#  登录到192.168.3.75
cd /root/mongodb-linux-x86_64-rhel62-3.2.9/bin
./mongod -f /mongodb/mongod-a3-config.yml
./mongod -f /mongodb/mongod-b3-config.yml
./mongod -f /mongodb/mongod-c3-config.yml
./mongod -f /mongodb/mongod-configserver3.yml

创建replicat set

# 登录到192.168.3.73

./mongo 127.0.0.1:28111/admin

> use admin
switched to db admin

# 初始化fang-s-a的副本集
> rs.initiate()
{
        "info2" : "no configuration specified. Using a default configuration for the set",
        "me" : "73.dooioo.org:28111",
        "ok" : 1
}

# 添加到副本集
fang-s-a:OTHER> rs.add("74.dooioo.org:28111")
{ "ok" : 1 }
fang-s-a:PRIMARY> rs.add("75.dooioo.org:28111")
{ "ok" : 1 }

# 看下副本集配置情况
fang-s-a:PRIMARY> rs.conf()
{
        "_id" : "fang-s-a",
        "version" : 3,
        "protocolVersion" : NumberLong(1),
        "members" : [
                {
                        "_id" : 0,
                        "host" : "73.dooioo.org:28111",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 1,
                        "host" : "74.dooioo.org:28111",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 2,
                        "host" : "75.dooioo.org:28111",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("57c00e2b9f6b9f6453c488c3")
        }
}

可以自行插入记录看看同步效果

# 登录到192.168.3.74  初始化fang-s-b 添加副本集
./mongo 127.0.0.1:28112/admin
rs.initiate()
rs.add("73.dooioo.org:28112")
rs.add("75.dooioo.org:28112")

# 登录到192.168.3.75  初始化fang-s-c 添加副本集
./mongo 127.0.0.1:28113/admin
rs.initiate()
rs.add("73.dooioo.org:28113")
rs.add("74.dooioo.org:28113")

# 登录到192.168.3.74  初始化fang-cs添加副本集
./mongo 127.0.0.1:28200/admin
rs.initiate()
rs.add("74.dooioo.org:28200")
rs.add("75.dooioo.org:28200")

添加分片集群

# 登录到192.168.3.73
cd /root/mongodb-linux-x86_64-rhel62-3.2.9/bin
./mongos --port 28300 --configdb fang-cs/73.dooioo.org:28200,74.dooioo.org:28200,75.dooioo.org:28200 --fork --logpath /home/log/mongodb/mongos.log --bind_ip 0.0.0.0

通过mongos来登录

# 登录到192.168.3.73
cd /root/mongodb-linux-x86_64-rhel62-3.2.9/bin
./mongo 127.0.0.1:28300/admin

mongos> use admin
switched to db admin
mongos> sh.addShard("fang-s-a/73.dooioo.org:28111,74.dooioo.org:28111,75.dooioo.org:28111")
{ "shardAdded" : "fang-s-a", "ok" : 1 }
mongos> sh.addShard("fang-s-b/73.dooioo.org:28112,74.dooioo.org:28112,75.dooioo.org:28112")
{ "shardAdded" : "fang-s-b", "ok" : 1 }
mongos> sh.addShard("fang-s-c/73.dooioo.org:28113,74.dooioo.org:28113,75.dooioo.org:28113")
{ "shardAdded" : "fang-s-c", "ok" : 1 }
mongos> 

没有安全认证的集群就搭建好了,下面是关于安全认证的。

建立安全

秘钥文件keyfile

生成秘钥文件

openssl rand -base64 755 > /mongodb/keyfile
chmod 400 /mongodb/keyfile
scp keyfile root@192.168.3.74:/mongodb/
scp keyfile root@192.168.3.75:/mongodb/

创建用户,登录到一个mongos实例,为集群创建root用户

db.createUser({user: "root******",pwd: "**************",roles: [ "root", "userAdminAnyDatabase", "userAdmin", "dbOwner" ]})

所有实例全部停止,使用

 ./mongod -f /mongodb/mongod-a1-config.yml --shutdown

mongod实例启动添加参数 --keyFile /mongodb/keyfile --auth

启动时可以不使用 --auth参数,因为使用了 --keyFile就必须验证,也就是隐含了 --auth。但是--auth并不隐含 --keyFile。

测试,iostat,观察使用情况

例如,以下命令会每隔一秒展示额外的统计数据和每次展示报表的时间(以MB/s为流量单位):

iostat -xmt 1

Key fields from iostat:

%util: 这对快速查看来说是最有用的字段,它指明了设备/驱动器使用时间的百分比。
avgrq-sz:平均请求大小。该值较小的数字反映了更多的随机IO操作。

核武MongoDB Ops Manager

下面介绍下核武MongoDB Ops Manager。

安装

机器同上(CentOS release 6.6)。官方推荐要求15 GB memory and 50 GB disk space。df -h校验。测试用,少一些没关系。这里测试机器30G硬盘空间,4G内存。需要有root账号。首先安装一个mongod实例,作为ops的db。到官网上下载Ops Manager包,我这里下载的是mongodb-mms-2.0.5.358-1.x86_64.rpm。

执行

sudo rpm -ivh mongodb-mms-2.0.5.358-1.x86_64.rpm

sudo service mongodb-mms start

配置文件位置/opt/mongodb/mms/conf/conf-mms.properties
默认访问8080端口,http://192.168.3.81:8080/.

账号配置

略,比如修改时区为北京时间。

新的部署

登录,可以选择部署新的集群和,管理手动创建的集群

这里写图片描述

选择Build New Deployment Where would you like to deploy MongoDB?
选择 Deployment in other remote. What type of MongoDB deployment would you like to build?
选择 Sharded Cluster Provide details for your sharded cluster 规划你的集群配置
Cluster Name : mdb-test-cluster Shard Count : 4 Nodes Per Shard : 3 Shard Name Prefix : mdb-test Data Directory Prefix : /data Install an Automation Agent on each server. 在每个服务器安装自动代理服务。 默认需要12个服务器,因为 4* 3,这里服务器少,选择4台服务器。
选择下载安装配置代理服务器: 基本是一步一步手把手了,

下载代理包

curl -OL http://192.168.3.81:8080/download/agent/automation/mongodb-mms-automation-agent-manager-2.5.19.1732-1.x86_64.rpm

安装代理包

sudo rpm -U mongodb-mms-automation-agent-manager-2.5.19.1732-1.x86_64.rpm

打开配置文件,编辑配置,数据库指定了目录的,必须创建目录。

sudo vi /etc/mongodb-mms/automation-agent.config
mmsGroupId=57be67ffe4b09e1dfa498ee7
mmsApiKey=e5b83213955c886d0ef8ce3324cf8f30
mmsBaseUrl=http://192.168.3.81:8080


sudo mkdir -p /data
sudo chown mongod:mongod /data

sudo service mongodb-mms-automation-agent start

验证通过后,下一步。初始了默认的一些实例:

这里写图片描述

你也可以移动。先按默认的下一步。

然后提示: We are deploying your changes. This might take a few minutes…