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()
四、副本集故障切换
主节点选举的触发条件:
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()查看
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()查看
七、增加安全认证
移除了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登录
也可以是直接命令登录
mongo --port 27017 ?--username=admin --password=admin --authenticationDatabase=admin
?
?