9.4. mariadb多实例安装

mariadb多实例实现方式:

mysqld_multi

这个是使用单独的配置文件来配置多个实例,不过管理实例还是很方便的。

多个sysv配置

这个方式相当于每个mairadb实例为一个不同的服务而已,每个实例一套sysv脚本。 配置起来比较简单,如果实例过多管理起来比较麻烦。

systemd

这个是systemd管理的特有的。

9.4.1. 配置前规划

上面mairadb的多实例有多种配置方法, 我们先规划如下:

方案

主目录

端口规划

其他

方案1

/data/scheme1/mysql/

3307,3308

方案2

/data/scheme2/mysql/

4307,4308

方案3

/data/scheme3/mysql/

5307,5308

9.4.2. 配置前的环境设置

关闭selinux

[root@centos-158 ~]# setenforce 0
[root@centos-158 ~]# sed -i 's@SELINUX=.*@SELINUX=disabled@' /etc/sysconfig/selinux

关闭防火墙

[root@centos-158 ~]# systemctl stop firewalld
[root@centos-158 ~]# systemctl disable firewalld

9.4.3. 安装mariadb

这里我不使用centos默认的版本,使用最新稳定版本10.2。

上面的基础规划完毕,需要配置下 mariadb的yum源

[root@centos-158 yum.repos.d]# vim mariadb.repo                             # 添加/etc/yum.repos.d/mariadb.repo文件
[root@centos-158 yum.repos.d]# cat mariadb.repo                             # 检查这个文件
[root@centos-158 yum.repos.d]# cat mariadb.repo
# MariaDB 10.2 CentOS repository list - created 2018-01-27 14:09 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
#这个地方的配置是国外的,下载太慢了。 我给改成清华镜像站点的了,这样下载会快点。
baseurl =https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.2.12/yum/centos/7Server/x86_64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

[root@centos-158 yum.repos.d]# yum install MariaDB-server MariaDB-client -y # 安装server和client

Note

这个包名是区分大小写的,使用rpm查询包提供文件的时候注意大小写。

9.4.4. 方案1-mysqld_multi

9.4.4.1. 创建目录并修改权限

[root@centos-158 ~]# mkdir -pv /data/scheme1/mysql/{3307,3308}/data         # 创建目录
[root@centos-158 ~]# chown mysql.mysql /data/scheme1/mysql/330{7,8} -R      # 修改权限

9.4.4.2. 安装数据库

[root@centos-158 ~]# mysql_install_db  --datadir=/data/scheme1/mysql/3308/data --basedir=/usr --user=mysql  # 安装到数据目录
[root@centos-158 ~]# mysql_install_db  --datadir=/data/scheme1/mysql/3308/data --basedir=/usr --user=mysql  # 安装到数据目录

9.4.4.3. 配置文件

[root@centos-158 ~]# mv /etc/my.conf /etc/my.conf.yumbak                # 重命名文件,别影响接下来的实验,其实不必要的
[root@centos-158 ~]# vim /etc/my.conf                                   # 编辑
[root@centos-158 ~]# cat /etc/my.conf                                   # 查看
[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user       = multi_admin
password   = zhaojiedi

[mysqld3307]
socket     = /data/scheme1/mysql/3307/mariadb.sock
port       = 3307
pid-file   = /data/scheme1/mysql/3307/mariadb.pid
datadir    = /data/scheme1/mysql/3307/data
user       = mysql

[mysqld3308]
socket     = /data/scheme1/mysql/3308/mariadb.sock
port       = 3308
pid-file   = /data/scheme1/mysql/3308/mariadb.pid
datadir    = /data/scheme1/mysql/3308/data
user       = mysql

Note

更多的参数官方文档。

9.4.4.4. 启动实例

[root@centos-158 ~]# mysqld_multi start 3307                        # 启动指定的实例,这个是在配置mysqld3307片段,实例名字就是3307
[root@centos-158 ~]# mysqld_multi start 3308                        # 启动指定的实例,这个是在配置mysqld3307片段,实例名字就是3307

[root@centos-158 ~]# netstat -tunlp |grep 330*                      # 查看服务
tcp6       0      0 :::3307                 :::*                    LISTEN      2631/mysqld
tcp6       0      0 :::3308                 :::*                    LISTEN      2746/mysqld

Note

mysqld_multi start 3307-3308来批量启动,多个矢量还可以逗号分割。

9.4.4.5. 安全初始化脚本运行

[root@centos-158 ~]# mysql_secure_installation -S /data/scheme1/mysql/3307/mariadb.sock  # 使用socket连接3307实例
# 下面内容只跳出重要的输入项列出
Enter current password for root (enter for none):              # 默认密码空,直接回车即可
Set root password? [Y/n] y                                     # 输入y
New password:                                                  # 输入root用户密码,注意不是系统密码,是数据库密码
Re-enter new password:                                         # 再次确认
Remove anonymous users? [Y/n] y                                # 移除匿名用户
Disallow root login remotely? [Y/n] y                          # 禁止root用户远程登陆,这个看你具体情况设置
Remove test database and access to it? [Y/n] y                 # 移除test数据库
Reload privilege tables now? [Y/n] y                           # 刷新权限表
[root@centos-158 ~]# mysql_secure_installation -S /data/scheme1/mysql/3308/mariadb.sock  # 使用socket连接3308实例

9.4.4.6. 添加多实例管理用户

[root@centos-158 ~]# vim create_user.sql                        # 添加用户脚本
[root@centos-158 ~]# cat create_user.sql                        # 检查
CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multi_admin';
GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';
flush privileges;

[root@centos-158 ~]# cat create_user.sql | mysql -u root -S /data/scheme1/mysql/3307/mariadb.sock -p #执行脚本
Enter password:
[root@centos-158 ~]# cat create_user.sql | mysql -u root -S /data/scheme1/mysql/3308/mariadb.sock -p # 执行脚本
Enter password:

更多 mysqld-multi 使用帮助。

9.4.4.7. 查看和关闭实例

[root@centos-158 ~]# mysqld_multi report                        # 查看服务状态
Reporting MariaDB servers
MariaDB server from group: mysqld3307 is running
MariaDB server from group: mysqld3308 is running
[root@centos-158 ~]# mysqld_multi stop 3307                     # 关闭一个实例
[root@centos-158 ~]# mysqld_multi report                        # 查看服务状态
Reporting MariaDB servers
MariaDB server from group: mysqld3307 is not running
MariaDB server from group: mysqld3308 is running

9.4.4.8. 开机启动

直接加入到rc.local中

[root@centos-158 ~]# echo `which mysqld_multi` start 3307-3308  >> /etc/rc.local        # 开机执行
[root@centos-158 ~]# tail -n 1 /etc/rc.local
/usr/bin/mysqld_multi start 3307-3308

上面的加入rc.local方式管理上容易混乱,还是写个sysv脚本好些。

[root@centos-158 init.d]# cd /etc/rc.d/init.d/
[root@centos-158 init.d]# vim mysqld_multi
[root@centos-158 init.d]# cat mysqld_multi
#! /bin/bash
# chkconfig: 2345 90 10
# description: mysqld_multi

# See how we were called.
mysqld_multi=/usr/local/mysql/bin/mysqld_multi
# 实例列表
instance_list="3307-3308"
#instance_list="3307,3308,3309-3310"
start(){
    $mysqld_multi start $instance_list
}
stop(){
    $mysqld_multi stop $instance_list
}
status(){
    $mysqld_multi report
}
case "$1" in
start)
    start
        ;;
stop)
    stop
        ;;
status)
    status
        ;;
restart)
    start
    stop
        ;;
*)
    echo $"Usage: $0 {start|stop|status}"
    exit 2
esac

[root@centos-158 init.d]# chkconfig --add mysqld_multi                  # 添加sysv
[root@centos-158 init.d]# chkconfig mysqld_multi on                     # 启用mysqld_multi

9.4.5. 方案2-多sysv脚本

