1、什么是mysql多实例?
mysql多实例就是在一台服务器上同时开启多个不同的服务器端口(如:3306、3307),同时运行多个mysql服务进程,这些服务进程通过不同的socket监听不同的服务器端口来提供服务。
这些mysql多实例共用一套mysql安装程序,使用不同的my.cnf(也可以相同)配置文件、启动命令(也可以相同)和数据文件。在提供服务时,多实例mysql在逻辑上看起来是各自独立的,它们根据配置文件的对应设定值,获得服务器相应数量的硬件资源。
打个比方,mysql多实例就相当于房子的多个卧室,每个实例可以看做一间卧室,整个服务器就是一套房子,服务器的硬件资源(CPU、Mem、Disk)、软件资源(centos操作系统)可以看作房子的卫生间、厨房、客厅,是房子的共用资源。
2、mysql多实例的作用与问题
作用:
2.1、有效利用服务器资源
当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离。
2.2、节约服务器资源
当公司资金紧张,但是数据库又需要各自尽量独立的提供服务,而且,需要主从复制等技术时,多实例就再好不过了。
问题:
存在资源互相抢占的问题。
当某个数据库实例并发很高或有SQL慢查询时,整个实例会消耗大量的系统CPU、磁盘I/O等资源,导致服务器上的其他数据库实例提供服务的质量一起下降。
3、mysql多实例的生产应用场景
3.1、资金紧张型公司的选择
若公司资金紧张,公司业务访问量不太大,但又希望不同业务的数据库服务各自尽量独立的提供服务而互相不受影响,同时,还需要主从复制等技术提供备份或读写分离服务,那么,多实例就再好不过了。例如:可以通过3台服务器部署9~15个实例,交叉做主从复制、数据备份及读写分离,这样就可以达到9~15台服务器每个只装一个数据库才有的效果。强调:所谓的尽量独立是相对的。
3.2、并发访问不是特别大的业务
当公司业务访问量不太大的时候,服务器的资源基本上都浪费了,这时就适合多实例的应用,如果对SQL语句的优化做的比较好,mysql多实例会是一个很值得使用的技术,即使并发很大,合理分配好系统资源,搭配好服务,也不会有太大问题。
3.3、门户网站应用mysql多实例场景
门户网站通常都会使用多实例,因为配置硬件好的服务器,可节省IDC机柜空间,同时,跑多实例也会减少硬件资源跑不满的浪费。
1、创建mysql多实例的数据文件目录
以/data目录作为mysql多实例总的根目录,然后规划不同的数字(即mysql实例端口号)作为/data下面的二级目录,不同的二级目录对应的数字就作为mysql实例的端口号,以区别不同的实例,数字对应的二级目录下包含mysql的数据文件,配置文件和启动文件。
[root@mysql-server tools]# mkdir -p /data/{3306,3307}/data/
[root@mysql-server tools]# tree /data
/data
├── 3306
│ └── data
├── 3307
│ └── data
2、创建mysql多实例的配置文件(data.zip 拿好早已配置的模板通过rz上传到相关目录下)
为了让mysql多实例之间彼此独立,要为每一个实例建立一个my.cnf配置文件和一个启动文件mysql,让它们分别对应自己的数据文件目录data。
[root@mysql-server tools]# unzip data.zip
Archive: data.zip
creating: data/
creating: data/3306/
inflating: data/3306/my.cnf
inflating: data/3306/mysql
creating: data/3307/
inflating: data/3307/my.cnf
inflating: data/3307/mysql
[root@mysql-server tools]# cp data/3306/my.cnf /data/3306/
[root@mysql-server tools]# cp data/3307/my.cnf /data/3307/
[root@mysql-server tools]# tree /data
/data
├── 3306
│ ├── data
│ └── my.cnf
└── 3307
├── data
└── my.cnf
4 directories, 2 files
3、创建mysql多实例的启动文件(data.zip 拿好早已配置的模板通过rz上传到相关目录下)
[root@mysql-server tools]# cp data/3306/mysql /data/3306/
[root@mysql-server tools]# cp data/3307/mysql /data/3307/
[root@mysql-server tools]# tree /data
/data
├── 3306
│ ├── data
│ ├── my.cnf
│ └── mysql
└── 3307
├── data
├── my.cnf
└── mysql
4 directories, 4 files
4、配置mysql多实例的文件权限
4.1、通过下面命令,授权mysql用户和组管理整个多实例的根目录/data
[root@mysql-server tools]# chown -R mysql.mysql /data
[root@mysql-server tools]# find /data -type f -name "mysql"|xargs ls -l
-rw-r--r-- 1 mysql mysql 1307 4月 8 21:07 /data/3306/mysql
-rw-r--r-- 1 mysql mysql 1307 4月 8 21:07 /data/3307/mysql
4.2、通过下面命令,授权mysql多实例所有启动文件的mysql可执行,设置700权限最佳,注意不要用755权限,因为启动文件里有数据库管理员密码,会被读取到。
[root@mysql-server tools]# find /data -type f -name "mysql"|xargs chmod 700
[root@mysql-server tools]# find /data -type f -name "mysql"|xargs ls -l
-rwx------ 1 mysql mysql 1307 4月 8 21:07 /data/3306/mysql
-rwx------ 1 mysql mysql 1307 4月 8 21:07 /data/3307/mysql
5、mysql相关命令加入全局路径的配置
5.1、配置全局路径的意义
如果不为mysql的命令配置全局路径,就无法直接在命令行输入mysql这样的命令,只能用全路径命令(/application/mysql/bin/mysql),这种带着路径输入命令的方式很麻烦。
5.2、配置mysql全局路径的方法
5.2.1、确认mysql命令所在路径,命令如下:
[root@mysql-server tools]# ls /application/mysql/bin/mysql
/application/mysql/bin/mysql
5.2.2、在PATH变量前面增加/application/mysql/bin路径,并追加到/etc/profile文件中,命令如下:
[root@mysql-server tools]# echo ‘export PATH=/application/mysql/bin:$PATH‘ >>/etc/profile
[root@mysql-server tools]# tail -1 /etc/profile
PATH="/application/mysql/bin:$PATH"
[root@mysql-server tools]# source /etc/profile
[root@mysql-server tools]# echo $PATH
/application/mysql/bin:/usr/local/java/jdk1.8.0_60/bin:/usr/local/java/jdk1.8.0_60/jre/bin:/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/bin:/root/bin
6、初始化mysql多实例的数据库文件
6.1、初始化mysql数据库,命令如下:
cd /application/mysql/scripts/
./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
##### --basedir=/application/mysql 是mysql安装路径,--datadir是不同的实例数据目录。
6.2、初始化数据库的原理及结果说明
初始化数据库的实质就是创建基础的数据库系统的库文件,例如:生成mysql库表等。
初始化数据库后查看对应实例的数据目录,可以看到多了如下文件:
[root@mysql-server scripts]# tree /data
/data
├── 3306
│ ├── data
│ │ ├── mysql
│ │ │ ├── columns_priv.frm
│ │ │ ├── columns_priv.MYD
│ │ │ ├── columns_priv.MYI
│ │ │ ├── db.frm
...省略部分...
7、启动mysql多实例数据库
第一个实例3306的启动命令如下:
[root@mysql-server scripts]# /data/3306/mysql start
Starting MySQL...
第二个实例3307的启动命令如下:
[root@mysql-server scripts]# /data/3307/mysql start
Starting MySQL...
检查mysql多实例数据库是否成功启动,命令如下:
[root@mysql-server scripts]# ss -lntup|grep 330
tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",2804,12))
tcp LISTEN 0 128 *:3307 *:* users:(("mysqld",3522,11))
8、mysql多实例启动故障排错说明
如果mysql多实例有服务没有启动,排查办法如下:
1)、如果发现没有显示mysql对应实例的端口,请稍微等待几秒再检查,mysql服务的启动比web服务慢一些。
2)、如果还不行,查看mysql服务对应实例的错误日志,错误日志路径在my.cnf配置的最下面定义。例如,3306实例的错误日志为:
[root@mysql-server 3306]# grep log-error my.cnf|tail -1
log-error=/data/3306/mysql_oldboy3306.err
[root@mysql-server 3306]# tail -10 /data/3306/mysql_oldboy3306.err
180408 22:14:09 InnoDB: 5.5.32 started; log sequence number 0
180408 22:14:09 [Note] Server hostname (bind-address): ‘0.0.0.0‘; port: 3306
180408 22:14:09 [Note] - ‘0.0.0.0‘ resolves to ‘0.0.0.0‘;
180408 22:14:09 [Note] Server socket created on IP: ‘0.0.0.0‘.
...省略部分...
1、配置mysql多实例数据库开机自启动
[root@mysql-server 3306]# echo "/data/3306/mysql start" >> /etc/rc.local
[root@mysql-server 3306]# echo "/data/3307/mysql start" >> /etc/rc.local
[root@mysql-server 3306]# tail -2 /etc/rc.local
/data/3306/mysql start
/data/3307/mysql start
2、登录mysql及管理方法
mysql安装完成后,默认情况下,mysql管理员的账号root是无密码的。登录不同的实例需要指定不同实例的mysql.sock文件路径,这个mysql.sock是在my.cnf配置文件里指定的。
下面是无密码登录数据库的方法,关键点是-S参数及后面指定的/data/3306/mysql.sock,注意,不同实例的sock虽然名字相同,但是路径是不同的,因此是不同的文件。
[root@mysql-server 3306]# mysql -S /data/3306/mysql.sock
[root@mysql-server 3306]# mysql -S /data/3307/mysql.sock
下面是重启对应实例数据库的命令:
/data/3306/mysql stop
/data/3306/mysql start
3、mysql安全配置
mysql管理员的账号root密码默认为空,极不安全,可以通过mysqladmin命令为mysql不同实例的数据库设置独立的密码,命令如下:
[root@mysql-server 3306]# mysqladmin -u root -S /data/3306/mysql.sock password ‘123456‘
[root@mysql-server 3306]# mysqladmin -u root -S /data/3307/mysql.sock password ‘123456‘
登录3306实例的命令如下:
[root@mysql-server 3306]# mysql -uroot -p -S /data/3306/mysql.sock
登录3307实例的命令如下:[root@mysql-server 3306]# mysql -uroot -p -S /data/3307/mysql.sock
若要重启多实例数据库,也需要进行相应的如下配置。在重启数据库前,需要调整不同实例启动文件里对应的数据库密码。
[root@mysql-server 3306]# sed -n ‘13p‘ /data/3306/mysql /data/3307/mysql
mysql_pwd="oldboy"
[root@mysql-server 3306]# sed -i ‘13 s#oldboy#123456#g‘ /data/3306/mysql /data/3307/mysql
[root@mysql-server 3306]# sed -n ‘13p‘ /data/3306/mysql /data/3307/mysql
mysql_pwd="123456"
4、多实例mysql登录问题分析
1)、多实例本地登录mysql
多实例本地登录一般通过socket文件来指定具体登录到哪个实例,此文件的具体位置是在mysql编译过程或my.cnf文件中指定的。在本地登录数据库时,登录程序会通过socket文件来判断登录的是哪个数据库实例。
2)、远程连接登录mysql多实例
远程登录mysql多实例中的一个实例时,通过TCP端口来指定所要登录的mysql实例,此端口的配置是在mysql配置文件my.cnf中指定的。
例如:在 mysql -uoldboy -p‘oldboy‘ -h 10.0.0.7 -P 3307 中,-P为端口参数,后面接具体的实例端口,端口是一种“逻辑连接位置”,是客户端程序被分派到计算机上特殊服务程序的一种方式,强调提前在10.0.0.7上对oldboy用户做了授权。
原文:http://blog.51cto.com/13688462/2327882