暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

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

原创 DBA周技 2023-08-19
732

##

如何在 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/
扫码_搜索联合传播样式标准色版.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论