基于阿里云SLB部署ECS自建MySQL高可用(SLB功能测试篇)

目录

 

背景介绍  

阿里云SLB简介

环境介绍 

创建测试表

测试脚本准备

模拟故障切换


背景介绍  

最近要在阿里云的ECS上部署MySQL高可用架构,因为阿里云上不能使用Keepalived提供VIP(虚拟IP),没有VIP就无法自动完成故障转移,经过调研发现阿里云产品SLB大致可以满足需求,SLB可以进行流量分发,消除单点故障实现服务高可用。所以打算使用阿里云产品SLB(负载均衡)替代VIP。本篇博客主要是验证SLB主备模式下如果主库服务宕机,数据库的写入和查询请求是否可以自动转移至备库。如果可以,后面ECS自建高可用的方案就是使用SLB+MHA来实现主库高可用。

SLB阿里云官方介绍

阿里云SLB简介

负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务。负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。

注意:

创建SLB时要要使用主备服务器组,主服务器对应MHA中的主库服务器,备服务器对应MHA中的备主,这样平时流量就会发送到主库,当出现故障的时候发生切换将流量发送到备主。其余的创建可以咨询公司的OP同事或者阿里云的技术人员。

环境介绍 

IP SLB中的角色 数据库架构(MHA)中的角色 简称
10.96.0.202 SLB地址 VIP 202
10.96.1.114   主服务器 主库服务器 4
10.96.1.115 备服务器 备主服务器 5
10.96.1.116 没有添加至SLB中 从库服务器 6

创建测试表

表结构说明:测试表中添加时间戳的列,方便记录插入时间和切换日志进行比对,另外的一个字段是num数字类型,可以使用for循环持续向表中插入数据

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 = '用户表';

测试脚本准备

安装依赖包:

pip install 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()

脚本说明 :使用SLB地址 10.96.0.202 往数据库中插入1000万数据,在插入期间手动停止4服务器上的数据库服务,验证SLB切换后5可以继续插入数据。在每次插入数据后会记录数据库的server_Id到日志中用来标识写入的是哪个数据库,并将切换时的错误记录到日志中

模拟故障切换

启动脚本

手动停止4上mysql服务

观察日志以及表中数据

测试

22:17开始脚本 持续写入

22:18:11 4上 停止数据库 /etc/init.d/mysqld stop  日志和数据库的表中都显示在18分11秒停止写入

ha.log

数据库中表

22:18:11持续至22:18:20,数据库无法写入 
22:18:20 SLB完成主备切换 5数据库开始写入 ,日志数据库表中显示在18分20秒开始写入5环境


22:19 4上启动 /etc/init.d/mysqld start

22:19:10秒 4环境数据库服务启动 ,5环境停止写入,但是4环境没有开始写入

 验证完成

猜你喜欢

转载自blog.csdn.net/weixin_48154829/article/details/108537882
slb