- 博客(72)
- 收藏
- 关注
原创 认识Electron 之开启探索世界二(绝对干货!!!)
前三行代码的作用是导入必要的模块,其中app是用来控制应用的生命周期,BrowserWindow是用来创建和管理应用程序窗口,readFileSync是node.js中的文件读取方法,允许同步的读取文件内容,path是用来处理和转换文件路径的node.js模块。1.窗口的基本概念:每个窗口都是一个独立的浏览器窗口,由主进程通过BrowserWindow模块创建和管理,每个窗口对应一个渲染进程负责加载和显示网页内容。父窗口:通过parent属性指定父窗口,子窗口会始终显示在父窗口的上方。
2025-02-11 18:00:09
1073
原创 项目发布的三大方式
项目在逻辑上分为AB组,在进行项目升级时,首先将A组从负载均衡中摘除进行新版本的部署,B组仍然继续提供服务,A组升级完成上线B组从负载均衡中摘除。:只升级部分的服务,让一部分用户继续使用老版本另外一部分使用新版本,如果用户对新版本没什么问题那么九逐步扩大范围,把所有用户都迁移到新版本上。:每次只升级一个或者多个服务,升级完成后加入生产环境,不断执行这个过程知道集群的旧版本全部升级成新版本。部署周期长且发布策略复杂不易回滚。缺点:对自动化的要求比较高。用户无感知,平滑过渡。用户无感知,平滑过渡。
2025-02-11 11:47:34
212
原创 Kubernetes集群搭建之部署Etcd集群
以上操作时先下载下cfssl所需要的相关的软件包,其中第一个安装包的作用是创建证书、签发证书和管理证书,第二个安装包的作用是处理和转换cfssl输出的json数据,第三个安装包用于查看和解析证书的详细信息。上述命令操作表示该服务会在网络服务启动之后启动并且会确保服务在网络完全可用时启动,之后的命令操作表示指定环境配置文件的路径,etcd启动时会读取此文件中的配置并且定义了启动服务的命令,之后设置了服务端的证书和私钥用于加密通信以及设置了与集群成员通信的证书和私钥。• ETCD_DATA_DIR:数据目录。
2025-02-10 20:04:20
934
原创 Ansible自动化部署K8s集群一 Ansible的基础使用实战
1.安装ansible: yum install ansible -y2.ansible的架构图:3.ansible四部分:inventory:ansible管理的主机信息,包括ip地址、ssh端口、账号和密码等modules:任务均由模块完成plugins:增加ansible的核心功能playbooks:模块化当以一些列任务供外部调用5.命令行使用:ad-hoc可以输入内容快速执行某个操作上述的密钥信息也可以在ansible.cfg配置文件中指定。
2025-02-10 13:57:20
1406
原创 认识Electron 开启新的探索世界一
在创建窗口时,我们传入了配置对象 webPreferences: {nodeIntergration: true},此配置对象告诉electron需要为页面集成node.js环境并赋予index.html页面中的javascript访问node.js的能力。1.electron给index.js提供了完整的node.js环境的访问能力,index.js可以像所有node.js程序一样,通过require引入其他的js文件。2.启动窗口:在项目的根目录下创建index.js文件。
2025-02-09 19:56:33
928
原创 Kubernetes之kube-proxy运行机制分析
此外,kube-proxy在iptables中为每个Service创建了由Cluster IP+Service端口到kube-proxy所在主机+service的代理服务所监听的端口的转发规则。,如果不存在,则会按照RR算法为该请求挑选一个Endpoint,并创建一个affinityState对象,记录请求的IP和指向的Endpoint,后面的请求就会。KUBE-NODEPORT-HOST:从主机中通过Service的Nodeport端口号访问service的请求。,另外在此算法的基础上。
2025-02-09 17:11:29
522
原创 Netty初学九 心跳与空闲检测
如果在一段时间内客户端没有收到服务端发来的数据包,则可以判定这个连接为假死状态,因此,服务端的Pipeline中需要再加上一个Handler,这个处理无需登录,所以一般会将这个Handler放在AuthHandler前面。连接假死的现象是:在某一端看来,底层的Tcp连接已经断开,但是应用程序没有捕获到,会认为这条连接仍然是存在的。对于服务端来说,客户端的连接如果出现假死,那么服务端将无法收到客户端的数据,反之,这个连接还是活的,服务端对于连接假死的应对策略是空闲检测。非假死状态下确实没有发送数据。
2025-02-09 13:45:20
831
原创 Netty初学八 群聊消息的收发及Netty性能优化
因为上述服务端的代码,在Pipeline中,绝大部分都是与指令相关的handler,Handler越多其链越长,事件传播过程性能损耗会逐渐被放大,因为解码器decode出来的每个Packet对象都要在每隔Handler上经过一遍,因此我i们需要缩短这个事件传播路径。netty的逻辑是,每次有新连接到来的时候都会调用ChannelInitializer的initChannel()方法,与指令相关的Handler每次都会被创建一次。这样每次来一个新连接,添加Handler的时候就不需要每次都创建。
2025-02-09 12:24:59
393
原创 Netty初学七 Pipeline与ChannelHandler && 构建客户端与服务端的Pipeline
上述代码的作用是接收上一个Handler的输出,里面的mag是上一个Handler的输出,其默认情况下的Adapter会通过fireChannelRead()方法直接把上一个Handler的输出结果传递到下一个Handler,Outbound同理。调用父类的write()方法,父类的write()方法会自动调用下一个outboundHandler的write()方法,并且会将outboundHandler里处理完毕的对象传递给下一个outboundHandler。
2025-02-08 17:44:55
592
原创 Netty初学六 客户端登录以及客户端与服务端收发消息
思路:给客户端连接Channel绑定属性,通过channel.attr().set()方式,在登录成功之后给Channel绑定一个登录成功的标志位,然后再判断登录成功的时候取出这个标志位。客户端拿到数据之后,调用PacketCodeC进行解码操作,如果类型是登录响应包,即在控制台打印出一条消息。客户端首先构建一个登录请求对象,然后通过编码把请求对象编码为ByteBuf,写到服务端。客户端接收服务端的响应数据之后解码ByteBuf,获得登录响应的对象判断是否登录成功。
2025-02-08 15:47:11
406
原创 Netty初学五 客户端与服务端通信协议编解码
第一个字段魔数,通常情况下是固定的几个字节,该字段的作用是服务端可以根据这个字段的信息进行比对,可以判断出这个数据包并非遵循自定义协议的,即无效的数据包。1.客户端与服务端的通信是基于tcp通信的数据包格式均为二进制,协议指的是客户端和服务端事先商量好的,每一个二进制包中每一段字节分别代表什么含义。以上过程为java对象的定义,可以根据一种规则把一个java对象转换成二进制数据,即java对象的序列化。第三个字段的序列化算法表示如何将java对象转换成二进制数据以及如何将二进制数据转换成java对象。
2025-02-08 12:46:07
438
原创 Netty初学四 数据载体ByteBuf
slice() duplicate() copy():第一个方法是截取readerIndex到writeIndex之间,并且返回的ByteBuf的最大容量是原始的readableBytes(),第二个方法是把整个ByteBuf都截取出来,前两个方法的相同点是底层是与原始的ByteBuf共享,即经过返回的ByteBuf的对象调用write方法都会影响到原始的ByteBuf,但是它们维持的与原始的读写指针不同的指针,最后一个方法会直接从原始的ByteBuf中复制信息。
2025-02-08 11:39:58
1053
原创 Netty初学三 客户端与服务端双向通信
首先获取一个Netty对二进制数的抽象ByteBuf,ctx.alloc()获取一个ByteBuf的内存管理器,然后将二进制数据填充到ByteBuf,最后调用ctx.channel().writeAndFlush()把数据写到服务端。从以上代码中可以看出,Netty里的数据是以ByteBuf为单位的,所需要写的数据必须放在一个ByteBuf中,读数据也如此。ch.pipeline()返回的是和这条连接相关的逻辑处理链,采用的是责任链模式。服务端覆盖的方法是channelRead()方法。
2025-02-08 09:18:00
372
原创 Netty初学三 客户端启动流程
上述代码中,定时任务调用的是 bootstrap.config().group().schedule(),其中bootstrap.config()这个方法是对bootstarp配置参数的抽象化,bootstrap.config().group()返回的是线程模型workerGroup()在一般情况下,连接失败不会立即重连,会调用自身重连,但是通常情况下,连接失败不会立即重连,而是每隔1秒 2秒 4秒 8秒,以2的幂次来建立连接,到达一定次数之后就放弃连接。和服务端一样需要需要指定线程模型,驱动连接的读写。
2025-02-07 18:59:52
423
原创 Netty初学二 服务端启动流程
1.服务端启动的最小代码: 上述代码: 2.自动绑定递增端口: 上述示例中绑定了8000端口,但是,在一般情况下这个端口可能被占用,因此找一个没有被占用的端口号还是比较有概率性的,那我们如何将这件事情做到自动化呢?即我们只需要给一个起始的端口号,然后自动向上找一个可用的端口为止,以此类推。以下为实现代码: 其中serverBootstrap方法为一个异步(不会等到端口绑定完成后再继
2025-02-07 18:17:44
830
原创 Netty初学二 即时聊天系统简介
这段代码是服务端首先创建一个serverSocket来监听8000端口,然后创建一个线程,线程里不断调用阻塞方法serverSocket.accept()获取新连接,当获取新连接之后,为每一个新连接都创建一个新线程,这个线程负责从该连接中读物数据(以字节流的方式读取)IO读写面向流,一次性只能从流中读取一个字节或者多个字节,并且读完之后流无法再读取,需要自己缓存数据,NIO的读写是面向Buffer的,可以随意读取里面的任何字节数据,不需要自己缓存数据,只需要移动读写指针即可。1.每个小朋友都配一个老师。
2025-02-07 15:07:52
556
原创 Netty入门初学一
刚开始,打开那个博主的网站源码之后两眼一抹黑,这么长,怎么都是英文,注释都看不懂啊,这写都是什么意思,想要学习的好奇心瞬间减半,但是还是坚守初心,硬着头皮尝试通过各种方式(看博客、看视频等)让自己理解,最后发现自己所领悟的少之甚少,浪费时间,撤退。于是,对于netty的学习就搁置下来。这里说一下原因,首先,语言描述还算自然,另外还有原理图等,这样会更加形象,最后,它是以一种问答式的当时来推进,可以让自己先大概思考一下如果是自己会怎么解决,如果是在想不出来,那自己也会非常好奇的想要继续读下去。
2025-02-07 13:09:45
193
原创 DNS探秘之一 nslookup
每个dns服务器里都有一个高速缓存区,这里面存放这这台dns服务器最近经手的域名ip的映射关系,以及获得这些映射关系的查询出处,这样做的好处是如果下次还有请求是询问查询过的域名和ip的信息时,这台dns服务器就不需要再次发起递归查询或迭代查询而是直接在缓存中寻找,但是缓存信息一般会有一定的信任时间。于是上连dns服务器会求助于根dns服务器,然后该请求会主机转发,顺序是cn的dns服务器-->edu.cn的dns服务器--->bupt.edu.cn的dns服务器。
2025-02-07 12:28:46
1036
原创 docker容器编排工具 docker compose
1.docker compose 是一个用于定义和运行多容器docker应用程序工具定义服务:使用yaml格式的配置文件来定义一组相关的容器服务,每个容器可以指定镜像、端口映射、环境变量、存储卷等参数。
2025-02-05 23:39:22
1400
原创 Docker数据卷管理及优化
docker run --volumes-from datavol -v `pwd`:/backup busybox tar zcf /backup/data1.tar.gz /data1 将当前目录挂载到本地容器中用于和容器交互保存要备份的容器,备份数据到本地。docker volume create test,这条命令执行会在默认的数据卷目录下(/var/lib/docker/volumes/)创建test目录,并在该目录下创建_data目录。性能差并且生命周期和容器相同。
2025-02-05 21:15:03
849
原创 Docker网络基础
三种自定义网络驱动:bridge overlay macvlanbridge驱动类似默认的bridge模式,overlay和macvlan是用于创建跨主机网络。
2025-02-04 21:43:07
1040
原创 Docker技术相关学习三
registry docker仓库:镜像和图标的仓库,不具有本地数据库以及不提供用户认证,通过index auth service的token方式进行认证。开启registry:docker run -d -p 5000:5000 --restart=always --name registry registry。用于存储和分发docker镜像的集中式存储库,开发者可以将自己创建的镜像推送到仓库中也可以从仓库中拉取所需要的镜像。registry会根据client的请求传递镜像到客户端。
2025-02-04 18:30:14
1376
原创 Docker技术相关学习二
1.Docker之父Solomon Hykes形容docker就像传统的货运集装箱。轻量级虚拟化:Docker容器相较于传统的虚拟机更加的轻量和高效,能够快速的启动和停止来节省系统资源。一致性:确保应用程序在不同的环境中具有一致的运行表现可移植性:可以轻松的将docker从一个平台迁移到另一个平台,无需考虑依赖和环境配置的差异最高的资源利用:多个docker可以共享主机的操作系统内核从而可以更有效的利用系统资源。易于部署和扩展:能够快速部署新的应用实例,也可以轻松的进行水平扩展。
2025-02-04 15:46:51
1010
原创 Kubernetes学习之网络
pod之间可以直接通过ip地址通信,但前提是pod知道对方的ip,在kubernetes中pod因为会被频繁的销毁和创建,其ip不是固定的,因此,需要一个稳定的前端对外提供服务的service(其ip不变)将请求转发给正确的pod。2.默认情况下,所有的pod是非隔离的,即任何来源的网络流量都可以访问pod,没有任何限制,当pod定义了NP时,只有policy允许的流量才可以访问pod。pod的ip时集群可见,即集群中任何其他的pod和node都可以通过ip直接与pod进行通信。
2025-02-04 10:20:44
1006
原创 Kubernetes学习之包管理工具(Helm)
执行helm repo index生成仓库的index文件:helm repo index myrepo/ --url http://192.168.56.106:8080/charts,helm会扫描myrepo目录中的所有tgz包生成index.yaml,其中--url指定的是新仓库的访问路径。调试chart:helm lint mychart会检测chart的语法,helm install --dry-run --debug会模拟安装chart,并输出每个模板生成的yaml内容。
2025-02-03 19:43:55
1068
原创 Kubernetes学习之通过Service访问Pod
1.当通过deployment等controller动态创建和销毁pod使得每个pod都有自己的ip地址,当controller用新的pod替代发生故障的pod时,新的pod会分配到新的ip地址,那么客户端如何稳定的找到并访问pod提供的服务。2.创建serviceservice从逻辑上代表一组pod(是由label挑选出来),service拥有自己的ip,这个ip地址不变,客户端只需要访问service的ipkubernetes负责建立和维护service和pod之间的映射关系。
2025-02-03 15:00:31
877
原创 Linux学习之DNS基础服务器搭建
1.dns服务主要的功能是将域名转换为相应的ip地址,提供dns服务的系统就是dns服务器2.dns服务器分为3种主域名服务器:本身提供dns服务,不含区域数据文件辅助域名服务器:和主域名服务器一起提供dns服务,当主域名服务器上的配置信息修改时会自动更新到辅助域名服务器实现同步缓存服务器:没有自己的区域文件,只是帮助客户端向外部dns请求查询,然后将结果保存在它的缓存里面。
2025-02-02 15:55:07
927
原创 Linux防火墙基础
默认策略定义格式:iptables -t(表名) -P(链名) (动作)-t:表示指定默认策略应用于哪个表,可以使用filter nat mangle,如果没有指定使用哪个,默认使用filter表链名:指定默认策略应用于哪个链,可以使用input ouput等动作:处理数据包的动作,可以使用accept(接收数据包)和 drop(丢弃数据包)
2025-02-02 12:29:49
770
原创 MySQL高可用
使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器,因此可以保证所有节点的数据一致性。当master出现故障时,会自动将最新数据的slave提升为新的master,然后将其他所有的slave重新指向新的master。1.利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用响应的路由策略来处理连接来使其连接到正确的mysql数据库服务器。它可以在0-30s内自动完成故障切换操作。
2025-02-01 19:04:39
966
原创 MySQL复制扩展功能
在gtid激活之后,当master出现问题后,slave2和master的数据最接近会作为新的mastser,slave1指向新的master,它不会去检测新的master的pos id,只需要继续读取自己的gtid_next。group_replication_allow_local_disjoint_gtids_join=1 放弃自己的信息以master事件为主。group_replication_single_primary_mode=OFF 使用多主模式。
2025-02-01 13:44:16
1042
原创 Mysql的主从复制及扩展功能
show tables 在从数据库的设备上查看相关的信息,看在主数据库创建的数据库和表是否同步到从数据库上。cat /data/mysql/mysql-node1-slow.log 该命令用来查看慢查询的日志信息。1.当执行sql超过long_query_time参数设定的时间阈值(默认为10s)时会被认为是慢查询,则这个慢查询是要被优化的。1.延迟复制是用来控制sql线程和io线程无关,其io线程正常工作,而是日志已经保存在slave端,而是sql要等多久进行回放。
2025-01-31 21:48:46
994
原创 Keepalived高可用集群企业应用实例二
connect_port 向当前rs的哪个port发起健康状态检测的请求。bind_port 向当前rs发出健康状态检测请求时使用的源端口。connect_port 向当前rs的哪个port发起健康状态检测的请求。real_server rs的ip和port。
2025-01-31 18:43:19
1035
原创 Keepalived高可用集群企业应用实例一
默认为抢占模式,即当高优先级的主机恢复在线后,会抢占低优先级的主机的master角色,这样会使vip在ka主机中来回漂移造成网络抖动,一般会设置为nopreempt,即高优先级主机恢复后并不会抢占低优先级的master角色。非抢占模式下,如果原主机down机,vip迁移到新主机,后续也发生down时,仍会将vip迁移回原主机。设置方式:在vrrp_instance的语句块中设置对方主机的ip地址,一般设置为专用于对应心跳线网络的地址而非使用业务网络。通知脚本类型:当前节点成为主节点时触发的脚本。
2025-01-31 17:12:44
1039
原创 Keepalived高可用集群入门学习
virtual_router_id 51 每个虚拟路由器的唯一标识,同属一个虚拟路由器的多个keepalived节点必须相同。vrrp_skip_check_adv_addr 启用该配置后,如果收到的通告报文和上一个报文是同一个路由器则跳过检查。notification_email_from keepalived@KA1.xiao.org 发邮件的地址。global definitions:定义邮件配置,route_id,vrrp配置,多播地址等。
2025-01-31 14:23:54
997
原创 Haproxy高级功能配置
1.对指定的错误进行重定向优雅的显示错误界面创建错误页面文件:mkdir /haproxy/errorpages/ -p关闭后端的rs主机用浏览器访问haproxy的Ip地址。
2025-01-30 18:45:44
912
原创 Haproxy入门学习二
支持权重的运行时调整和慢启动,根据当前最少的后端服务器而非权重进行优先调度并且支持长连接的使用场景使用。对用户请求的url中的params部分中的一个参数key对应的value值做hash计算,并由总权重相除以后派发给某个服务器,后端搜索同一个数据会被调度到同一个服务器。:对source地址进行hash计算再基于服务器总权重取模,缺点是当服务器的总权重发生变化时有服务器上线或下线都会因总权重发生变化而导致调度结果的整体改变。其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务器。
2025-01-29 22:38:51
1375
原创 Haproxy介绍及学习
1.haproxy是法国开发者威利塔罗在2000年使用c语言开发的支持高并发、高性能的tcp和http负载均衡器。支持cookie的持久性,自动故障切换支持正则表达式和web状态统计2.haproxy的安装和服务信息环境:客户端 eth0:172.25.254.10软件安装:基本配置信息:其配置文件为 /etc/haproxy/haproxy.cfg,该配置文件由两大部分组成:global:全局配置段进程及安全配置相关参数性能调整相关参数debug参数。
2025-01-29 20:01:04
1584
原创 Redis学习之哨兵二
客观下线:当sentinel主观下线 的节点是主节点,该sentinel节点会通过sentinel is-master-down-by-addr命令向其他sentinel节点询问对主节点的判断,当超过<quorum>个数就认为主节点有问题,则这个sentinel就会做出客观下线的决定。Ⅱ、每隔2s,每个sentinel节点会向redis数据节点发送该sentinel节点对于主节点的判断以及当前sentinel节点的信息同时其他sentinel节点也可以得知它们对于主节点的判断。
2025-01-28 18:34:09
1443
原创 Redis学习之哨兵一
Redis Sentinel是一个分布式架构,其包含若干个Sentinel节点和Redis数据节点,其中每个Sentinel节点会对数据节点和其余的Sentinel节点进行监控,当发现节点不可达时会对节点做下线标识,如果标识的时主节点,它会和其他Sentinel节点进行协商,当大多数Sentinel节点认为主节点不可达时,它们会选举一个Sentinel节点来自动完成故障转移工作同时也会将这个实时的变化通知给redis的应用方,整个过程不需要人工介入。
2025-01-28 12:20:45
837
原创 Redis复制
用于主节点出现宕机时从节点提供故障转移支持,当应用写命令并发量较高且需要持久化时可以仅在从节点上开启AOF,这样可以保证数据安全性的同时也避免了持久化对主节点的性能干扰,一般是在从节点上执行slaveof no one断开与主节点的复制关系再重启主节点避免从节点继续复制主节点导致从节点的数据被清空。参与复制的redis实例划分为主节点(master)和从节点(slave),每个从节点只能有一个主节点而主节点可以同时具有多个从节点并且复制的数据流是单向的,只能由主节点复制到从节点。
2025-01-27 20:27:41
1106
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人