解决k8sMysqlCluster无故重启问题
前言
使用 bitpoke的mysql-operator 作为k8s的mysql服务,使用的版本v0.4.0,
github地址:https://github.com/bitpoke/mysql-operator 介绍
MysqlCluster operator主要支持如下功能 数据自动备份/还原 主从模式 支持Prometheus 数据监控 问题产生
建立的mysql服务每隔一段时间就重启,事件的报错信息如下 Readiness probe failed: ERROR 2003 (HY000): Can"t connect to MySQL server on "127.0.0.1" (111) /bin/sh: line 0: test: -eq: unary operator expected Liveness probe failed: Get "http://172.31.210.72:9125/metrics": dial tcp 172.31.210.72:9125: connect: connection refused 定位问题
为什么心跳不通过?
貌似心跳机制不通过,查看pod信息
pod 探针设置
心跳默认20秒不通过,就重启,看源码也没有心跳配置项,坑啊,不过这只是表象,到底是什么导致心跳不通过?
mysqlCluster启动时,会启动4个容器metrices-exporter, mysql, pt-heartbeat, sidecar。看这4个容器的cpu, 内存使用情况,发现mysql内存超过,如下:
mysql内存使用情况
看最后状态,OOMKilled,而且当前内存使用率3.9G 接近limit 4G的设置。 找到产生的问题原因了,是因为内存超了,被容器杀掉,导致心跳不通过报错重启
为什么内存使用这么高?
思考mysql使用内存高,可能跟mysql自身缓存有关系,查内存相关参数 show variables where variable_name in ("innodb_buffer_pool_size","innodb_log_buffer_size","innodb_additional_mem_pool_size","key_buffer_size","query_cache_size");
mysql配置信息
看到 innodb_buffer_pool_size 设置得值特别大,这个参数设置只有主要缓存innodb表的索引,数据,插入数据时的缓冲,但默认是8M。
为什么 innodb_buffer_pool_size 设置变得这么大?
翻翻mysqlCluster源码,跟innodb_buffer_pool_size 有关代码
default.go // 没有设置innodb-buffer-pool-size ,通过cluster.Spec.PodSpec.Resources.Requests.Memory 配置项计算一个 // set innodb-buffer-pool-size if not set innodbBufferPoolSize := 128 * mb // MySQL default value if mem := cluster.Spec.PodSpec.Resources.Requests.Memory(); mem != nil && !mem.IsZero() { var cErr error if innodbBufferPoolSize, cErr = computeInnodbBufferPoolSize(mem); cErr == nil { setConfigIfNotSet(cluster.Spec.MysqlConf, "innodb-buffer-pool-size", humanizeSize(innodbBufferPoolSize)) } } // 计算大小 func computeInnodbBufferPoolSize(mem *resource.Quantity) (int64, error) { availableMem := mem.Copy() percentRAM := 0.75 if mem.Value() <= 512*mb { // don"t set innodb-buffer-pool-size leave it to mysql default (128M) return 0, fmt.Errorf("memory too small to compute innodb-buffer-pool-size: %s", mem) } else if mem.Value() <= 1*gb { // RAM <= 1gb => buffer size set to RAM * 0.5 availableMem.Sub(resource.MustParse("256Mi")) percentRAM = 0.5 } else if mem.Value() <= 4*gb { // RAM <= 4gb => buffer size set to RAM * 0.75 availableMem.Sub(resource.MustParse("256Mi")) percentRAM = 0.75 } else if mem.Value() > 4*gb { // RAM > 4gb => buffer size set to RAM * 0.8 availableMem.Sub(resource.MustParse("512Mi")) percentRAM = 0.8 } return int64(float64(availableMem.Value()) * percentRAM), nil }
源码解析:没有设置innodb-buffer-pool-size, 则通过cluster.Spec.PodSpec.Resources.Requests.Memory 大小的参数乘以系数,这里是0.75,所以是3G。
问题就在这里,为了保证资源独占,mysql设置时是request = limit,因为自动计算导致 innodb-buffer-pool-size过大,最终导致oom,需要手动设置innodb-buffer-pool-size,就手动设置2G吧 mysqlConf: innodb-buffer-pool-size: 2147483648
设置 innodb-buffer-pool-size 不生效?
设置后,pod不重启? 参数没有生效设置。设另一个512M就生效了。尝试加入引号,作为字符串处理,配置开始生效。难道跟类型有关系? 继续看相关源码
default.go innodbBufferPoolSize := 128 * mb // MySQL default value if mem := cluster.Spec.PodSpec.Resources.Requests.Memory(); mem != nil && !mem.IsZero() { var cErr error if innodbBufferPoolSize, cErr = computeInnodbBufferPoolSize(mem); cErr == nil { setConfigIfNotSet(cluster.Spec.MysqlConf, "innodb-buffer-pool-size", humanizeSize(innodbBufferPoolSize)) } }
看这个类型定义cluster.Spec.MysqlConf
MysqlClusterSpec type MysqlConf map[string]intstr.IntOrString
intstr type IntOrString struct { Type Type `protobuf:"varint,1,opt,name=type,casttype=Type"` IntVal int32 `protobuf:"varint,2,opt,name=intVal"` StrVal string `protobuf:"bytes,3,opt,name=strVal"` }
如果设置成数字,则整数是int32位
看int32位的长度
int32 the set of all signed 32-bit integers (-2147483648 to 2147483647)
2147483647 < 2147483648 = 2g 所以应该是配置报错,但没有抛出来而已
至此内存使用过大的问题,解决了,内存使用也降下来了 结论mysqlCluster 自动设置了 innodb-buffer-pool-size 导致内存过高,超过Limit限制,被容器kill,反复重启,事件日志就是心跳连不上了,导致重启。 k8s 上有状态的服务。优点:操作快捷方便,普通开发人员都可以操作。缺点:刚起步,很多方面不够完善,包括文档。碰见问题,需要下源码查具体问题。
苹果公司被指窃取商业机密既抄技术又挖墙脚据彭博社(Bloomberg)8月25日报道,美国医疗器械公司迈心诺(Masimo)CEO乔基亚尼(JoeKiani)近日对外表示,目前该公司针对苹果窃取商业机密的诉讼已进入了一个
美国医疗器械公司迈心诺指控苹果公司窃取商业机密抄技术还挖墙脚多年以来,数码界就以苹果出品作为标杆,其设计和技术被誉为全球顶尖,以往有不少厂商是根据苹果的产品来设计自家的产品,并且还能通过借鉴的设计获得不错的市场反馈。但是作为一家巨头公司,苹
荣耀X20上手评测6。67英寸超窄边框全视屏66W快充荣耀X系列作为荣耀爆款系列之一,不少用户也在期盼,荣耀X系列到底什么时候回归?没错,这个夏天,它回来了最新发布的荣耀X20会带来什么不凡体验呢?熊姐带大家一起来看看。6。67英寸超
阿里聊天工具设计阿里应该出个类似微信一样的产品,把支付宝改造一下,下面五个按钮,消息通讯录发现服务我的。1消息和微信一样可以聊天2通讯录是联系人及订阅号公众号,群聊新朋友等等3发现里包括朋友圈视频
挂载阿里云盘为本地磁盘网盘为多类型终端文件传输提供了极大的便利,很多时候我们需要直接在PC上编辑处理文件,将云盘进行挂载,可以像编辑本地文件一样编辑云盘文件。网上存在许多类似教程,但大多为转发,并未验证
预算不高只有千元怎么选手机内行人推荐的这几款款款都是高性价比最近很多朋友问我,我预算不高,可能最多也只有千元,那我能买到心仪的手机吗?一般情况下,便宜的东西不好,贵的东西肯定好,这也是中国消费者传统的想法,不过手机就不一样,随着科技的发展,
防拆卸司法定位社区矫正腕带4G全网通GPS北斗防拆卸定位追踪器功能1双向通话,SOS紧急呼救,环境听音,远程录音,短信接收2多重精准定位历史轨迹电子围栏3视频通话,拍照(微聊视频通话选配)4IP68深度防水防尘等级5
用极致设计征服强迫症用户,魅族18系列这个开学季价格有点香8月已经接近尾声,细数一番国产手机厂商还发布了不少新旗舰,当然在配置的提升的同时价格也是水涨船高。在新机价格太高的情况下,消费者不妨看看上半年的一些旗舰,价格不仅有优势,而且在设计
红米k40Pro好不好用?该不该入手?话不多说直接上图跑分是没有问题的,但是因为手机发烫很严重我是对着空调吹测的跑分这是手机平均温度这是我手机的配置配置总的来说配置方面还可以,打游戏流畅运行无压力,原神最高画质不掉帧,
微软将在未来五年内投入200亿美元用于网络安全微软计划在未来五年内将网络安全方面的支出翻四番,达到200亿美元。这一承诺是在美国总统乔拜登与几家大型科技公司首席执行官举行安全峰会期间做出的。微软还将提供1。5亿美元的技术服务,
华为创始人任正非,管理就是洞察人性,35条深度思考值得收藏在中国,能够被称为企业家教父的人并不多,甚至很少有企业家可以被称之为教父,毫无疑问,华为创始人任正非就是其中之一。有人形容任正非是真正的商业思想家。中国历来都不缺乏政治家企业家,但