发表时间: 2019-12-16  |  分类: RocketMQ  |  标签: Java RocketMQ Docker

根据该文章搭建的最终成果为:RocketMQ集群内,有一个name server,6个broker节点,其中,每三个broker以master-slave的形式组成一个broker组,当master挂掉时,从broker组选举出一个broker节点成为master节点。

每个broker组至少需要3个broker节点,否则master挂掉后无法完成slave自动切换为master节点,因为剩下的1个broker节点无法获得集群内大多数节点的投票。(详见Raft算法)

阅读
发表时间: 2019-10-16  |  分类: Raft  |  标签: Raft 分布式 笔记

问题1

  1. 目前已经有一个正常的Leader节点A,任期号为1
  2. 由于丢包或网络波动等可能的原因,节点X心跳超时
  3. 节点X自增当前任期号,自增后节点X的当前任期号为2,并转为候选人
  4. 此时节点X的网络恢复正常
  5. 节点X向集群中其他节点发送RequestVote RPC

:

  1. 此时其他Follower节点如何响应节点XRequestVote RPC
  2. 此时Leader节点A如何响应节点XRequestVote RPC

个人见解:如果在节点X发起选举请求的过程中,Leader和其他Follower都没有收到来自客户端的写操作,那么所有节点都承认节点X的选举,Leader节点A自动退化为Follower。如果在这个选举期间有新的日志条目成功提交,那么自然大多数节点都会拒绝节点X的请求,因为它不持有最新的数据。

论文中有以下这段话与个人见解冲突 :
when they believe a current leader exists. Specifically, if a server receives a RequestVote RPC within the minimum election timeout of hearing from a current leader, it does not update its term or grant its vote.
each server waits at least a minimum election timeout before starting an election.
if a leader is able to get heartbeats to its cluster, then it will not be deposed by larger term numbers
因此,像问题中描述的情况,除了节点X外,其他的节点依然是有收到节点A的心跳的,会忽略节点X的投票请求。

阅读
发表时间: 2019-10-03  |  分类: 内网穿透  |  标签: Linux iptables zerotier 内网穿透

1. 启用ipv4转发

# vi /etc/sysctl.conf

再打开的文件里追加如下内容:

net.ipv4.ip_forward=1

然后执行以下命令使之生效,并查看结果:

# sysctl -p
# sysctl net.ipv4.ip_forward

输出内容:net.ipv4.ip_forward = 1即启用成功

2. 设置iptables

先获取zerotier的接口名,可以使用zerotier-cli listnetworks查看,此处假设接口名为zt0

#配置防火墙
root@LEDE:~# iptables -I FORWARD -i zt0 -j ACCEPT
root@LEDE:~# iptables -I FORWARD -o zt0 -j ACCEPT
root@LEDE:~# iptables -t nat -I POSTROUTING -o zt0 -j MASQUERADE

3. 上面不行的话下面这条也可用

# vmbr0是物理网卡(虚拟机外网网卡)设备名
1. iptables -t nat -A POSTROUTING -o vmbr0 -j MASQUERADE
2. iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
3. iptables -A FORWARD -i zt2lr5cj6c -o zt2lr5cj6c -j ACCEPT
> 如果第3条不行的话,试试这条
> iptables -A FORWARD -i zt2lr5cj6c -o vmbr0 -j ACCEPT
阅读
发表时间: 2019-09-24  |  分类: iptables  |  标签: Linux iptables

查看规则

# iptables -L INPUT --line-numbers

禁止所有ip访问指定端口

# iptables -I INPUT -p tcp --dport xxxxx -j DROP

只允许指定ip访问指定端口

# iptables -I INPUT -s xxx.xxx.xxx.xxx -p tcp --dport xxxxx -j ACCEPT

删除规则

# iptables -D INPUT [num]
阅读
发表时间: 2019-08-20  |  分类: JavaScript  |  标签: JavaScript Vue
if (!this.$refs.selectFile.files || !this.$refs.selectFile.files.length) {
  return
}

const file = this.$refs.selectFile.files[0]      
const fr = new FileReader()

fr.onloadend = event => {
  console.log(event.target.result)
}
fr.onerror = event => {
  console.log(event)

  fr.abort()
}

// 要求loadend 事件中,result 属性包含一个data:URL格式的字符串(base64编码)表示所读取文件的内容
// 这里也可以换成其他接口,取决于文件类型:
//   fr.readAsText()
//   fr.readAsArrayBuffer()
fr.readAsDataURL(file)
阅读
发表时间: 2019-08-19  |  分类: Java  |  标签: Java 字符串拆分
public static void main(String[] args) {
    String src = "abc硕大的dws你好不abca奥凯电缆静安寺;%20流量卡接%20你2额垃圾袋离开2";

    CharsetEncoder coder = StandardCharsets.UTF_8.newEncoder();
    // 要求拆分后,每个字符串的字节数不大于10个字节(String.getBytes().length <= 10)
    ByteBuffer out = ByteBuffer.allocate(10);
    CharBuffer in = CharBuffer.wrap(src);
    // 按顺序存储拆分之后的每个字符串
    List<String> strList = new LinkedList<>();

    int startPos = 0;
    while(true) {
        CoderResult result = coder.encode(in, out, true);
        int endPos = src.length() - in.length();

        strList.add(src.substring(startPos, endPos));

        startPos = endPos;

        out.rewind();
        if (!result.isOverflow()) {
            break;
        }
    }

    // 最终strList中每一个字符串的字节数都不会大于10个字节,可以直接存储到数据库中 
    strList.stream()
           .map(String::getBytes)
          .map(b -> b.length)
          .forEach(System.out::println);
}
阅读
发表时间: 2019-05-29  |  分类: Linux  |  标签: Linux bond

