Kafka生产者分区策略 数据可靠性保证
### 分区策略 1. 指明partition的情况下,直接将指明的值作为partition值 2. 没有指明partition值但是有key情况下,将key的hash值与topic的partition数进行取余得到partition值 3. 既没有partition又没有key的情况下,第一次调用产生一个随机整数,然后每次调用会在这个整数上递增,将这个值与topic可用的partition总数取余得到partition值,也就常说的 round-robin(轮询) 算法 ### 数据可靠性保证 1. 两种策略 - 同步半数副本,那么保证数据不丢失需要2n+1个副本 - 同步全部副本,那么保证数据不丢失需要n+1个副本 **kafka采用同步全部副本** 并且优化加入ISR(同步副本)策略,保证如果有一个副本出现不能同步或者同步缓慢而迟迟不能发送ack命令的策略(如果follower长时间未向leader同步数据,则该follower将被踢出ISR,时间阈值由replica.lag.time.max.ms参数设定。) 当Leader发生故障之后,就会从ISR中选区新的leader 2. ISR(同步副本) TODO 3. acks应答机制 参数配置: - acks:`0` producer不等待broker的ack,提供了最低延迟,broker一接受还没写入磁盘就返回,`那么会丢失数据` - acks:`1` producer等待broker的ack,Partition的Leader回落后返回ack,如果在follower同步成功前leader发生故障,`那么会丢失数据`。 - acks:`-1或all` producer等待broker的ack,所有follower同步成功后返回ack - 但是如果follower同步成功但是还没有发送ack的时候 leader坏掉了,这时候重新选举leader,选举成功后会再次发送消息,会造成`消息重复` - 如果ISR副本个数为1的时候 ack设置为all还`可能会丢数据` > 以上的follower都是ISR同步副本中的follower ### ExactlyOnce 精准一次性 1. At least once 至少一次 acks: -1 可以保证数据不丢失,不能保证数据不重复 2. At Most once 至多一次 acks: 0 可以保证数据不重复,不能保证数据不丢失 3. Exactly Once 不重复也不丢失,采用幂等性。0.11之前,采用消费者段进行去重 配置文件设置 `enable.idompotence=true` 即可以开启幂等性 > 生产者在初始化的时候分配一个PID,发往同一Partition的消息会带有Sequence Number。 而且Broker会对<PID,Partition,SeqNumber>做缓存,相同主键提交时候,Broker只会持久化一条。 缺点《生产者,重启后数据还会重复》1
Kafka如何保持数据一致性
## 数据一致性 ### 两个名词 - LEO(Log End Offset) 每个副本的最大offset - HW(High Watermark) 消费者能看到的最大offset,ISR队列中最小的LEO ### 保持一致性得两个场景 - follower故障(长时间未向leader同步数据 时间阈值:replica.lag.time.max.ms): 会被临时踢出ISR,等该follower恢复后,follower会读取本地磁盘上次记录的HW,并将log文件高于HW的地方截取掉,从HW开始向leader进行同步,等follower的LEO大于等于该Partition的HW,追上leader以后,就可以重新加入ISR。 - leader故障: leader发生故障以后会从follower重新选举一个leader,为了保持数据一致性,从剩下follower的log中截掉高于HW的消息,然后从新leader同步数据 **只能保证数据一致性问题,并不能保证数据不丢失或者不重复**
Jenkins 使用原有机器的环境变量
### 查看原有机器环境变量 ``` [root@cvm8184]# echo $PATH /root/.nvm/versions/node/v12.18.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/java/jdk1.8.0_231/bin ``` ### 把服务器的环境变量添加到jenkins 节点管理->设置->环境变量 ![Jenkins 使用原有机器的环境变量](https://qiyue.info/usr/uploads/2020/06/1285336046.png) 这样就可以使用机器已经配置环境变量的软件了,就不用在jenkins中二次安装了
vue 父子组件利用计算属性传递信息
- 内容参考 vue官网-组件基础 https://cn.vuejs.org/v2/guide/components.html 以下只是我一些不成熟的理解,建议大概扫一眼官网文档再阅读 #### 父组件传递给子组件 > 子组件定义自定义参数(Prop),父组件传参。 当子组件增加一个prop属性 那么对应的函数名就是你自定义的参数 - 子组件 ```html <template> <v-md-editor/> </template> <script> export default { props: { # 自定义String类型参数text,父组件就可以使用`v-bind:text` 传值 text: String } </script> ``` 如上代码,在父组件引用子组件的时候,加上:text="xxx",就已经把xxx以参数形式传递给子组件了(如下) - 父组件 ```html <markdown :text="xxx" /> // :text 与 v-bind:text 同等含义 <script> # 注册子组件 import Markdown from '@/components/Markdown' export default { components: { Markdown } } </script> ``` #### 子组件传递给父组件 > 子组件使用内建方法`$emit`。 子组件通过调用内建`$emit`方法并传入事件名称来触发一个事件,达到子组件传递给父组件的目的 - 子组件 ```html <script> export default { # 自定义指令'getChildrenText' 并将子组件的data函数中的childrenText属性,通过参数传递给父组件 mounted() { this.$emit('getChildrenText', this.childrenText) } } </script> ``` - 父组件 ```html <markdown @getChildrenText="getChildrenText" /> <script> export default { methods: { # 也就是使用自定义指令的地方'@getText'会接收到子组件的childrenText getChildrenText(val) { # val为上个代码块的参数'this.childrenText' this.fatherText = val # 让父组件的值等于子组件传递过来的值 } } </script> ```
英语语法:六大基本句型拓展
## 主系表的扩展 > 主系表,表语多为名词,想拓展就得靠定语(形容词,介词短语) - 形容词作定语放在名词之前 - 介词短语作定语放在被修饰的词之后 介词短语完全反顺序 如: `The girl is a teacher on the second floor from school.` 这个女孩是学校二楼的老师 ## Do句型的扩展 > 主语+动词(谓语)+宾语+状语(副词)+状语(介词短语) 注意:状语修饰动词,放在所修饰的动词的后面,通常有**副词**或者**介词短语**充当 `children plant tree => children plant carfully(副词) => children plant carfully on Sunday(介词短语) 孩子们星期天努力地种树` 1. 状语前置 > 一般来说,在主谓宾句型里,可以把作为状语的介词短语前置。 `The student read English in the morning => In the morning, the student read English 孩子们早晨读英语` 2. there be(do) 句型:谓主状 > 正式文体中,没有特定主语;某些表示**存在、发生、出现、坐落**等意义的`不及物动词`也可以与there连用如: appear,seem,come,remain,exist,live,stand,lie,arise,enter,follow,occur,rise,grow,happen,belong,arrive,fly,flash,sail,pass,run,spring up,emerge等 `There exist many ancient temples in the country. 那个国家有很多古老的寺庙` there be(do) 句型拓展 `There is a teacher from Amarica in the school in the city. 城市的学校有一个来自美国的老师` 注意:与主系表句型一样,There be 句型里,形容词做定语,介词短语也可以做定语,形容词做定语放在所修饰的名词前面,介词短语放在所修饰的名词后面 ## 总结 1. 首先,把英文的六大句型写完整,再加定语和状语 2. 定语修饰名词,由形容词和介词短语充当,形容词作放在名词之前,介词短语放在的名词之后 3. 状语修饰动词,由副词和介词短语充当,**但是一定要完成句型的基本结构再加状语**
英语六个句型
1. 主系表 2. 主谓宾 3. 主谓 4. 主谓宾宾 5. 主谓宾补 6. 谓主状(倒装句) - 定语 定语是限定名词,只要有名词出现的地方,就可以用定语来修饰。 1. 形容词作定语 跟中文一样放在名词之前 `beautiful teacher` 2. 介词短语做定语 介词短语放在被修饰的名词后面 `the teacher from japan 来自日本的老师 ,主系表 The taecher is from japan 老师来自日本` - 状语 状语是限定动词,它常由副词和介词充当,中文的状语一般放在动词之前。比如:他努力的学习。英语要放在动词之后:`he studies hard`
vue 重写element ui样式的遇到的问题
### 需求描述 重写element-ui 按钮`<button>`内部嵌套的`<span>`的样式 无奈用了css内部选择器也无法实现 请教别人以后,发现有以下三种做法 ### 解决办法 1. 在`App.Vue`中使用css内部选择器 > 不推荐 缺点 代码不符合规范,如果此类需求过多,App.Vue会很乱。 并且 如果使用`特性选择器`的时候 会很慢; 2. 删除掉`<style scoped>` 中的`scoped` 这样就会生效 > 不推荐 缺点 同上; 如果没有限制好特定作用域的话 容易产生样式覆盖 3. 使用Vue 提供的深度选择器 > 推荐 不会产生上述情况 只对当前作用域生效 ```html <style scoped> .parent >>> .child { /* ... */ } </style> ``` 将会编译成: ```css .parent[data-v-f3f3eg9] .child { /* ... */ } ``` 而对于less或者sass等预编译,是不支持>>>操作符的,可以使用/deep/来替换>>>操作符,例如: ```css .parent /deep/ .child { /* ... */ } ``` ### `scoped`的原理 细心的小伙伴会发现上述代码编译后 会增加[data-v-******]的东东,其实Vue就是根据这个确定作用域的, 这也就是`scoped`的原理
简单理解计算机网络知识记录
网络(计算机网络体系结构模型 - 7层结构) ### 一、OSI与TCP/IP各层的结构与功能,都有哪些协议? 1.1 应用层 > 通过应用进程间的交互来完成特定网络应用 包括域名系统 DNS,HTTP协议 1.2 运输层 - TCP 传输控制协议 面向连接的,可靠的,字节流,效率低的 - UDP 用户数据协议 无连接的,不可靠的,数据报文段,效率高的 1.3 网络层 > 在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。 1.4 数据链路层 > 数据链路层 通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 ### 二、TCP 三次握手和四次挥手 2.1 TCP 三次握手 ![三次握手](https://qiyue.info/usr/uploads/2020/01/1252926793.png) 简单示意图: - 客户端-发送带有SYN标志的数据包-一次握手-服务端 - 服务端-发送带有SYN/ACK标志的数据包-二次握手-客户端 - 客户端-发送带有ACK标志的数据包-三次握手-服务端 2.2 为什么要三次握手 三次握手为了确认自己与对方的发送是正常的。 2.3 TCP 四次挥手 ![四次挥手](https://qiyue.info/usr/uploads/2020/01/3915799633.png) 断开一个TCP连接则需要"四次挥手" - 客户端-发送一个FIN,用来关闭客户端到服务器的数据传送 - 服务器-收到这个FIN,他发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号 - 服务器-关闭与客户端的连接(**半关闭**),发送一个FIN给客户端 - 客户端-发回ACK报文确认,并将确认需要设置为收到序号加1 2.4 为什么要四次挥手 任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。 ### TCP与UDP对比 ![TCP与UDP对比](https://qiyue.info/usr/uploads/2020/01/2026815193.jpg) 总结自 JavaGuide
一键清理Docker镜像和产生的文件
1、 此命令会清空所有的`Docker`文件 ```bash docker kill $(docker ps -aq) docker rm $(docker ps -aq) docker rmi $(docker images -q) docker volume rm $(docker volume ls -q) ``` 2、 此命令会保留正在运行的`Docker`镜像,其它会全部清除 ```bash docker rm $(docker ps -aq) docker rmi $(docker images -q) docker volume rm $(docker volume ls -q) ```
xshell 无法在vim中复制粘贴
编辑文件(默认没有这个文件) `vim ~/.vimrc` <!--more--> 文件内填写以下内容 ``` set mouse=c syntax on ``` ![vim.png][1](https://qiyue.info/usr/uploads/2019/10/3247838920.png) > 说明: > 第一行:设置成命令行模式,设置完成后代码高亮会消失; > 第二行:设置代码高亮。 网络转载
01
文章聚合
Hello,August
Hello,May
Hello,July