sudo apt-get install libgcrypt20-dev libzstd-dev liblzo2-dev liblzma-dev libbz2-dev libsctp-dev doxygen libnl-3-dev libnl-route-3-dev
编译libqb
git clone https://github.com/ClusterLabs/libqb.git
cd libqb
./autogen.sh
./configure
make -j 32
sudo make install
编译kronosnet
git clone https://github.com/kronosnet/kronosnet.git
cd kronosnet
./autogen.sh
./configure
make -j 32
sudo make install
编译corosync
git clone https://github.com/corosync/corosync.git
cd kronosnet
./autogen.sh
./configure
make -j 32
sudo make install
op协议相关
token_retransmit
token
hold
在Ring不怎么繁忙时,RingRepresentative在转发token前,休息多长时间。
默认值:180ms
本值通常由程序根据地其他选项自动计算。
token_retransmits_before_loss_const
Token最大重传次数
默认值:重传4次
若设置本值,token_retransmit和hold的值,由程序根据地本值和token值计算。
fail_recv_const
在多少次token循环中,没有收到任何消息(本该收到消息:token.seq>my_aru),超过这个次数将激活Membership
Protocol,进入Gather状态。
默认值:2500次
mp协议相关
join
Processor在发送JoinMsg后,在多长时间内没有收到其他成员的JoinMsg,将引发JoinMsg重传。
默认值:50ms
send_join
consensus
Processor从进入Gather状态起,在多长时间内必须使(my_proc_set-my_fail_set)集合的成员达到consensus(被标记为true)。否则清除已被标记为true的成员,重发JoinMsg。
若设置此值,必须>=1.2*token。
若未设置此值,程序将按1.2*token值处理。
rp协议相关
rrp_mode
ReplicationStyle,可能的值:none, active, passive
rrp_token_expired_timeout
在多长时间内,没有从任意一个冗余网络中收到token,则把ProblemCounter增1。认值:47ms。
rrp_problem_count_timeout
在多长时间内,如果某个网络没被标记为faulty,则把ProblemCounter减1。默认值:2000ms。
rrp_problem_count_threshold
当ProblemCounter达到某个值后,则把某个网络标记为faulty,默认值:10
流量控制配置
window_size
在一次token的循环中,整个集群可以广播的最大的消息数
max_messages
节点在拿到token后,可以广播的最大消息数。
当客户端向本地 corosync发起写请求时,corosync需要等待令牌,当拿到令牌后,才能向其它corosync节点广播消息,各节点持久化完成后会以单播的方式告诉发起节点持久化结果,发起节点判断如果大于1/2的节点完成,向客户端返回写成功。令牌环中节点只要有异常,就会重新生成新的环, leader就会重新选。
如何修改corosync监听端口
totem {
version: 2
secauth: off
crypto_cipher: none
crypto_hash: none
threads: 0
clear_node_high_bit: no
rrp_mode: none
transport: udp
token: 1000
interface {
ringnumber: 0
ttl: 45
mcastport: 5406
}
}
修改后执行结果如下:
ha@ha-virtual-machine:~$ netstat -anp | grep udp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
udp 0 0 0.0.0.0:51896 0.0.0.0:* -
udp 0 0 127.0.0.53:53 0.0.0.0:* -
udp 0 0 0.0.0.0:5353 0.0.0.0:* -
udp 0 2304 192.168.145.130:5405 0.0.0.0:* -
udp 0 0 0.0.0.0:631 0.0.0.0:* -
udp6 0 0 :::41918 :::* -
udp6 0 0 :::5353 :::* -
ha@ha-virtual-machine:~$ sudo /etc/init.d/corosync stop
ha@ha-virtual-machine:~$ sudo vim /etc/corosync/corosync.conf
ha@ha-virtual-machine:~$ sudo /etc/init.d/corosync start
Starting corosync (via systemctl): corosync.service.
ha@ha-virtual-machine:~$ netstat -anp | grep udp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
udp 0 0 0.0.0.0:51896 0.0.0.0:* -
udp 0 0 127.0.0.53:53 0.0.0.0:* -
udp 0 0 0.0.0.0:5353 0.0.0.0:* -
udp 0 2304 192.168.145.130:5406 0.0.0.0:* -
udp 0 0 0.0.0.0:631 0.0.0.0:* -
udp6 0 0 :::41918 :::* -
udp6 0 0 :::5353 :::* -
ha@ha-virtual-machine:~$
各节点持久化完成后会以单播的方式告诉发起节点持久化结果,所以这个时候其实不管客户端有没有返回成功,本地都已经更新了,那就出现了个节点状态不一致的情况?所以读的时候读的是更新前的?新的会回滚掉?
节点如何绑定多个分组
cpg_dispatch是不是阻塞的
是阻塞的,其内部执行逻辑是一个死循环。
corosync内部重传机制
corosync挂死如何处理
不需要quorum的写接口是什么
应用层回调的触发场景和条件是什么