Tabla de contenido
Introducción a Alibaba Cloud SLB
Introducción al medio ambiente
Preparación del guión de prueba
Simular la conmutación por error
Introducción de antecedentes
Recientemente, es necesario implementar la arquitectura de alta disponibilidad de MySQL en Alibaba Cloud ECS, porque Keepalived no se puede usar para proporcionar VIP (IP virtual) en Alibaba Cloud, y la conmutación por error no se puede completar automáticamente sin VIP. Después de la investigación, se encuentra que Alibaba El producto en la nube SLB puede satisfacer aproximadamente la demanda. SLB La distribución del tráfico se puede realizar para eliminar puntos únicos de falla y lograr una alta disponibilidad del servicio. Así que planeo usar el producto SLB (equilibrio de carga) de Alibaba Cloud en lugar de VIP. Este blog es principalmente para verificar si las solicitudes de escritura y consulta de la base de datos se pueden transferir automáticamente a la base de datos en espera si el servicio de la base de datos principal está inactivo en el modo SLB activo / en espera. Si es posible, la siguiente solución de alta disponibilidad autoconstruida de ECS es utilizar SLB + MHA para lograr la alta disponibilidad de la biblioteca principal.
Introducción oficial de SLB Alibaba Cloud
Introducción a Alibaba Cloud SLB
Server Load Balancer es un servicio de equilibrio de carga que distribuye el tráfico a varios servidores en la nube. El equilibrio de carga puede expandir las capacidades de servicio externo del sistema de la aplicación a través de la distribución del tráfico y mejorar la disponibilidad del sistema de la aplicación al eliminar los puntos únicos de falla.
Nota:
Al crear un SLB, debe utilizar un grupo de servidores activos y en espera. El servidor primario corresponde al servidor de base de datos primario en el MHA, y el servidor en espera corresponde al maestro en espera en el MHA, por lo que el tráfico habitual será enviado a la base de datos primaria, y cuando ocurre una falla, el tráfico será enviado al maestro en espera. Por lo demás, puede consultar a los compañeros de operaciones de la empresa o al personal técnico de Alibaba Cloud.
Introducción al medio ambiente
IP | Rol en SLB | Roles en la arquitectura de la base de datos (MHA) | Abreviatura |
---|---|---|---|
10.96.0.202 | Dirección SLB | VIP | 202 |
10.96.1.114 | Servidor principal | Servidor de biblioteca principal | 4 |
10.96.1.115 | Servidor en espera | Servidor maestro en espera | 5 |
10.96.1.116 | No agregado a SLB | Servidor de biblioteca esclavo | 6 |
Crear tabla de prueba
Descripción de la estructura de la tabla: agregue una columna de marca de tiempo a la tabla de prueba, que es conveniente para registrar el tiempo de inserción y cambiar el registro para comparar. El otro campo es de tipo num, y puede usar el bucle for para insertar continuamente datos en la tabla .
create database test;
use test;
CREATE TABLE `hatest` (
`ID` BIGINT (20) NOT NULL AUTO_INCREMENT,
num BIGINT (20) NOT NULL,
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`UPDATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`ID`)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 ROW_FORMAT = DYNAMIC COMMENT = '用户表';
Preparación del guión de prueba
Instale paquetes dependientes:
pip instalar PyMySQL
# Author admin
# DATE 2020/9/10
# -*- coding:UTF-8 -*-
import pymysql
import time,datetime
import logging
import os
logging.basicConfig(filename=os.path.join(os.getcwd(),'ha.log'),level=logging.DEBUG)
def insert():
while True:
try:
conn = pymysql.connect(host='10.96.0.202',port=3306,user='dba',password='dba',database='test',charset='utf8')
cursor = conn.cursor()
for num in range(0,10000000):
data_time = time.strftime("%Y-%m-%d %H:%M:%S")
sql1="insert into hatest(num) values(%d);"%num
sql2 = "show variables like 'server_id';"
cursor.execute(sql1)
data_time = datetime.datetime.now()
cursor.execute(sql2)
server_id = cursor.fetchone()
logging.warning('%s server_id is %s'%(datetime.datetime.now(),server_id[1]))
conn.commit()
cursor.close()
except Exception as e:
logger_info = "%s %s" %(datetime.datetime.now(),e)
logging.warning(logger_info)
insert()
Descripción del script: use la dirección de SLB 10.96.0.202 para insertar 10 millones de datos en la base de datos, detenga manualmente el servicio de base de datos en el servidor 4 durante la inserción y verifique que 5 pueda continuar insertando datos después del cambio de SLB. Cada vez que se insertan datos, el server_Id de la base de datos se registrará en el registro para identificar qué base de datos se está escribiendo, y el error durante el cambio se registrará en el registro.
Simular la conmutación por error
Script de inicio
Detenga manualmente el servicio mysql en 4
Observe el registro y los datos de la tabla.
prueba
22:17 Inicio de la escritura continua del guión
22:18:11 4上 停止数据库 /etc/init.d/mysqld stop 日志和数据库的表中都显示在18分11秒停止写入
ha.log
Tabla en la base de datos
22:18:11 continúa hasta 22:18:20, la base de datos no se puede escribir 22:18:20 SLB完成主备切换 5数据库开始写入 ,日志数据库表中显示在18分20秒开始写入5环境
22:19 4上启动 /etc/init.d/mysqld start
22:19:10 segundos Se inició el servicio de base de datos de 4 entornos, 5 entornos dejaron de escribir, pero 4 entornos no comenzaron a escribir
Verificación completa