負載均衡算法-輪詢、加權輪詢、源地址hash、一致性hash


負載均衡算法-輪詢、加權輪詢、源地址hash、一致性hash

1.輪詢算法

根據服務ip列表元素進行依次訪問

代碼:

server_ip_list = ["192.168.1.10", "192.168.1.20", "192.168.1.30", "192.168.1.40"]

def get_ip():
    for server_ip in server_ip_list:
        print(server_ip)

# 循環執行get_ip()函數1次,查看輸出結果
for i in range(1):
    get_ip()

 

2.加權輪詢算法

根據服務ip列表元素+權重值進行輪詢訪問

經典加權輪詢算法

python代碼:

dict = {"192.168.1.10":{'weight':5,'dynamicWeight':0}, "192.168.2.20":{'weight':1,'dynamicWeight':0}, "192.168.3.30":{'weight':3,'dynamicWeight':0}, "192.168.4.40":{'weight':2,'dynamicWeight':0}}


def get_ip():
    # 初始化總權重
    total_weight = 0
    # 求總權重值
    for k,v in dict.items():
        total_weight += v['weight']
    # 求每個服務器ip的動態權重值
    for k,v in dict.items():
        v['dynamicWeight'] += v['weight']

    # 比較動態權重值,最大的動態權重值的妃嬪打印出來
    dw = 0
    ps = ''
    for k,v in dict.items():
        if v['dynamicWeight'] > dw:
            dw = v['dynamicWeight']
            ps = k
    dict[ps]['dynamicWeight'] = dw - total_weight
    print(ps)

# 循環執行get_princess()函數11次,查看輸出結果
for i in range(11):
    get_ip()

 

3.源地址hash算法

根據客戶端ip地址的hash值 % 服務端ip的數量 得到的值作為服務端ip列表的索引值

這種算法缺點:一台服務器節點故障,會引起所有客戶端連接服務發生變化。

python代碼:import hashlib

server_ip_list = ["192.168.1.10", "192.168.2.20", "192.168.3.30", "192.168.4.40"]
client_ip_list = ["113.88.97.173", "106.11.154.33", "207.46.13.149","42.156.137.120", "203.208.60.0", "119.39.47.182", "171.34.179.4", "111.175.58.52", "124.235.138.199","175.184.166.184","175.184.166.18"]


def get_ip():
    hash_list = []
    for clientip in client_ip_list:
        #print(hash(str(clientip)))
        m = hashlib.md5()
        m.update(str(clientip).encode('utf-8'))
        hash_list.append(m.hexdigest())
        #print(hash_list)
     # python的hash()無法獲取不變的值,只能用這種hash方法代替 
index = len(hash_list) % len(server_ip_list) print(clientip + '請求的服務器ip為:'+ server_ip_list[index]) for i in range(1): get_ip()

 

4.一致性hash算法

解決”一台服務器節點故障,會引起所有客戶端連接服務發生變化。”,當一台服務器發生故障時,只影響連接到這台服務的客戶端ip,其他客戶端不受影響。

原理:通過將服務ip添加多個虛擬節點hash值,將客戶端ip的hash值與虛擬節點hash值做比較,根據客戶端ip所在的范圍,進行分配服務ip給客戶端使用

python代碼:

import hashlib

server_ip_list = ["192.168.1.10", "192.168.2.20", "192.168.3.30","192.168.4.40"]
client_ip_list = ["113.88.97.173", "106.11.154.33", "207.46.13.149","42.156.137.120", "203.208.60.0", "119.39.47.182", "171.34.179.4", "111.175.58.52", "124.235.138.199","175.184.166.184","111.175.58.52", "124.235.18.119","175.144.163.124","175.14.166.114","111.175.8.152", "124.23.18.113","175.144.13.116"]

def get_md5(data):
    m = hashlib.md5()
    m.update(data.encode('utf-8'))
    return m.hexdigest()

def get_ip():
    virtual_nodes = 500
    node_dict = {}
    # 遍歷服務器ip,生成對應的虛擬結點
    for serverip in server_ip_list:
        for i in range(virtual_nodes):
            # serverip加上一些動態參數生成md5值
            hash_key = get_md5(str('{0}VN{1}'.format(serverip,i)))
            node_dict[hash_key]=serverip
    # 將node_dict字典按key排序生成列表
    sorted_key_list = sorted(node_dict)
    # 將node_dict字典按key排序
    node_dict = sorted(node_dict.items(),key=lambda d:d[0],reverse=False)
    #print(node_dict)
    #print(sorted_key_list)

    for clientip in client_ip_list:
        selected_key_list = []
        # clientip生成md5值
        hc = get_md5(str(clientip))
        #print(hc)
        switch = 0
        for key in sorted_key_list:
            #print(key)
            # clientip和sorted_key_list中的md5值做比較,clientip的md5值小於等於sorted_key_list中的md5值,switch=1
            if hc <= key:
                selected_key_list.append(key)
                switch=1
        if switch == 0:
            firstkey = sorted_key_list[0]
        else:
            firstkey = selected_key_list[0]
        #print(firstkey)
        #print(selected_key_list)
        print("{0}請求的服務器ip為:{1}".format(clientip,dict(node_dict)[firstkey]))


# for i in range(2):
get_ip()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM