1.mysql多实例实质
在一台机器上开启多个不同的mysql服务端口(3306,3307),运行多个mysql服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务;
多个实例共用一套mysql安装程序,配置文件可以用同一个(最好不同),启动程序可以用同一个(最好不同),数据文件是不同的;
服务器的硬件资源是公用的;
逻辑上多实例是各自独立的

2.多实例的作用
有效利用服务器资源; #每台服务器的资源利用率要高
节约服务器资源;
但是多实例会存在资源互相抢占问题,当某个服务实例并发很高或者有慢查询时,会消耗整台服务器更多的内存、CPU等,导致其他实例运行也慢

3.多实例的应用场景
资金比较紧张的公司;
并发访问不是特别大的业务;
门户网站一般会采取:目的是配硬件好的服务器,节省IDC机柜空间,让硬件资源不浪费

4.mysql多实例常见配置方案
1)通过多个配置文件及多个启动程序来实现多实例

#生产中比较推荐此方法,本随笔中也将采取此方法
2)单一配置文件方案即一个配置文件里写多个实例的内容

#通过mysqld_muti参数实现,此方法耦合性太高

5.安装多实例数据库

#生产硬件配置,32G MEM 8 CPU,硬盘6*600g SAS 15k,跑2-3个实例
1)安装好cmake及mysql依赖的包
yum install ncurses-devel -y
yum install libaio-devel -y
2)创建mysql多实例数据文件目录

#此过程依赖于已经安装好mysql软件的单实例环境
采用/data目录作为mysql多实例总的数据文件根目录
pkill mysqld

#创建前需把创建好的mysql单实例杀掉

rm -f /etc/init.d/mysqld #删除单实例时的启动命令

mkdir -p /data/{3306,3307}/data
tree /data

chown -R mysql.mysql /data #授权data目录

3)创建mysql配置文件并配置环境变量
分别在/data/3306和/data/3307下创建my.conf文件 不像单实例放在/etc/下 #my.cnf中主要修改port和server-id

echo ‘export PATH=/application/mysql/bin:$PATH’ >>/etc/profile #环境变量设置单实例已设置

4)初始化数据文件
初始化命令同单实例,只是更改数据路径:
在/application/mysql/scripts下执行./mysql_install_db –basedir=/application/mysql –defaults-file=/data/3306/my.cnf –datadir=/data/3306/data –user=mysql #同理实现3307初始化

#初始化的目的就是为了生成存放文件的地方,结果就是在/data下生成了一些系统化的文件

5)配置开机自启动脚本&启动多实例

#!/bin/bash
# chkconfig: 2345 64 36 #配置系统自启动
# description: A very fast and reliable SQL database engine.
##############################################################
# File Name: mysqld
# Version: V1.0
##############################################################
#引入系统函数库
. /etc/init.d/functions

#基础路径定义
basedir='/application/mysql'
bindir='/application/mysql/bin'
lockdir='/var/lock/subsys'                                       
lock_file_path="$lockdir/mysql"
mysqld_pid_file_path='$basedir/data/`uname -n`.pid'

#成功提示函数
log_success_msg(){
    #action为特殊的提示函数,$@为所有参数。
    action "SUCCESS! $@" /bin/true
}
#失败提示函数
log_failure_msg(){
    action  "ERROR! $@" /bin/false
  }

#mysql启动函数
start(){
    echo $"Starting MySQL"
    #测试mysqld_safe是否可执行
    if test -x $bindir/mysqld_safe
    then
        #后台执行启动mysql命令
        $bindir/mysqld_safe &>/dev/null &
        #获取返回值
        retval=$?
        #判断返回值是否为0
        if [ $retval -eq 0 ]
        then
            #调用成功提示函数。
            log_success_msg "mysql Startup"
            if test -w "$lockdir" #判断锁目录是否可写。
            then
                touch "$lock_file_path" #创建锁文件。
            fi
            return $retval #给返回值是专业的表现。
        else
            log_failure_msg "MySQL Startup" #调用失败函数提示。
            return $retval
        fi
    else
        log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
    fi
}
#停止MySQL函数。
stop(){
    #判断mysql pid file大小是否为0。
    if test -s "$mysqld_pid_file_path"
    then
        #读取pidfile
        mysqld_pid=`cat "$mysqld_pid_file_path"`
        #判断mysql pid对应的进程是否存在。
        if (kill -0 $mysqld_pid 2>/dev/null)
        then
            echo $"Shutting down MySQL"
            kill $mysqld_pid #停止MySQL命令。
            retval=$?
            if [ $retval -eq 0 ]
            then
                log_success_msg "MySQL Stop" #调用停止成功函数。
                if test -f "$lock_file_path"
                then
                    rm -f "$lock_file_path"  #删除锁文件。
                fi
                return $retval
            else
                log_failure_msg "MySQL Stop."
                return $retval
            fi
        else
            log_failure_msg "MySQL server process mysqld_pid is not running!"
            rm "$mysqld_pid_file_path"
        fi  
    else
        log_failure_msg "MySQL server PID file is null or not exist!"
    fi
}
#接收传参判断并执行相应函数。
case "$1" in
    start)
        start
        retval=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    restart)
        stop
        sleep 2 #这里很重要,要休息一下。
        start
        retval=$?
        ;;
    *)
        echo $"Usage:$0 {start|stop|restart}"
        exit 2
esac
exit $retval    #执行脚本后,有返回值才更专业。

启动数据库:
/data/3306/mysql start
/data/3307/mysql start
netstat -lntup|grep 330[6-7]
多实例启动文件的启动mysql服务实质 #这里直接采用mysqld_safe启动多实例
mysqld_safe –defaults-file=/data/3306/my.cnf 2>&1 > /dev/null &
mysqld_safe –defaults-file=/data/3307/my.cnf 2>&1 > /dev/null &

6)登录多实例数据库
mysql -S /data/3306/mysql.sock #多实例的登录一定要指定特定的socket
mysqladmin -u root -S /data/3306/mysql.sock password ‘oldboy123’ #多实例为root增加密码
mysql -uroot -p’oldboy123’ -S /data/3306/mysql.sock #密码外侧的单引号可省略

#为了确保账户安全,因此要将启动脚本改权限,只有root可以更改密码:
find /data -type f -name “mysql” -exec chmod 700 {} .
find /data -type f -name “mysql” -exec chown root.root {} .
find /data -type f -name “mysql” -exec ls -l {} .
7)停止多实例数据库
多实例启动文件的停止mysql服务实质:
mysqladmin -u root -poldboy123 -S /data/3306/mysql.sock shutdown
mysqladmin -u root -poldboy123 -S /data/3307/mysql.sock shutdown

8)如果mysql服务没有起来,排查办法如下:
8.1)若发现没有mysql的端口,等几秒再看,可能是会比较慢
8.2)查看错误日志,该日志路径在my.cnf最下面可以看到
grep log-error my.cnf|tail -l
>>log-error=/data/3306/mysqlcoco.err
8.3)前面每行命令执行的返回结果是否有错误
8.4)查看系统的/var/log/messages

#Linux中可以用vimdiff file1 file2 来同时对比两个文件内容 %附件为3306和3307两个实例的my.cnf对比

文档更新时间: 2019-12-18 14:26   作者:老王