9.4.5.1. 创建目录并修改权限

这种方式,需要每个配置文件都要单独存放,可以给目录更详细的规划下

[root@centos-158 ~]#  mkdir -pv /data/scheme2/mysql/{4307,4308}/{data,etc,log,socket,pid,service}       # 创建目录
[root@centos-158 ~]# chown mysql.mysql /data/scheme2/mysql/4307 -R                                      # 修改所有者
[root@centos-158 ~]# chown mysql.mysql /data/scheme2/mysql/4308 -R                                      # 修改所有者

9.4.5.2. 安装数据库

[root@centos-158 ~]# mysql_install_db  --datadir=/data/scheme2/mysql/4307/data --basedir=/usr --user=mysql  # 安装数据库
[root@centos-158 ~]# mysql_install_db  --datadir=/data/scheme2/mysql/4308/data --basedir=/usr --user=mysql  # 安装数据库

9.4.5.3. 配置配置文件

[root@centos-158 ~]# cd /data/scheme2/mysql/4307/etc/                           # 进入配置目录
[root@centos-158 etc]# vim my.cnf                                               # 编辑单独的配置文件
[root@centos-158 etc]# cat my.cnf                                               # 检查
[mysqld]
port=4307
datadir=/data/scheme2/mysql/4307/data
socket=/data/scheme2/mysql/4307/socket/mariadb.sock
[mysqld-safe]
log-error=/data/scheme2/mysql/4307/log/mariadb.log
pid-file=/data/scheme2/mysql/4308/pid/mariadb.pid

[root@centos-158 etc]# cp my.cnf ../../4308/etc/my.cnf                          # 复制到另一个实例中去
[root@centos-158 etc]# sed -i 's@4307@4308@' ../../4308/etc/my.cnf              # 修改配置的端口
[root@centos-158 etc]# cat ../../4308/etc/my.cnf                                # 检查
[mysqld]
port=4308
datadir=/data/scheme2/mysql/4308/data
socket=/data/scheme2/mysql/4308/socket/mariadb.sock
[mysqld-safe]
log-error=/data/scheme2/mysql/4308/log/mariadb.log
pid-file=/data/scheme2/mysql/4308/pid/mariadb.pid

9.4.5.4. 配置服务文件

[root@centos-158 4307]# vim service/mysqld.sh                                   # 编辑sysv脚本
[root@centos-158 4307]# cat service/mysqld.sh                                   # 检查
#!/bin/bash
# chkconfig: 2345 91 19
# description: manage mariadb

port=4307
mysql_user="root"
mysql_pwd=""
mysql_basedir="/data/scheme2/mysql"
#cmd_path="${mysql_basedir}/${port}/bin"
cmd_path="/usr/bin"
mysql_sock="${mysql_basedir}/${port}/socket/mariadb.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
    printf "Starting MySQL...\n"
    cmd="${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf"
    printf "$cmd\n"
    ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
    printf "MySQL is running...\n"
    exit
    fi
}
function_status_mysql(){
        if [ -e "$mysql_sock" ] ; then
                printf "MySql is running...\n"
        else
                printf "MySql is stopped...\n"
        fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
    printf "MySQL is stopped...\n"
    exit
    else
    printf "Stoping MySQL...\n"
    ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}


function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
        function_start_mysql
        ;;
stop)
        function_stop_mysql
        ;;
restart)
        function_restart_mysql
        ;;
status)
        function_status_mysql
        ;;
*)
    printf "Usage: ${cmd_path}/mysqld {start|stop|restart|status}\n"
esac


[root@centos-158 4307]# cp service/mysqld.sh  ../4308/service/mysqld.sh     # 复制一份
[root@centos-158 4307]# sed -i 's@4307@4308@' ../4308/service/mysqld.sh     # 修改端口
[root@centos-158 4307]# cat ../4308/service/mysqld.sh                       # 检查
#!/bin/bash
# chkconfig: 2345 91 19
# description: manage mariadb

