天天看点

MongoDB复制集及管理

复制集是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断的服务进行恢复。

复制集的优点如下:

1)、让数据更安全;

2)、高数据可用性;

3)、灾难恢复;

4)、无停机恢复(如备份、索引重建、故障转移);

5)、读缩放(额外的副本读取);

6)、副本集对应用程序是透明的;

MongoDB的复制集至少需要两个节点。其中一个是主节点(Primary),负责处理客户端的请求,其余的都是从节点(Secondary),负责复制主节点上的数据。

MongoDB各个节点的搭配方式为:一主一从或一主多从。主节点记录其上的所有操作到oplog中,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

客户端在主节点写入数据,在从节点读取数据,主节点与从节点进行交互保障数据的一致性。如果其中一个节点出现故障,其他节点马上会将业务接过来而无需停机操作。

复制集特点如下:

1)、N个节点的群集;

2)、任何节点可以做主节点;

3)、所有写入操作都在主节点上;

4)、自动故障转移;

5)、自动恢复;

1)、创建多实例;

mkdir -p /data/mongodb/mongodb{2,3,4} #创建数据目录 mkdir /data/logs touch /data/logs/mongodb{2,3,4}.log #创建日志文件 cd /data/logs chmod 777 *.log #赋予权限 vi /etc/mongod.conf
cp mongod.conf mongod2.conf cp mongod.conf mongod3.conf cp mongod.conf mongod4.conf

#编辑完成后,复制三分,作为其他三个实例的配置文件,将mongod2.conf中的port参数设置为27018,mongod3.conf中的port参数设置为27019,mongod4.conf中的port参数设置为27020,同样也将padb和thPath参数修改为对应的路径值。

mongod -f /etc/mongod.conf #启动所有实例 mongo --port 27017 mongod -f /etc/mongod2.conf mongo --port 27018 mongod -f /etc/mongod3.conf mongo --port 27019 mongod -f /etc/mongod4.conf mongo --port 27020
MongoDB复制集及管理

2)、初始化配置复制集

mongo cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.27.28:27017"},{"_id":1,"host":"192.168.27.128:27018"},{"_id":2,"host":"192.168.27.128:27019"}]} #定义cfg初始化参数 rs.initiate(cfg) #初始化启动复制集
MongoDB复制集及管理

3)、增加和删除节点

rs.add("192.168.27.128:27020") #添加节点 rs.status() #查看状态
MongoDB复制集及管理
rs.remove("192.168.27.128:27020") #删除节点 re.status #查看状态,新添加的节点已被删除

4)、模拟故障自动切换与手动切换

模拟故障自动切换

mongo -f /etc/mongod.conf --shutdown #关闭复制集当前主节点 mongo --port 27018 #进入到第二个节点中 rs.ststus() #查看状态
MongoDB复制集及管理

手动切换

mongod -f /etc/mongod.conf #开启第一个节点 kgcrs:PRIMARY> rs.freeze(30) #暂停30s不参与选举 kgcrs:PRIMARY> rs.stepDown(60,30) #交出主节点位置,维持从节点状态不少于60秒,等待30秒使主节点和从节点日志同步
MongoDB复制集及管理

复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录。复制是将主节点的oplog日志同步并应用到其他从节点的过程。

节点类型分为标准(host)节点、被动(passive)节点和仲裁(arbiter)节点。

1)、只有标准节点可能被选举为活跃(primary)节点,有选举权。被动节点有完整副本,不可能成为活跃节点,有选举权。仲裁节点不复制数据,不可能成为活跃节点,只有选举权。

2)、标准节点与被动节点的区别:priority值高者是标准节点,低者则为被动节点。

-3)、选举规则是票数高者获胜,priority是优先权为0~1000的值,相当于额外增加0~1000的票数。选举结果:票数高者获胜;若票数相同,数据新者获胜。

mongon cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.27.128:27017","priority":100},{"_id":1,"host":"192.168.27.128:27018","priority":100},{"_id":2,"host":"192.168.27.128:27019","priority":0},{"_id":3,"host":"192.168.27.128:27020","arbiterOnly":true}]} #配置4个节点的复制集 rs.reconfig(cfg) kgcrs:PRIMARY> rs.isMaster() #查看状态信息
MongoDB复制集及管理
kgcrs:PRIMARY> use kgc kgcrs:PRIMARY> db.t1.insert({"id":1,"name":"tom"}) #插入数据 kgcrs:PRIMARY> db.t1.insert({"id":2,"name":"jerry"}) #插入数据 kgcrs:PRIMARY> db.t1.find() #查看集合中的数据 kgcrs:PRIMARY> db.t1.update({"id":2},{$set:{"name":"jack"}}) #更改 kgcrs:PRIMARY> db.t1.remove({"id":1}) #删除 kgcrs:PRIMARY> use local kgcrs:PRIMARY> show collections #查看集合
kgcrs:PRIMARY> db.oplog.rs.find() #查看日志记录所有操作

#oplog会包含所有对数据有修改的操作;但查询操作不会记录。

-1)、如果主节点出现故障,另一个标准节点将会选举成新的主节点;

mongod -f /etc/mongod.conf --shutdown #关闭第一个节点服务器 mongo --port 27018 #此时会选举第二个标准节点为主节点 rs.status() #查看状态信息
MongoDB复制集及管理

2)、当所有标准节点都出现故障,被动节点也不可能成为主节点;

mongod -f /etc/mongod2.conf --shutdown #关闭第二个节点服务器 mongo --port 27019 #此时被动节点不能成为主节点
MongoDB复制集及管理

默认MongoDB复制集的从节点不能读取数据,可以使用rs.slaveOK()命令能够在从节点读取数据。

可以使用rs.printReplicationInfo()查看日志大小、时间范围;使用rs.printSlaveReplicationInfo()查看复制的节点、时间;

rs.printReplicationInfo() #查看日志大小、时间范围 use admin db.shutdownServer() exit vim /etc/mongod2.conf #注销replication:相关启动参数,并修改port端口号27028
mongod -f /etc/mongod2.conf #单实例模式启动 mongodump --port 27028 --db local --collection 'oplog.rs' #全备当前节点的所有oplog记录 mongo --port 27028 use local db.oplog.rs.drop() #删除原日志文件 db.runCommand( { create: "oplog.rs", capped: true, size: (2 1024 1024 * 1024) } ) #重建新的日志文件,并指定大小 db.shutdownServer() #关闭服务 vim /etc/mongod2.conf
mongod -f /etc/mongod2.conf #启动 mongo --port 27018 #进入第二个节点
MongoDB复制集及管理
mongo #进入主节点 rs.stepDown() #有效产生选举;让出主节点,第二个会变成主节点
use admin #在主节点中创建一个用户 db.createUser({"user":"root","pwd":"123","roles":["root"]}) vim /etc/mongod.conf #编辑配置文件;4个都需添加如下内容
cd /usr/bin/ #写入四个实例的秘钥文件(内容需一样) echo "kgcrs key"> kgcrskey1 echo "kgcrs key"> kgcrskey2 echo "kgcrs key"> kgcrskey3 echo "kgcrs key"> kgcrskey4 chmod 600 kgcrskey{1..4} #四个实例依次进行重启,并进入主节点进行验证; show dbs #无法查看数据库 rs.status() #无法查看复制集 use admin #身份登录验证 db.auth("root","123") rs.status() #可以查看数据库 show dbs #可以查看复制集
MongoDB复制集及管理