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

在这里插入图片描述

  • 启动服务

    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 [email protected]:/opt/mongo/
[yanfa@localhost ~]$ scp /opt/mongo/keyfile [email protected]:/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 [email protected]:/opt/mongo/
[yanfa@localhost ~]$ scp /opt/mongo/keyfile [email protected]:/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

猜你喜欢

转载自blog.csdn.net/weixin_37481769/article/details/84840032