MySQL 线上部署

2017-08-21 language linux c/cpp

主要介绍下 MySQL 如何在线上进行部署。

mysql deploy online logo

可以通过如下步骤部署 MySQL 服务。

创建用户

首先创建 MySQL 用户和组。

# groupadd -r mysql
# useradd -r -g mysql -M -s /sbin/nologin mysql
参数:
    -r 添加系统用户组、系统用户
    -g 指定用户需要添加到的group
    -M 不创建home目录
    -s 指定使用的shell

当出现权限问题时,可以通过如下方式进行调试。

# usermod -s /bin/bash mysql
# su mysql -c 'echo "test" > /opt/data/test'
# su mysql -c 'cat /opt/data/test'
# usermod -s /sbin/nologin mysql

创建数据目录

创建数据目录,另外需要保证 mysql 用户对安装目录有读权限,否则加载插件时可能失败。

# mkdir -pv /opt/data
# chown -R mysql:mysql /opt/data
# chown -R --verbose mysql:mysql /opt/mysql-5.7

数据库初始化

创建系统自带的数据库和表,如果后续误删除,可以直接再次执行如下命令。

# /opt/mysql-5.7/bin/mysqld --initialize-insecure --basedir=/opt/mysql-5.7 \
    --datadir=/opt/data --user=mysql

添加配置文件

如下只是一个简单的配置,详细配置文件可以查看。

# vi /etc/my.cnf
[client]
password       = your_password
port           = 3306
socket         = /tmp/mysql.sock

[mysqld]
user            = mysql
port            = 3306
socket          = /tmp/mysql.sock
basedir         = /opt/mysql-5.7
datadir         = /opt/data
pid-file        = /opt/data/mysqld.pid
ft_min_word_len = 4
max_allowed_packet = 32M
character-set-server = utf8
skip-name-resolve

启动脚本

注意,在编译后源码的 support-files 目录下,包括了一些常见的脚本。

如果使用的是 SysV 系统,可以拷贝服务启动脚本到 /etc/init.d/mysqld 目录下,不过现在一般采用 systemd 管理服务;当然,可以后直接通过该脚本启动服务。

# cp support-files/mysql.server /etc/init.d/mysqld
# service mysqld start

# /opt/mysql-5.7/support-files/mysql.server start 

如果使用 systemd ,可以添加如下文件,如下是 MariaDB 在 CentOS 中的配置。

$ cat /lib/systemd/system/mariadb.service
[Unit]
Description=MariaDB database server
After=syslog.target
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql

ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n
# Note: we set --basedir to prevent probes that might trigger SELinux alarms,
# per bug #547485
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300

# Place temp files in a secure directory, not /tmp
PrivateTmp=true

[Install]
WantedBy=multi-user.target

安全加固

5.7 对系统安全进行了加固,例如:

  • 在数据库初始化时,如果使用的是 initialize 参数初始化数据库,则会为 root 用户设置一个默认的密码,保存在 /root/.mysql_secret 文件中。
  • 密码强度管理,该功能是通过 validate_password 插件进行判断。
  • SET PASSWORD=PASSWORD('paasword'); 方式,修改为 SET password='password';,而且官方建议使用 ALTER 方式。
----- 推荐密码修改方式
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

----- validate_password插件加载方式
$ cat /etc/my.cnf
[mysqld]
plugin-load=validate_password.so

mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
mysql> SHOW VARIABLES LIKE 'validate%';

另外,可以通过如下脚本加固,简单来说就是设置 root 密码,删除 test 数据库。

# /opt/mysql-5.7/bin/mysql_secure_installation

防火墙设置

设置为允许 3306 端口可以远程访问,如下,将 192.168.1.0/24 网段的客户机设置为白名单。

# vim /etc/sysconfig/iptables
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp -m state --state NEW -dport 3306 -j ACCEPT