Salt Keepalive分析

转自:http://wiki.saltstack.cn/salt-keepalive

Salt Keepalive分析

在salt 0.11版本时碰到了一个问题,就是salt master意外重启后(断电服务器重启,然后重启了salt master服务),结果minion netstat显示为ESTABLIASHED,结果master无法连通minion,查阅salt Issues,有人反馈过这个问题,官方提示说在新一个版本修复。刚好目前有salt 0.13的环境,发现minion的配置文件中已经有关于Keepalive的设置,就对Salt Keepalive进行下测试

测试环境

角色

IP

OS

版本

Master

172.16.0.26

CentOS 6.3 X86_64

0.13.1

Minion

172.16.0.27

CentOS 6.3 X86_64

0.13.1

minion的keepalive setting部分配置采用默认配置

测试

(1) 进行test.ping测试

切换行号显示
   1 # salt '*' test.ping
   2 salt-test:
   3     True

返回结果为True,代表和minion通信一切正常

(2) 进行tcpdump抓包

切换行号显示
   1 # tcpdump host 172.16.0.27 and port 4505 -nnn
   2 

在300s之后,收到了如下包:

15:31:03.828271 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2495920406 ecr 2495615334], length 0
15:31:03.828303 IP 172.16.0.26.4505 > 172.16.0.27.43263: Flags [.], ack 1, win 227, options [nop,nop,TS val 2495915334 ecr 2495620406], length 0

说明minion的keepalive默认是开启的,并且tcp_keepalive_idle默认是300s

(3) 限制minion连接

切换行号显示
   1 # iptables -A INPUT -s 172.16.0.27 -p tcp --dport 4505 -j DROP
   2 

模拟salt master突然关闭的情况,此时minion上对应的tcp连接为ESTABLIASHED

300s之后,tcpdump检测到新的包:

切换行号显示
   1 15:36:03.828237 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496220406 ecr 2495915334], length 0
   2 15:37:18.828341 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496295406 ecr 2495915334], length 0
   3 15:38:33.828316 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496370406 ecr 2495915334], length 0
   4 15:39:48.828255 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496445406 ecr 2495915334], length 0
   5 15:41:03.828220 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496520406 ecr 2495915334], length 0
   6 15:42:18.828249 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496595406 ecr 2495915334], length 0
   7 15:43:33.828236 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496670406 ecr 2495915334], length 0
   8 15:44:48.828231 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496745406 ecr 2495915334], length 0
   9 15:46:03.829814 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [.], ack 163, win 547, options [nop,nop,TS val 2496820406 ecr 2495915334], length 0
  10 15:47:18.828229 IP 172.16.0.27.43263 > 172.16.0.26.4505: Flags [R.], seq 1, ack 163, win 547, options [nop,nop,TS val 2496895406 ecr 2495915334], length 0
  11 15:47:19.029054 IP 172.16.0.27.34080 > 172.16.0.26.4505: Flags [S], seq 337868058, win 14600, options [mss 1460,sackOK,TS val 2496895606 ecr 0,nop,wscale 6], length 0
  12 15:47:20.028250 IP 172.16.0.27.34080 > 172.16.0.26.4505: Flags [S], seq 337868058, win 14600, options [mss 1460,sackOK,TS val 2496896606 ecr 0,nop,wscale 6], length 0
  13 15:47:22.028223 IP 172.16.0.27.34080 > 172.16.0.26.4505: Flags [S], seq 337868058, win 14600, options [mss 1460,sackOK,TS val 2496898606 ecr 0,nop,wscale 6], length 0
  14 15:47:26.028357 IP 172.16.0.27.34080 > 172.16.0.26.4505: Flags [S], seq 337868058, win 14600, options [mss 1460,sackOK,TS val 2496902606 ecr 0,nop,wscale 6], length 0

第一个包是keepalive的包,由于master上有防火墙策略,minion和master的通信是中断的.

第二个包到第九个包,每个包间隔是75s,表示默认的tcp_keepalive_intvl75

之前发送完9个包后,收到了RST的包,表明tcp_keepalive_cnt默认值是9

然后salt minion会不断的发送SYN包到master,以确保salt minion能够连通master.

结论

Salt采用长连接的方式进行通信,由于新版本新增的keepalive功能,将不会出现salt minion由于连接中断无法连通的情况(但在keepalive之间由于tcp连接是断开的,master和minion是无法进行通讯的).


接反馈,有朋友在CentOS 5上依然会出现minion无法连接的情况, CentOS 6正常


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、升级说明 1、修复了数据库中字段值为空值的时候查询报错的Bug; 2、修复DbCommand属性ExecuteType为DbExecuteType.Scalar时执行命令报错的Bug; 3、感谢网友“尘世流浪汉”和“春之子”反馈Bug,也欢迎大家试用并提出更多建议! 二、修复功能示例 1、空值测试 public class T_Test { public int? Id { get; set; } public string Name { get; set; } } try { //创建一个数据连接 DbConnection conn = new DbConnection("Data Source=|DataDirectory|CSmsPlatThird.db;Pooling=true;FailIfMissing=false"); //设置使用的数据访问程序集 conn.AssemblyName = "System.Data.SQLite"; //设置数据工厂,这里是SQLite的数据工厂 conn.DbProviderFactory = "System.Data.SQLite.SQLiteFactory"; //创建一个数据命令 DbCommandSyn cmd = new DbCommandSyn(); //设置命令的连接 cmd.Connection = conn; //设置SQL语句,可以是存储过程 cmd.CommandText = "SELECT [Id],[Name] FROM [T_Test]"; //设置命令类型,一般SQL语句是Text,存储过程是StoredProcedure cmd.CommandType = DbCommandType.Text; //设置执行类型 cmd.ExecuteType = DbExecuteType.Reader; //执行命令,得到结果 DbCommandExecuteResult result = cmd.Execute(); if (!string.IsNullOrEmpty(result.ErrMsg))//首先判断ErrMsg是否有值,有表示执行过程发生错误 { MessageBox.Show("发生错误:" + result.ErrMsg); } else { List<T_Test> valueList = result.ReaderResult.ToEntityList<T_Test>(); //将数据显示在DataGrid中 this.dataGrid1.ItemsSource = valueList; } } catch (Exception ex) { MessageBox.Show("发生错误:" + ex.ToString()); } 2、存储过程示例 try { //数据库创建T_SQL脚本在网站App_Data文件夹下面,文件名为OMSDB.sql DbConnection conn = new DbConnection("Server=localhost;DataBase=OMSDB;Uid=sa;Pwd=jiton;"); DbCommandSyn cmd = new DbCommandSyn(); cmd.Connection = conn; //设置存储过程名称 cmd.CommandText = "JP_GetSystemName"; //设置命令类型为存储过程 cmd.CommandType = DbCommandType.StoredProcedure; cmd.ExecuteType = DbExecuteType.Scalar; //执行命令,得到结果 DbCommandExecuteResult result = cmd.Execute(); if (!string.IsNullOrEmpty(result.ErrMsg))//首先判断是否存在错误 { MessageBox.Show("发生错误:" + result.ErrMsg); } else { MessageBox.Show("系统名称为:" + result.ScalarResult as string); } } catch (Exception ex) { MessageBox.Show("发生错误:" + ex.Message); } 三、技术交流 有任何问题可以加入唯一指定的专用QQ群153079750进行反馈交流,也欢迎加入笔者的另一个Silverlight技术群175213051进行交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值