我在AWS EC2上测试了MongoDB Sharding
为了进行AWS上MongoDB分片的测试,
租借了6台t2.medium的EC2实例进行实验。只有一台服务器使用弹性IP,
其他服务器通过代理转发进行登录。每台服务器的容量为8GB,
虽然使用了6台服务器,但仅为了实验目的而言,
借租一台樱花云的服务器可能更经济实惠。
在MongoDB的分片复制架构中,
据说配置服务器需要独立于分片服务器,需要三个配置服务器,
所以我们选择了在AWS上租用多个服务器。
由於每個AWS只有8GB的記憶體,所以只有在實驗情況下才能將conf的journal設定為false來禁用預設的journal日誌,以節省約3.5GB的空間。
请参阅以下链接:http://qiita.com/daisuke-3/items/d7e56e8ad788d7150090
然而,如果将journal设置为false,在正常停止时(如停止aws实例而不停止mongodb),数据可能会损坏,为了避免以后麻烦事情的发生,即使在测试阶段,也应该判断journal应该保持启用状态。
请参考此链接查看详细信息:http://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/
学习主题
使用service命令在相同服务器不同端口启动MongoDB。
使用service命令会显示“/usr/bin/mongod already running.”,无法成功执行。
因此,只能使用以下操作:
使用”/usr/bin/mongod -f /etc/mongod_sh*”进行启动。
使用kill -KILL PID进行停止。
通过db.shutdownServer()停止。
架构

