corosync使用


难度 中等

编译

依赖

corosync编译依赖libqb和kronosnet。

  • 系统库依赖
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

使用

配置

totem协议配置

  • op协议相关

    • token_retransmit

      • Processor在转发完token后,在多长时间内没有收到token或消息后,将引发token重传。
      • 默认值:238ms
      • 如果设置了下面的token值,本值由程序自动计算
    • token

      • Processor在多长时间内没有收到token(中间包含token重传)后,将触发token丢失事件(将激活MembershipProtocol,进入Gather状态)。
      • 默认值:1000ms
    • 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

      • 当Processor数量比较大时(>30),某个节点的加入/离开,可能造成各节点瞬间同时发出JoinMsg,造成网络拥塞。通过设置此值,程序发送JoinMsg前,将随机等待[0,send_join]区间内的某个时长。
      • 默认值:0ms
    • 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就会重新选。

testquorum

graph TB quorum_initialize-->|初始化quorum api的连接,注册quorum配置和投票变更的回调函数|quorum_trackstart-->|q启动quorum api回调通知,投票配置变更会quorum状态更改时,通知会进行排队|quorum_getquorate-->|检查节点的仲裁状态|quorum_dispatch

testvotequorum1

graph TB votequorum_initialize-->votequorum_trackstart-->votequorum_getinfo-->votequorum_setexpected-->votequorum_dispatch votequorum_getinfo-->votequorum_setvotes-->votequorum_dispatch

FAQ

  1. 如何修改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:~$
  2. 各节点持久化完成后会以单播的方式告诉发起节点持久化结果,所以这个时候其实不管客户端有没有返回成功,本地都已经更新了,那就出现了个节点状态不一致的情况?所以读的时候读的是更新前的?新的会回滚掉?

  3. 节点如何绑定多个分组

  4. cpg_dispatch是不是阻塞的

    是阻塞的,其内部执行逻辑是一个死循环。

  5. corosync内部重传机制

  6. corosync挂死如何处理

  7. 不需要quorum的写接口是什么

  8. 应用层回调的触发场景和条件是什么

reference

  1. https://www.cnblogs.com/yuzhaoxin/p/4911679.html

文章作者: growdu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 growdu !
  目录
分类导航
随笔3 AI29 计算机基础13 算法1 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库59 数据库深入93 数据库93 Docker11 DPDK26 编辑工具4 Elasticsearch4 FAQ1 Go Web1 hometown2 编程语言16 人生11 网络9 Linux38 OPC1 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 stock1 存储5 成长之路1 工具20 视频作品1 VPP18 Vue13 Web1 代码示例11 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
PostgreSQL 逻辑复制全链路:以一个真实事务为例,从 `INSERT` 到 `apply` 的源码级旅程
数据库🔥 2162
2
PostgreSQL 逻辑复制 Stream 执行逻辑源码级拆解:从 reorderbuffer 触发到订阅端落盘回放
数据库🔥 1765
3
PostgreSQL 行锁机制源码级深度拆解:4 种锁模式 + xmax + MultiXact 的完整链路
数据库🔥 1656
4
PostgreSQL reorderbuffer.c 函数级源码全集:5615 行 / 95 个函数的逐函数解析
数据库深入🔥 1650
5
PostgreSQL 目录快照源码级深度拆解:系统表读取的 MVCC 真相与失效机制
数据库🔥 1604
6
13 逻辑复制深入
数据库深入🔥 1570
7
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
8
PostgreSQL 读一行数据源码级深度拆解:MVCC 在每个环节的落点
数据库🔥 1464
9
PostgreSQL WAL 记录类型完全指南:21 个 RMGR × 80+ 种记录的源码级拆解
数据库🔥 1431
10
一文读懂openguass dcf网络模块
集群🔥 1420
11
PostgreSQL 元数据存储机制:从磁盘文件到内存缓存,`pg_class` 撑起的整个系统表体系
数据库🔥 1411
12
openGauss 并行解码设计原理深度拆解:reader + 多 worker + CSN 三层架构的源码级剖析
数据库深入🔥 1344
13
逻辑复制源码分析
数据库深入🔥 1327
14
PostgreSQL 逻辑复制:catalog 改动、可见性判定与 xmin/xmax 推进全景
数据库深入🔥 1317
15
自托管服务全家桶:从原文方案到可复制实操手册
人生🔥 1278
16
PostgreSQL CREATE_REPLICATION_SLOT 端到端源码分析:从 SQL 到 snapbuild 状态机的完整链路(每个函数每个参数)
数据库深入🔥 1277
17
PostgreSQL syscache 模块源码深度拆解:CatCache 数据结构、LRU 哈希表、cache invalidation 全链路
数据库深入🔥 1216
18
PostgreSQL 18 内核数据结构全景:RangeVar 与 20+ 个核心数据结构源码级拆解
数据库🔥 1158
19
PostgreSQL 逻辑复制里 `RUNNING_XACTS` 写入机制与快照 `xmin / xmax / xip` 的演化:源码级深度拆解
数据库🔥 1119
20
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094