·8.1.1什么是MySQL多实例?
简单的说,就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务。
这些MySQL多实例共用一套MySQL安装程序,使用不同的my.cnf配置文件、启动程序,数据文件。在提供服务时,多实例MySQL在逻辑上看来是各自独立的,多个实例之间是根据配置文件的设定值,来取得相关服务器的硬件资源。
作个比喻,MySQL多实例相当于房子的多个卧室一样,每个实例可以看作一个卧室,整个服务器就是一套房子,服务器的硬件资源(cpu.mem,disk)可以看作房子的卫生间,厨房、客厅一样,是房子的公用资源,北漂蜗居在一起,肯定要共用上述资源。
多实例补充:其实很多服务都可以有多实例,甚至在门户网站用的很广泛,例如nginx就可以多实例,apache haproaxy redis memcache,都可以多实例。
http:/∥edu.51cto.com/course/course id-395.html.
·8.1.2MySQL多实例的作用
·8.1.2.1有效利用服务器资源。
当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。
·8.1.2.2节约服务器资源。
当公司资金紧张,但是数据库又需要各自尽量独立提供服务,而且,需要主从同步等
技术时,多实例就再好不过了。
·8.1.2.3资源互相抢占问题。
当某个服务实例并发很高或者有慢查询时,整个实例会消耗更多的内存、CPU、磁盘IO资源,导致服务器上的其它实例提供服务的质量下降。这就相当于大家住在一个房子的不同卧室一样,早晨起来上班,都要刷牙、洗脸等,这样卫生间就会长期占用,其它人就
8.2 MySQL多实例生产应用场景。
8.2.1资金紧张型公司的选择。
当公司业务访问量不太大,又舍不得花钱,但又希望不同业务的数据库服务各自尽量独立的提供服务互相不受影响,而且,需要主从同步进行等技术提供备份或读写分离服务时,多实例就再好不过了。如:可以通过3台服务器部署6-9个实例,交叉做主从同步备份及读写分离,实现6-9台服务器才有的效果。这里要强调的是,所谓的尽量独立是相对的。画图举例(连接数多,查询多)
8.2.2并发访问不是特别大的业务。
当公司业务访问量不太大的时候,服务器的资源基本都是浪费的,这时就很适合多实例的应用,如果对SQL语句优化的好,多实例一个很值得使用的技术,即使并发很大,合理分配好系统资源,也不会有太大问题。
8.3MySQL多实例常见配置方案。
8.3.1多配置文件部署方案。
即本文主要讲解的方案,通过配置多个配置文件及多个启动程序来实现多实例的方案,这是推荐的方法。本文的配置:
[root@oldboy /]#tree/data
/data
1--3306
|I--my.cnfe
|-mysql
-3307
|--my.cnfe
--mysql
2 directories,4 filese
提示:mysql及my.cnf文件请见相关目录mysql_config_test.tar.gz文件或结尾附录
8.3.2单一配置文件部署方案。
1)my.cnf配置文件样例
[mysqld multi]
mysqld =/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmine
user=mysql
[mysqld1]
socket =/var/1ib/mysql/mysql.socke
port =3306
pid-file =/var/1ib/mysql/mysql.pide
datadir=/var/1ib/mysql/
user=mysql
[mysqld2]
socket =/mnt/data/db1/mysql.socke
port =3302I
pid-file =/mnt/data/db1/mysql.pid
datadir=/mnt/data/db1/
user=mysql
skip-name-resolve
server-id=10
default-storage-engine=innodbe
innodb_buffer_pool_size=512M
innodb_additional_iem pool=10M
default_character_set=utf8
character_set_server=utf8
#read-onlye
relay-log-space-1imit=3G
expire_logs_day=20
[mysqld3]
socket =/mnt/data/db2/mysql.socke
port =3303
pid-file =/mnt/data/db2/mysal.pid
datadir =/mnt/data/db2
user=mysql
skip-name-resolvee
server-id=11
master-connect-retry=60
default-storage-engine=innodbe
inmodb_buffer pool_size=1G
innodb_additional_mem_pool=10Me
default_character_set=utf8
character_set_server=utf8e
read-onlye
relay-log-space-limit=3Ge
expire_logs_day=20
[mysqld4]
socket =/mnt/data/db3/mysql.socke
port=3304
pid-file =/mnt/data/db3/mysql.pid
datadir =/mnt/data/db3/
user=mysql
skip-name-resolve
server-id=12
master-connect-retry=60
default-storage-engine=innodb
innodb_buffer_pool_size=1G
innodb_additional_mem_pool=10M
default_character_set=utf8
character_set_server=utf8
read-onlye
relay-log-space-limit=3Ge
expire_logs_day=20
2)启动方法
Mysql_multi –config-file=/data/mysql/my_multi.cnf start 1,2,3,4,5,6,7
- 缺点耦合性太高
8.4安装多实例mysql数据库
http://blog.51cto.com/jackx/1939991
8.4.1建立MySQL多实例的条件。
首先按照我们前面讲过的四种MySQL的安装方法之一安装好数据库,如果是编译安装,则到make install之后截止。
8.4.1建立MySQL帐号。
首先以root 身份登陆到linux系统,然后执行如命令创建mysql组及用户
[root@mysq1~]# groupadd mysql
[root@mysq1~]#useradd mysql -s /sbin/nologin -g mysql -M
useradd命令参数简要说明:
#1.-s/sbin/nologin 表示禁止该用户登陆,加强安全。
#2.-g mysq1指定属于mysql组。
#3.-M表示不创建用户家目录。
检查创建的用户:
[root@mysq1~]#tail –l /etc/passwd
mysq1:x:1816:1816::/home/mysq1:/sbin/nologin
建立mysql软件目录:
[root@mysql~]#mkdir -p /home/wj/tools
[root@mysql~]#cd /home/wj/tools/
8.4.2获得MySQL软件。
通过rz命令从本地上传mysql软件包如:mysql-5.1.62.tar.gz,当然你也可以到网去下
载。I
本例通过rz命令来演示。如提示无rz命令,可先执行yum install lrzsz-y来安装。。
执行结果如下:
[rooteC tools]# rz
rz waiting to receive.
正在开始zmodem传输。按Ctr1+C取消。
正在传输 mysq1-5.1.62.tar.gz...…
100%27000KB2454KB/s00:00:110错误
提示:你也可以通过wget http://mysql.ntu.edu.tw/Downloads/MySQL-5.1/mysgl-5.1.62.tar.gz方式下载。
[root@mysql tools]# wget http://mysql.ntu.edu.tw/Downloads/MySQL-5.1/mysql-5.1.62.tar.gz
8.4.3安装MySQL软件。
1)解压。
[root@mysql tools]# tar zxf- mysql-5.1.62.tar.gz #-解压mysql软件包
[root@mysql tools]# cd mysq1-5.1.62
2)配置
yum install libtermcap-devel –y
防止checking for termcap functions library... configure: error: No curses/termcap library found
[root@mysql mysq1-5.1.62]#./configure \
-prefix=/usr/local/mysql \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--localstatedir=/usr/local/mysql/data \
--enable-assembler \
--enable-thread-safe-client \
-with-mysqld-user=mysql \
-with-big-tables \
-without-debug \
-with-pthread \
--enable-assembler \
--with-extra-charsets=complex \
--with-readline \
-with-ssl \
--with-embedded-server \
--enable-1ocal-infile \
--with-plugins=partition,innobase \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static
#说明:
#1.可以通过执行./configure-help命令来详细查看以上各参数的用途。
#2.以上配置中的"\”斜线表示换行
#3.configure 编译常用参数的说明,请见附录一
3)静态编译生成mysqld的执行文件。
[root@mysq1 mysq1-5.1.62]# make
#提示:
#1.也可执行下面命令make-j4加快mysql的编译#-j表示希望使用cpu核数
#2.如果使用不当可能反而安装速度更慢。
#3.注意编译的结果是否报错(带error字符样),有些不少读者也不管有没有错误,就直接make install,结果导致无法完成安装。
#4没有configure直接make报以下错误:
make: *** No targets specified and no makefile found. Stop
4)安装mysql
[root@mysql mysq1-5.1.62]# make install
#1.注意安装的结果是否报错(带error 字符样),有些不少读者也不管有没有错误,就直接make install,结果导致无法完成安装。
补充:我们曾经讲解过的单实例安装的数据库文件和启动程序最好删除。
8.4.4创建MySQL多实例的数据目录。
如果机器上装过mysql将mysql安装的data目录mv走,mv data /tmp/data-mysql5.5-single
在这里我们采用不同的端口来作为二级目录,以区别不同的实例。。
[root@oldboy /]#mkdir-p/data/{3306,3307}/data
[root@oldboy /]#tree/data
/data
1-3306
1--data
--3307
--data
4 directories,0 filese
提示:
- mkdir-p/data/{3306,3307}/data 相当于mkdir-p/data/3306/data;mkdir -p/data/3307/data 两条命令
2)如果是创建多个目录可以增加,如3308,3309,一般生产环境中2-3个实例就可以了。
生产硬件配置:MEM16g双cpu8核,磁盘6*600g sas 15k。
8.4.5创建MySQL多实例的配置文件。
[root@mysql mysq1-5.1.62]#ls -l support-files/*.cnf
修改my.cnf中端口 server-id等不同
8.4.6创建mysql多实例的启动文件
启动文件的创建,和配置文件创建几乎一样,也可以通过vi命令来添加,如下:
vi/data/3306/mysql
vi/data/3307/mysql
修改属主属组和执行权限:
sudo chown -R mysql.mysql /data/
find /data/ -name mysql|xargs sudo chmod 700
sudo /application/mysql/scripts/mysql_install_db --defaults-file=/data/3306/my.cnf --basedir=/application/mysql/ --datadir=/data/3306/data --user=mysql
中间有空格否则报错: FATAL ERROR: Could not find ./bin/my_print_defaults
sudo /application/mysql/scripts/mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/application/mysql/ --datadir=/data/3307/data --user=mysql
多实例启动文件的实质就是指定单独的配置文件启动而已:
mysqld_ safe --defaults-file=/data/3306/my.cnf 2>&1>/dev/null &
mysald_ safe --defaults-file=/data/3307/my.cnf 2>&1>/dev/null &
8.4.5初始化MySQL多实例的数据库文件
上述步骤全都配置完毕后,就可以初始化数据库文件了,这个步骤其实也可以在编译安装MySQL之后就操作,只不过放到这里更合理一些。
(1)初始化MySQL数据库
初始化命令如下:
[root@Jackscripts]# ./mysql_install_db --defaults-file=/data/3306/my.cnf--basedir=/application/mysql/ --datadir=/data/3306/data --user=mysql
[root@Jack scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf--basedir=/application/mysql/ --datadir=/data/3307/data --user=mysql
8.4.6 启动MySQL多实例数据库
下面来看看启动MySQL多实例的命令。
第一个实例3306的启动命令如下:
[root@Jack scripts]# /data/3306/mysql start
Starting MySQL...
第二个实例3307的启动命令如下:
[root@Jack scripts]# /data/3307/mysql start
Starting MySQL...
现在,检查MySQL多实例数据库是否成功启动,命令
及结果如下:
[root@Jack scripts]# ss -lnutp |grep 330
tcp LISTEN 0 600 :::3306 :::* users:(("mysqld",47072,11))
tcp LISTEN 0 600 :::3307 :::* users:(("mysqld",47796,11))
8.4.7mysql多实例数据库开机自启动
[root@localhost ~]# echo "#mysql multi instances" >>/etc/rc.local
[root@localhost ~]# echo "/data/3306/mysql start" >>/etc/rc.local
[root@localhost ~]# echo "/data/3307/mysql start" >>/etc/rc.local
[root@localhost ~]# tail -3 /etc/rc.local
8.4.8登录多实例:
mysql –uroot –p –S /data/3306/mysql.sock 本机加socket,远程加端口
mysql –uroot –p –S /data/3307/mysql.sock
刚装好的root用户是空密码再输入enter即可进入