-_-以前可视化编辑器的太丑了,因此删了原来的,拿markdown重写了一遍mongodb
本文讲述如何搭建最简单的1主2从的mongo复制集 以及 如何进行复制集的认证shell
关于什么是mongo复制集和大多数原则的理论知识就不讲了,这里只讲部署上的完整步骤及每一步的细节json
我给的示例是所有的主从结点都放在了本机上,固然生产环境下建议把每一个结点放到独立的机子上面
而且一般状况下,生产环境下的一个复制集每每是集群中的一个分片数组
环境版本 : 3.2.4markdown
复制集的架构为1个主结点,2个从结点 三个结点都部署在本地(固然主机充足的话,你也能够部署在不一样机子上) 主结点的端口号为28001,从结点的端口号为28002和28003
port=28001 该结点的端口号 bind_ip=127.0.0.1 该结点的绑定ip dbpath=/home/seven/program/mongodb/data/db28001/ 该结点的数据目录(绝对路径) logpath=/home/seven/program/mongodb/log/28001.log 该结点的日志文件路径(绝对路径) pidfilepath=/home/seven/program/mongodb/data/db28001/28001.pid 该结点的pid文件路径(绝对路径) logappend=true 日志是不是追加方式(建议开启) fork=true 是否之后台进程方式运行(建议开启) replSet=warringstates 复制集的名称(同一个复制集下的主从结点的该值应相同) profile=1 只在操做时间超过slowms时,才记录慢日志 profile=0表示永不记录,profile=1表示只记录慢日志,profile=2表示全部日志都记录 slowms=100 慢日志的时间阀值是100ms 另外,这两项配置推荐在全部结点上都进行配置 而且能够经过db.getProfilingStatus()这条命令来查看慢日志的配置信息 其实,不推荐经过配置文件的方式强制开启慢日志 相反,推荐使用db.setProfilingLevel(int)的方式动态调整profile的等级 由于,慢日志一般用在内测时候,真正上线后为了性能,是不会开启慢日志的,或者说是不会长期开着的 通常是每隔一段时间,动态地开启一段时间来获取线上测试状况
和 28001.conf 类似 修改 : 端口,IP,数据目录,日志目录,pid目录
init.sh :架构
禁用hugepage,不然启动mongod进程的时候会有warning 另外这个脚本要以root方式运行,因此权限最好设置为700,所属组设置为root:root echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
mongo28001.sh : 启动结点28001的mongod进程的脚本,这个脚本最好不要以root身份运行app
cd /home/seven/program/mongodb/bin 进入mongo的bin目录 ./mongod -f ../conf/28001.conf 启动mongod实例,-f后面跟上该结点的配置文件的路径 "../conf/28001.conf"是一个相对路径,即上面的28001.conf这个配置文件的路径
mongo28002.sh : 启动结点28002的mongod进程的脚本,这个脚本最好不要以root身份运行编辑器
cd /home/seven/program/mongodb/bin 进入mongo的bin目录 ./mongod -f ../conf/28002.conf 启动mongod实例,-f后面跟上该结点的配置文件的路径 "../conf/28002.conf"是一个相对路径,即上面的28002.conf这个配置文件的路径
mongo28003.sh : 启动结点28003的mongod进程的脚本,这个脚本最好不要以root身份运行性能
cd /home/seven/program/mongodb/bin 进入mongo的bin目录 ./mongod -f ../conf/28003.conf 启动mongod实例,-f后面跟上该结点的配置文件的路径 "../conf/28003.conf"是一个相对路径,即上面的28003.conf这个配置文件的路径
su root 切换为root身份,以便运行init.sh脚原本禁用hugepage ./init.sh 禁用hugepage,(固然这里你须要进到你本身机子上存放该脚本的目录) exit 退出root身份,以便启动mongod实例 ./mongo28001.sh 启动结点28001进程(固然这里你须要进到你本身机子上存放该脚本的目录) ./mongo28002.sh 启动结点28002进程(固然这里你须要进到你本身机子上存放该脚本的目录) ./mongo28003.sh 启动结点28003进程(固然这里你须要进到你本身机子上存放该脚本的目录)
mongo 127.0.0.1:28001/admin 进入结点28001(其实随便进哪一个结点都行)的shell,并指定一开始进入admin库 rs.status() 查看复制集状态 发现返回值是相似"run rs.initiate(...) if not yet done for the set" 说明还须要手动地初始化复制集 config = { _id : "warringstates", members : [ { _id : 0, host : "127.0.0.1:28001" }, { _id : 1, host : "127.0.0.1:28002" }, { _id : 2, host : "127.0.0.1:28003" } ] } 建立复制集配置对象,其中id=warringstates是表示复制集的名称 且应该和配置文件中的一致 以后的一个数组中的每个json对象都表示一个结点的id和地址和端口 rs.initiate(config) 使刚才的配置对象生效 过一会,敲回车键,会发现当前shell的提示符变成了"warringstates:PRIMARY>", 或者先变成"warringstates:SECONDARY"后变成"warringstates:PRIMARY", 则表示复制集初始化成功 rs.status() 再次查看复制集的状态,会发现多了不少内容 rs.conf() 查看复制集的配置
use mydb 在主结点上建立名为mydb的库 它只是进入,并不会真的当即建立库 只有在真正有数据的时候,才会建立库 db.students.insert({"name":"lvyang","age":20}) 在主结点上的mydb库中的students集合中插入一条数据 db.students.insert({"name":"shangyang","age":44}) 在主结点上的mydb库中的students集合中插入一条数据 db.students.insert({"name":"yingji","age":72}) 在主结点上的mydb库中的students集合中插入一条数据 show tables 查看主结点上的当前库下的集合列表 db.students.find() 查看主结点上的当前库下的students集合中的全部数据
use mydb 在从结点上进入mydb库 show tables 在从结点上查看mydb下的集合列表。发现报错,提示未开启slaveOk rs.slaveOk(true) 开启从结点的slaveOk,每次想要进到从结点的shell里查看数据,都要开启slaveOk db.students.find() 在从结点上查看mydb库下的students集合里的数据,此时可以查到数据了
openssl rand -base64 64 > keyfile.dat 生成64字节的密钥文件 chmod 600 keyfile.dat 建议把密钥文件的权限设置为600(针对启动mongo实例的那个用户) 接着须要把这个密钥文件拷贝到每一个复制集结点上(包括主结点和从结点)
mongo 127.0.0.1:28001/admin 进入主结点(我这里此时28001是主结点)的admin库 你可能配的时候28001不是主结点,请进你的主结点 注 : 主结点在任一时刻是惟一的,可是是可变的,即随着时间推移,可能换了一个结点成了主结点 db.createUser( { user : your username of this admin库, pwd : your password, roles : [ { role : "root", db : "admin" } ] } ) 建立admin库的用户(身份为全部库的用户的管理者) use 新库 进入你以前建立的新库 db.createUser( { user : your username of this 新库, pwd : your password, roles : [ { role : "dbOwner", db : 此库 } ] } ) 建立这个库的用户(身份为此库的拥有者) 注意,只须要在主结点上建立这两个用户 因为复制集的关系,每一个从结点会自动建立这两个相同的用户
keyFile=path/keyfile.dat 在每一个结点(主结点,从结点)的配置文件中加入keyFile的配置项 auth=true 在每一个结点(主结点,从结点)的配置文件中加入auth=true的配置项 db.shutdownServer() 关闭原先的集群 注意,最好按照 从结点 -> 主结点 的顺序,依次关闭各结点的进程 在关闭某个进程时,须要先进入admin库,而后执行这条命令 从新启动集群,命令同第五步
mongo 127.0.0.1:28001/admin 进入主结点(我这里是28001,你可能主结点不是28001,由于主结点时刻可能变化)的admin库 show users 查看admin库中的用户 发现查到了用户,说明复制集环境下,查用户是不须要认证的 show collections 查看admin库中的集合列表 发现报错,提示未进行认证,说明查集合和查数据之类的操做,是须要认证的 db.auth(admin库的用户,此用户的密码) 进行认证 show collections 再次查看admin库下的集合列表,此次成功了 use 新库 进入你以前建立的那个新库 db.auth(该库的用户,此用户的密码) 进行认证 show collections 查看这个库下的集合列表 db.某集合.find() 查看该库下的某个集合中的数据
mongo 127.0.0.1:28002/admin 进入从结点28002的admin库 固然你也能够进入28003这个从结点 db.auth(admin库的用户,该用户的密码) 进行认证 use 新库 切换到你以前建立的那个新库中 db.auth(该库的用户,该用户的密码) 进行认证 show collections 查看该库下的集合列表 发现报错,咦,明明认证成功了,为什么会如此 ? 记起来了吧,从结点上查数据,须要 rs.slaveOk这条命令 rs.slaveOk(true) 容许该从结点读数据 show collections 再次查看该库下的集合列表,此次成功了