如何在 Linux 中使用 systemd 配置和管理多个 MySQL 实例

2023年 8月 23日 42.6k 0

##

如何在 Linux 中使用 systemd 配置和管理多个 MySQL 实例

本博客介绍了如何为多个 MySQL 实例配置 systemd。通过使用 YUM 或 APT 进行 MySQL 软件包安装,可以轻松地使用 systemctl 管理 MySQL,但是当您从通用二进制文件安装时,您将如何管理它呢?

在这里,我们将从通用二进制文件配置多个 MySQL 实例,并使用 systemd 管理它们。

为什么同一服务器上需要多个实例?

我们会这样做,但为什么首先需要同一主机上的多个实例呢?为什么不在同一个实例上创建另一个数据库呢?在某些情况下,您将需要主机上有多个实例。

  1. 您可以将具有两个或三个实例的主机配置为源服务器的延迟副本,其中 SQL 延迟为 24 小时、12 小时和 6/3 小时。
  2. 备份测试。您可以在服务器上运行多个实例,以使用正确的版本和配置测试备份。
  3. 我们按功能/团队拆分数据库,让每个团队对其模式拥有完全的自主权,如果有人搞砸了,只会破坏他们的集群,而不是所有数据库。然而,较大的实例更经济,因为并非所有 MySQL 服务器总是需要最大资源。因此,您可以将多个 MySQL 服务器放在一台机器上,而不是在一个 MySQL 实例中放置多个数据库。更好的故障处理,类似的成本。但是,是的,不要将同一集群的所有节点放在同一主机上,而是在不同集群的同一主机上有多个节点。
  4. 在这种情况下(在非常大的分片部署中)用户将在每台服务器上安装多个 mysqld 以减少争用,即,他们在每台具有 4 个或 8 个 mysqld 的 2 插槽服务器上获得的性能比一台服务器更高。据我所知,Facebook 就是这样做的。

FB 的最初动机是由于不同的硬件代次,特别是在区域/数据中心之间。例如,较旧的数据中心可能拥有较小/功能较弱的机器,因此它们在每个主机上运行较少的 mysqld 以进行补偿。还有其他例外,例如需要专用机器的异常大的特殊情况分片。

也就是说,上面提到的其他性能动机确实发挥了作用,尤其是在多线程复制出现之前。我同意,在云和巨大闪存存储的现代时代,绝大多数公司永远不需要考虑在产品中这样做,但总有需要的机会。

安装MySQL

要安装和使用 MySQL 二进制发行版,命令序列如下所示:

yum install libaio1 libaio-dev numactl
useradd -r -g mysql -s /bin/false mysql
groupadd mysql
cd /usr/local/
tar xvfz /root/Percona-Server-8.0.19-10-Linux.x86_64.ssl101.tar.gz
ln -s /usr/local/Percona-Server-8.0.19-10-Linux.x86_64.ssl101/ mysql
cd /data/
mkdir -p /data/mysql/{3306,3307}/data
chown -R mysql:mysql /data
chmod 750 -R /data/mysql/{3306,3307}/data

为每个实例创建MySQL配置

下面是我放置在 /etc/prod3306.cnf 中的第一个实例的示例。我的命名约定是prod3306和prod3307。然后,我 将该命名约定放在配置文件名 /etc/prod3306.cnf 中。我可以做 my.cnf.instance 或 instance.my.cnf。

当您的 MySQL 二进制文件基目录不是默认目录时,需要目录 lc_messages_dir = / usr / local / mysql / share ,因此我必须传递它的路径 - 否则,MySQL 将无法启动。

[root@ip-172-31-128-38 share]# cat /etc/prod3306.cnf

[mysqld@prod3306]
datadir=/data/mysql/3306
socket=/data/mysql/3306/prod3306.sock
mysqlx_socket=/data/mysql/3306/prod3306x.sock
log-error=/data/mysql/prod3306.err
port=3306
mysqlx_port=33060
server-id=1336
slow_query_log_file=/data/mysql/3306/slowqueries.log
innodb_buffer_pool_size = 50G
lower_case_table_names=0
tmpdir=/data/mysql/3306/tmp/
log_bin=/data/mysql/3306/prod3306-bin
relay_log=/data/mysql/3306/prod3306-relay-bin
lc_messages_dir=/usr/local/mysql/share

