一种低成本的基于Python3的HIS负载均衡研究

Posted 中国数字医学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种低成本的基于Python3的HIS负载均衡研究相关的知识,希望对你有一定的参考价值。

点击上方 中国数字医学” 可以订阅哦!


导读:使用Python3编程,用软件替代硬件,降低负载均衡的成本。通过随机的方式实现登录的随机,从而在大样本的登录时实现登录的均衡,并且通过C/S架构实时剔除故障服务器。基本实现负载均衡的要求,可以局部替代硬件负载均衡。利用Python3,负载均衡硬件的软件化将大大降低负载均衡的成本,并可以实现基本的负载均衡需求。


随着医院信息系统的大量普及,并且不断加入各种新的功能模块,导致网络负载不断提升,如果存在很多的数据包同时通过网络连向一台服务器,也就是网络的速度比网络所连接的设备速度快的情况下,负载均衡技术是解决这个问题的有效方式,但是负载均衡器价格昂贵,而且为了提供不中断的服务,一般需要两台负载均衡器一备一用,因此更加提高了硬件成本,本文是介绍一种软件负载均衡机制,使负载在客户机端实现负载均衡。


Python是一种简单易学,功能强大的编程语言,它有高效率的高级数据结构,可以简单而有效地实现面向对象编程。它具有高效率的数据结构,能够简单又有效地实现面向对象编程,简洁的语法与动态输入之特性,加之其解释性语言的本质,使得它成为一种在多种领域与绝大多数平台都能进行脚本编写与应用快速开发工作的理想语言。本系统使用Python3作为开发语言,正是看中了Python的易于开发和维护的优点,能够通过Python方便的做网络传输、文件操作以及服务器线程并发,任何有计算机专业背景的工作人员都可以很好的掌握并迅速开发,甚至非计算机专业人员上手也不难,这可以让任何的医院信息部门人员参与并改进软件系统。

 

负载均衡技术简介


负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。均衡负载能够平均分配客户请求到服务器阵列,籍此以快速获取重要数据,解决大量并发访问服务的问题。

 

负载均衡的软件实现流程


本负载均衡系统采用C/S架构,服务器和客户端通过socket进行TCP通讯,传输数据。客户端每次运行,从配置文件中读取的可用ECP列表,并通过随机的方式选一个ECP进行连接,然后连接负载均衡服务器,要求下载最新的配置文件,为防止频繁读写硬盘,客户端获取配置文件后,跟本机配置文件对比,若一样或校验错误则不更新,否则更新。


配置文件中包含目前可用的目标ECP列表,若某个ECP故障,可在服务器端修改配置文件,剔除故障ECP,这样客户端更新配置文件后,将不再连接故障ECP


配置文件ecplist_in_server.txt内容如下图:

一种低成本的基于Python3的HIS负载均衡研究

 图1 ecplist_in_server.txt

 

对以上配置文件的解释如下:

第1行:表示N个数据为非IP数据

第3行:端口号

第4行:版本号

第5行:数据传输校验标识,确保来自服务器的数据可信

 

工作流程图如下:

一种低成本的基于Python3的HIS负载均衡研究

 图2 工作流程图

 

客户端功能简述 客户端的工作分两为打开随机ECP和同步服务器配置文件两部分:首先,根据配置文件内所列服务器列表(第6行及以后)随机打开一个ECP供客户使用;然后通过Socket进行TCP通讯,获取服务器配置文件,并同本地文件比较,若同本地文件一致则不更新否则更新,更新后的文件会包含最新的ECP列表,用以实现剔除故障服务器的功能。


客户端随机打开ECP流程


(1)客户端随机数的产生需要导入random模块

import random

(2)通过随机数发生函数产生随机数:

randomIP=random.randint(firstIP,lenofIPname-1)

(3)由于ECP是个网址,打开某个ECP前需要导入webbrowser模块:

import webbrowser

(4)通过函数调用打开浏览器

webbrowser.open(IPname[randomIP])

 

以下是客户端实现随机打开某个ECP的逻辑图:

一种低成本的基于Python3的HIS负载均衡研究

图3 客户端随机逻辑

 

客户端下载配置文件流程


客户端配置文件下载,并非直接的文件传输,而是服务器读取服务器存储的txt文件后传输文件内的数据,客户端将接收到的数据写入本地文件,以此来还原文件。


(1)建立Socket连接之前需要导入socket库:

import socket

(2)建立Socket连接:

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(HOST, PORT)

(3)通过向服务器发送特定的命令获取文件:

client_command = 'get ecplist_in_server.txt'

s.send(client_command.encode())

(4)从服务器接收数据并校验保存

data = s.recv(4096).decode()

