MongoDB副本集群部署

1、MongoDB单机版的安装

提前准备MongoDB安装包

这里以下实例为例: 
hostname:mongodb63  
IP:192.168.4.63
[root@mongodb63 ~]# tar -xf  mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@mongodb63 ~]# mkdir  /usr/local/mongodb
[root@mongodb63 ~]# cp -r mongodb-linux-x86_64-rhel70-3.6.3/bin/ /usr/local/mongodb/
[root@mongodb63 mongodb]# cd /usr/local/mongodb/
[root@mongodb63 mongodb]# mkdir -p  data/db  log etc   #新建 data/db、log、etc 目录
[root@mongodb63 mongodb]# ls
bin  data  etc  log
vim etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.4.63
port=27077     #默认端口为27017 如果不加为默认端口
#auth=true
#keyFile = /usr/local/mongodb/rs/keyfile
添加环境变量
[root@mongodb63 ~]# vim /etc/profile
export  PATH=$PATH:/usr/local/mongodb/bin/
[root@mongodb63 ~]# source /etc/profile
[root@mongodb63 ~]# mongod  -f /usr/local/mongodb/etc/mongodb.conf   #启动MongoDB
[root@mongodb63 ~]# ss -anput|grep 27077  #查看是否成功
[root@mongodb63 ~]# mongo  --host 192.168.4.63 --port 27077     #登录MongoDB
常用命令 MongoDB命令和配置文件要区分大小
> show dbs   #显示已有库
admin   0.000GB
config  0.000GB
local   0.000GB
> db     #显示当前所在库
> use 库名  #切换库,若不存在 会自动延时创建库
> show tables   #或者show collections 查看库下已有的集合
> db.dropDatabase()  #删除当前所在的库
> db.haha.save({a:1,b:2,c:3})   #写入数据
WriteResult({ "nInserted" : 1 })
> db.haha.count()
1
> db.haha.find()
停止服务
[root@mongodb63 ~]# mongod --dbpath=/usr/local/mongodb/data/db --shutdown  #停止服务或killall mongod 杀死服务

2、副本集群的搭建

  • 集群前准备3台实例并安装MongoDB 并删除除之前所有数据MongoDB
mongodb61  IP:192.168.4.61
mongodb62  IP:192.168.4.62
mongodb63  IP:192.168.4.63

2.1、副本集群的搭建

操作在61上进行 其实任何一台操作都可以

  • 方便选举主节点 建议奇数台组建集群
  • 其中只有主库可以写入 副本(从)不能写入只能查询
  • 主库down机 会从副本中自动选举主库,当之前的主库恢复后 为自动加放到集群 并以副本(从)库身份运行
  • 仲裁节点,可要可不要,但因为mongodb算法不太好,存在有选举不出主节点的可能,建议还是配置一个,仲裁节点不存储数据,对硬件配置也没有要求,可以找一台配置较差或者配置到其它服务的实例上
修改配置文件 3台都需要修改 在单机版基础上添加replSet=rs1
[root@mongodb61 mongodb]# vim /usr/local/mongodb/etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.4.61
port=27077
replSet=rs1      #添加这一行配置
#auth=true
#keyFile = /usr/local/mongodb/rs/keyfile
开启服务
[root@mongodb61 ~]# mongod -f /usr/local/mongodb/etc/mongodb.conf
登陆MongoDB
[root@mongodb61 ~]# mongo --host 192.168.4.61 --port 27077
config={
_id:"rs1",
members:[
{_id:0,host:"192.168.4.61:27077"},
{_id:1,host:"192.168.4.62:27077"},
{_id:2,host:"192.168.4.63:27077",arbiterOnly:true}   #加仲裁节点
]
};
========显示以下信息代表成功
{
    "_id" : "rs1",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.4.61:27077"
        },
        {
            "_id" : 1,
            "host" : "192.168.4.62:27077"
        },
        {
            "_id" : 2,
            "host" : "192.168.4.63:27077",
            "arbiterOnly" : true
        }
    ]
}
> rs.initiate(config)  #初始化 选主从  如果集群成功> 会变成 rs1:PRIMARY>
rs1:PRIMARY> rs.status()  #查看集群状态
rs1:PRIMARY> rs.isMaster()  #查看是否为主库
rs1:PRIMARY> use haha
rs1:PRIMARY> db.haha.save({d:5,e:6,f:8})  #写入数据测试 可以看到前面已要变了成 
rs1:PRIMARY> db.haha.find() 
{ "_id" : ObjectId("5e05b7def43f1d19454bf8e4"), "d" : 5, "e" : 6, "f" : 8 }
从库查询
rs1:SECONDARY> db.getMongo().setSlaveOk()  #默认从库不能查询 要输入这条命令
rs1:SECONDARY> use haha
rs1:SECONDARY> db.haha.find()
{ "_id" : ObjectId("5e05b7def43f1d19454bf8e4"), "d" : 5, "e" : 6, "f" : 8 }