[mysqld@prod3307]
datadir=/data/mysql/3307
socket=/data/mysql/3307/prod3307.sock
mysqlx_socket=/data/mysql/3307/prod3307x.sock
log-error=/data/mysql/prod3307.err
port=3307
mysqlx_port=33070
server-id=2337
slow_query_log_file=/data/mysql/3307/slowqueries.log
innodb_buffer_pool_size = 50G
lower_case_table_names=0
lc_messages_dir=/usr/local/mysql/share
tmpdir=/data/mysql/3307/tmp/
log_bin=/data/mysql/3307/prod3307-bin
relay_log=/data/mysql/3307/prod3307-relay-bin

初始化实例

初始化数据库,并从错误日志文件中获取数据库的临时密码,以便在MySQL实例启动后登录并更新密码。

ln -s /usr/local/mysql/bin/mysqld /usr/bin
mysqld --no-defaults --initialize-insecure --user=mysql --datadir=/data/mysql/3307 --lower_case_table_names=0
mysqld --no-defaults --initialize-insecure --user=mysql --datadir=/data/mysql/3306 --lower_case_table_names=0

配置systemd服务

在 /etc/systemd/system/ mysql@.service创建 SYSTEMD 基本配置,并将以下内容放入其中。这是 MySQL 实例的命名约定生效的地方。在 SYSTEMD 配置文件中,%I 将替换为您使用的命名约定。

[root@ip-172-31-128-38 share]# cat /usr/lib/systemd/system/mysqld@.service
# Copyright (c) 2016, 2021, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# systemd service file for MySQL forking server
#
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/data/mysql/mysqld-%i.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables
#ExecStartPre=/usr/bin/mysqld_pre_systemd %I

# Start main service
ExecStart=/usr/bin/mysqld --defaults-file=/etc/prod3306.cnf --defaults-group-suffix=@%I --daemonize --pid-file=/data/mysql/mysqld-%i.pid $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 65536
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
[root@ip-172-31-128-38 share]#

重新加载守护进程

systemctl daemon-reload

启动MySQL

systemctl start mysqld@prod3307
systemctl start mysqld@prod3306

启用MySQL服务

systemctl enable mysqld@prod3307
systemctl enable mysqld@prod3306

每个实例的错误日志

[root@ip-172-31-128-38 3307]# tail -5 /data/mysql/prod3306.er
tail: cannot open ‘/data/mysql/prod3306.er’ for reading: No such file or directory
[root@ip-172-31-128-38 3307]# tail -5 /data/mysql/prod3306.err
2023-07-10T05:26:42.521994Z 0 [System] [MY-010910] [Server] /usr/bin/mysqld: Shutdown complete (mysqld 8.0.19-10) Percona Server (GPL), Release 10, Revision f446c04.
2023-07-10T05:26:48.210107Z 0 [System] [MY-010116] [Server] /usr/bin/mysqld (mysqld 8.0.19-10) starting as process 20477
2023-07-10T05:26:52.094196Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2023-07-10T05:26:52.112887Z 0 [System] [MY-010931] [Server] /usr/bin/mysqld: ready for connections. Version: '8.0.19-10' socket: '/data/mysql/3306/prod3306.sock' port: 3306 Percona Server (GPL), Release 10, Revision f446c04.
2023-07-10T05:26:52.261062Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/data/mysql/3306/prod3306x.sock' bind-address: '::' port: 33060

root@ip-172-31-128-38 3307]# tail -5 /data/mysql/prod3307.err
2023-07-10T05:26:36.032160Z 0 [System] [MY-010910] [Server] /usr/bin/mysqld: Shutdown complete (mysqld 8.0.19-10) Percona Server (GPL), Release 10, Revision f446c04.
2023-07-10T05:26:58.328962Z 0 [System] [MY-010116] [Server] /usr/bin/mysqld (mysqld 8.0.19-10) starting as process 20546
2023-07-10T05:27:02.179449Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2023-07-10T05:27:02.198092Z 0 [System] [MY-010931] [Server] /usr/bin/mysqld: ready for connections. Version: '8.0.19-10' socket: '/data/mysql/3307/prod3307.sock' port: 3307 Percona Server (GPL), Release 10, Revision f446c04.
2023-07-10T05:27:02.346514Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/data/mysql/3307/prod3307x.sock' bind-address: '::' port: 33070
[root@ip-172-31-128-38 3307]#

结论

利用systemctl来控制MySQL,大大简化了MySQL实例的管理。此方法有助于轻松配置多个实例(扩展到两个以上),并简化整体管理流程。然而,在单个服务器上设置多个 MySQL 实例时,必须注意内存分配。为每个 MySQL 实例适当分配内存可确保足够的开销和最佳性能。

机翻:https://www.percona.com/blog/how-to-use-systemd-in-linux-to-configure-and-manage-multiple-mysql-instances/

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论