为防止频繁读写硬盘,校验本地文件和服务器文件的版本号,若不同,则写文件

if data[3].strip(' ') != IPname:

f.write(data)

(5)数据校验并转移存储

本地的ecplist_in_server.txt和ecplist.txt对比,数据传输校验标识相同则表示数据完整可靠并且版本号不一致的情况下才更新本地ecplist.txt,满足如下条件:

IPnamefromserver.strip(' ')=="18661801660" and IPnamefromserver != IPname

 

服务器端功能简述


SocketServer是Python3标准库中一个高级别的模块,用于简化网络客户与服务器的实现。服务器端的实现主要使用Python3的SocketServer模块实现网络服务器功能,并利用其多线程技术解决服务器并发请求。


网络服务器的实现


首先要定义一个继承自基类BaseRequestHandler的处理程序类,然后BaseRequestHandler的实例MyRequestHandler可以实现以下方法。


(1)MyRequestHandler. setup()

在handle()之前进调用此方法进行初始化操作,提示进入处理线程。

(2)MyRequestHandler. handle()

收到客户端发出的get请求,读取文件并发送数据。

while True:

try:

data = self.request.recv(4096).decode()

print("get data:", data)

if not data:

print("break the connection!")

break                

else:

action, filename = data.split()

            if action == 'get':

             self.sendfile(filename)  

         else:

             print("get error!")

             continue

except socket.timeout:

     print ("caught socket.timeout exception")

(3)MyRequestHandler. finish()

完后handle()方法后调用此方法执行清除操作。

 

并发服务器的实现


host,port = '192.168.108.39’,8080  

(2)实现了多线程的socket通话

server=socketserver.ThreadingTCPServer((host,port),Server)

(3)当一个客户端结束后继续运行,与其他的客户端继续进行通话

    server.serve_forever()

 

客户端和服务器端的运行效果分别如下:

一种低成本的基于Python3的HIS负载均衡研究

图4、客户端运行效果


一种低成本的基于Python3的HIS负载均衡研究

图5、服务器端运行效果

 

网络速率和服务器软硬件配置需求


网络速率需求


客户端每次同步配置文件最多需要传输1KB的数据,100Mbps带宽的网络可以在1秒内传输文件的数量为N=100*1024/8=12800,即理论上可以接受每秒12800次配置文件下载请求,我医院有几千台终端,此速率远远满足要求,并且实测中,在用户使用高峰期也不会有丢包现象。

 

服务器软硬件配置


服务器硬件配置能安装win7和Python3,网口速率在100Mbps及以上,以下是我的服务器配置,这台机器的生产日期是2009年,供参考:

CPU:Intel(R) Core(TM)2 Duo CPU     E7500  @ 2.93GHz

内存:2048MB

硬盘:160G

网卡:Marvell Yukon 88E8057 PCI-E Gigabit Ethernet Controller

操作系统:windows7 专业版 x86

Python版本:Python 3.3.2

 

服务器硬件可以用科室里淘汰的电脑,成本为几乎为零。

 

软件负载均衡的应用


经过一段时间的临床集中测试,临床科室反响良好,尤其是当某一组服务器发生服务故障但硬件负载均衡检测不到时,通过改变服务器的配置文件,将故障服务器剔除,并再次随机分配一个新的服务器。通过密切监测,并未影响到医院目前硬件负载均衡的功能,各个服务器负载仍然处于均衡状态。


本文首先提出硬件负载均衡的成本问题,然后讲解了基于Python3的软件负载均衡的实现方式并分享了医院软件负载均衡的应用现状,分析了网络速率和服务器软硬件配置需求,软件负载均衡的低成本优势突出。但本负载均衡方案只能做到登陆的均衡,而不能做到完全的流量均衡,智能化和可配置方面不如硬件负载均衡。


文章来源:《中国数字医学》杂志2018年第01期,作者及单位:庄绪金  陈浩 张戈 申宝明 庄甸珍,青岛大学附属医院信息管理部。


欢迎关注,CHINC服务号获取最新大会消息


传播数字医学领域发展最新动态,关注医疗卫生信息化相关资讯。

以上是关于一种低成本的基于Python3的HIS负载均衡研究的主要内容,如果未能解决你的问题,请参考以下文章

国家数字交换系统工程技术研究中心张帆等 | MDLB:一种基于强化学习的元数据动态负载均衡机制

研究人员提出一种基于FPGA高性能动态配置负载均衡引擎的系统实现方法

实现基于LVS负载均衡集群的电商网站架构

基于consul实现微服务的服务发现和负载均衡

分布式进阶(十九) 基于集群的动态反馈负载均衡策略

nginx笔记2-负载均衡