Mongo配置
Mongo在2010年NoSQL浪潮掀起的过程中脱颖而出,较关系型数据库而言,它将表间的关系去除掉,保留了繁多的数据类型,而且将消除了表关系的劣势转化为数据结构的可扩展性,这是它之所以流行的一大特色。
从负载的角度来说,Mongo拥有主从=>副本集=>分片的水平扩展能力,自带监控组件、备份及恢复的能力。mongo也有自己的事物,控制在collection级别,默认使用读写锁,读锁和读锁不排斥,读锁和写锁排斥。遇到实时性不强又需要深度计算的数据有可以使用自带的MapReduce能力,包含了geo的整套算法组件。
总之,如果你的项目是新应用,需求会变,数据模型无法确定,想快速迭代开发,没有佷强的数据关联性,应用需要TB甚至 PB 级别数据存储,应用发展迅速,需要能快速水平扩展,应用需要大量的地理位置查询、文本查询。Mongo很可能会让你爱不释手
下面,我们一起来认识Mongo
Mongo安装
笔者用的是Cent OS,如需其它系统配置,请移步:https://docs.mongodb.com/manual/installation/
- 配置yum
[yanfa@localhost ~]$ echo '
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
' > /etc/yum.repos.d/mongodb-org-4.0.repo
- Install packages
[yanfa@localhost ~]$ sudo yum install -y mongodb-org
[yanfa@localhost ~]$ sudo yum install -y mongodb-org-4.0.4 mongodb-org-server-4.0.4 mongodb-org-shell-4.0.4 mongodb-org-mongos-4.0.4 mongodb-org-tools-4.0.4
[yanfa@localhost ~]$ echo 'exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools' >> /etc/yum.conf
Mongo配置
一个配置文件mongod.conf及mongod命令,mongod.conf中的配置我们尽可能简单,所有的关键配置在mongod启动时指定。装好mongo服务后找到mongod.conf文件,按以下修改
- mongod.conf
[yanfa@localhost ~]$ echo '
storage:
dbPath: /opt/mongo/data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /opt/mongo/log/mongod.log
net:
port: 27017
http:
enabled: true #启动web管理页面
RESTInterfaceEnabled: false #启动web管理页面
replication:
replSetName: blort
' > ./mongod.conf
- mongod命令
[yanfa@localhost ~]$ mongod --port 20000 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --fork
现在已启动了一个mongo服务,读者可通过:http://yourip:27017 访问mongo web管理页面
-
mongod命令详解
在开始主从 => 副本集 => 分片前先理解一下mongod的一些关键参数,下面的会用到,以下参数都可以引入 mongod.conf 配置文档里
参数 | 说明 |
---|---|
–quiet | 指定服务端口号,默认端口27017 |
–port arg | 指定服务端口号,默认端口27017 |
–bind_ip arg | 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP |
–logpath arg | 指定MongoDB日志文件,注意是指定文件不是目录 |
–logappend | 使用追加的方式写日志 |
–pidfilepath arg | PID File 的完整路径,如果没有设置,则没有PID文件 |
–keyFile arg | 集群的私钥的完整路径,只对于Replica Set 架构有效 |
–unixSocketPrefix arg | UNIX域套接字替代目录,(默认为 /tmp) |
–fork | 以守护进程的方式运行MongoDB,创建服务器进程 |
–auth | 启用验证 |
–cpu | 定期显示CPU的CPU利用率和iowait |
–dbpath arg | 指定数据库路径 |
–diaglog arg | diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads |
–directoryperdb | 设置每个数据库将被保存在一个单独的目录 |
–journal | 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 |
–journalOptions arg | 启用日志诊断选项 |
–ipv6 | 启用IPv6选项 |
–jsonp | 允许JSONP形式通过HTTP访问(有安全影响) |
–maxConns arg | 最大同时连接数 默认2000 |
–noauth | 不启用验证 |
–nohttpinterface | 关闭http接口,默认关闭27018端口访问 |
–noprealloc | 禁用数据文件预分配(往往影响性能) |
–noscripting | 禁用脚本引擎 |
–notablescan | 不允许表扫描 |
–nounixsocket | 禁用Unix套接字监听 |
–nssize arg (=16) | 设置信数据库.ns文件大小(MB) |
–objcheck | 在收到客户数据,检查的有效性, |
–profile arg | 档案参数 0=off 1=slow, 2=all |
–quota | 限制每个数据库的文件数,设置默认为8 |
–quotaFiles arg | number of files allower per db, requires --quota |
–rest | 开启简单的rest API |
–repair | 修复所有数据库run repair on all dbs |
–repairpath arg | 修复库生成的文件的目录,默认为目录名称dbpath |
–slowms arg (=100) | value of slow for profile and console log |
–smallfiles | 使用较小的默认文件 |
–syncdelay arg (=60) | 数据写入磁盘的时间秒数(0=never,不推荐) |
–sysinfo | 打印一些诊断系统信息 |
–upgrade | 如果需要升级数据库 * Replicaton 参数 |
–fastsync | 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步 |
–autoresync | 如果从库与主库同步数据差得多,自动重新同步, |
–oplogSize arg | 设置oplog的大小(MB) * 主/从参数 |
–master | 主库模式 |
–slave | 从库模式 |
–source arg | 从库 端口号 |
–only arg | 指定单一的数据库复制 |
–slavedelay arg | 设置从库同步主库的延迟时间 * Replica set(副本集)选项: |
–replSet arg | 设置副本集名称 * Sharding(分片)选项 |
–configsvr | 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb |
–shardsvr | 声明这是一个集群的分片,默认端口27018 |
–noMoveParanoia | 关闭偏执为moveChunk数据保存 |
-
服务器介绍
笔者暂且使用3台机器,分别为192.168.116.131,192.168.116.132,192.168.116.133,在配置时尽可能地简单,读者可按照mongod命令详解自行添加
Mongo主从模式
- 在192.168.116.131和192.168.116.132中按照Mongo配置中的步骤安装并配置mongo.conf
-
启动服务
- 在192.168.116.131启动主服务
mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --master --auth
- 在192.168.116.132启动从服务
mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --slave --source 192.168.116.131:27017 --auth
主从服务已启动完成
Mongo单副本集模式
- 在192.168.116.131和192.168.116.132和192.168.116.133中按照Mongo配置中的步骤安装并配置mongo.conf
-
配置副本集
- 副本集通过key文件用来保证各服务的安全,在192.168.116.131服务器中执行
[yanfa@localhost ~]$ sudo openssl rand -base64 90 > /opt/mongo/keyfile
[yanfa@localhost ~]$ scp /opt/mongo/keyfile username@192.168.116.132:/opt/mongo/
[yanfa@localhost ~]$ scp /opt/mongo/keyfile username@192.168.116.133:/opt/mongo/
- 启动各服务,在三台服务器中执行
[yanfa@localhost ~]$ mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --replSet blort1
- 在任意一台服务器中执行
[yanfa@localhost ~]$ mongo --port 27017
[mongo-cli] $ rs.initiate({ "_id":"blort_1", "members":[{ "_id":1, "host":"192.168.116.131:27017" }, { "_id":2, "host":"192.168.116.132:27017" }, { "_id":3, "host":"192.168.116.133:27017","arbiterOnly":true }]})
[mongo-cli] $ db.createUser({
"user":"root",
"pwd":"123456",
"roles":[
{"role":"read","db":"admin"},
{"role":"readWrite","db":"admin"},
{"role":"userAdminAnyDatabase","db":"admin"}
]})
- 关闭所有mongo服务,在三台服务器中执行
[yanfa@localhost ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()
- 启动副本集,在三台服务器中执行
[yanfa@localhost ~]$ mongo --port 27017
[mongo-cli] $ mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --replSet blort1 --keyFile /opt/mongo/keyfile
副本集配置完成,启动成功
Mongo分片模式
- 在192.168.116.131和192.168.116.132和192.168.116.133中按照Mongo配置中的步骤安装并配置mongo.conf
-
配置分片
-
端口约定
mongos为 20000, config server 为 21000, shard1为 22000 , shard2为22001, shard3为22002
-
配置服务器启动,在三台服务器分别执行
-
[yanfa@localhost ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork
- 配置服务器副本集INIT,在192.168.116.131服务器中执行
[yanfa@localhost ~]$ mongo --port 21000
[mongo-cli] $ rs.initiate({ "_id":"confblort", "members":[{ "_id":1, "host":"192.168.116.131:21000" }, { "_id":2, "host":"192.168.116.132:21000" }, { "_id":3, "host":"192.168.116.133:21000"}]})
[mongo-cli] $ db.createUser({
"user":"root",
"pwd":"123456",
"roles":[
{"role":"read","db":"admin"},
{"role":"readWrite","db":"admin"},
{"role":"userAdminAnyDatabase","db":"admin"}
]})
- 通过key文件用来保证各服务的安全,在192.168.116.131服务器中执行
[yanfa@localhost ~]$ sudo openssl rand -base64 90 > /opt/mongo/keyfile
[yanfa@localhost ~]$ scp /opt/mongo/keyfile username@192.168.116.132:/opt/mongo/
[yanfa@localhost ~]$ scp /opt/mongo/keyfile username@192.168.116.133:/opt/mongo/
- 配置服务器重启开启认证,在三台服务器分别执行
[yanfa@localhost ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile
- mongos服务器启动,在三台服务器分别执行
[yanfa@localhost ~]$ mongos --port 20000 --configdb confblort/192.168.116.131:21000,192.168.116.132:21000,192.168.116.133:21000 --logpath /opt/mongo/data_mongos/log/mongos.log --fork --keyFile /opt/mongo/keyfile
- 副本集启动,在三台服务器分别执行
[yanfa@localhost ~]$ mongod --shardsvr --port 22000 --dbpath /opt/mongo/data_shard1/data --logpath /opt/mongo/data_shard1/log/shard.log --replSet shard1 --fork
[yanfa@localhost ~]$ mongod --shardsvr --port 22001 --dbpath /opt/mongo/data_shard2/data --logpath /opt/mongo/data_shard2/log/shard.log --replSet shard2 --fork
[yanfa@localhost ~]$ mongod --shardsvr --port 22002 --dbpath /opt/mongo/data_shard3/data --logpath /opt/mongo/data_shard3/log/shard.log --replSet shard3 --fork
- 副本集INIT,在三台服务器分别执行
[yanfa@localhost ~]$ mongo --port 22000 | 22001 | 22002
[mongo-cli] $ rs.initiate({ "_id":"shard1", "members":[{ "_id":1, "host":"192.168.116.131:22000" }, { "_id":2, "host":"192.168.116.132:22000" }, { "_id":3, "host":"192.168.116.133:22000","arbiterOnly":true}]})
[mongo-cli] $ rs.initiate({ "_id":"shard2", "members":[{ "_id":1, "host":"192.168.116.131:22001" }, { "_id":2, "host":"192.168.116.132:22001" }, { "_id":3, "host":"192.168.116.133:22001","arbiterOnly":true}]})
[mongo-cli] $ rs.initiate({ "_id":"shard3", "members":[{ "_id":1, "host":"192.168.116.131:22002" }, { "_id":2, "host":"192.168.116.132:22002" }, { "_id":3, "host":"192.168.116.133:22002","arbiterOnly":true}]})
- 关闭所有副本集服务,在三台服务器中执行
[yanfa@localhost ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()
- 副本集重启开启认证,在三台服务器中执行
[yanfa@localhost ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile
[yanfa@localhost ~]$ mongod --configsvr --port 21001 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile
[yanfa@localhost ~]$ mongod --configsvr --port 21002 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork --keyFile /opt/mongo/keyfile
- 添加副本集到mongos,在三台服务器中执行,注意分片的端口号要变,22000|22001|22002
[yanfa@localhost ~]$ mongos --port 20000
[mongo-cli] $ sh.addShard("shard1/192.168.116.131:22000,192.168.116.132:22000,192.168.116.133:22000")
-
指定testdb分片生效,指定数据库里需要分片的集合和片键,在三台服务器中执行
注:3.4.10以后的版本:想要分片必须用散列/hash键,避免数据倾斜。numInitialChunks初始化块的数量,默认为shard的数量
[yanfa@localhost ~]$ mongos --port 20000
[mongo-cli] $ db.runCommand( { enablesharding :"test"});
[mongo-cli] $ db.runCommand( { shardcollection : "test.table1",key : {"_id":"hashed"} ,"numInitialChunks":3} )
至此,分片配置完成,启动成功
以下是笔者整理后的Mongo Shell,一目了然,言简意赅,免费供大家使用:
https://github.com/yuzhou152/MongoConfig-Shell.git