1. 先禁用NetworkManager

必须先禁用NetworkManager,并关闭自启

# systemctl stop NetworkManaher
# systemctl disable NetworkManaher

2. 加载bonding模块

# modprobe bonding

执行完后没有任何输出就是对的

3. 配置bond0网卡

vi /etc/sysconfig/network-scripts/ifcfg-bond0

在该文件中输入以下内容

DEVICE=bond0
NAME=bond0
TYPE=Bond
ONBOOT=yes
BOOTPROTO=none
IPADDR=x.x.x.x
GATEWAY=x.x.x.x
NETMASK=x.x.x.x
BONDING_MASTER=yes
BONDING_OPTS="mode=4 miimon=100"

IPADDR、GATEWAY、NETMASK根据实际情况填写

这里的模式配置为4动态链路聚合模式,可以根据需要调整为其他模式:

0: 轮询模式,按照设备顺序依次传数据包,具有负载均衡和容错的能力。
1:主备模式,只有一张网卡在工作,挂掉之后切换到其他网卡,具有容错能力。
2:异或模式,根据MAC地址异或运算的结果选择设备,具有负载均衡和容错能力。
3:广播模式,将所有数据包发送给所有网卡,提供容错能力。
4:动态链路聚合模式,通过创建聚合组来共享传输,需要交换机的支持,提供容错能力。
5:适配器传输负载均衡模式,该策略是根据当前的负载把发出的数据分给每一个设备,由当前使用的设备处理收到的数据。本策略的通道联合不需要专用的交换机支持,提供负载均衡和容错能力。
6:该策略在IPV4情况下包含适配器传输负载均衡策略,由ARP协商完成接收的负载,通道联合驱动程序截获ARP在本地系统发送出的请求,用其中一个设备的硬件地址覆盖从属设备的原地址。

4. 配置网卡1

先做备份,其中网卡1为实际网卡配置的名称

cp /etc/sysconf/network-scripts/ifcfg-网卡1 /etc/sysconf/network-scripts/ifcfg-网卡1.bak
vi /etc/sysconf/network-scripts/ifcfg-网卡1

文件内容做如下修改:

# 其他保持默认,修改一下这两项
BOOTPROTOT=static
ONBOOT=yes

# 添加下面你这两项
MASTER=bond0
SLAVE=yes

5. 配置网卡2

网卡2做和网卡1一样的修改

6. 最后

执行systemctl restart network重启网络,稍等数秒,使用ifconfig可以看到bond0网卡的信息,此时可以和其他网内的设备互通。

或者,执行lsmod | grep bonding若输出如下的结果也表明配置成功:

bonding 145728 0

阅读
发表时间: 2019-02-26  |  分类: Java  |  标签: Java 翻译 Feign Spring Cloud

转载请注明出处: 翻译: Spring Cloud Feign使用文档

Why Feign and not X?

Feign使用诸如JerseyCXF之类的工具来实现ReSTSOAP服务的java客户端, 此外, Feign允许你在http库(如: Apache HC)之上编写自己的代码. 通过自定义解码器(decoders)和错误处理(error handing), Feign可以用最小的开销和最少的代码将你的代码关联到任何基于文本的http接口(http APIS),

How does Feign work?

Feign是通过将注解(annotations)转换成模板请求来实现它的功能的, Feign可以将请求参数直接应用到这些模板上. 尽管Feign只支持基于文本的接口, 但同样的它能显著地简化系统的方方面面, 如请求重放等, 此外, Feign也可以使你的单元测试更加简单.

阅读
发表时间: 2019-02-25  |  分类: Hystrix  |  标签: Java 翻译 Spring Cloud Hystrix

转载请注明出处: 翻译:Hystrix - How To Use

Hello World!

下面的代码展示了HystrixCommand版的Hello World:

public class CommandHelloWorld extends HystrixCommand<String> {

    private final String name;

    public CommandHelloWorld(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.name = name;
    }

    @Override
    protected String run() {
        // a real example would do work like a network call here
        return "Hello " + name + "!";
    }
}

查看源码

阅读
关闭

分类

Linux JavaScript Raft Java Git iptables 内网穿透 RocketMQ 算法 Go Hystrix

标签

Linux bond JavaScript Vue Raft 分布式 笔记 Java 字符串拆分 Git Socks5 iptables zerotier 内网穿透 网络 RocketMQ Docker 字符串 VPS VPN 算法 kmp Go json 日志 log4j slf4j 面试 后端开发 系统界面 翻译 Feign Spring Cloud Hystrix