2.2、副本集群开启用户认证

在以上基础上  新建管理员超级用户
rs1:PRIMARY> use admin#添加root超级管理员   admin用户  在主服务端创建后会自动同步到其它服务端
rs1:PRIMARY> db.createUser(
     {
       user:"root",
       pwd:"root",
       roles:[{role:"root",db:"admin"}]
     }
  )
rs1:PRIMARY> db.createUser(
  {
    user: "admin",
    pwd: "admin",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
rs1:PRIMARY> exit
[root@mongodb61 ~]# mongod --dbpath=/usr/local/mongodb/data/db --shutdown 

3台实例相同的操作 退出和关闭MongoDB
MongoDB 中的角色:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予所有数据库的dbAdmin权限
root:只在admin数据库中可用。超级账号,超级权限

查看已经存在的用户
use admin
db.system.users.find()
移除用户
use admin
db.system.users.remove({user:"root"})
创建用户 
use admin
db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]})
创建读写用户 因为admin只有用户管理权限,下面创建用户,用户都是跟着库走
use dev_data
db.createUser({user:"datauser",pwd:"123456",roles:[{role:"readWrite",db:"dev_data"}]})
创建只读用户
use dev_data
生成keyfile文件
通过openssl生一个keyfile文件,用于节点之间权限认证的
在mongodb安装文件夹下创建一个rs目录 mkdir -p /usr/local/mongodb/rs
使用 openssl生成一个key文件, openssl rand -base64 741 > keyfile (没有安装openssl的请自行下载安装)
同时给 keyfile 文件设置权限 chmod 600 keyfile
然后scp或者其它方法把keyfile文件传到各个mongodb服务器mongodb/rs 文件夹下
修改配置文件 3台都需要相同操作
vim /usr/local/mongodb/etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.4.63
port=27077
replSet=rs1
auth=true                #取消之前注释的两行
keyFile = /usr/local/mongodb/rs/keyfile
]# mongod -f /usr/local/mongodb/etc/mongodb.conf
服务器 认证登陆  第1种认证登陆方式
格式:mongo -u用户名 -p密码 --authenticationDatabase 数据库名
[root@mongodb61 ~]# mongo --host 192.168.4.61 --port 27077 -u "root" --authenticationDatabase "admin" -p'root'
服务器 无认证登陆 无权限
[root@mongodb62 mongodb]# mongo --host 192.168.4.62 --port 27077 
rs1:SECONDARY> rs.status()
{
    "operationTime" : Timestamp(1577785469, 1),
    "ok" : 0,
    "errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0, $clusterTime: { clusterTime: Timestamp(1577785449, 1), signature: { hash: BinData(0, 098FCC247EDB082DB5B18A84AD2AF2A587243261), keyId: 6776528919215472641 } }, $db: \"admin\" }",
    "code" : 13,
    "codeName" : "Unauthorized",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1577785469, 1),
        "signature" : {
            "hash" : BinData(0,"i8vPtAV9DxxIxssN6reZMezng1o="),
            "keyId" : NumberLong("6776528919215472641")
        }
    }
}
第2种认证登陆方式  先登陆 然后进入admin库认识
rs1:SECONDARY> use admin
switched to db admin
rs1:SECONDARY> db.auth("root","root")

3、扩展 增加、删除节点

增加一个节点
1、同上,建立一个文件包含bin、data、config、log等文件
2、启动mongodb
3、添加次新节点到现有的Replica sets
rs1:PRIMARY> rs.add("192.168.4.64:27077")   #添加192.168.4.64节点
rs1:PRIMARY> rs.status()
删除一个节点
rs1:PRIMARY> rs.remove("192.168.4.64:27077")
rs1:PRIMARY> rs.status()

4、扩展 集群指定权重 在集群初始化也可以指定权重 这样相对灵活一点

hqmongodb:PRIMARY> cfg = rs.conf() 
rs1:PRIMARY> cfg.members[0].priority = 1
1
rs1:PRIMARY> cfg.members[1].priority = 3
3
rs1:PRIMARY> cfg.members[3].priority = 2
2
rs1:PRIMARY> rs.reconfig(cfg)  #使配置生效  过大概1分钟左右
rs1:SECONDARY> rs.conf()   #查看节点为权重   前缀已经变成rs1:SECONDARY  

你可能感兴趣的