有些同学在部署webfunny的时候会遇到数据库相关的问题,我在这里总结一下,供大家参考
一、为什么数据库里创建了几千张表?
首先,为了提升查询效率,所以webfunny按照项目、日志类型、日期来进行建表的,这就导致了表的数量会比较多。
表的数量并不会影响数据库的性能,可以不用担心哈,这些操作可以理解为一些数据库的分区和分片设计。
那么怎么才能尽量减少表的数量呢?
1. 不要创建无效的项目、删除或者禁用无效的项目
2. 存储周期不要太长,默认8天。如果不需要往前查询数据,可以再减少一点。根目录下 webfunny.config/index.js,在这两个文件中找到logSaveDays参数可以进行修改。
二、数据库有些表非常大,怎么办?
首先,为了帮助用户排查问题,我们不得不尽可能的上报用户的各种日志。其中接口请求量一般是比较大的,所以 -HttpLogInfo- 这张表的量会比较大,因为我们记录了项目中的所有请求和返回值。
那应该怎么办呢?
其实项目中有很多接口是不需要我们关注的,因为我们只需要关注业务接口就行了,在项目详情页,有各种设置,可以帮我们解决:
1. 我们不需要接口监控,那就直接关闭好了(不推荐)
2. 有些接口是无效的,非业务,那就可以把它过滤掉,可以参考应用设置第四步
3. 接口的返回值我们也不需要,那就把请求和返回值的长度设置为0
这样就可以降低接口请求日志的量了。
三、err message: Table 'webfunny_db.webfunny1275CustomerPV20210710' doesn't exist
这个问题很多小伙伴都可能会遇到,但是这并不是一个严重的问题,不要紧张哈。
webfunny采用每天分表的方式,所以webfunny的运行不能中断,才能完成每天建表哦。大家在测试过程中,难免会出现中断运行的情况,所以这种情况很正常,只需要在启动webfunny以后,进入 设置->管理员特权 页面(或者直接进入:/databaseTable.html),「点击重建今明两天的表」,就可修复最近两天的表结构了。
webfunny的上报机制是通过项目标识(webfunny1275),和日期(20210710)找到对应的表,然后数据入库的,所以项目标识和日期对应不上,就无法入库了。
四、为什么还会收到一个月甚至几个月前的日志呢?
webfunny探针产生的日志先存放在本地,再进行上报的。 有些用户产生了日志,还没来得及上报,就关闭了网页,几个月后再次打开,旧日志就会跟新日志一起上报。虽然这个方式有弊端,但是也会减低日志的丢失率。所以大家也不必担心这个问题
五、mysql 连接数太多(SequelizeConnectionError: Too many connections)
这个就是最常见的问题了。因为我做的这个是前端监控系统,日志上报量比较大,所以经常会遇到连接数不够用的情况。 除了你要使用其他技术来缓解并发量,还需要适当的设置mysql数据库的最大连接数。那么怎么增加mysql的最大连接数呢,设置多大为合适呢,这又是一个比较麻烦的问题了。下边是我的一些浅见,仅供参考。
首先我们需要登录mysql, 进入mysql的命令行:
查看当前mysql的连接数:
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 403 |
+----------------------+-------+
1 row in set (0.00 sec)
如何设置mysql的最大连接数呢?
第一种方法:通过mysql命令设置(这种方法是临时性的,重启mysql以后就会失效)
mysql> set GLOBAL max_connections=5000;
Query OK, 0 rows affected (0.00 sec)
第二种方法:进入mysql目录(/usr/local/mysql)找到my.cnf文件,添加如下配置(注意:最大连接数不要设置过大,有可能会在启动的时候爆掉哦),然后执行命令$: service mysql restart
[mysqld]
max_connections=5000
Mysql的最大连接数设置多少合适呢?一般设置个3,5000都没有问题的。
六、Mysql连接错误太多(SequelizeConnectionError: Host 'xx.xx.xx.xx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts')
这个问题并不常见,因为一般mysql的默认值是100。只有当同一个IP对mysql访问出现100次连接错误的时候,mysql就会拒绝这个ip的请求访问。因为我的日志服务和数据库是分离的,所以,经常会在量大的时候出现这个问题。
查看连接报错配置:
mysql> show variables like '%max_connect_errors%';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| max_connect_errors | 100 |
+--------------------+-------+
1 row in set (0.01 sec)
此时只需要执行一下: flush hosts; 就可以清理掉错误记录了。
mysql> flush hosts;
七、数据无法保存 The MySQL server is running with the --read-only option
从字面意思看,应该是只读权限问题,但是这个有极大可能是因为硬盘满了,删除一些过期日志表,或者扩容硬盘即可解决
八、数据库ID无法自增
正常情况下数据库自增是没有问题,除非你做了一些设置。 特别是在更换数据库的时候,极大可能性发生,数据库厂商都会有自增相关的配置,请检查一下