一、什么是mysql多实例?
mysql多实例就是在一台服务器上同时开启多个不一样的服务器端口(如:330六、3307),同时运行多个mysql服务进程,这些服务进程经过不一样的socket监听不一样的服务器端口来提供服务。
这些mysql多实例共用一套mysql安装程序,使用不一样的my.cnf(也能够相同)配置文件、启动命令(也能够相同)和数据文件。在提供服务时,多实例mysql在逻辑上看起来是各自独立的,它们根据配置文件的对应设定值,得到服务器相应数量的硬件资源。
打个比方,mysql多实例就至关于房子的多个卧室,每一个实例能够看作一间卧室,整个服务器就是一套房子,服务器的硬件资源(CPU、Mem、Disk)、软件资源(centos操做系统)能够看做房子的卫生间、厨房、客厅,是房子的共用资源。
二、mysql多实例的做用与问题
做用:
2.一、有效利用服务器资源
当单个服务器资源有剩余时,能够充分利用剩余的资源提供更多的服务,且能够实现资源的逻辑隔离。
2.二、节约服务器资源
当公司资金紧张,可是数据库又须要各自尽可能独立的提供服务,并且,须要主从复制等技术时,多实例就再好不过了。
问题:
存在资源互相抢占的问题。
当某个数据库实例并发很高或有SQL慢查询时,整个实例会消耗大量的系统CPU、磁盘I/O等资源,致使服务器上的其余数据库实例提供服务的质量一块儿降低。
三、mysql多实例的生产应用场景
3.一、资金紧张型公司的选择
若公司资金紧张,公司业务访问量不太大,但又但愿不一样业务的数据库服务各自尽可能独立的提供服务而互相不受影响,同时,还须要主从复制等技术提供备份或读写分离服务,那么,多实例就再好不过了。例如:能够经过3台服务器部署9~15个实例,交叉作主从复制、数据备份及读写分离,这样就能够达到9~15台服务器每一个只装一个数据库才有的效果。强调:所谓的尽可能独立是相对的。
3.二、并发访问不是特别大的业务
当公司业务访问量不太大的时候,服务器的资源基本上都浪费了,这时就适合多实例的应用,若是对SQL语句的优化作的比较好,mysql多实例会是一个很值得使用的技术,即便并发很大,合理分配好系统资源,搭配好服务,也不会有太大问题。
3.三、门户网站应用mysql多实例场景
门户网站一般都会使用多实例,由于配置硬件好的服务器,可节省IDC机柜空间,同时,跑多实例也会减小硬件资源跑不满的浪费。java
一、建立mysql多实例的数据文件目录
以/data目录做为mysql多实例总的根目录,而后规划不一样的数字(即mysql实例端口号)做为/data下面的二级目录,不一样的二级目录对应的数字就做为mysql实例的端口号,以区别不一样的实例,数字对应的二级目录下包含mysql的数据文件,配置文件和启动文件。mysql
[root@mysql-server tools]# mkdir -p /data/{3306,3307}/data/ [root@mysql-server tools]# tree /data /data ├── 3306 │ └── data ├── 3307 │ └── data
二、建立mysql多实例的配置文件(data.zip 拿好早已配置的模板经过rz上传到相关目录下)
为了让mysql多实例之间彼此独立,要为每个实例创建一个my.cnf配置文件和一个启动文件mysql,让它们分别对应本身的数据文件目录data。web
[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
三、建立mysql多实例的启动文件(data.zip 拿好早已配置的模板经过rz上传到相关目录下)sql
[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
四、配置mysql多实例的文件权限
4.一、经过下面命令,受权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.二、经过下面命令,受权mysql多实例全部启动文件的mysql可执行,设置700权限最佳,注意不要用755权限,由于启动文件里有数据库管理员密码,会被读取到。centos
[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
五、mysql相关命令加入全局路径的配置
5.一、配置全局路径的意义
若是不为mysql的命令配置全局路径,就没法直接在命令行输入mysql这样的命令,只能用全路径命令(/application/mysql/bin/mysql),这种带着路径输入命令的方式很麻烦。
5.二、配置mysql全局路径的方法
5.2.一、确认mysql命令所在路径,命令以下:安全
[root@mysql-server tools]# ls /application/mysql/bin/mysql /application/mysql/bin/mysql
5.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
六、初始化mysql多实例的数据库文件
6.一、初始化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.二、初始化数据库的原理及结果说明
初始化数据库的实质就是建立基础的数据库系统的库文件,例如:生成mysql库表等。
初始化数据库后查看对应实例的数据目录,能够看到多了以下文件:app
[root@mysql-server scripts]# tree /data /data ├── 3306 │ ├── data │ │ ├── mysql │ │ │ ├── columns_priv.frm │ │ │ ├── columns_priv.MYD │ │ │ ├── columns_priv.MYI │ │ │ ├── db.frm ...省略部分...
七、启动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))
八、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'. ...省略部分...
一、配置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
二、登陆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
三、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"
四、多实例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用户作了受权。