alloc_global_data() 用于初始化全局对象:struct data_t global_data。(global_data.c)
其中,包括设置 vrrp 使用的 IPV4(224.0.0.18)与 IPV6(ff02::12)组播地址(global_data.c - set_default_mcast_group() - data_t.vrrp_mcast_group4、data_t.vrrp_mcast_group6)、VRRP的版本(默认:2)、通告的发送、smtp_alerts等。
IP_ADD_MEMBERSHIP / IP_DROP_MEMBERSHIP 分别表示加入和退出组播。
struct data_t 各字段含义:
typedef struct _data {
const char *process_name;
#ifdef _WITH_VRRP_
const char *vrrp_process_name;
#endif
#ifdef _WITH_LVS_
const char *lvs_process_name;
#endif
#ifdef _WITH_BFD_
const char *bfd_process_name;
#endif
#if HAVE_DECL_CLONE_NEWNET
const char *network_namespace; // network namespace name
bool namespace_with_ipsets; // override for namespaces with ipsets on Linux < 3.13
#endif
const char *local_name;
const char *instance_name; // keepalived instance name
#ifdef _WITH_LINKBEAT_
bool linkbeat_use_polling;
#endif
const char *router_id;
const char *email_from;
struct sockaddr_storage smtp_server;
const char *smtp_helo_name;
unsigned long smtp_connection_to;
list email; //
int smtp_alert; // 设置所有smtp_alerts的默认状态,当master状态变迁时激活smtp通知。默认:-1
#ifdef _WITH_VRRP_
bool dynamic_interfaces;
bool allow_if_changes;
bool no_email_faults;
int smtp_alert_vrrp; // 设置vrrp的smtp_alerts的状态。默认:-1
const char *default_ifname; // Name of default interface
interface_t *default_ifp; // Default interface for static addresses
#endif
#ifdef _WITH_LVS_
int lvs_tcp_timeout;
int lvs_tcpfin_timeout;
int lvs_udp_timeout;
int smtp_alert_checker; // 设置checker的smtp_alerts的状态。默认:-1
bool checker_log_all_failures;
#ifdef _WITH_VRRP_
struct lvs_syncd_config lvs_syncd; // ?。lvs_syncd.syncid = UINT_MAX,lvs_syncd.mcast_group.ss_family = AF_UNSPEC
#endif
bool lvs_flush; // flush any residual LVS config at startup
lvs_flush_t lvs_flush_onstop; // flush any LVS config at shutdown
#endif
#ifdef _WITH_VRRP_
struct sockaddr_in vrrp_mcast_group4; // IPV4 组播地址。默认:224.0.0.18
struct sockaddr_in6 vrrp_mcast_group6; // IPV6 组播地址。默认:ff02::12
unsigned vrrp_garp_delay; // Default delay to launch gratuitous arp。默认:5 * 1000000
timeval_t vrrp_garp_refresh; // Default interval for refresh gratuitous arp。默认:0
unsigned vrrp_garp_rep; // Default repeat value for MASTER state gratuitous arp。默认:5
unsigned vrrp_garp_refresh_rep;
unsigned vrrp_garp_lower_prio_delay; // UINT_MAX
unsigned vrrp_garp_lower_prio_rep; // UINT_MAX
unsigned vrrp_garp_interval;
unsigned vrrp_gna_interval;
bool vrrp_lower_prio_no_advert; // 如果收到低优先级的通告,不发送任何通告。默认是false
bool vrrp_higher_prio_send_advert; // 如果我们是master,收到一个更高优先级的vrrp,在我们变成backup之前发送一个通告。
// 这意味如果其他master设置了garp_lower_priority_repeat,他将重新发送免费arp信息。
// 这是为了解决出现双master的情况,且最后一个看到的免费arp是从我们为您这里发出的。
// 默认是false
int vrrp_version; // VRRP version (2 or 3)。默认是2
#ifdef _WITH_IPTABLES_
char vrrp_iptables_inchain[XT_EXTENSION_MAXNAMELEN];
char vrrp_iptables_outchain[XT_EXTENSION_MAXNAMELEN];
#ifdef _HAVE_LIBIPSET_
bool using_ipsets;
char vrrp_ipset_address[IPSET_MAXNAMELEN];
char vrrp_ipset_address6[IPSET_MAXNAMELEN];
char vrrp_ipset_address_iface6[IPSET_MAXNAMELEN];
#ifdef HAVE_IPSET_ATTR_IFACE
char vrrp_ipset_igmp[IPSET_MAXNAMELEN];
char vrrp_ipset_mld[IPSET_MAXNAMELEN];
#endif
#endif
#endif
#ifdef _WITH_NFTABLES_
const char *vrrp_nf_table_name;
int vrrp_nf_chain_priority; // ?。默认-1
bool vrrp_nf_counters;
bool vrrp_nf_ifindex;
unsigned nft_version;
#endif
bool vrrp_check_unicast_src; // 在单播模式中,开启对VRRP数据包的源地址做检查,源地址必须是单播邻居之一。默认false
bool vrrp_skip_check_adv_addr; // 检查收到的VRRP通告中的所有地址,设置此命令的意思是,
// 如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
// 默认是不跳过检查
bool vrrp_strict; // 严格遵守VRRP协议。下列情况将会阻止启动Keepalived:
// 1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址(1.2.7中无效,1.3.5有效)
// 默认false
bool have_vrrp_config;
char vrrp_process_priority;
bool vrrp_no_swap; // vrrp进程不能够被交换
unsigned vrrp_realtime_priority;
cpu_set_t vrrp_cpu_mask;
#if HAVE_DECL_RLIMIT_RTTIME == 1
rlim_t vrrp_rlimit_rt; // ?。默认:10000
#endif
#endif
#ifdef _WITH_LVS_
bool have_checker_config;
char checker_process_priority;
bool checker_no_swap; // checker进程不能够被交换
unsigned checker_realtime_priority;
cpu_set_t checker_cpu_mask;
#if HAVE_DECL_RLIMIT_RTTIME == 1
rlim_t checker_rlimit_rt; // ?。默认:10000
#endif
#endif
#ifdef _WITH_BFD_
bool have_bfd_config;
char bfd_process_priority;
bool bfd_no_swap;
unsigned bfd_realtime_priority;
cpu_set_t bfd_cpu_mask;
#if HAVE_DECL_RLIMIT_RTTIME == 1
rlim_t bfd_rlimit_rt; // ?。默认:10000
#endif
#endif
notify_fifo_t notify_fifo; // 向FIFO写入通知事件
#ifdef _WITH_VRRP_
notify_fifo_t vrrp_notify_fifo; // FIFO要将vrrp通知事件写入
#endif
#ifdef _WITH_LVS_
notify_fifo_t lvs_notify_fifo; // FIFO要将notify healthchecker事件写入
#endif
#ifdef _WITH_VRRP_
int vrrp_notify_priority_changes;
#endif
#ifdef _WITH_SNMP_
bool enable_traps;
const char *snmp_socket;
#ifdef _WITH_VRRP_
#ifdef _WITH_SNMP_VRRP_
bool enable_snmp_vrrp; // enable SNMP handling of vrrp element of KEEPALIVED MIB
#endif
#ifdef _WITH_SNMP_RFCV2_
bool enable_snmp_rfcv2; // enable SNMP handling of RFC2787 VRRPv2 MIB
#endif
#ifdef _WITH_SNMP_RFCV3_
bool enable_snmp_rfcv3; // enable SNMP handling of RFC6527 VRRPv3 MIB
#endif
#endif
#ifdef _WITH_LVS_
bool enable_snmp_checker; // enable SNMP handling of checker element of KEEPALIVED MIB
#endif
#endif
#ifdef _WITH_DBUS_
bool enable_dbus; // 使能DBus接口
const char *dbus_service_name; // dbus服务名,默认是org.keepalived.Vrrp1
#endif
#ifdef _WITH_VRRP_
unsigned vrrp_netlink_cmd_rcv_bufs; // Set netlink receive buffer size
bool vrrp_netlink_cmd_rcv_bufs_force; // very large configurations where a large number of interfaces exist,
unsigned vrrp_netlink_monitor_rcv_bufs; // the initial read of the interfaces on the system causes a netlink buffer
bool vrrp_netlink_monitor_rcv_bufs_force; // overrun
#ifdef _WITH_CN_PROC_
unsigned process_monitor_rcv_bufs;
bool process_monitor_rcv_bufs_force;
#endif
#endif
#ifdef _WITH_LVS_
unsigned lvs_netlink_cmd_rcv_bufs; // The vrrp netlink command and monitor socket and the checker command
bool lvs_netlink_cmd_rcv_bufs_force; // and monitor socket buffer sizes can be independently set.
unsigned lvs_netlink_monitor_rcv_bufs; // The force flag means to use SO_RCVBUFFORCE, so that the buffer size can
bool lvs_netlink_monitor_rcv_bufs_force; // exceed /proc/sys/net/core/rmem_max.
#endif
#ifdef _WITH_LVS_
bool rs_init_notifies; // Send notifies at startup for real servers that are starting up
bool no_checker_emails; // Don't send an email every time a real server checker changes state;
// only send email when a real server is added or removed
#endif
#ifdef _WITH_VRRP_
int vrrp_rx_bufs_policy;
size_t vrrp_rx_bufs_size;
int vrrp_rx_bufs_multiples; // ?。默认:3
unsigned vrrp_startup_delay;
bool log_unknown_vrids;
#endif
} data_t;