MongoDB Replica Set 集群
一、简介:
Mongodb是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key-Value形式。
Mongodb集群搭建有三种方式分别是Replica Set / Sharding / Master-Slaver。这里只说明Replica Set(副本集)集群搭建方式.
Replica Set
简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致,如下图.
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。
二、部署
1.下载mongodb
MongoDB官网下载中心:MongoDB Download Center
mongodb 3.4.10下载地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.10.tgz
2.环境:
环境: 这里副本集(Replica Set)采用一主一备一仲裁模型:
3.. 解压并创建目录
[root@server-1 data]# tar zxvf mongodb-linux-x86_64-rhel70-3.4.10.tgz [root@server-1 data]# mv mongodb-linux-x86_64-rhel70-3.4.10 mongodb //为了方便简洁,改名
同样的,在server-2和server-3上也解压并改名。
[root@server-1 ~]# mkdir -p /data/mongodb/primary //在server-1上建立主数据存放目录 [root@server-1 ~]# mkdir /etc/mongodb/ //即将存放primary的配置文件 [root@server-2 ~]# mkdir -p /data/mongodb/secondary //在server-2上建立从数据存放目录 [root@server-2 ~]# mkdir /etc/mongodb/ //即将存放secondary的配置文件 [root@server-3 ~]# mkdir -p /data/mongodb/arbiter //在server-3上建立仲裁数据存放目录 [root@server-3 ~]# mkdir /etc/mongodb/ //即将存放arbiter的配置文件
4. 新建配置文件
[root@server-1 ~]# vim /etc/mongodb/primary.conf //新建主配置文件,内容如下:
#PRIMARY.CONF dbpath=/data/mongodb/primary //存放数据目录 logpath=/data/mongodb/primary.log //日志数据目录 pidfilepath=/data/mongodb/primary.pid //pid文件 #keyFile=/data/mongodb/mongodb.key //节点间用户认证文件,内容必须一致,权限600,仅副本集模式有效. directoryperdb=true //数据库是否分目录存放 logappend=true //日志追加方式存放 replSet=do1 //Replica Set名字,自己定义即可 bind_ip=192.168.6.42 // port=27017 #auth=true oplogSize=100 //设置oplog的大小,单位MB fork=true //启动到后台,守护进程方式启动 noprealloc=true
集群配置文件:
[root@server-1 ~]# cat /etc/mongodb/primary.conf #PRIMARY.CONF dbpath=/data/mongodb/primary logpath=/data/mongodb/primary.log pidfilepath=/data/mongodb/primary.pid #keyFile=/data/mongodb/mongodb.key directoryperdb=true logappend=true replSet=do1 bind_ip=192.168.6.42 port=27017 #auth=true oplogSize=100 fork=true noprealloc=true [root@server-1 ~]#
[root@server-2 ~]# vim /etc/mongodb/secondary.conf //secondary的配置文件,如下:
[root@server-2 ~]# cat /etc/mongodb/secondary.conf #secondary.CONF dbpath=/data/mongodb/secondary logpath=/data/mongodb/secondary.log pidfilepath=/data/mongodb/secondary.pid #keyFile=/data/mongodb/mongodb.key directoryperdb=true logappend=true replSet=do1 bind_ip=192.168.6.43 port=27017 #auth=true oplogSize=100 fork=true noprealloc=true [root@server-2 ~]#
[root@server-3 ~]# vim /etc/mongodb/arbiter.conf // arbiter的配置文件内容如下
[root@server-3 ~]# cat /etc/mongodb/arbiter.conf #arbiter.CONF dbpath=/data/mongodb/arbiter logpath=/data/mongodb/arbiter.log pidfilepath=/data/mongodb/arbiter.pid #keyFile=/data/mongodb/mongodb.key directoryperdb=true logappend=true replSet=do1 bind_ip=192.168.6.44 port=27017 #auth=true oplogSize=100 fork=true noprealloc=true
5. 启动mongodb服务
[root@server-1 data]# ./mongodb/bin/mongod -f /etc/mongodb/primary.conf //启动主 [root@server-2 data]# ./mongodb/bin/mongod -f /etc/mongodb/secondary.conf //启动从 [root@server-3 data]# ./mongodb/bin/mongod -f /etc/mongodb/arbiter.conf //启动仲裁
如果出现started successfuly,则说明启动成功.
6. 将节点配置组成集群
可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb节点,这里就在server-1操作,会出现一个交互界面:
[root@server-1 data]# ./mongodb/bin/mongo 192.168.6.42:27017 //使用mongo命令登录,格式:mongo IP:PORT
初始化配置:
> use admin; //直接回车 switched to db admin cfg={ _id:"do1",members:[{_id:0,host:'192.168.6.42:27017',priority:2},{_id:1,host:'192.168.6.43:27017',priority:1},{_id:2,host:'192.168.6.44:27017',arbiterOnly:true}] };
使配置生效
> rs.initiate(cfg) //使配置生效
说明:cfg名字可选,只要跟mongodb参数不冲突,_id为Replica Set名字,members里面的优先级priority值高的为主节点,
对于仲裁点一定要加上arbiterOnly:true,否则主备模式不生效。
查看是否生效:rs.status(),集群节点的状态:主节点PRIMARY,副本节点SECONDARY
下面会显示字样:"ok" : 1,表明整个副本集已经搭建成功了。
7、测试副本集数据复制功能
在主节点192.168.6.42 上连接到终端:
cd /data/mongodb/bin ./mongo 192.168.6.42:27017 do1:PRIMARY> use test; //建立test 数据库 switched to db test do1:PRIMARY> db.testdb.insert({"test1":"testval1"}) //往testdb表插入数据 WriteResult({ "nInserted" : 1 }) do1:PRIMARY> show tables; testdb do1:PRIMARY>
在副本节点 192.168.6.43 上连接到mongodb查看数据是否复制过来。
[root@server-2 ~]# cd /data/mongodb/bin/ [root@server-2 bin]# ./mongo 192.168.6.43:27017 MongoDB shell version v3.4.10 connecting to: 192.168.6.43:27017 MongoDB server version: 3.4.10 do1:SECONDARY> do1:SECONDARY> use test; switched to db test do1:SECONDARY> show tables; 2020-02-28T22:24:42.525+0800 E QUERY [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435, "codeName" : "NotMasterNoSlaveOk" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:807:1 DB.prototype.getCollectionInfos@src/mongo/shell/db.js:819:19 DB.prototype.getCollectionNames@src/mongo/shell/db.js:830:16 shellHelper.show@src/mongo/shell/utils.js:774:9 shellHelper@src/mongo/shell/utils.js:671:15 @(shellhelp2):1:1 do1:SECONDARY> db.getMongo().setSlaveOk(); do1:SECONDARY> show tables; testdb do1:SECONDARY>
#mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读,执行如下命令即可 db.getMongo().setSlaveOk();
如果需要配置mongodb集群密码访问认证,则需要修改配置文件及执行如下操作(先创建用户,然后在配置文件开启认证参数auth、keyFile),具体见参考文档:
db.createUser({user:"admin",pwd:"do1@1234",roles:[{role:"root",db:"admin"}]}) db.createUser({user: "admin", pwd: "do1@1234", roles: [{ role: "dbOwner", db: "tiforg" }]}) ./mongo 192.168.6.42:27017 -u "admin" -p "do1@1234" --authenticationDatabase tiforg do1:PRIMARY> use tiforg; switched to db tiforg do1:PRIMARY> do1:PRIMARY> do1:PRIMARY> db.createUser({user: "admin", pwd: "do1@1234", roles: [{ role: "dbOwner", db: "tiforg" }]}) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "dbOwner", "db" : "tiforg" } ] } do1:PRIMARY> 认证: use tiforg db.auth("admin","do1@1234")
使用 db.updateUser 修改用户密码
do1:PRIMARY> use tiforg switched to db tiforg do1:PRIMARY> db.updateUser("admin",{pwd:"do1#1234"}); do1:PRIMARY> exit
常用命令:
show dbs #显示数据库列表 show collections #显示当前数据库中的集合(类似关系数据库中的表) show users #显示用户 use <db name> #切换当前数据库,如果数据库不存在则创建数据库。 db.help() #显示数据库操作命令,里面有很多的命令 db.foo.help() #显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令 db.foo.find() #对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据) db.foo.find( { a : 1 } ) #对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1 db.dropDatabase() #删除当前使用数据库 db.cloneDatabase("127.0.0.1") #将指定机器上的数据库的数据克隆到当前数据库 db.copyDatabase("mydb", "temp", "127.0.0.1") #将本机的mydb的数据复制到temp数据库中 db.repairDatabase() #修复当前数据库 db.getName() #查看当前使用的数据库,也可以直接用db db.stats() #显示当前db状态 db.version() #当前db版本 db.getMongo() #查看当前db的链接机器地址 db.serverStatus() #查看数据库服务器的状态
查看全局所有账户
db.system.users.find().pretty()
参考文档:https://www.cnblogs.com/gaomanito/p/11731658.html
https://www.cnblogs.com/guigujun/p/9595234.html
副本集