Solución de alta disponibilidad de la base de datos MongoDB: conjunto de replicación de MongoDB (replicación maestro-esclavo)
Prefacio
Este entorno se basa en el sistema Centos 7.8 para crear un entorno de aprendizaje mongodb-enterprise-4.2.8. Para
una construcción específica, consulte la construcción del entorno mongodb-enterprise-4.2.8.
La replicación de MongoDB es el proceso de sincronizar datos en varios servidores; el conjunto de replicación proporciona una copia de seguridad redundante de los datos y mejora la disponibilidad de los datos, generalmente garantizando la seguridad de los datos; el conjunto de replicación también permite a los técnicos recuperarse de fallas de hardware e interrupciones del servicio Recuperación de datos.
1. ¿Qué es un conjunto de réplicas de MongoDB?
¿Qué es un conjunto de réplicas?
- Garantizar la seguridad de los datos
- Respaldo y redundancia de datos
- Alta disponibilidad de datos (24 * 7)
- Recuperación de desastres
- Sin tiempo de inactividad por mantenimiento (como respaldo, reindexación, compresión)
- Datos de lectura distribuidos
- El conjunto de réplicas es transparente para la capa de la aplicación (en relación con el usuario final)
El principio de funcionamiento del conjunto de réplicas de MongoDB
- 1. El conjunto de replicación de mongodb requiere al menos dos nodos. Uno de ellos es el nodo maestro, que se encarga de procesar las solicitudes de los clientes, y el resto son nodos esclavos, que se encargan de copiar los datos en el nodo maestro.
- 2. El método de colocación común de cada nodo de mongodb es: un maestro y un esclavo, un maestro y varios esclavos.
- 3. El nodo maestro registra todos los registros de operación en él, y el nodo esclavo sondea periódicamente al nodo maestro para obtener estas operaciones, y luego realiza estas operaciones en su propia copia de datos, a fin de garantizar que los datos del nodo esclavo sean consistentes con el nodo maestro
2. Diseño de la arquitectura del conjunto de réplicas de MongoDB
Características del conjunto de réplicas de MongoDB
- Clúster de n nodos
- Cualquier nodo puede usarse como nodo maestro
- Todas las operaciones de escritura están en el nodo maestro.
- Conmutación por error automática
- Recuperación automática
Tres, el caso real del conjunto de replicación de MongoDB
1. Implementación del conjunto de réplicas de MongoDB
Preparación ambiental
papel | anfitrión | ip | versión mongodb |
---|---|---|---|
Maestro | node01 | 192.168.5.11 | mongodb-empresa-4.2.8 |
esclavo1 | node02 | 192.168.5.12 | mongodb-empresa-4.2.8 |
esclavo2 | node03 | 192.168.5.13 | mongodb-empresa-4.2.8 |
Modificar el archivo de configuración de MongoDB
# 所有节点修改
--- node01
[root@node01 ~]# vim /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.5.11
replication:
oplogSizeMB: 1024
replSetName: myRs
[root@node01 ~]# systemctl restart mongod
--- node02
[root@node02 ~]# vim /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.5.12
replication:
oplogSizeMB: 1024
replSetName: myRs
[root@node02 ~]# systemctl restart mongod
--- node03
[root@node03 ~]# vim /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.5.13
replication:
oplogSizeMB: 1024
replSetName: myRs
[root@node03 ~]# systemctl restart mongod
Configurar el nodo maestro
# 登录MongoDB
[root@node01 ~]# mongo
MongoDB shell version v4.2.8
# 查看ReplSet状态
MongoDB Enterprise > rs.status()
{
"operationTime" : Timestamp(0, 0),
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized",
"$clusterTime" : {
"clusterTime" : Timestamp(0, 0),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
# 初始化ReplSet复制集
MongoDB Enterprise > rs.initiate({
_id:'myRS',members:[{
_id:1,host:'192.168.5.11:27017'}]})
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1613533287, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1613533287, 1)
}
Verifique el estado de ReplSet nuevamente
para agregar nodos esclavos en el maestro
MongoDB Enterprise myRS:PRIMARY> rs.add('192.168.5.12:27017','192.168.5.13:27017')
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1613534429, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1613534429, 1)
}
Ver estado de ReplSet
El nodo maestro inserta datos para probar la sincronización maestro-esclavo
Datos de inserción principal
# 插入数据
MongoDB Enterprise myRS:PRIMARY> use test
switched to db test
MongoDB Enterprise myRS:PRIMARY> for(var i =0; i <4; i ++){
db.user.insert({
userName:'my'+i,age:i})}
WriteResult({
"nInserted" : 1 })
# 查看数据
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{
"_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }
esclavo01 vista
esclavo02 vista
El conjunto de replicación de MongoDB se realizó correctamente!!!
2. Simule la falla del maestro para realizar la conmutación por error y la recuperación de fallas.
Simular el cierre del nodo maestro
MongoDB Enterprise myRS:PRIMARY> use admin
switched to db admin
MongoDB Enterprise myRS:PRIMARY> db.shutdownServer()
2021-02-17T12:30:51.021+0800 I NETWORK [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
2021-02-17T12:30:51.038+0800 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed
2021-02-17T12:30:51.038+0800 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed
2021-02-17T12:30:51.042+0800 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed
2021-02-17T12:30:51.042+0800 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed
MongoDB Enterprise >
vista node03
Cambie node02 a master
node02 para ver e insertar tres registros
[root@node02 ~]# mongo
MongoDB shell version v4.2.8
MongoDB Enterprise myRS:PRIMARY> use test
switched to db test
MongoDB Enterprise myRS:PRIMARY> for(var i =4; i <7; i ++){
db.user.insert({
userName:'my'+i,age:i})}
WriteResult({
"nInserted" : 1 })
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{
"_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }
{
"_id" : ObjectId("602c9d4a2db6914f63068e15"), "userName" : "my4", "age" : 4 }
{
"_id" : ObjectId("602c9d4a2db6914f63068e16"), "userName" : "my5", "age" : 5 }
{
"_id" : ObjectId("602c9d4a2db6914f63068e17"), "userName" : "my6", "age" : 6 }
node03 view
start master
[root@node01 ~]# systemctl start mongod
[root@node01 ~]# systemctl is-active mongod
active
node03 ver el estado maestro-esclavo
node01 ha cambiado al estado salve y
node02 inserta tres datos nuevamente
MongoDB Enterprise myRS:PRIMARY> use test
switched to db test
MongoDB Enterprise myRS:PRIMARY> for(var i =7; i <10; i ++){
db.user.insert({
userName:'my'+i,age:i})}
WriteResult({
"nInserted" : 1 })
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{
"_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{
"_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }
{
"_id" : ObjectId("602c9d4a2db6914f63068e15"), "userName" : "my4", "age" : 4 }
{
"_id" : ObjectId("602c9d4a2db6914f63068e16"), "userName" : "my5", "age" : 5 }
{
"_id" : ObjectId("602c9d4a2db6914f63068e17"), "userName" : "my6", "age" : 6 }
{
"_id" : ObjectId("602c9f71912509e6bd44076c"), "userName" : "my7", "age" : 7 }
{
"_id" : ObjectId("602c9f71912509e6bd44076d"), "userName" : "my8", "age" : 8 }
{
"_id" : ObjectId("602c9f71912509e6bd44076e"), "userName" : "my9", "age" : 9 }
node01 ver datos
node03 ver datos
Conmutación por error, recuperación de fallas¡Logrado con éxito! ! !