这次经历不是真的吐血,只是想描述一下当时的心里,真的是有点想吐血的感觉。
在三个月前,我做了一个日志服务,是一个分布式架构的服务,架构体系是使用zookeeper做服务治理,kafka做日志的分发,logstash做日志传输,elasticsearch和mysql做日志的存储,然后还有自己写的一个系统级服务作为其他系统和kafka的连接向kafka生产日志和从kafka消费日志,系统是用tomcat作为容器支撑的,zookeeper、kafka、日志服务、tomcat分别部署在三台服务器上,logstash部署到其中一台服务器,elasticsearch部署到另外三台服务器组成一个集群,然后在另外一台机器上部署的Nginx做日志服务接口请求的统一代理,其他系统只需知道Nginx暴露的那个地址即可,这就是整个日志服务用到的中间件和架构体系,下面说问题。
在项目刚刚完成后,运维给了三台linux服务器,这是一个专业的运维人员给的,我用了小半天时间部署并测试成功了,然后让生产环境切到部署的日志服务正常运行了两个多月,后来应公司安排,内部网络架构大调整,系统都要做迁移,得重新部署一遍,这本来是运维组的事,但是在部署日志服务时,他们原来专业的那个运维人员撤到其他地方了,只剩下一个应届生不怎么懂,还在学习阶段,怎么也部署不对,在部署zookeeper集群时就一直报错,三台服务器上的zookeeper互相连接不上,集群部署失败,更别说后面需要依赖zookeeper的kafka等中间件,而他还不自知是在zookeeper处就部署错误,一直在后面的kafka和tomcat出找原因,失败失败失败,一直都是失败的,无法访问一直报错,然后就只能找到原创作者了,我刚开始其实是很纳闷的,因为部署教程我都按照部署顺序,连命令都写到上面的,他们按照命令去一步一步执行应该就可以了啊,再说他们做运维的应该比我都熟啊,怎么会部署不成功呢,报着这么小的问题看我一会就给你们解决掉的态度就去帮他们部署了。
刚开始他们都部署到docker容器里的,然后我看zookeeper status显示not contacting就是这个意思,具体的错误信息忘记了,然后我看zookeeper里的配置,还有防火墙、端口占用问题,都是正常的,可就是连不上,三台机器之间也能互相ping通,速度也不慢,那就奇怪了,后来我说docker里的都删了,都放在linux实体环境里边来部署试试,然后一顿操作,还是一样的问题,执行zkServer.sh status一样的问题not contacting ,zookeeper.out里的日志也是连接不上另外两台机器,后来又查看是不是端口未开放导致的,然后端口默认是全部开放的,又分别看了好几遍三台服务器的防火墙是否是关闭的,都没问题,这就真的奇怪了,然后又百度搜索同样的问题,网上还真多,挺多人用过的,有人说在zookeeper配置文件把每一台服务器本机地址改为0.0.0.0后面跟上端口,其他两台也分别这么改,然后实在不理解为什么要这样才可以,根本没报希望,但是因为试过很多方法了都不行,那就死马当作活马医吧,反正也没辙,然后就改了重启zookeeper,然后运行zkServer.sh status结果Mode leader 这样的字符出来了,竟然成功了,我去实在不理解啊,这是为什么,这是什么操作,一脸懵逼的看着结果发呆,想了一顿,还是想不通,时间也不早了,我说那就先这么干吧,然后部署kafka,部着部着,忽然想到一个问题,zookeeper每一台本机暴露的地址是0.0.0.0这不行啊,这让kafka怎么找呢,想到这里,我就想着0.0.0.0和原来的ip有啥区别呢,0.0.0.0是代表本机,那个ip也代表本机,zookeeper为啥识别不了这个本机呢,然后我想看一下这个机器的ip不对吗,ifconfig直接上,结果显示人家机器的ip根本不是我们用的那个,真实ip是另一个,现在我们用的这个是虚拟映射出来的ip,我靠,这下就可以解释为啥0.0.0.0可以了,made,这运维自己给自己搞事情啊,也不跟我说,然后二话不说zookeeper配置直接修改ip重启,果然成功了,下来kafka同样的修改为真实ip也是OK的,这个真是他么的想吐血啊,部署了一天竟然是因为这个问题,运维自己不知道?硬是让我排查出来,这我根被没往这方面想啊,谁知道给的环境就有问题呢,然后在部署tomcat、日志服务时,日志服务需要配置producer和consumer的连接地址,producer因为要直接连接kafka生产数据,所以配置了kafka集群的ip和端口,consumer因为要消费kafka的数据但是kafka的消费数据的接口已经交给zookeeper来治理服务了,所以consumer需要配置zookeeper集群的ip和端口,都配的机器的真实ip地址,结果启动服务时报错了,又是找不到服务,连接不上kafka和zookeeper,我去,那这样不行,只能换虚拟地址了,然后毫不犹豫的换成虚拟地址重新启动服务,竟然OK了,哇,这个ip映射真的是麻烦啊。
最后总结一下,看来zookeeper和kafka底层配置的ip是需要机器的真实ip,而在tomcat服务这一层只需映射出来的虚拟地址就可以了啊。