报错
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "Connection reset by peer"
debug_error_string = "{"created":"@1656122568.552913904","description":"Error received from peer ipv4:xxx.xxx.57.213:30083","file":"src/core/lib/surface/call.cc","file_line":1067,"grpc_message":"Connection reset by peer","grpc_status":14}"
raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "connections to all backends failing"
debug_error_string = "{"created":"@1656122569.146862274","description":"Failed to pick subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":5419,"referenced_errors":[{"created":"@1656122568.553159260","description":"connections to all backends failing","file":"src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc","file_line":335,"grpc_status":14}]}"
问题
k8sVIP,服务端和客户端,超时复位:
https://www.codercto.com/a/45450.html
https://www.jianshu.com/p/ce4d0c866a2c
详细解决方案:
本质上就是让探针及时探测到断开情况并重连,就是保持在发送消息的时候处于连接的状态
解决思路:http://longfan.me/post/devops/2020-07-09
术语解释:https://webhostinggeeks.com/howto/configure-linux-tcp-keepalive-setting/
GRPC官方文档:
https://grpc.io/docs/languages/python/basics/
理解
详细概念理解:https://www.yixuebiancheng.com/article/88647.html
tcp KeepAlive 并不是 tcp 协议的一部分,但是大多数操作系统都实现了这个机制。KeepAlive 机制可以理解为:
这3个参数与TCP KeepAlive有关.默认值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某个TCP连接在idle空闲 2个小时后,客户端内核才发起probe.如果probe9次(每次j间隔75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务
Solution
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 30
600 + 9 * 30 = 870 < 900
尝试把net.ipv4.tcp_keepalive_time + net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl改成了小于 900 的值以后,经过观察和测试,貌似出现Error: 14 UNAVAILABLE: TCP Write failed错误信息的概率变小了, 问题看起来暂时解决了一部分,准备再观察一段时间看看情况。
docker指令run配置:https://docs.docker.com/engine/reference/commandline/run/
--rm Automatically remove the container when it exits
--privileged Give extended privileges to this container
要根据自身的业务来调整这三个参数,有下面三种方式:
第一种方式:
# vim /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
# sysctl -p
第二种方式:
# echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
第三种方式:
# sysctl -w net.ipv4.tcp_keepalive_time=600
# sysctl -w net.ipv4.tcp_keepalive_probes=2
# sysctl -w net.ipv4.tcp_keepalive_intvl=2
术语 HTTP,TCP, socket,RPC 与gRPC都是啥
参考:https://blog.csdn.net/qq_15821487/article/details/125868985?spm=1001.2014.3001.5501
首先回顾下计算机网络的五(七)层协议:物理层、数据链路层、网络层、传输层、(会话层、表示层)和应用层。那么从协议上来讲:
TCP是传输层协议,主要解决数据如何在网络中传输
HTTP 是应用层协议,主要解决如何包装数据(文本信息),是建立在tcp协议之上的应用。TCP协议是以二进制数据流的形式解决传输层的事儿,但对上层的应用开发极不友好,所以面向应用层的开发又产生了HTTP协议。
而socket 是针对TCP或UDP的具体接口实现,提供了在传输层进行网络编程的方法。
理解:https://network.51cto.com/article/609479.html
理解1:https://www.programminghunter.com/article/87951280996/
理解2:https://blog.csdn.net/u013078871/article/details/118680029
理解3:https://blog.csdn.net/pearl8899/article/details/118640086
RPC 远程过程调用(分布式、微服务间的方法调用)
HTTP 无状态,每次请求都要发送一个request,服务器响应之后就断掉(http header中的keep-alive指的是tcp)
TCP 面向连接,三次握手保证通信可靠
UDP 非面向连接,不可靠,速度快(可以手动对数据收发进行验证,IM系统多采用,QQ)
socket TCP协议的接口实现,面向传输层进行网络编程
RPC原理是什么?
grpc:grpc是谷歌开源的一个 rpc 框架,面向移动和 http/2 设计。
1.什么是Socket?
为何有http协议之后,还要RPC调用?
通俗解释:HTTP VS RPC (普通话 VS 方言)
HTTP 与 RPC 的关系就好比普通话与方言的关系。要进行跨企业服务调用时,往往都是通过 HTTP API,也就是普通话,虽然效率不高,但是通用,没有太多沟通的学习成本。但是在企业内部还是 RPC 更加高效,同一个企业公用一套方言进行高效率的交流,要比通用的 HTTP 协议来交流更加节省资源。整个中国有非常多的方言,正如有很多的企业内部服务各有自己的一套交互协议一样。虽然国家一直在提倡使用普通话交流,但是这么多年过去了,你回一趟家乡探个亲什么的就会发现身边的人还是流行说方言。
如果再深入一点说,普通话本质上也是一种方言,只不过它是官方的方言,使用最为广泛的方言,相比而言其它方言都是小语种,小语种之中也会有几个使用比较广泛比较特色的方言占比也会比较大。这就好比开源 RPC 协议中 Protobuf 和 Thrift 一样,它们两应该是 RPC 协议中使用最为广泛的两个。
备注
idle
英 [ˈaɪdl] 美 [ˈaɪdl]
adj.
懈怠的;懒惰的;闲置的;没有工作的;闲散的;漫无目的的;空闲的
v.
混时间;闲荡;无所事事;空转;挂空挡;未熄火;(尤指暂时地)关闭工厂,使(工人)闲着