mysql5.5数据库多实例部署,我们可以分以下几个步骤来完成。

1、 mysql多实例的原理

2、 mysql多实例的特点

3、 mysql多实例应用场景

4、 mysql5.5多实例部署方法

一、mysql多实例的原理

mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听不同的服务端口,来提供各自的服务。

这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务器的相关硬件资源。

二、mysql多实例的特点

2.1 有效的利用服务器资源

当单个服务器资源有剩余时,可以充分利用剩余的服务器资源来提供更多的服务。

2.2 节约服务器资源

当公司资金紧张,但是数据库需要各自提供独立服务,而且需要主从同步等技术时,使用多实例就最好了。

2.3 出现资源互相抢占问题

当某个实例服务并发很高或者有慢查询时,会消耗服务器更多的内存、CPU、磁盘IO等资源,这时就会导致服务器上的其它实例提供访问的质量下降,出现服务器资源互相抢占的现象。

三、mysql多实例应用场景

3.1 资金紧张型公司的选择

当公司业务访问量不太大,又舍不得花钱,但同时又希望不同业务的数据库服务各自独立,而且需要主从同步进行等技术提供备份或读写分离服务时,使用多实例是最好不过的。

3.2 并发访问不是特别大的业务

当公司业务访问量不太大,服务器资源基本闲置的比较多,这是就很适合多实例的应用。如果对SQL语句优化的好,多实例是一个很值得使用的技术。即使并发很大,只要合理分配好系统资源,也不会有太大问题。

四、mysql5.5多实例部署方法

4.1 mysql5.5多实例部署方法

mysql5.5多实例部署方法一个是通过多个配置文件启动多个不同进程的方法,第二个是使用官方自带的mysqld_multi来实现。

第一种方法我们可以把各个实例的配置文件分开,管理比较方便。第二种方法就是把多个实例都放到一个配置文件中,这个管理不是很方便。所以在此我们选择第一种方法,而且以下实验我们全部是在此方法下进行的。

4.2 mysql5.5的安装及配置

要配置mysql5.5多实例,我们首先要安装mysql5.5,有关mysql5.5的安装可以查看《烂泥:mysql5.5数据库cmake​​源码​​编译安装》这篇文章。

mysql5.5安装完毕后,我们不要启动mysql,因为此时mysql是单实例的。

4.3 创建mysql多实例的数据目录

现在我们来创建mysql5.5多实例的数据目录,在此我们创建两个mysql实例3306和3307。创建各自的数据目录,如下:

[root@localhost ~]# mkdir -p /data/{3306,3307}/data


[root@localhost ~]# tree -L 2 /data/


/data/


|-- 3306


|   `-- data


`-- 3307


    `-- data




4 directories, 0 files


[root@localhost ~]# 


4.4 修改mysql5.5多实例my.cnf文件

实例3306和3307的数据目录创建完毕后,我们来配置实例3306与3307的my.cnf配置文件。

复制mysql5.5安装目录support-files下的my-medium.cnf为my.cnf,

root@localhost ~]# 
[root@localhost ~]# cp /application/mysql-5.5.32/support-files/my-medium.cnf /data/3306/my.cnf
[root@localhost ~]# cp /application/mysql-5.5.32/support-files/my-medium.cnf /data/3307/my.cnf
[root@localhost ~]# tree /data
/data
|-- 3306
|   |-- data
|   `-- my.cnf
`-- 3307
    |-- data
    `-- my.cnf


4 directories, 2 files
[root@localhost ~]# 

并把内容修改为下。现在以3306这个实例为例,如下:

[client]
port = 3306
socket = /data/3306/mysql.sock
[mysqld]
port = 3306
socket = /data/3306/mysql.sock
basedir = /application/mysql-5.5.32
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


注意图中黄色标记出来的部分,就是我们主要修改的,其他默认保持不变。

以上是实例3306的my.cnf配置文件,现在我们来配置实例3307的my.cnf。实例3307的配置文件my.cnf我们直接复制实例3306的my.cnf文件,然后通过sed命令把该文件中的3306修改为3307即可。如下:

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需要改成不同的;



4.5 初始化mysql多实例

实例3306和3307的my.cnf配置文件修改完毕后,我们需要来初始化这两个实例,使用mysql_install_db命令。如下:


/application/mysql-5.5.32/scripts/mysql_install_db --basedir=/application/mysql-5.5.32 --datadir=/data/3306/data --user=mysql

/application/mysql-5.5.32/scripts/mysql_install_db --basedir=/application/mysql-5.5.32 --datadir=/data/3307/data --user=mysql

注意mysql5.5的mysql_install_db在mysql5.5的/usr/local/mysql/scripts/mysql_install_db目录下。




查看实例初始化后的情况,如下:

tree -L 3 /data/ 

