openstack数据库报错1040:too many connections,修改MariaDB最大连接数

时间:2022-10-03 11:43:07

【现象】
测试环境140虚机,机房断电一次,服务器重启后无法创建虚拟机一直显示scheduler(调度),查看日志报错数据库报错1040:too many connections,显示连接数太多。
【分析】
查看openstack数据库配置文件(使用MariaDB),按照官网配置:

[root@controller user]# vim /etc/my.cnf.d/openstack.cnf 

[mysqld]
bind-address = 10.1.XX.XXX
default-storage-engine = innodb
innodb_file_per_table
max_connections = 1024
collation-server = utf8_general_ci
character-set-server = utf8

已经定义max_connections为1024,最大支持连接数16384,那就修改max_connections = 16000
保存配置重启服务仍然不行。

进入数据库查看使用情况:

mysql -uroot -pxxxx
MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value | +-----------------+-------+
| max_connections | 214 | +-----------------+-------+
MariaDB [(none)]> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value | +----------------------+-------+
| Max_used_connections | 215 | +----------------------+-------+

max_connections:最大连接数214,
Max_used_connections:最大已用连接数215,

MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_connections。因此MySQL的实际最大可连接数为 max_connections+1;

现在已用连接数已经达到最大数,所以虚拟机无法再创建,dashboard上面经常无法刷新flavor、image列表就可以解释了。
但是,为什么是214呢,我们不是修改了配置文件为1024吗?为什么没生效呢?

【解决】
原因在于Centos7/RHEL7的系统中,systemd对系统资源有限制,配置如下:
全局的配置,放在文件/etc/systemd/system.conf和/etc/systemd/user.conf。
同时,也会加载两个对应的目录中的所有.conf文件
/etc/systemd/system.conf.d/.conf和/etc/systemd/user.conf.d/.conf

其中,system.conf是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。

我们在system.conf中添加以下两个参数,数目自定义,我们写100000.

# vim /etc/systemd/system.conf
[Manager]
DefaultLimitNOFILE=100000
DefaultLimitNPROC=100000

或者修改单个service的资源限制:
编辑/usr/lib/systemd/system/mariadb.service
在【service】字段下添加:

LimitNOFILE=50000
LimitNPROC=50000

然后保存配置,执行:

# systemctl daemon-reload
# systemctl restart mariadb.service

最后到数据库中重新查看连接数,最大连接数已经改为我们在
/etc/my.cnf.d/openstack.cnf
中设置的数值

mysql -uroot -pxxxx
MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value | +-----------------+-------+
| max_connections | 16000 | +-----------------+-------+
MariaDB [(none)]> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value | +----------------------+-------+
| Max_used_connections | 385 | +----------------------+-------+