Mongo配置主从,副本集,分片

Mongo配置

      Mongo在2010年NoSQL浪潮掀起的过程中脱颖而出,较关系型数据库而言,它将表间的关系去除掉,保留了繁多的数据类型,而且将消除了表关系的劣势转化为数据结构的可扩展性,这是它之所以流行的一大特色。

      从负载的角度来说,Mongo拥有主从=>副本集=>分片的水平扩展能力,自带监控组件、备份及恢复的能力。mongo也有自己的事物,控制在collection级别,默认使用读写锁,读锁和读锁不排斥,读锁和写锁排斥。遇到实时性不强又需要深度计算的数据有可以使用自带的MapReduce能力,包含了geo的整套算法组件。

      总之,如果你的项目是新应用,需求会变,数据模型无法确定,想快速迭代开发,没有佷强的数据关联性,应用需要TB甚至 PB 级别数据存储,应用发展迅速,需要能快速水平扩展,应用需要大量的地理位置查询、文本查询。Mongo很可能会让你爱不释手

图片

      下面,我们一起来认识Mongo

Mongo安装

      笔者用的是Cent OS,如需其它系统配置,请移步:https://docs.mongodb.com/manual/installation/

  1. 配置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
  1. 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 argPID File 的完整路径,如果没有设置,则没有PID文件
–keyFile arg集群的私钥的完整路径,只对于Replica Set 架构有效
–unixSocketPrefix argUNIX域套接字替代目录,(默认为 /tmp)
–fork以守护进程的方式运行MongoDB,创建服务器进程
–auth启用验证
–cpu定期显示CPU的CPU利用率和iowait
–dbpath arg指定数据库路径
–diaglog argdiaglog选项 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 argnumber 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

在这里插入图片描述

  • 启动服务

    1. 在192.168.116.131启动主服务
mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --master --auth
  1. 在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

在这里插入图片描述

  • 配置副本集

    1. 副本集通过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/

  1. 启动各服务,在三台服务器中执行

[yanfa@localhost ~]$ mongod --port 27017 --dbpath /opt/mongo/data --logpath /opt/mongo/log/mongo.log --replSet blort1

  1. 在任意一台服务器中执行

[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"}
]})

  1. 关闭所有mongo服务,在三台服务器中执行

[yanfa@localhost ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()

  1. 启动副本集,在三台服务器中执行

[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

在这里插入图片描述

  • 配置分片

    1. 端口约定

      mongos为 20000, config server 为 21000, shard1为 22000 , shard2为22001, shard3为22002

    2. 配置服务器启动,在三台服务器分别执行


[yanfa@localhost ~]$ mongod --configsvr --port 21000 --dbpath /opt/mongo/data_conf/data --logpath /opt/mongo/data_conf/log/config.log --replSet confblort --fork 

  1. 配置服务器副本集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"}
]})

  1. 通过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/

  1. 配置服务器重启开启认证,在三台服务器分别执行

[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

  1. 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

  1. 副本集启动,在三台服务器分别执行

[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

  1. 副本集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}]})

  1. 关闭所有副本集服务,在三台服务器中执行

[yanfa@localhost ~]$ mongo --port 27017
[mongo-cli] $ db.shutdownServer()

  1. 副本集重启开启认证,在三台服务器中执行

[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

  1. 添加副本集到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")

  1. 指定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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值