[root@localhost 3306]# tree -L 3 /data/
/data/
|-- 3306
|   |-- data
|   |   |-- ib_logfile0
|   |   |-- ib_logfile1
|   |   |-- ibdata1
|   |   |-- ilanni3306
|   |   |-- mysql
|   |   |-- mysql-bin.000001
|   |   |-- mysql-bin.000002
|   |   |-- mysql-bin.index
|   |   |-- performance_schema
|   |   `-- test
|   |-- ilanni.err
|   |-- ilanni.pid
|   |-- my.cnf
|   `-- mysql.sock
`-- 3307
    |-- data
    |   |-- ib_logfile0
    |   |-- ib_logfile1
    |   |-- ibdata1
    |   |-- mysql
    |   |-- mysql-bin.000001
    |   |-- mysql-bin.000002
    |   |-- mysql-bin.000003
    |   |-- mysql-bin.000004
    |   |-- mysql-bin.index
    |   |-- performance_schema
    |   `-- test
    |-- ilanni.err
    |-- ilanni.pid
    |-- my.cnf
    `-- mysql.sock


11 directories, 22 files
[root@localhost 3306]# 



通过上面我们可以看到mysql实例在初始化后会创建基本的数据库。

现在再来看看初始化创建文件的属性,如下:


通过上图可以看到初始化创建的文件都是属于mysql这个用户的。

为什么会是这样呢?

这个是因为我们初始化加入--user=mysql这个选项。当然这个也是我们所需要的,因为这增加了mysql的安全性。


[root@localhost 3306]# ll -h /data/3306/data/
total 29M
-rw-rw---- 1 mysql mysql  18M May 28 07:30 ibdata1
-rw-rw---- 1 mysql mysql 5.0M May 28 07:44 ib_logfile0
-rw-rw---- 1 mysql mysql 5.0M May 28 07:30 ib_logfile1
drwx------ 2 mysql mysql 4.0K May 28 07:46 ilanni3306
drwx------ 2 mysql mysql 4.0K May 28 07:25 mysql
-rw-rw---- 1 mysql mysql  126 May 28 07:30 mysql-bin.000001
-rw-rw---- 1 mysql mysql  202 May 28 07:46 mysql-bin.000002
-rw-rw---- 1 mysql mysql   38 May 28 07:44 mysql-bin.index
drwx------ 2 mysql mysql 4.0K May 28 07:25 performance_schema
drwx------ 2 mysql mysql 4.0K May 28 07:25 test
[root@localhost 3306]# 


4.6 修改mysql实例的数据库目录权限

mysql实例初始化完毕后,我们现在把实例3306和实例3307的数据目录权限重新赋予给mysql用户。如下:

chown -R mysql:mysql /data/3306

chown -R mysql:mysql /data/3307

这个地方建议一定要操作一遍,否则在启动mysql实例时,会提示出错。导致mysql实例无法启动。



4.7 启动mysql5.5多实例

我们现在来启动实例。使用如下命令:


/application/mysql-5.5.32/bin/mysqld_safe --defaults-file=/data/3306/my.cnf &


/application/mysql-5.5.32/bin/mysqld_safe --defaults-file=/data/3307/my.cnf &


ps aux |grep mysqld

[root@localhost 3306]# ps aux |grep mysqld


root      7299  0.0  0.1   4588  1172 pts/1    S    07:44   0:00 /bin/sh /application/mysql-5.5.32/bin/mysqld_safe --defaults-file=/data/3306/my.cnf


mysql     7610  0.0  3.1 337404 33012 pts/1    Sl   07:44   0:00 /application/mysql-5.5.32/bin/mysqld --defaults-file=/data/3306/my.cnf --basedir=/application/mysql-5.5.32 --datadir=/data/3306/data --plugin-dir=/application/mysql-5.5.32/lib/plugin --user=mysql --log-error=/data/3306/ilanni.err --pid-file=/data/3306/ilanni.pid --socket=/data/3306/mysql.sock --port=3306


root      7633  0.0  0.1   4592  1208 pts/1    S    07:45   0:00 /bin/sh /application/mysql-5.5.32/bin/mysqld_safe --defaults-file=/data/3307/my.cnf


mysql     7946  0.0  3.1 336944 32316 pts/1    Sl   07:45   0:00 /application/mysql-5.5.32/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/application/mysql-5.5.32 --datadir=/data/3307/data --plugin-dir=/application/mysql-5.5.32/lib/plugin --user=mysql --log-error=/data/3307/ilanni.err --pid-file=/data/3307/ilanni.pid --socket=/data/3307/mysql.sock --port=3307


root      8088  0.0  0.0   4020   676 pts/1    R+   08:08   0:00 grep mysqld


[root@localhost 3306]# 


通过上面,我们可以看到实例3306和3307 都已经正常启动。也说明我们的mysql5.5多实例已经配置成功。

其实单实例mysql的启动也是通过mysqld_safe命令来启动。它默认会加载/etc/my.cnf文件。

4.8 登录mysql5.5多实例

登录多实例数据库时,我们需要加入该实例的socket文件,才能正常登录。现在以3306实例为例。

本地登录3306实例,如下:

mysql -uroot -p -S /data/3306/mysql.sock

[root@localhost ~]# 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 4


Server version: 5.5.32-log Source distribution




Copyright (c) 2000, 2013, 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上创建一个ilanni3306的数据库。如下:

create database ilanni3306;

show databases;





现在我们远程登录实例3306,并查看刚刚新建的数据库。如下:

mysql -h192.168.1.213 -uroot -p -S /data/3306/mysql.sock


或者:mysql -h192.168.1.213 -uroot -p –P 3306


4.9 修改mysql5.5多实例root密码

修改实例3306的root密码,使用mysqladmin命令。如下:

mysqladmin -uroot -p password 123456 -S /data/3306/mysql.sock




到此我们的mysql多实例部署就已经完成。


4.10 mysql5.5 多实例如何关闭

[root@localhost ~]# /application/mysql-5.5.32/bin/mysqladmin -uroot -p -S /data/3306/mysql.sock shutdown
Enter password: 
[root@localhost ~]# /application/mysql-5.5.32/bin/mysqladmin -uroot -p -S /data/3307/mysql.sock shutdown
Enter password: 
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# ps aux |grep mysqld
root      8184  0.0  0.0   4020   676 pts/3    R+   08:28   0:00 grep mysqld
[root@localhost ~]# 

参考资料:

​ http://blog.chinaunix.net/uid-20639775-id-3438560.html​

​ http://www.th7.cn/db/mysql/201410/75947.shtml​

​ http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21710354&id=4652983​

​ http://blog.fity.cn/post/349/​