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)采用一主一备一仲裁模型:

Host Ip Software Port Usage OS
server-1 192.168.6.42 mongodb 3.4.10
27017 primary(主) Linux release 7.6.1810
server-2 192.168.6.43 mongodb 3.4.10 27017 secondary(备) Linux release 7.6.1810
server-3 192.168.6.44 mongodb 3.4.10 27017 arbiter(仲裁) Linux release 7.6.1810

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

 

副本集

posted @ 2020-02-28 22:40  梦徒  阅读(3169)  评论(0编辑  收藏  举报