#自动化运维# #干货#
简介我是一个在北京互联网厂子里996的程序员,一边学习追赶新技术,怕被潮流甩下掉队,一边学习投资理财方法,让自己的薪水滚雪球。我相信,越努力越幸运,虽然刚开始雪球滚起来很慢,但是只要坚持下去,它就会越滚越快,自己的养老就靠它了。在财富自由的道路上,我与你共勉。欢迎来评论区与我交流心得和干货,这样我们就可以收获更多。
syndic是master和minion之间的一个代理层, 用来转发来自master的指令给minion. syndic可以扩展整个saltstack的架构规模.
组成一个syndic node包含2个组件
CONFIGURING THE SYNDIC
CONFIGURING THE SYNDIC WITH MULTIMASTER
详情参考 https://docs.saltstack.com/en/latest/topics/topology/syndic.html#topology
SYNDIC WAITPermalink发送一条指令
[root@master vagrant]# salt 'client.jacky.com' cmd.run 'uptime'
client.jacky.com:
11:43:21 up 2:56, 1 user, load average: 0.00, 0.00, 0.00
Master
Syndic
Minion
源码分析Permalinksalt代码版本是2015.8.
Syndic的源码在/salt/salt/minion.py中class Syndic. 核心主逻辑在tune_in方法.
.
# Syndic Tune In
def tune_in(self, start=True):
'''
Lock onto the publisher. This is the main event loop for the syndic
'''
signal.signal(signal.SIGTERM, self.clean_die)
log.debug('Syndic {0!r} trying to tune in'.format(self.opts['id']))
if start:
self.sync_connect_master() # 以'sub'的角色连接到master的pub端口.
# Instantiate the local client # 实例化LocalClient对象
self.local = salt.client.get_local_client(self.opts['_minion_conf_file'])
self.local.event.subscribe('')
self.local.opts['interface'] = self._syndic_interface
# add handler to subscriber
self.pub_channel.on_recv(self._process_cmd_socket) # 在连接上添加回调函数, 只要接到新命令就解密, 并且转发给local的master.
# `_process_cmd_socket`调用了`_handle_decoded_payload`, 又调用了`self.syndic_cmd(data)`
# 在`syndic_cmd`方法里调用了`self.local.pub`将从上级Master接收的指令通过LocalClient转发给本地
# 的Master.
# register the event sub to the poller
self._reset_event_aggregation()
self.local_event_stream = zmq.eventloop.zmqstream.ZMQStream(self.local.event.sub, io_loop=self.io_loop)
self.local_event_stream.on_recv(self._process_event) # 监听本地的event pub接口获取minion的命令执行结果
# forward events every syndic_event_forward_timeout
self.forward_events = tornado.ioloop.PeriodicCallback(self._forward_events, # 通过`_forward_events`方法调用`self._return_pub`将结果转发回上级Master.
self.opts['syndic_event_forward_timeout'] * 1000,
io_loop=self.io_loop)
self.forward_events.start()
# Send an event to the master that the minion is live
self._fire_master_syndic_start()
# Make sure to gracefully handle SIGUSR1
enable_sigusr1_handler()
if start:
self.io_loop.start()
任务异步Permalink
提交异步任务: salt 'client.jacky.com' cmd.run 'uptime' --async --show-jid
执行结果异步化接收的方法有如下几种, 参考 这里
基于Syndic的架构, 将执行结果异步化可以减小最顶级Master的压力. 方法也有两种
考虑到扩展性, 方法2是最合适的. 以returner为’mysql’为例, 预测到这种情况下, 多个syndic-master会同时写jid和event, 所以会碰到duplicated key的问题, 不过这种情况并不影响数据的完整性.
参考资料PermalinkCopyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved