keepalived源码解析 —— alloc_global_data()

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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值