四层负载均衡和七层负载均衡
七层负载均衡
首先,我们来看下七层负载均衡,它一般是针对应用层请求协议做请求转发,拿http请求举例,有A,B两台服务器,如果采用轮询的负载均衡策略,负载均衡器将第一个请求转发给了A服务器,那么第二个请求到达时,负载均衡器就会把请求转发到B服务器。
在转发时,能够在应用协议层对请求做一些变动,拿http请求来说,可以对http的请求头,http路径做相应的变动。
四层负载均衡
再来看看四层负载均衡,它一般是指针对连接做的负载均衡,举例说明下,有A,B两台服务器,同样采取轮询的策略,某个客户端发起一个新的连接,经过均衡器连接到了A服务器,现在又来一个客户端同样发起连接,经过均衡器后,此时就该和B服务器建立连接了。而在同一个连接里是能够发送多个请求的,这也是和七层负载均衡最本质的区别,它是针对连接做的负载均衡。
(资料图片仅供参考)
实现四层负载均衡器
实现四层负载均衡策略的方式有很多,比较著名的四层负载均衡软件就有lvs,它是通过修改数据包的ip地址或者mac地址实现四层负载均衡,性能较好,工作模式有好几种,具体的就不在本文展开了。
本文实现的四层负载均衡的原理和nginx四层负载类似,通过均衡器在客户端和服务端之前都维护一个连接来达到让 客户端在同一个连接里发送的请求都会被服务端同一个连接所接收的目的。如下图所示:
以后client1 通过连接A发的请求都会由连接B发往服务器,而client2通过连接C发送的请求,都将经过连接D发往另一台服务器。
实现逻辑
现在让我们来实现下这部分的逻辑,我将会以轮询的策略实现连接的负载均衡。
并且这里还要考虑下实现数据复制的逻辑,我们需要在均衡器分别建立对客户端和服务端的socket连接,并且将其中一个socket的数据转移到另一个socket,如果每次都将某一个socket数据读到用户层,再写到另一个socket就会导致一些没有必要的拷贝。伪代码如下:
var (src // 一个socket 连接dst // 一个socket连接)// ...buf = make([]byte, size) nr, er := (buf)nw, ew := (buf[0:nr])
有没有什么技术让内核自动将某个socket的数据转移到另一个socket,不用将数据拷贝到应用层来,这正是零拷贝相关的技术,关于零拷贝的技术原理我在之前这篇文章 有很详细的介绍,内核提供了一个splice的系统调用,专门用于socket连接间拷贝数据,只需要调用时传入对应socket连接的文件描述符即可让内核自动完成拷贝过程。
func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
这个系统调用已经被golang更深层次的封装到了一个比较常用的方法里,这个方法会自动判断reader和writer底层的类型,如果都是socket连接则会调用splice系统调用实现零拷贝。
func Copy(dst Writer, src Reader) (written int64, err error) { return copyBuffer(dst, src, nil) }
接着我们看下均衡的代码逻辑,运行逻辑如下:
1, 监听到新连接,启动一个协程去处理连接。
2 , 在新协程里与通过轮询的策略,选择一个后端服务器并与之建立连接。
3, 启动两个协程分别进行 ,将客户端的socket写到服务端socket,将服务端socket返回的信息写到客户端socket。代码如下:
type Server struct { Li Balance } func (s *Server) Run() { for { c, err := () if err != nil { (err) } go func(c ) { remoteAddr := () backendIp := (()) serverConn, err := ("tcp", backendIp) if err != nil { (err) () return } ("获取到了新连接", remoteAddr, backendIp) go func() { _, err := (serverConn, c) if err != nil { (err, 1) } () () ("结束1", err) }() go func() { _, err := (c, serverConn) if err != nil { (err, 2) } () () ("结束2", err) }() }(c) } }
会不断的拷贝源socket的数据到目的socket,直到连接关闭。
更好的方案
可以看到上述方案中维护一个客户端的连接将会启动3个协程,当连接量上去后,均衡器很可能成为瓶颈,有没有办法减少下协程的数量,可以直接采用epoll的方式监听连接的读写,以及关闭事件(这样能在一个协程里处理多个连接),当连接可读时,直接使用splice系统调用对数据进行拷贝直到返回 就停止,因为返回 说明连接缓冲区内的数据暂时被读取完了,继续下一次epoll wait的监听循环。这样能极大的减少协程数量。不过实现我就不准备再继续展开了,后续有空再补充下这部分。对epoll的使用有兴趣的同学也可以看看我之前一篇用epoll实现类似redis的网络模型框架这篇文章
测试负载均衡代码
现在让我们来测试下负载均衡的代码,我会用docker-compose去启动两个mysql,然后本地启动我们负载均衡器的代码,之后用两个mysql客户端去连接负载均衡器,看下是不是mysql客户端连接到了不同的mysql服务器。
docker-compose的配置文件如下:
version: '3' services: mysql1: restart: always image: amd64/mysql:latest container_name: mysql1 environment: - "MYSQL_ROOT_PASSWORD=1234567" - "MYSQL_DATABASE=test" ports: - "3306:3306" mysql2: restart: always image: amd64/mysql:latest container_name: mysql2 environment: - "MYSQL_ROOT_PASSWORD=1234567" - "MYSQL_DATABASE=test2" ports: - "3307:3306"
为了能验证不同客户端的确连上了不同的mysql服务器,我在mysql1上创建了test数据库,在mysql2上创建了test2数据库。到时候连上不同服务器数据库是不一样的。
均衡服务器监听5555端口启动
s := &{} li, err := ("tcp", ":5555") if err != nil { (err) } = li = () ("", "mysql1") ("", "mysql2") ()
之后用mysql客户端去连接均衡服务器
## client1mysql -h -u root -P 5555 -D test -p1234567## client2mysql -h -u root -P 5555 -D test2 -p1234567
发现两个mysql客户端的确连接到了不同服务器,并且能正常执行命令,over。
下一篇:最后一页
- 微资讯!如何实现四层负载均衡
- 中国南航召开在韩中资企业产品发布会
- 中国大数据交易所,成立第9年 世界快消息
- 要闻速递:东北财经大学开设专业有什么 东北财经大学优势专业是什么
- 每日观察!预告|“双争”有我——6月“时代新人·河北好人”即将发布
- 通俗解读大学专业
- 辟谣!高铁踹座老人为退休政法干部信息不实
- 宁波全域预警!一地冰雹橙色预警!今天要爆发……
- 360借条几天不还会上征信 会有哪些影响
- 大唐四川发电有限公司2023年高校毕业生招聘公告-焦点快报
- 全球热讯:什么是企业刑事合规?
- 美国纽约收容所中无家可归者人数超10万,创历史新高
- 海新能科:公司将继续加强催化剂、加氢工艺及技术的研发工作,稳定产能、提高生产能力,降低单位成本
- 也门政府军基地遭无人机袭击造成至少4人死亡
- 热文:新莱福(301323.SZ):今年开始,医用防辐射材料开始全面推向市场
-
微资讯!如何实现四层负载均衡
四层负载均衡和七层负载均衡七层负载均衡首先,我们来看下七层负载均衡
-
汉宇集团接待中信证券等多家机构调研_世界消息
汉宇集团接待中信证券等多家机构调研
-
环球即时:鸡尸牛从_关于鸡尸牛从简述
小伙伴们,你们好,今天小夏来聊聊一篇关于鸡尸牛从,关于鸡尸牛从简述
-
环球今日报丨【甘快看】甘肃渭源县:15.6万人喝上洮河水
6月29日,引洮工程渭源县北部供水水源置换工程通水,覆盖区域内12个乡
-
天天实时:【甘快看】甘肃水环境质量进一步改善 水污染防治“任重道远”
中新网甘肃新闻6月30日电(记者冯志军)黄河流域生态保护和污染防治取得
-
当前简讯:【甘快看】甘肃省矿产资源勘查开发高质量发展论坛举行
6月28日,甘肃省矿产资源勘查开发高质量发展论坛举行。论坛主题为“强
-
【甘快看】甘肃:数字赋能激发文旅产业发展潜能
近年来甘肃不断通过数字技术拓展文旅的表现力,将大数据、人工智能这些
-
中国南航召开在韩中资企业产品发布会
南航韩国营销中心总经理王巡致辞。 刘旭 摄中新网首尔6月30日电(记者
-
环球快消息!@所有毕业生:毕业求职季,小心被间谍盯上!
近年来,境外间谍情报机构抓住即将毕业的大学生急于赚钱、追求高薪的心
-
世界速递!f12011配置要求_《f12011》玩后感优缺点分析
《f12011》玩后利弊分析,我很想告诉你玩后的感受,但说实话,我真的觉
-
百利科技:拟与金彩矿业、宝圣佳优共同投资设立合资公司
南方财经6月30日电,百利科技公告,拟与金彩矿业、宝圣佳优共同投资设
-
微视频丨这是信仰的力量
信仰是什么?是一面面热情挥舞着的五星红旗,是一幕幕令人铭记的历史瞬
-
【甘快看】张掖市?甘州区:养老不离村,晚年享幸福-世界新动态
7点半起床收拾内务、打扫卫生,早餐是鸡蛋、牛奶、馒头和小菜;上午在
-
环球视讯!【甘快看】甘肃临夏:联合国教科文组织专家对拟建临夏世界地质公园开展实地考察评估
新华社客户端甘肃频道6月29日电(记者胡伟杰)6月26日至28日,联合国教
-
中国大数据交易所,成立第9年 世界快消息
中国大数据交易所,成立第9年,广州,金融,比特币价格,大数据交易所
-
宁夏创业项目获西部农民工返乡创业大赛三等奖|微速讯
6月27日,“西部大赛·创响未来”第三届西部农民工返乡创业大赛在重庆
-
银川开展全市安全用气培训 构建全民共管共控安全用气环境-天天微动态
6月30日,记者从银川市市政管理局获悉,该局制定了《关于开展燃气居民
-
南宁到桂林多少公里开几个小时_南宁到桂林多少公里-天天精选
1、楼上悲剧…没看清题目…桂林离南宁400公里左右灵川离桂林15公里左右
-
天天简讯:梦幻西游黑暗料理合成(梦幻西游黑暗料理)
诸多的对于梦幻西游黑暗料理合成,梦幻西游黑暗料理这个问题都颇为感兴
-
兰州公安推出“家门口”户籍服务 惠民暖民更贴心-视点
西北角·中国甘肃网记者程健通讯员范国臣魏一茜“只要您愿意,落户我来
-
兰州新区新增6项县级非遗项目 各级非遗项目增至13项
各级非遗项目增至13项中国甘肃网6月30日讯据兰州日报报道(记者张建平
-
环球精选!兰州新区将举办首届“才聚新区·智创未来”人才节
新区将举办首届“才聚新区·智创未来”人才节中国甘肃网6月30日讯据兰
-
甘肃省颁发首批农村土地承包经营权不动产权证书
6月28日,甘肃省首批农村土地承包经营权不动产权证书颁发仪式在白银市
-
全球最新:第二十九届兰洽会嘉峪关市筹备工作推进会召开 何正义主持并讲话
何正义主持并讲话中国甘肃网6月30日讯据嘉峪关日报报(记者文静)6月29
-
要闻速递:东北财经大学开设专业有什么 东北财经大学优势专业是什么
高考填报志愿时,东北财经大学有哪些特色优势专业是广大考生和家长朋友
广告
X 关闭
1、上海到张家界适合自驾还是坐飞机到底是自驾游还是坐飞机,个人认为应视情况而定,一是如果你们是一帮年
广告
X 关闭
(相关资料图)近日,不少地方迎来疫情大考。由于快递、外卖运力不足,加上药品断货、抗原检测试剂脱销等,不...