port=4308
mysql_user="root"
mysql_pwd=""
mysql_basedir="/data/scheme2/mysql"
#cmd_path="${mysql_basedir}/${port}/bin"
cmd_path="/usr/bin"
mysql_sock="${mysql_basedir}/${port}/socket/mariadb.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
    printf "Starting MySQL...\n"
    cmd="${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf"
    printf "$cmd\n"
    ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
    printf "MySQL is running...\n"
    exit
    fi
}
function_status_mysql(){
        if [ -e "$mysql_sock" ] ; then
                printf "MySql is running...\n"
        else
                printf "MySql is stopped...\n"
        fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
    printf "MySQL is stopped...\n"
    exit
    else
    printf "Stoping MySQL...\n"
    ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}


function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
        function_start_mysql
        ;;
stop)
        function_stop_mysql
        ;;
restart)
        function_restart_mysql
        ;;
status)
        function_status_mysql
        ;;
*)
    printf "Usage: ${cmd_path}/mysqld {start|stop|restart|status}\n"
esac

# 添加执行权限
[root@centos-158 4307]# chmod a+x /data/scheme2/mysql/4307/service/mysqld.sh
[root@centos-158 4307]# chmod a+x /data/scheme2/mysql/4308/service/mysqld.sh

9.4.5.5. 开机启动

[root@centos-158 4307]# ln -s /data/scheme2/mysql/4307/service/mysqld.sh /etc/rc.d/init.d/mysql4307     # 添加到init.d目录
[root@centos-158 4307]# chkconfig --add mysql4307                                                       # 添加到sysv
[root@centos-158 4307]# chkconfig mysql4307 on                                                          # 开机启动

[root@centos-158 4307]# cd ../4308

[root@centos-158 4308]# ln -s /data/scheme2/mysql/4308/service/mysqld.sh /etc/rc.d/init.d/mysql4308     # 添加到init.d目录
[root@centos-158 4308]# chkconfig --add mysql4308                                                       # 添加到sysv
[root@centos-158 4308]# chkconfig mysql4308 on                                                          # 开机启动

9.4.5.6. 启动服务和查看状态

[root@centos-158 4307]# service mysql4307 start                     # 启动实例
[root@centos-158 4307]# service mysql4308 start                     # 启动实例
[root@centos-158 4307]# netstat -tunlp |grep 430                    # 查看状态
tcp6       0      0 :::4307                 :::*                    LISTEN      8221/mysqld
tcp6       0      0 :::4308                 :::*                    LISTEN      8369/mysqld

9.4.5.7. 安全初始化

[root@centos-158 4307]# mysql_secure_installation  -u root  -S /data/scheme2/mysql/4307/socket/mariadb.sock # 安全初始化,参考方案1
[root@centos-158 4307]# mysql_secure_installation  -u root  -S /data/scheme2/mysql/4308/socket/mariadb.sock # 安全初始化,参考方案1

9.4.5.8. 服务文件修改密码

[root@centos-158 4307]# vim service/mysqld.sh               # 修改文件的密码项为上面的安装初始化指定的密码
mysql_pwd="xxxxx"
[root@centos-158 4307]# chmod 750 service/mysqld.sh         # 带有密码设置下权限
[root@centos-158 4307]# cd ../4308
[root@centos-158 4308]# vim service/mysqld.sh               # 修改文件的密码项为上面的安装初始化指定的密码
mysql_pwd="xxxxx"
[root@centos-158 4308]# chmod 750 service/mysqld.sh         # 带有密码设置下权限

9.4.6. 方案3-systemd

9.4.6.1. 创建目录并修改权限

这种方式,需要每个配置文件都要单独存放,可以给目录更详细的规划下

[root@centos-158 ~]# mkdir -pv /data/scheme3/mysql/{5307,5308}/{data,log,socket,pid}        # 创建目录
[root@centos-158 ~]# chown mysql.mysql /data/scheme3/mysql/5307 -R                          # 所有者修改
[root@centos-158 ~]# chown mysql.mysql /data/scheme3/mysql/5308 -R                          # 所有者修改

9.4.6.2. 安装数据库

