一、MySQL多实例介绍
(1)什么是MySQL多实例?
简单的说,就是在一台一台机器上开启多个不同的服务端口(如:3306,3307,3308)等,运行多个MySQL服务进程;
这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务。
这些MySQL多实例公用一套MySQL安装程序,使用不同或相同的my.cnf配置文件,启动程序,数据文件。在提供服务时,多实例
MySQL在逻辑上看来试各自独立的多个实例的自身是根据配置文件对应的设定值;来取得服务器的相关硬件资源的多少。
做个比喻;MySQL多实例相当于一个房子有多个卧室一样,每个实例可以看做是一间卧室,整个服务器就是这一套房子,
服务器的硬件资源(cpu,mem,disk)可以看做房子的卫生间,厨房,客厅一样,是房子的公共资源。这样我们就明白了。
多实例补充:其实很多服务都可以有多实例,甚至在门户网站用的很广泛,例如nginx就可以多实例,apache,haproxy,redis,memcache,等都可以多实例。
(2)MySQL多实例的作用与问题?
1.有效利用服务器资源
当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。
2.节约服务器资源
当公司资金紧张时,但是数据库又需要各自尽量提供独立的服务,而且,需要主从同步技术时,多实例就再好不过了
3.资源互相强占问题
当某个服务实例并发很高或者有慢查询时,整个实例会消耗很多的内存,CPU,磁盘,IO资源,导致服务器上的其它的实例提供服务的质量下降,
这个就相当于大家住在不同的卧室,但是早上起来都得洗脸,刷牙等。这样卫生间就会长期占用,需要排队等待。。。
(3)MySQL多实例生产应用场景
1.资金紧张型公司的选择
当公司业务访问量不大,又不想花钱,但是希望不同的业务的数据库服务各自尽量独立的提供服务互相不受影响;而且,需要主从同步技术进行提供备份或读写分离服务时,多实例就很好了。
如:dell 720 满配:3台服务器 一般部署6-9个实例,交叉做主从同步备份及读写分离。
2.并发访问部署特别大的业务
当公司业务访问量部署太大的时候,服务器的资源基本就是浪费的,这就很时候做多实例的应用;
如果SQL优化做得比较好,MySQL多实例是一个很好的技术,及时并发很大,合理分配系统资源,也可以解决。
3.门户网站应用MySQL多实例场景
百度搜索引擎的数据库就是多实例,一般是从库,内存96G,跑3-4个实例,sina网也用的多实例,内存48G,门户
网站使用多实例的目的是配置硬件好的服务器,节省IDC机柜空间,同时,跑多实例让硬件资源不浪费。
(4)MySQL多实例常见配置方案
1.多实例配置文件部署方案
即本文主要讲解的方案,通过配置多个配置文件及多个启动程序来实现多实例的配置,
推荐使用这种:
[root@mysql-double /]# ls -R data/
data/:
3306 3307 3308 data my.cnf mysql
数据文件 配置文件 启动文件
data/3306:
data/3307:
data/3308:
[root@mysql-double /]#
提示:数据文件 配置文件 启动文件 分别是独立的,每个目录下面都有。
2.单一配置文件部署方案
(5)安装MySQL多实例
1.安装
[root@mysql-double tmp]# mkdir /var/soft
[root@mysql-double tmp]# cp mysql-5.6.20.tar.gz /var/soft/
[root@mysql-double tmp]# sh lamp.sh
ok mysql-5.6.20
-- Installing: /usr/local/mysql/sql-bench/test-alter-table
-- Installing: /usr/local/mysql/sql-bench/innotest2
-- Installing: /usr/local/mysql/sql-bench/bench-init.pl
-- Installing: /usr/local/mysql/sql-bench/test-big-tables
mysql-5.6.20安完成
[root@mysql-double tmp]#
在我的企业中,采用的是/data目录作为mysql多实例总的根目录,然后规划不同的MySQL实例端口号来作为/data
下面的二级目录,不同的端口号就是不同的实例目录,以区别不同的实例;二级目录下包含mysql数据文件,配置文件以及启动文件的目录。
2.创建相关mysql多实例的目录如下:
[root@mysql-double /]# mkdir -p /data/{3306,3307,3308}/data
[root@mysql-double /]# ll data/ 总的目录
total 12
drwxr-xr-x. 3 root root 4096 Dec 28 21:40 3306 3306实例的目录
drwxr-xr-x. 3 root root 4096 Dec 28 21:40 3307 3307实例的目录
drwxr-xr-x. 3 root root 4096 Dec 28 21:40 3308 3308实例的目录
[root@mysql-double /]#
注意:生产环境配置:MEM 32G 双cpu:核心 磁盘:6*600Gsas 15K;两到三个实例
3.创建MySQL多实例配置文件
MySQL数据库默认为用户提供多个配置文件,用户可以根据实际情况选择
cd /usr/local/mysql/support-files
cp my-default.cnf /etc/my.cnf
注:关于mysql my.cnf中参数的调优,后面会介绍;
support-files下有my-default.cnf的默认配置样例
4.拷贝配置文件
[root@mysql-double data]# cd /usr/local/mysql/support-files
[root@mysql-double support-files]# cp mysql.server /data/3306/mysql 这里需要多实例启动脚本
[root@mysql-double support-files]# cp mysql.server /data/3307/mysql
[root@mysql-double support-files]# cp mysql.server /data/3308/mysql
################################################################################################
#############################多实例启动脚本--自写#####################
[root@sersync 3306]# cat mysql
####################tangbo##################
###############mysql start file#############
#init#
port=3306
mysql_user="root"
mysql_pwd="111111"
cmdpath="/usr/local/mysql/bin/"
mysql_sock="/data/${port}/mysql.sock"
#start function
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL......\n"
/bin/sh ${cmdpath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 >/dev/null &
else
printf "MySQL is running.....\n"
exit
fi
}
#stop function
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stoped......\n"
exit
else
printf "Stop MySQL.....\n"
${cmdpath}mysqladmin -u${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
#restart function
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
;;
*)
printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
[root@sersync 3306]#
###################################################done###########
####################################################################
[root@mysql-double support-files]# cp my-default.cnf /data/3306/my.cnf
[root@mysql-double support-files]# cp my-default.cnf /data/3307/my.cnf
[root@mysql-double support-files]# cp my-default.cnf /data/3308/my.cnf
5.完整的配置文件
[root@mysql-double /]# ls -R /data/
/data/:
3306 3307 3308
/data/3306:
data my.cnf mysql.server
/data/3306/data:
/data/3307:
data my.cnf mysql.server
/data/3307/data:
/data/3308:
data my.cnf mysql.server
/data/3308/data:
[root@mysql-double /]#
6.初始化
[root@mysql-double /]# ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
[root@sersync scripts]# ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
[root@sersync scripts]# ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
chown -R mysql.mysql /data/3306/*
chown -R mysql.mysql /data/3307/*
chown -R mysql.mysql /data/3308/*
chown -R mysql.mysql /usr/local/mysql/*
(6)安装完成,开始启动检查.包括修改密码,检查端口,启动停止是否正常,登陆正常等。
1.启动与停止mysql
[root@mysql-double /]#/data/3306/mysql start
[root@mysql-double /]#netstat -tlnp
[root@mysql-double /]#/data/3306/mysql stop
[root@mysql-double /]#netstat -tlnp
2.登陆数据库
[root@sersync /]# mysql -uroot -p -S /data/3306/mysql.sock
[root@sersync /]# mysql -uroot -p -S /data/3307/mysql.sock
[root@sersync /]# mysql -uroot -p -S /data/3308/mysql.sock
mysqladmin -uroot password '111111' -S /data/3307/mysql.sock 修改密码
3.验证端口
[root@sersync /]# netstat -tlnp |grep 33
tcp 0 0 :::3307 :::* LISTEN 14096/mysqld
tcp 0 0 :::3308 :::* LISTEN 14302/mysqld
tcp 0 0 :::3306 :::* LISTEN 13892/mysqld
[root@sersync /]#
(7)MySQL故障排错多实例数据库
如果MySQL服务没有起来,排查办法如下:
1.如果发现没有显示MySQL端口,请稍等几秒再看看,MySQL服务启动会稍微慢。
2.如果不行,查看错误日志
[root@sersync 3306]# grep mysql_tangbo3306.err my.cnf | tail -l
3.细看所有执行命令的屏幕输出,不要忽略关键的输出内容。
4.查看系统的[root@sersync 3306]# tail /var/log/messages
5.如果是关联服务,要同时查看相关的LOG。
提醒:经常查看各种服务运行日志是个很好的习惯,也是高手的成长之路。
(8)配置MySQL多实例数据库开机自启动
加入/etc/local,设置为开机自启动(要确保脚本可以执行)
[root@sersync 3306]#echo "#mysql multi instances" >>/etc/rc.local
[root@sersync 3306]#echo "/data/3306/mysql start" >>/etc/rc.local
[root@sersync 3306]#echo "/data/3307/mysql start" >>/etc/rc.local
[root@sersync 3306]#echo "/data/3308/mysql start" >>/etc/rc.local
[root@sersync 3306]# tail -l /etc/rc.local
tail: inotify cannot be used, reverting to polling
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
#mysql multi instances
/data/3306/mysql start
/data/3307/mysql start
/data/3308/mysql start
[root@sersync 3306]#
(9)增强root密码
[root@sersync 3306]# mysqladmin -uroot password '111111' -S /data/3307/mysql.sock
###################################################################################################
###################################################################################################
###关于多实例MySQL登陆问题总结:
1.本地登陆
多实例本地端登陆通过socket文件来指定具体登陆到哪个实例,此文件具体位置是在MySQL初始化
(mysql_install_db)时指定的。在本机登陆时登陆程序通过socket文件来判断登陆的数据库实例。
mysql_sock <-->文件是服务器与本地客户端进行通信的Unix套接字文件
例如:mysql -uroot -p'111111' -S /data/3306/mysql.sock
mysql -uroot -p'111111' -S /data/3307/mysql.sock
mysql -uroot -p'111111' -S /data/3308/mysql.sock
2.远程登陆
远程登陆指定多实例主机中的期中一个实例。TCP/UDP端口(port)来指定所需要登陆的mysql实例,
此端口是在mysql配置文件中的my.cnf中指定的。
端口port{----}端口是一种‘逻辑连接位置’,客户端程序被分派计算机上特殊服务程序的一种方式。
例如:mysql -uremote -p'111111' -h192.168.11.36 -P3306
mysql -uremote -p'111111' -h192.168.11.36 -P3307
mysql -uremote -p'111111' -h192.168.11.36 -P3308