当前位置: 首页 > wzjs >正文

提升网站建设网店买卖有哪些平台

提升网站建设,网店买卖有哪些平台,潍坊大型做网站建设的公司,网站建设高我吐槽过,reuseport socket 没做一致性 hash,socket 新建或者退出时,会对所有 session 产生影响: 新建 socket 会追加到 group 最后,增加组员数量 num,进而影响 hvalue % num 结果;socket 退出…

我吐槽过,reuseport socket 没做一致性 hash,socket 新建或者退出时,会对所有 session 产生影响:

  • 新建 socket 会追加到 group 最后,增加组员数量 num,进而影响 hvalue % num 结果;
  • socket 退出时会用 group 最后一个 socket 替换退出者的 index,递减组员数量,影响 hash 结果。

要做一致性 hash,需要单独写 ebpf 程序 attach 到 reuseport lookup 的位置,但要想实现这个 ebpf 程序其实也麻烦,因为相当于你要手工跟踪和维护 socket 的 slot index,比方说 session k 会映射到 index = m 的一个socket m,但由于某个 socket 退出,socket m 的 index 发生了变化,要想捕捉到这个变化以重建映射,需要监控 socket 退出事件并持续跟踪 socket m 的原始 slot index,这件事可做,但非常繁琐。

还是老方法,麻烦的事情需要拿点东西来换。这次拿点 standby 或占位符来换。

如果我需要在 n 个 reuseport socket 之间做一致性 hash 映射,我会创建 n + d 个 reuseport socket,k 可以从 1 到 n 不等,然后我的 ebpf 始终只做 index = hvalue % n 即可,这种情况下,即使 n 个 socket 中有一个挂了,后面那 d 个 standby socket 的最后一个马上就填充了退出者的位置,接管服务,可谓透明无感。
在这里插入图片描述

核心思想是,由 ebpf 程序自行控制从哪里到哪里进行 hash,而不是有多少算多少,全部参与运算。示例代码如下:

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <bpf/bpf_helpers.h>#define FIRST_N 4SEC("sk_reuseport")
int reuseport_prog(struct sk_reuseport_md *ctx)
{void *data = (void *)(long)ctx->data;void *data_end = (void *)(long)ctx->data_end;struct ethhdr *eth = data;if (data + sizeof(*eth) > data_end)return SK_DROP;data += sizeof(*eth);struct iphdr *ip = data;if (data + sizeof(*ip) > data_end)return SK_DROP;data += ip->ihl * 4;struct udphdr *udp = data;if (data + sizeof(*udp) > data_end)return SK_DROP;__u64 hash = ip->saddr;hash = hash * 31 + ip->daddr;hash = hash * 31 + udp->source;hash = hash * 31 + udp->dest;return hash % FIRST_N;
}

这个一致性 hash 策略也将大大降低昨天我那个热升级方案的复杂性。假设旧版本服务有 m 个 reuseport socket,新版本 socket 有 n 个,我在升级的时候,会创建 n + m 个 reuseport socket,其中后面 m 个并不提供任何服务,它们只是在前面旧版本服务退出后占位符,等到旧版本服务全部退出后,它们也将按顺序集体退出,这样真正的新版本服务 socket index 只需要一次新集体平移 m 个单位即可:
在这里插入图片描述

唯一的问题还是需要服务自行跟踪和维护自己的 index,所以 reuseport 至少还缺一个 getsockopt 调用:SO_REUSEPORT_GETINDEX:

void get_reuseport_index(int sockfd) 
{int index;socklen_t len = sizeof(index);if (getsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT_GETINDEX, &index, &len) == 0) {printf("This socket is at index %d in the reuseport group\n", index);} else {perror("getsockopt(SO_REUSEPORT_GETINDEX) failed");}
} 

否则,就要通过下面的非常规手段获得进程 pid,socket index 的关系:

// 运行方法 bpftrace ./trace.btkprobe:reuseport_add_sock
{$pid = pid;$sk = (struct sock *)arg1;$port = (($sk->__sk_common.skc_num & 0xff) << 8) | (($sk->__sk_common.skc_num >> 8) & 0xff);$reuseport = (struct sock_reuseport *)($sk->sk_reuseport_cb);printf("add sock PID: %d, Port: %d, Sock:%p\n", $pid, $port, $sk);printf("curr num_socks and this index is %d \n", $reuseport->num_socks);
}kprobe:reuseport_detach_sock
{$pid = pid;$sk = (struct sock *)arg0;$port = (($sk->__sk_common.skc_num & 0xff) << 8) | (($sk->__sk_common.skc_num >> 8) & 0xff);$reuseport = (struct sock_reuseport *)($sk->sk_reuseport_cb);printf("remove sock PID: %d, Port: %d, Sock:%p\n", $pid, $port, $sk);printf("curr num_socks and this index is %d \n", $reuseport->num_socks);
}

这些关系被打印出来只是在这篇文章中被看清,实际上应该保存起来备用,在 SO_REUSEPORT_GETINDEX 被支持之前,这个信息非常重要。

注意,下面的方法不能保证导出的顺序就是 reuseport socket group 的 index 顺序,慎用!甚至 proc/$pid/fd 的链接时间戳都不好使:

root@vbox:/proc/net# cat udpsl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops384: 00000000:3039 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 16567 2 00000000c107c9c0 0384: 00000000:3039 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 15892 2 00000000023d3ee4 0
root@vbox:~# ls -l /proc/1000/fd
total 0
lrwx------ 1 root root 64 Mar 31 21:30 0 -> /dev/pts/0
lrwx------ 1 root root 64 Mar 31 21:30 1 -> /dev/pts/0
lrwx------ 1 root root 64 Mar 31 21:30 2 -> /dev/pts/0
lrwx------ 1 root root 64 Mar 31 21:30 3 -> 'socket:[15892]' 

浙江温州皮鞋湿,下雨进水不会胖。

http://www.dtcms.com/wzjs/368880.html

相关文章:

  • 网站开发流程可规划为那三个阶段免费友链平台
  • wordpress快速制作app安徽网站关键词优化
  • 哪个网站能学做微商软文广告是什么意思
  • 玉溪企业网站建设公司怎样建立一个网络销售平台
  • 移动端网站日历怎么做国外搜索引擎网站
  • 自己做头像的网站非流光百度知道官网登录入口
  • 购物网站开店免费百度高级搜索
  • 和网站设计人员谈价要注意什么建站系统推荐
  • 济南济阳哪有做网站的分销渠道
  • 网站建设一般要多钱属性词 关键词 核心词
  • 曰本真人性做爰视频网站seo网站编辑是做什么的
  • 成都解放号网站建设快优吧seo优化
  • 福建老区建设网站推广码怎么填
  • 网站程序制作软件seo网站排名全选
  • 专业模板网站制作多少钱seo的优点和缺点
  • 网站建设怎样宣传比较好html+css网页制作成品
  • 网站做打火机如何韩国日本比分
  • 系统网站建设ppt模板下载站内优化
  • 用c 做网站短视频营销案例
  • 东莞seo建站优化费用b站推出的短视频app哪个好
  • 想开个视频网站该怎么做怎样在百度上发布自己的文章
  • 域名备案需要有网站吗百度推广费用预算表
  • 小说主角重生之后做网站seo优化轻松seo优化排名
  • 中国建设监督网站seo网络优化专员
  • kindeditor wordpress西藏自治区seo 标题 关键词优化
  • 云开发网站腾讯广点通
  • 浙江建设职业技术学院网站网络推广企划
  • 青岛专业做网站的公司网络优化软件有哪些
  • 电影网站建设java百度推广登录后台登录入口
  • 做化工回收的 做那个网站什么都能搜的浏览器