Bootstrap

公有云——天翼云4.0及负载均衡相关介绍

目录

1 云计算的价值

1.1 公有云的价值

1.2 公有云的一条龙服务

1.3 天翼云强推的现有产品

1.3.1 云电脑

1.3.2 Aone (All In One):又称Access One,该产品基于CDN网络,涵盖Web应用防火墙(WAF) 和 CDN加速。

2 云上架构

2.1 架构图

2.2 负载均衡算法

3 资源池——天翼云4.0

3.1 广义的天翼云4.0——SateCloud


1 云计算的价值

1.1 公有云的价值

快速部署 弹性伸缩 按需使用 高可用 简化易用 开放共享

1.2 公有云的一条龙服务

服务提供涵盖:

上云咨询、设计规划、部署迁移、测试调优、运维支撑

天翼云的核心优势:

云网融合

什么是云网融合

云网融合 = 渠道+产品+技术+运维+安全+服务

1.3 天翼云强推的现有产品
1.3.1 云电脑
1.3.2 Aone (All In One):又称Access One,该产品基于CDN网络,涵盖Web应用防火墙(WAF) 和 CDN加速。

2 云上架构

2.1 架构图

下面一图看懂云架构

云架构
2.2 负载均衡算法

拓展知识——基于分布式系统的特性,我们先普及一下负载均衡算法(此处只重点介绍公有云中常用的三种)

源地址哈希法(Hash)

源地址哈希法是根据请求来源的地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一源地址的请求,当服务器列表不变时,它每次都会映射到同一台服务器进行访问。

具体可以参考这位老师的文章:负载均衡算法--源地址哈希法(Hash)-CSDN博客

最少连接数(Least Connections)

将新的请求发送到同时连接最少的服务实例。

代码示例,以下是使用 Least Connections 负载均衡算法,实现了对 HTTP 和 HTTPS 两种协议的负载均衡:

import http.client
import http.server
import socket
import ssl
import threading
from typing import List
 
 
# HTTP server configuration
HTTP_HOSTNAME = 'localhost'
HTTP_PORT = 8080
 
 
# HTTPS server configuration
HTTPS_HOSTNAME = 'localhost'
HTTPS_PORT = 8443
SSL_CERTIFICATE = 'localhost.crt'
SSL_PRIVATE_KEY = 'localhost.key'
 
 
# Servers and their weights
# Format: (hostname, port, weight)
SERVERS = [
    ('localhost', 5001, 3),
    ('localhost', 5002, 2),
    ('localhost', 5003, 1)
]
 
 
class LeastConnectionsBalancer:
 
 
    def __init__(self, servers: List):
        self.servers = servers
        self.connections = [0 for _ in servers]
        self.mutex = threading.Lock()
 
 
    def get_best_server(self):
        with self.mutex:
            index = 0
            current_connections = self.connections[0]
            for i, conn in enumerate(self.connections[1:]):
                if conn < current_connections:
                    index = i + 1
                    current_connections = conn
            self.connections[index] += 1
            return self.servers[index]
 
 
    def release_server(self, server_index):
        with self.mutex:
            self.connections[server_index] -= 1
 
 
class LoadBalancerHTTPHandler(http.server.BaseHTTPRequestHandler):
 
 
    balancer = LeastConnectionsBalancer(SERVERS)
 
 
    def do_GET(self):
        server = self.balancer.get_best_server()
        conn = http.client.HTTPConnection(server[0], server[1])
        conn.request('GET', self.path)
        response = conn.getresponse()
        self.send_response(response.status)
        for header, value in response.getheaders():
            self.send_header(header, value)
        self.end_headers()
        self.wfile.write(response.read())
        conn.close()
        self.balancer.release_server(SERVERS.index(server))
 
 
class LoadBalancerHTTPSHandler(http.server.BaseHTTPRequestHandler):
 
 
    balancer = LeastConnectionsBalancer(SERVERS)
 
 
    def do_GET(self):
        server = self.balancer.get_best_server()
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE
        conn = http.client.HTTPSConnection(server[0], server[1], context=context)
        conn.request('GET', self.path)
        response = conn.getresponse()
        self.send_response(response.status)
        for header, value in response.getheaders():
            self.send_header(header, value)
        self.end_headers()
        self.wfile.write(response.read())
        conn.close()
        self.balancer.release_server(SERVERS.index(server))
 
 
if __name__ == '__main__':
    # Start HTTP server in a new thread.
    http_server = http.server.HTTPServer((HTTP_HOSTNAME, HTTP_PORT), LoadBalancerHTTPHandler)
    http_thread = threading.Thread(target=http_server.serve_forever)
    http_thread.daemon = True
    http_thread.start()
    print('HTTP server started on %s:%d' % (HTTP_HOSTNAME, HTTP_PORT))
 
 
    # Start HTTPS server in a new thread.
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
    context.load_cert_chain(SSL_CERTIFICATE, SSL_PRIVATE_KEY)
    https_server = http.server.HTTPServer((HTTPS_HOSTNAME, HTTPS_PORT), LoadBalancerHTTPSHandler)
    https_server.socket = context.wrap_socket(https_server.socket, server_side=True)
    https_thread = threading.Thread(target=https_server.serve_forever)
    https_thread.daemon = True
    https_thread.start()
    print('HTTPS server started on %s:%d' % (HTTPS_HOSTNAME, HTTPS_PORT))
 
 
    # Wait for threads to finish.
    http_thread.join()
    https_thread.join()

③静态算法——轮询(Round Robin):将客户端请求按顺序发送到不同的服务实例。服务通常需要是无状态的。2.粘性轮询(Sticky Round Robin):是轮询算法的改进版本。如果Alice的第一个请求发送到服务A,则以下请求也发送到服务A。3.权重轮询(Weighted Round Robin):管理员可以为每个服务指定权重。权重更高的服务处理的请求更多。4.散列(Hash):该算法对传入请求的IP或URL应用哈希函数。根据哈希函数结果,将请求路由到相关实例。

下面为代码示例,轮询算法的实现非常简单,可以定义一个服务器的列表和当前服务器指针: 

# 服务器列表
servers = ["ServerA", "ServerB", "ServerC"]
# 当前服务器
current_server = 0
# 轮询算法
if(req):
    # 选择当前服务器来处理请求
    process_request(servers[current_server])
    # 将当前服务器移到服务器列表的末尾
 
    if current_server == length(servers):
        current_server = 0
    else:
      # 指针+1
      current_server += 1

当客户端有新的请求到达时,负载均衡器会选择服务器指针(current_server)指向的服务器来处理请求,然后将当前服务器指针移到下一个服务器(current_server += 1), 如果current_server=服务器总数,则把current_server设置为0,进行下一场轮询。

3 资源池——天翼云4.0

广义的天翼云4.0——SateCloud

全面自研——全新一代,始于2021,拥有 分布式云架构云网融合创新 两大核心优势,从“2+4+21+X”的天翼云3.0到“千城万池”的天翼云4.0

4 “西南1”产品介绍

4.1 多AZ ——公有云的核心灵魂

作为第七代云主机,采用第三代Intel至强可扩展处理器(Ice Lake),基于新一代虚拟化平台,使用NUMA绑定技术。

4.2 云容灾 CT—CDR(Cloud disaster recovery)

关键特性(注意 ,容灾迁移两边的地址不一样):

ESC跨AZ容灾能力

PS : 块存储不加容灾能力无法跨AZ容灾

4.3 服务能力

4.3.1 内网 DNS 

4.3.2 数据迁移服务

注意,云硬盘并非利用了纠错冗余码技术,而是采用了三分块技术使得数据不丢失。

;