手把手搭建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/.
账号配置
略,比如修改时区为北京时间。
新的部署
登录,可以选择部署新的集群和,管理手动创建的集群
选择 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…