1、什么是MySQL多实例?
MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3307,3308),运行多个MySQL服务进程,通过不同的socket监听不同的服务端口来提供各自的服务。各个实例之间是相互独立的,每个实例的datadir, port, socket, pid都是不同的。
2、MySQL多实例的特点
•有效利用服务器资源,当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。
•资源互相抢占问题,当某个服务实例服务并发很高时或者开启慢查询时,会消耗更多的内存、CPU、磁盘IO资源,导致服务器上的其他实例提供服务的质量下降。
3、应用场景
•采用了数据伪分布式架构的原因,而项目启动初期又不一定有那多的用户量,为此先一组物理数据库服务器,但部署多个实例,方便后续迁移;
•为规避mysql对SMP架构不支持的缺陷,使用多实例绑定处理器的办法,把不同的数据库分配到不同的实例上提供数据服务;
•一台物理数据库服务器支撑多个数据库的数据服务,为提高mysql复制的从机的恢复效率,采用多实例部署;
•已经为双主复制的mysql数据库服务器架构,想部分重要业务的数据多一份异地机房的热备份,而mysql复制暂不支持多主的复制模式,且不给用户提供服务,为有效控制成本,会考虑异地机房部署一台性能超好的物理服务器,甚至外加磁盘柜的方式,为此也会部署多实例;
•传统游戏行业的MMO/MMORPG,以及Web Game,每一个服都对应一个数据库,而可能要做很多数据查询和数据订正的工作,为减少维护而出错的概率,也可能采用多实例部署的方式,按区的概念分配数据库;
4、约定
1、将所有的安装文件、配置文件、数据目录全部放存/mnt/data/mysql目录中,便于今后实现快速迁移、整体备份和快速复制;
2、在一台服务器上配置2个MySQL实例,分别绑定在3307、3308端口。
3、实例均采用my-default.cnf 配置文件;我们可以根据实际需求定制各个实例的my.cnf配置。
my.cnf配置文件有两种方案:
1.多个实例共用同一个my.cnf配置文件中,利用[mysqld1]、[mysqld2]、[mysqld*]标签实现不同实例的差异化配置;
2.每一个实例单独一个my.cnf配置文件
第一种方案:每一个实例单独一个my.cnf配置文件
datadir: /mnt/data/mysql/3307/data
/mnt/data/mysql/3308/data
my.cnf: /mnt/data/mysql/3307/my.cnf
/mnt/data/mysql/3308/my.cnf
5、安装MySQL(通用二进制方式)
1、创建mysql用户和组
[root@localhost ~]# groupadd -r mysql
[root@localhost ~]# useradd -r -g mysql -s /sbin/nologin mysql
2、目录规划
我们为每个实例单独创建一个目录:3307,3308
[root@localhost ~]# mkdir -pv /mnt/data/mysql/{3307,3308}/data
[root@localhost ~]# tree /mnt/data/mysql
/mnt/data/mysql
|-- 3307
`-- 3308
3、解压
[root@localhost ~]# tar xf mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz -C /usr/local/src
[root@localhost ~]# cd /usr/local/
[root@localhost local]# ln -sv src/mysql-5.6.41-linux-glibc2.12-x86_64 mysql
create symbolic link `mysql' to `src/mysql-5.6.41-linux-glibc2.12-x86_64'
4、提供配置文件,并编辑
[root@localhost local]# cd mysql
[root@localhost mysql]# cp support-files/my-default.cnf /mnt/data/mysql/3307/my.cnf
[root@localhost mysql]# cp support-files/my-default.cnf /mnt/data/mysql/3308/my.cnf
# 这里是实验环境,所以简单配置。请各位看官根据实际需求调整
###3307
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3307
socket = /tmp/mysql_3307.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3307
socket = /tmp/mysql_3307.sock
pid-file = /mnt/data/mysql/3307/mysql.pid
user = mysql
basedir = /usr/local/mysql
datadir = /mnt/data/mysql/3307/data
###########################################################
###3308
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3308
socket = /tmp/mysql_3308.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3308
socket = /tmp/mysql_3308.sock
pid-file = /mnt/data/mysql/3308/mysql.pid
user = mysql
basedir = /usr/local/mysql
datadir = /mnt/data/mysql/3308/data
5、修改数据目录的属主、属组
[root@localhost mysql]# chown -R mysql:mysql /mnt/data/mysql/3306
[root@localhost mysql]# chown -R mysql:mysql /mnt/data/mysql/3307
6、把mysql/bin目录添加到PATH
[root@localhost mysql]# vi /etc/profile.d/mysql.sh
# 添加
export PATH=$PATH:/usr/local/mysql/bin
[root@localhost mysql]# . /etc/profile.d/mysql.sh
7、初始化
# 初始化 实例1
[root@localhost mysql]# scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/mnt/data/mysql/3307/data --user=mysql
# 初始化 实例2
[root@localhost mysql]# scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/mnt/data/mysql/3308/data --user=mysql
8、启动/关闭 实例
这里有一个问题,每个实例如何读取各自的my.cnf配置文件呢? 我们需要手动指定
• /usr/local/mysql/bin/mysqld_safe
• --defaults-file 手动指定配置文件
### 启动实例
[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/mnt/data/mysql/3307/my.cnf &>/dev/null &
[1] 3494
[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/mnt/data/mysql/3308/my.cnf &>/dev/null &
[2] 3662
[root@localhost mysql]# netstat -tulpn | grep -i mysql
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 3642/mysqld
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 3815/mysqld
### 关闭实例, 先不要操作哈
[root@localhost ~]# /usr/local/mysql/bin/mysqladmin -uroot -p -S /tmp/mysql_3307.sock shutdown
[root@localhost ~]# /usr/local/mysql/bin/mysqladmin -uroot -p -S /tmp/mysql_3308.sock shutdown
# 注意:这里mysql的root用户并没有设置密码,密码提示直接敲 Enter即可
OK, 我们看到mysqld 监听在3307,3308两个端口上。
接下来我们写上MySQL多实例管理脚本(/mnt/data/mysql/my_sql):
使用方式:/mnt/data/mysql/my_sql 3307 start root psufool
说明:my_sql 端口号 命令 mysql用户 密码
如遇到启动不成功,试试将/tmp/mysql_端口号.sock文件删除后重试
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
port=$1
command=$2
user=$3
pwd=$4
mysql_basedir="/usr/local/mysql"
mysql_multidir="/mnt/data/mysql"
mysql_sock="/tmp/mysql_${port}.sock"
mysql_start(){
if [ ! -e "$mysql_sock" ];then
printf "mysql $port start ... \n"
${mysql_basedir}/bin/mysqld_safe --defaults-file=${mysql_multidir}/${port}/my.cnf 2>&1 > /dev/null &
else
printf "mysql $port is runing ... \n"
exit
fi
}
mysql_stop(){
if [ ! -e "$mysql_sock" ]; then
printf "mysql $port is stopped ... \n"
exit
else
printf "mysql $port stop ... \n"
${mysql_basedir}/bin/mysqladmin -u $user -p${pwd} -S ${mysql_sock} shutdown
fi
}
mysql_restart(){
printf "mysql ${port} restart ... \n"
mysql_stop
sleep 2
mysql_start
}
mysql_login(){
$mysql_basedir/bin/mysql -u$user -p$pwd -S /tmp/mysql_$port.sock
}
mysql_netstat(){
printf netstat -tulpn|grep -i mysql
}
case $command in
start) mysql_start ;;
stop) mysql_stop ;;
restart) mysql_restart ;;
login) mysql_login;;
mysql_netstat) mysql_netstat;;
*)
printf "usage: /mnt/data/mysql/mysql ${port} {start|stop|restart}\n"
esac