三、mongodb副本集搭建

mongodb单台服务器:

数据会有丢失的风险,无法做到高可用

mongodb复制集可以预防数据丢失,多台mongodb数据一直,能够在有问题的时候自动切换

副本集同步原理

secondary通过主动抓取primary的oplog来达到与主库数据的一致性,每隔secondary都维护一个自己的offset,记录同步源最后一条日志的optime,执行同步的时候,secondary会启用一个同步线程,通过optime向主库的oplog集合查询需要同步的数据,只要同步源中的oplo*生了新的数据,secondary就可以通过这个线程获得同样的数据

oplog同步具备幂等性,对于同一条oplog,无论在secodary执行多少次操作,数据的最终形态都保持和第一次执行时一致

一、单实例环境准备

192.168.10.128 192.168.10.129 192.168.10.130端口统一使用27017

创建目录

mkdir -p /mongodb/27017/{data,log,conf}

cat >/mongodb/27017/conf/mongod.conf <<EOF
storage:
? dbPath: /mongodb/27017/data/
? journal:
? ? enabled: true
systemLog:
? destination: file
? logAppend: true
? path: /mongodb/27017/log/mongodb.log
net:
? port: 27017
? bindIp: 0.0.0.0
replication:
? oplogSizeMB: 2048
? #复制集名字,几个节点必须一样 ?
? replSetName: mySet
processManagement:
? fork: true
? pidFilePath: /mongodb/27017/log/mongod.pid
EOF

启动服务

mongod -f /mongodb/27017/conf/mongod.conf

二、副本集搭建

副本集三种角色:

primary主节点:主要接受所有写操作

secondary从节点:主节点通过复制操作以维护相同的数据集,备份数据, 不能写,但可以读(需要设置)

arbiter仲裁节点:不保留任何数据的副本,只有投票选举功能

副本集的两种添加方式

通过设置变量config再初始化

mongo 192.168.10.128:27017
config={"_id":"mySet",members:[
? {_id:0,host:"192.168.10.128:27017"},
? {_id:1,host:"192.168.10.129:27017"},
? {_id:2,host:"192.168.10.130:27017"}]
}
rs.initiate(config_set) ##初始化

三、节点添加和移除

在192.168.10.130创建27018节点

cp -r /mongodb/27017/ /mongodb/27018

sed ‘s#27017#27018#g‘ /mongodb/27018/conf/mongod.conf -i

需要将复制过来的data和log下面的数据清理掉

mongod -f /mongodb/27018/conf/mongod.conf #启动节点

添加仲裁节点192.168.10.130:27018

rs.addArb("192.168.10.130:27018")

移除节点

rs.remove("192.168.10.130:27018")

添加副本节点192.168.10.130:27018 #如果都拿192.168.10.130:27018做实验,做完仲裁就得把27018服务停了,data和log清空重新启动

rs.add("192.168.10.130:27018")

查看副本集信息rs.config()

三、mongodb副本集搭建

四、副本集故障切换

主节点选举的触发条件:

1、主节点故障

2、主节点网络不可达(默认心跳信息为10s)

3、人工干预(rs.stepDown(600))

选主规则:

1.票数最高,且获得半数以上成员支持的节点获胜

当副本集存活的成员不及半数时,将无法选举主节点。也就无法写数据,此时整个副本集只能读取数据。

2.票数相同且均获得了大部分成员支持,则其数据在最新的节点获胜

两个节点谁的数据最新,同步主节点数据的速度最快,谁就获取胜利。

3.优先级会严重影响获取选票的情况

优先级的设置范围是0~100,默认情况下,优先级为1。通过设置节点的优先级,使得优先级更高的节点更有可能成为主节点,而优先级更低的节点更不可能成为主节点。

如果主节点挂掉,192.168.10.129:27017会变成主节点

如果192.168.10.129:27017和192.168.10.130:27017同时挂掉,192.168.10.128:27017主节点变成从节点,只能读取无法写入

如果192.168.10.128:27017和192.168.10.130:27017同时挂掉,192.168.10.129:27017并不会变成主节点,依旧是从节点

五、权重对主从切换的影响

默认权重都是1,可以通过rs.config()查看

三、mongodb副本集搭建

conf=rs.config()
conf.members[0].priority=5 #members是一个集合,不要被里面的_id误导
conf.members[1].priority=3
conf.members[2].priority=2
rs.reconfig(conf) #更新副本集配置

主节点插入数据

db.myuser.insert( {userid:1} )

停掉192.168.10.128:27017主节点

use admin

db.shutdownServer()

根据权重设置,192.168.10.129:27017切换到了主节点

当前主节点插入数据

db.myuser.insert( {userid:2} )

db.myuser.insert( {userid:3} )

此时启动192.168.10.128:27017

发现主节点又变回了192.168.10.128:27017,并且停掉期间插入的数据也同步过来了

如果权重不一致时,权重高的启动,会首先同步数据,然后把自己切换成主节点

六、隐藏节点和延时节点

hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏),一般情况下会将delay+hidden一起配置使用

将192.168.10.130:27018开启隐藏节点和延时节点

cfg=rs.conf()?
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=120
rs.reconfig(cfg)

rs.conf()查看

三、mongodb副本集搭建

七、增加安全认证

移除了192.168.10.130:27018,只保留三个节点便于操作

rs.remove("192.168.10.130:27018")

主节点创建一个用户,便于登录

use admin

db.createUser({

user: "admin",

pwd: "admin",

roles: [{role: "root",db: "admin"}]

})

keyfile认证原理:

使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。只有有正确的keyfile的mongod实例可以加入副本集。

keyFile文件内容必须采用base64编码的6-1024个字符长度的共享密钥,且副本集所有成员的内容必须相同

创建keyfile文件

mkdir -p /mongodb/27017/keyfile #创建放keyfile的文件夹

openssl rand -base64 66 -out "/mongodb/27017/keyfile/file.key"

chmod 600 /mongodb/27017/keyfile/file.key
scp file.key root@192.168.10.129:/mongodb/27017/keyfile/ #将keyfile复制到其他两台机器
scp file.key root@192.168.10.130:/mongodb/27017/keyfile/

其他两台机器做一下权限设置

chown mongodb.mongodb /mongodb/27017/keyfile/file.key
chmod 600 /mongodb/27017/keyfile/file.key

将配置写入配置文件

echo ‘security:
? authorization: enabled
? keyFile: /mongodb/27017/keyfile/file.key
‘ >>/mongodb/27017/conf/mongod.conf

重启副本集

mongod -f /mongodb/27017/conf/mongod.conf --shutdown
mongod -f /mongodb/27017/conf/mongod.conf?

在使用mongo --port 27017登录

三、mongodb副本集搭建

也可以是直接命令登录

mongo --port 27017 ?--username=admin --password=admin --authenticationDatabase=admin

?

?

上一篇:MySQL_14数据库设计三范式


下一篇:mysql数据库