aws1(弹性 IP)…分片1
aws2…分片2
aws3…分片3
aws4…前端,配置1
aws5…前端,配置2
aws6…前端,配置3
在 AWS1 上删除 SH2 和 SH3 后,使用 df -h 命令查看容量没有变化,
因此重新安装了 MongoDB,但容量显示仍然没有变化,然后将日志设置为 true 并启动 SH1。
容量显示仍然没有变化,实际上有空余空间,但显示上存在问题。
步骤
在AWS1、AWS2和AWS3上分别创建SH1、SH2和SH3。
在AWS4上创建FRONT和CONFIG1。
将CONFIG1复制到AWS5和AWS6作为CONFIG2和CONFIG3
(停止正在运行的SHARD、FRONT和CONFIG)。
将现有的配置服务器中的整个dbPath文件系统树复制到将提供额外配置服务器的两台机器上。
创建/etc/init.d/mongod_sh1时,请注意权限。执行权限为chmod +x mongod_sh1。
首先,无需进行认证设置即可启动。
启动后,添加admin用户。
使用admin账户登录。
db.addUser(‘root’,’password’)
退出。
然后,停止mongod_sh1服务。
接着,添加认证设置。启动mongod_sh1服务。
使用admin账户登录。
通过db.auth(‘root’,’password’)进行认证。
认证设置的mongodb.keyfile文件是什么。
openssl rand -base64 753 | sudo tee /etc/mongodb.keyfile
请注意权限。
chown mongodb:mongodb mongodb.keyfile
chmod 400 mongodb.keyfile
为确保在使用相同的密钥文件时保持一致,请使用相同的密钥文件。
设置文件
mongod_sh1 的 /etc/init.d/ 文件
默认情况下,mongod会被符号链接到/lib/init/upstart-job,但这个upstart-job似乎已被弃用,因此需要使用旧版SysV init的设置方法进行配置。
请点击此链接获取详细信息:http://blog.livedoor.jp/hack_le/archives/25394608.html。
#!/bin/sh
### BEGIN INIT INFO
# Provides: mongod_sh1
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts mongod_sh1 (a rails app)
# Description: starts mongod_sh1 (a rails app) using start-stop-daemon
### END INIT INFO
USER=mongodb
PID_FILE="/var/run/mongodb/mongod_sh1.pid"
CMD="/usr/bin/mongod"
ARGS="-f /etc/mongod_sh1.conf"
. /lib/lsb/init-functions
case $1 in
start)
start-stop-daemon --start --chuid $USER --exec $CMD -- $ARGS || true
;;
stop)
start-stop-daemon --stop --signal TERM --pidfile $PID_FILE || true
;;
status)
status_of_proc -p $PID_FILE "$CMD" mongod && exit 0 || exit $?
;;
*)
echo >&2 "Usage: $0 "
exit 1
;;
esac
mongod_sh1.conf 蒙戈德_平衡1配置文件
systemLog:
destination: file
path: "/var/log/mongodb/mongod_sh1.log"
quiet: true
logAppend: true
storage:
dbPath: "/var/lib/mongod_sh1"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/var/run/mongodb/mongod_sh1.pid"
net:
bindIp: aws1
port: 27017
#replication:
# replSetName: sh1
sharding:
clusterRole: shardsvr
security:
authorization: enabled
keyFile: /etc/mongodb.keyfile
将登录过程脚本化
创建bin目录。
在该目录下以vim mongo_sh1的形式,写入执行命令,以简化命令输入处理。
可以通过./mongo_sh1来执行。要注意权限chmod +x mongo_sh1。
#!/bin/sh
/usr/bin/mongo aws1:27017/admin
※为了实验目的,chunkSize设置为1。
systemLog:
destination: file
path: "/var/log/mongodb/mongod_front.log"
quiet: true
logAppend: true
processManagement:
fork: true
pidFilePath: "/var/run/mongodb/mongod_front.pid"
net:
bindIp: aws4
port: 20000
sharding:
configDB: aws4:20001,aws5:20001,aws6:20001
chunkSize: 1
security:
keyFile: /etc/mongodb.keyfile
配置文件 conf
systemLog:
destination: file
path: "/var/log/mongodb/mongod_conf1.log"
quiet: true
logAppend: true
storage:
dbPath: "/var/lib/mongod_conf1"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/var/run/mongodb/mongod_conf1.pid"
net:
bindIp: aws4
port: 20001
security:
authorization: enabled
keyFile: /etc/mongodb.keyfile
不使用 127.0.0.1,而是使用 localhost。
將 bindIP 全部設置為主機名,問題解決了。
AWS默认情况下不允许ping。
通过安全组解锁ICMP。
关于绑定IP
从文件中提取的信息:
net.bindIp
类型:字符串
默认值:所有接口
在2.6.0版本更改:deb和rpm软件包包含了一个设置net.bindIp为127.0.0.1的默认配置文件。
指定mongos或mongod绑定的IP地址,以便监听来自应用程序的连接。您可以将mongos或mongod附加到任何接口上。当将mongos或mongod附加到公共可访问的接口时,请确保已实施适当的身份验证和防火墙限制以保护数据库的完整性。
由于无法连接到aws123-4的网络,请进行网络配置。
如果在相同的区域内,除了安全组外,没有其他地方可以允许流量的设置位置。
问题
当再启动后,出现了mongodb目录下的mongo.pid进程文件消失的问题。这是因为它被写入了RAM中的Ubuntu tmpfs功能造成的,而不是AWS的问题,而是Ubuntu方面的问题。
配置服务器
在测试环境下,config-server必须使用1个,而在生产环境下,必须使用3个。此外,config-server必须使用与shard-server不同的服务器。当3个config-server停止运行时,mongos不应该重新启动,直到config-server重新启动。备份config-server非常简单。如果使用CNAME来连接config-server和cluser,并且想要进行重命名或重新编号,那么必须重新启动所有的mongod和mongos。
更改设置后,将按照mongod -> mongoc -> mongos的顺序启动。
增加碎片服务器
mongos> sh.addShard("aws1:27017")
mongos> sh.addShard("aws2:27017")
mongos> sh.addShard("aws3:27017")
mongos> sh.status()
追加されているか確認。
我来试一试
参考链接:http://gihyo.jp/dev/serial/01/mongodb/0006?page=2
课题
如果存在多个前端服务器,当一个前端服务器登录时,其他服务器的前端似乎无法启动。这是关于ReplicaSet的问题吧…
关于MongoDB的笔记
来自此处(http://www.slideshare.net/akuwano/cyberagentmongodb)的摘录。
系统架构
-
- スキーマレス
-
- 機能追加等が比較的楽。
-
- 冗長化(ReplicaSet)
-
- 相互死活監視&投票により冗長性を保つ。最小単位は3台(プライマリ、セカンダリx2)
-
- スケーラビリティ(Sharding)
- データをChunkサイズに分割することで各サーバーの負荷分散を行う。
引以自喜之物
-
- データ量が大きすぎない。
-
- 書き込みが多過ぎでない。
-
- 単位時間あたりの処理データが各シャードのメモリ量を超えない処理は得意。
-
- 得意なユースケース
ゲーム系webアプリケーション
一時的ログ解析基盤
不擅长的东西
-
- ほっとデータが無い様なデータの使い方は苦手
データ量が爆発的に増える
常に全データへのアクセスを行うような
苦手なユースケース
ソーシャル系等のWebアプリケーション
継続的 or 統合的 なログ解析基盤