在大数据的时代,传统的关系型数据库要提供更高的服务必须要解决高并发读写、海量数据高效存储、高可扩展性和高可用性这些难题。不过就是因为这些问题Nosql诞生了。
NOSQL有这些优势:
●大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制。
●高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病。
●高性能,Nosql通过简单的key-value方式获取数据,非常快速。还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多。
灵活的数据模型,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
●高可用,NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如mongodb通过mongos、mongo分片就可以快速配置出高可用配置。
●在nosql数据库里,大部分的查询都是键值对(key、value)的方式。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的。支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。所以这个非常方便,我们可以用sql操作MongoDB,从关系型数据库迁移过来,开发人员学习成本会大大减少。如果再对底层的sql API做一层封装,开发基本可以感觉不到mongodb和关系型数据库的区别。
[root@localhost ~]# tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/ ##解压工具
[root@localhost ~]# cd /opt/
[root@localhost opt]# mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb ##将工具配置到/usr/local目录下
[root@localhost opt]# cd /usr/local/mongodb
[root@localhost mongodb]# ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo ##将命令文件建立软链接
[root@localhost mongodb]# ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
[root@localhost mongodb]# mkdir -p /data/mongodb/mongodb{
1,2,3,4} ##创建数据目录
[root@localhost mongodb]# cd /data/mongodb/
[root@localhost mongodb]# ls
mongodb1 mongodb2 mongodb3 mongodb4
[root@localhost mongodb]# mkdir logs ##创建日志
[root@localhost mongodb]# cd logs
[root@localhost logs]# touch /data/mongodb/logs/mongodb{
1,2,3,4}.log ####创建数据日志文件
[root@localhost logs]# chmod 777 *.log ##增加权限
[root@localhost logs]# ls
mongodb1.log mongodb2.log mongodb3.log mongodb4.log
[root@localhost logs]# ulimit -u 25000 ##做下优化
[root@localhost logs]# ulimit -u 25000
[root@localhost logs]# cd /usr/local/bin/
[root@localhost bin]# ls
[root@localhost bin]# vim mongodb1.conf
port=37017
dbpath=/data/mongodb/mongodb1
logpath=/data/mongodb/logs/mongodb1.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
configsvr=true
某节点内存不足时,从其他节点分配内存
[root@localhost bin]# sysctl -w vm.zone_reclaim_mode=0
vm.zone_reclaim_mode = 0
[root@localhost bin]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost bin]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
[root@localhost bin]# mongod -f mongodb1.conf
about to fork child process, waiting until server is ready for connections.
forked process: 11180
child process started successfully, parent exiting
分片服务器配置
[root@localhost bin]# cp -p mongodb1.conf mongodb2.conf
[root@localhost bin]# vim mongodb2.conf
[root@localhost bin]# cp -p mongodb2.conf mongodb3.conf
[root@localhost bin]# vim mongodb3.conf
[root@localhost bin]# mongod -f mongodb2.conf ##将服务启动
[root@localhost bin]# mongod -f mongodb3.conf ##将服务启动
配置路由服务器
指定对方连接入口,只要访问27017,就会把处理交给37017去处理,指定数据块
[root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.148.134:37017 --chunkSize 1
添加分片服务器
1.先查看受否添加了分片服务器
[root@localhost bin]# mongo
mongos> show dbs
config 0.031GB
mongos> sh.status() ##查看分片服务器
mongos> sh.addShard("192.168.148.134:37018") ##添加分片37018
{
"shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.148.134:37019") ####添加分片37019
{
"shardAdded" : "shard0001", "ok" : 1 }
3.分片功能
mongos> use test ##创建一个test库
switched to db test
mongos> db.users.insert({
"id":1,"name":"zhangsan"}) ##写入数据
WriteResult({
"nInserted" : 1 })
mongos> show dbs
config 0.031GB
test 0.078GB
mongos> sh.enableSharding("test") ##开启分片管理
{
"ok" : 1 }
mongos> sh.status()
mongos> db.users.createIndex({
"id":1}) ##建立索引
mongos> sh.shardCollection("test.users",{
"id":1}) ##建立表分片
{
"collectionsharded" : "test.users", "ok" : 1 }
分片管理
1.创建集合,写入5000条信息
mongos> use test
mongos> for(var i=1;i<=5000;i++)db.users2.insert({
"id":i,"name":"tom"+i})
WriteResult({
"nInserted" : 1 }) ##写入5000条信息
mongos> db.users2.count() ##统计信息数量
5000
mongos>
mongos> db.users2.createIndex({
"id":1}) ##给users2创建索引
mongos> sh.shardCollection("test.users2",{
"id":1}) ##users2建立表分片
2.给目标添加标签
mongos> sh.addShardTag("shard0000","abc00")
3.连接配置服务器
[root@localhost bin]# mongo --port 37017
configsvr> use config
configsvr> show tables
configsvr> db.databases.find() ##查看数据库是否被分片
{
"_id" : "test", "primary" : "shard0000", "partitioned" : true }
configsvr> db.collections.find() ##查看分片
{
"_id" : "test.users", "lastmodEpoch" : ObjectId("5f5c7cba52ab4dc5c493c260"), "lastmod" : ISODate("1970-02-19T17:02:47.296Z"), "dropped" : false, "key" : {
"id" : 1 }, "unique" : false }
{
"_id" : "test.users2", "lastmodEpoch" : ObjectId("5f5c7f3a52ab4dc5c493c2e2"), "lastmod" : ISODate("1970-02-19T17:02:47.296Z"), "dropped" : false, "key" : {
"id" : 1 }, "unique" : false }
configsvr> db.chunks.find() ##查询数据块
创建一个mongodb4实例
[root@localhost bin]# cd /usr/local/mongodb/bin/
[root@localhost bin]# cp -p mongodb3.conf mongodb4.conf
[root@localhost bin]# vim mongodb4.conf
[root@localhost bin]# mongod -f mongodb4.conf
[root@localhost bin]# mongo
mongos> sh.addShard("192.168.148.134:37020") ##将37020添加到分片管理
{
"shardAdded" : "shard0002", "ok" : 1 }
mongos> sh.status() ##查看状态
mongos> use admin
switched to db admin
mongos> db.runCommand({
"removeshard":"192.168.148.134:37020"})