1. 概述
1.1 mysql多实例的原理
mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听不同的服务端口,来提供各自的服务。这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务器的相关硬件资源。
2. mysql多实例的特点
2.1 有效的利用服务器资源
当单个服务器资源有剩余时,可以充分利用剩余的服务器资源来提供更多的服务。
2.2 节约服务器资源
当公司资金紧张,但是数据库需要各自提供独立服务,而且需要主从同步等技术时,使用多实例就最好了。
2.3 出现资源互相抢占问题
当某个实例服务并发很高或者有慢查询时,会消耗服务器更多的内存、CPU、磁盘IO等资源,这时就会导致服务器上的其它实例提供访问的质量下降,出现服务器资源互相抢占的现象。
3. mysql5.6多实例部署方法
3.1 mysql5.5多实例部署方法
mysql5.5多实例部署方法一个是通过多个配置文件启动多个不同进程的方法,第二个是使用官方自带的mysqld_multi来实现。
第一种方法我们可以把各个实例的配置文件分开,管理比较方便。第二种方法就是把多个实例都放到一个配置文件中,这个管理不是很方便。所以在此我们选择第一种方法,而且以下实验我们全部是在此方法下进行的。
3.2 mysql5.5的安装及配置
要配置mysql5.5多实例,我们首先要安装mysql5.5,有关mysql5.5的安装可以查看《烂泥:mysql5.5数据库cmake源码编译安装》这篇文章。
mysql5.5安装完毕后,我们不要启动mysql,因为此时mysql是单实例的。
3.3 创建mysql多实例的数据目录
现在我们来创建mysql5.5多实例的数据目录,在此我们创建两个mysql实例3306和3307。创建各自的数据目录,如下:
[root@testdb2 data]# mkdir -p /data/{3306,3307}/data
[root@testdb2 data]# tree -L 2 /data
/data
|-- 3306
| `-- data
|-- 3307
| `-- data
`-- mysql
|-- auto.cnf
|-- db2
|-- db3
|-- db_gbk
|-- ib_logfile0
|-- ib_logfile1
|-- ibdata1
|-- master.info
|-- mysql
|-- performance_schema
|-- relay-log.info
|-- relaylog
|-- test
`-- testdb2.err
12 directories, 7 files
3.4 修改mysql5.5多实例my.cnf文件
实例3306和3307的数据目录创建完毕后,我们来配置实例3306与3307的my.cnf配置文件。
复制mysql5.5安装目录support-files下的my-medium.cnf为my.cnf,并把内容修改为下。现在以3306这个实例为例,如下:
以上是实例3306的my.cnf配置文件,现在我们来配置实例3307的my.cnf。实例3307的配置文件my.cnf我们直接复制实例3306的my.cnf文件,然后通过sed命令把该文件中的3306修改为3307即可。如下:
--配置文件
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysqld]
port = 3306
socket = /data/3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/3306/data
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
skip-name-resolve
log-bin=mysql-bin
binlog_format=mixed
max_binlog_size = 500M
server-id = 1
[mysqld_safe]
log-error=/data/3306/ilanni.err
pid-file=/data/3306/ilanni.pid
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
cp /data/3306/my.cnf /data/3307/my.cnf
sed -i 's/3306/3307/g' /data/3307/my.cnf
或者
sed -e 's/3306/3307/g' /data/3306/my.cnf >/data/3307/my.cnf
备注:修改 server-id
3.5 初始化mysql多实例
先授权
[root@testdb2 data]# chown -R mysql:mysql /data/3306
[root@testdb2 data]#
[root@testdb2 data]#
[root@testdb2 data]# chown -R mysql:mysql /data/3307
实例3306和3307的my.cnf配置文件修改完毕后,我们需要来初始化这两个实例,使用mysql_install_db命令。如下:
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3306/data --user=mysql
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3307/data --user=mysql
注意mysql5.5的mysql_install_db在mysql5.5的/usr/local/mysql/scripts/mysql_install_db目录下。
[root@testdb2 3307]# tree -L 3 /data
/data
|-- 3306
| |-- data
| | |-- ib_logfile0
| | |-- ib_logfile1
| | |-- ibdata1
| | |-- mysql
| | |-- performance_schema
| | `-- test
| `-- my.cnf
|-- 3307
| |-- data
| | |-- ib_logfile0
| | |-- ib_logfile1
| | |-- ibdata1
| | |-- mysql
| | |-- performance_schema
| | `-- test
| `-- my.cnf
3.6 修改mysql实例的数据库目录权限
mysql实例初始化完毕后,我们现在把实例3306和实例3307的数据目录权限重新赋予给mysql用户。如下:
chown -R mysql:mysql /data/3306
chown -R mysql:mysql /data/3307
这个地方建议一定要操作一遍,否则在启动mysql实例时,会提示出错。导致mysql实例无法启动。
3.7 启动mysql5.5多实例
我们现在来启动实例。使用如下命令:
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf &
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@testdb2 data]# ps -ef |grep mysql
root 6950 6502 0 19:07 pts/2 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf
mysql 7261 6950 0 19:07 pts/2 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf --basedir=/usr/local/mysql --datadir=/data/3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3306/ilanni.err --pid-file=/data/3306/ilanni.pid --socket=/data/3306/mysql.sock --port=3306
root 7302 6502 0 19:09 pts/2 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf
mysql 7613 7302 0 19:09 pts/2 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/usr/local/mysql --datadir=/data/3307/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3307/ilanni.err --pid-file=/data/3307/ilanni.pid --socket=/data/3307/mysql.sock --port=3307
root 7645 6502 0 19:09 pts/2 00:00:00 grep mysql
其实单实例mysql的启动也是通过mysqld_safe命令来启动。它默认会加载/etc/my.cnf文件。
3.8 登录mysql5.5多实例
登录多实例数据库时,我们需要加入该实例的socket文件,才能正常登录。现在以3306实例为例。
本地登录3306实例,如下:
mysql -uroot -p -S /data/3306/mysql.sock
[root@testdb2 data]# mysql -uroot -p -S /data/3306/mysql.sock
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 5.6.28-log Source distribution
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
mysql> select user,host,password from mysql.user;
+------+-----------+----------+
| user | host | password |
+------+-----------+----------+
| root | localhost | |
| root | testdb2 | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | testdb2 | |
+------+-----------+----------+
6 rows in set (0.00 sec)
mysql>
3307数据库
[root@testdb2 data]# mysql -uroot -p -S /data/3307/mysql.sock
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 5.6.28-log Source distribution
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
现在我们远程登录实例3306,并查看刚刚新建的数据库。如下:
mysql -h192.168.1.213 -uroot -p -S /data/3306/mysql.sock
[root@testdb2 data]# mysql -uroot -p -h localhost -S /data/3306/mysql.sock
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.6.28-log Source distribution
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
或者:mysql -h192.168.1.213 -uroot -p –P 3306
3.9 修改mysql5.5多实例root密码
修改实例3306的root密码,使用mysqladmin命令。如下:mysqladmin -uroot -p password 123456 -S /data/3306/mysql.sock
多实例关闭数据库
[root@testdb2 data]# mysqladmin -uroot -p -S /data/3306/mysql.sock shutdown
Enter password:
160427 19:19:29 mysqld_safe mysqld from pid file /data/3306/ilanni.pid ended
[1]- Done /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf
[root@testdb2 data]# netstat -luntp |grep 33
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 7613/mysqld
[root@testdb2 data]# mysqladmin -uroot -p -S /data/3307/mysql.sock shutdown
Enter password:
160427 19:21:26 mysqld_safe mysqld from pid file /data/3307/ilanni.pid ended
[2]+ Done /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf
3.10 总结
--配置root用户环境变量
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
export PATH
unset USERNAME
export LANG=en
多实例数据库启动
[root@testdb2 ~]# mysqld_safe --defaults-file=/data/3306/my.cnf &
[root@testdb2 ~]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@testdb2 ~]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@testdb2 ~]# ps -ef |grep mysql
root 8760 6502 0 19:41 pts/2 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf
mysql 9069 8760 0 19:41 pts/2 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf --basedir=/usr/local/mysql --datadir=/data/3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3306/ilanni.err --pid-file=/data/3306/ilanni.pid --socket=/data/3306/mysql.sock --port=3306
root 9095 6502 0 19:42 pts/2 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf
mysql 9404 9095 0 19:42 pts/2 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/usr/local/mysql --datadir=/data/3307/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3307/ilanni.err --pid-file=/data/3307/ilanni.pid --socket=/data/3307/mysql.sock --port=3307
root 9428 6502 0 19:42 pts/2 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3308/my.cnf
mysql 9737 9428 0 19:42 pts/2 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf --basedir=/usr/local/mysql --datadir=/data/3308/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3308/ilanni.err --pid-file=/data/3308/ilanni.pid --socket=/data/3308/mysql.sock --port=3308
root 9772 6502 0 19:43 pts/2 00:00:00 grep mysql
[root@testdb2 ~]# netstat -lntup |grep 330
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 9069/mysqld
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 9404/mysqld
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 9737/mysqld
多实例登录数据库
[root@testdb2 data]# mysql -uroot -p -S /data/3306/mysql.sock
[root@testdb2 data]# mysql -uroot -p -S /data/3307/mysql.sock
多实例关闭数据库
[root@testdb2 ~]# mysqladmin -uroot -p -S /data/3306/mysql.sock shutdown
[root@testdb2 ~]# mysqladmin -uroot -p -S /data/3307/mysql.sock shutdown
[root@testdb2 ~]# mysqladmin -uroot -p -S /data/3308/mysql.sock shutdown
[root@testdb2 ~]# ss -lnutp |grep 330