[root@centos-158 ~]# mysql_install_db  --datadir=/data/scheme3/mysql/5307/data --basedir=/usr --user=mysql  # 安装数据库
[root@centos-158 ~]# mysql_install_db  --datadir=/data/scheme3/mysql/5308/data --basedir=/usr --user=mysql  # 安装数据库

9.4.6.3. 配置配置文件

[root@centos-158 ~]# mv /etc/my.cnf /etc/my.cnf.multi                       # 原有配置文件重名
[root@centos-158 system]# cd /etc/my.cnf.d/                                 # 进入conf.d目录

[root@centos-158 my.cnf.d]# vim my5307.cnf                                  # 编辑这个文件,名字为my<instance_nam>.cnf
[root@centos-158 my.cnf.d]# cat my5307.cnf                                  # 检查
[mysqld]
datadir=/data/scheme3/mysql/5307/data
socket=/data/scheme3/mysql/5307/socket/mariadb.sock
port=5307
log-error=/data/scheme3/mysql/5307/log/mariadb.log
pid-file=/data/scheme3/mysql/5307/pid/mariadb.pid
[root@centos-158 my.cnf.d]# vim my5308.cnf                                  # 编辑这个文件
[root@centos-158 my.cnf.d]# cat my5308.cnf                                  # 检查
[mysql]
datadir=/data/scheme3/mysql/5308/data
socket=/data/scheme3/mysql/5308/socket/mariadb.sock
port=5308
log-error=/data/scheme3/mysql/5308/log/mariadb.log
pid-file=/data/scheme3/mysql/5308/pid/mariadb.pid

9.4.6.4. 配置systemd

[root@centos-158 my.cnf.d]# vim /usr/lib/systemd/system/mariadb@.service        # 修改mariadb@service文件默认项
# 修改如下内容
ConditionPathExists=/etc/my.cnf.d/my%I.cnf

ExecStartPre=/bin/sh -c "[ ! -e /usr/bin/galera_recovery ] && VAR= || \
VAR=`/usr/bin/galera_recovery --defaults-file=/etc/my.cnf.d/my%I.cnf`; [ $? -eq 0 ] \
&& systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1"

ExecStart=/usr/sbin/mysqld --defaults-file=/etc/my.cnf.d/my%I.cnf \
$_WSREP_NEW_CLUSTER $_WSREP_START_POSITION%I $MYSQLD_OPTS

上面的简单的说就是说明下mysqld命令的路径,指定你的实例所在的路径%I代表实例名字。后续启动的systemctl start mariadb@5307这个命令中,5307就是实例名字。

这个文件有点多, 提供一个下载参考吧。

/files/mariadb@.service

9.4.6.5. 启动服务和查看状态

[root@centos-158 my.cnf.d]# systemctl daemon-reload                 # 重载systemd
[root@centos-158 my.cnf.d]# systemctl start mariadb@5307            # 启动实例
[root@centos-158 my.cnf.d]# systemctl start mariadb@5308            # 启动实例
[root@centos-158 my.cnf.d]# netstat -tunlp |grep 530                # 查看服务状态
tcp6       0      0 :::5307                 :::*                    LISTEN      10267/mysqld
tcp6       0      0 :::5308                 :::*                    LISTEN      10595/mysqld

9.4.6.6. 开机启动

[root@centos-158 my.cnf.d]# systemctl enable  mariadb@5307           # 开机启动这个实例
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb@5307.service to /usr/lib/systemd/system/mariadb@.service.
[root@centos-158 my.cnf.d]# systemctl enable  mariadb@5308           # 开机启动这个实例
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb@5308.service to /usr/lib/systemd/system/mariadb@.service.

9.4.6.7. 安全初始化

[root@centos-158 ~]# mysql_secure_installation  -u root  -S /data/scheme3/mysql/5307/socket/mariadb.sock    # 安全设置
[root@centos-158 ~]# mysql_secure_installation  -u root  -S /data/scheme3/mysql/5308/socket/mariadb.sock    # 安全设置