mysql多实例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql多实例相关的知识,希望对你有一定的参考价值。
mysql多实例
mysql多实例,简单理解就是在一台服务器上,mysql服务开启多个不同的端口(如3306、3307),运行多个服务进程。这些 mysql 服务进程通过不同的 socket来监听不同的数据端口,进而互不干涉的提供各自的服务。
在同一台服务器上,mysql 多实例会去共用一套 mysql 应用程序,因此你在部署 mysql 的时候只需要部署一次 mysql程序即可,无需多次部署。但是,mysql多实例之间会各自使用不同的 my.cnf 配置文件、启动程序和数据文件。在提供服务方面,mysql多实例在逻辑上看起来是各自独立,互不干涉的,并且多个实例之间是根据配置文件的设定值,来获取相关服务器的硬件资源。
.
优点如下:
1、有效利用服务器资源
当单个服务器资源过剩时,可以充分利用剩余的资源来提供更多的服务
2、节约服务器资源
当公司资金紧张,但数据库又需要数据库之间各自提供服务时,并且还想使用主从同步等技术,此时多实例就再好不过了
3、方便后期架构扩展
当公司的某个项目才启动时,启动初期并不一定有很大的用户量,因此可以先用一组物理数据库服务器,在上面部署多个实例,方便后续架构扩展、迁移
缺点如下:
1、资源互相抢占问题
当某个服务实例并发很高或者有慢查询时,整个实例会消耗更多的内存、CPU和IO资源,这将导致服务器上的其它实例提供服务的质量下降。这就比如说合租房的各个租客,每当早晨上班时,都会洗漱,此时卫生间的占用率就大,各个租客总会发生等待。
多实例的应用场景
1、当一个公司业务访问量不太大,又想节俭成本,并且还希望不同业务的数据库服务能够各自尽量独立,提供服务能够互相不受影响。另外还需要应用主从同步等技术来提供数据库备份或读写分离服务,以及方便后期业务量增大时,数据库架构的扩展和迁移。此时,Mysql 多实例就再好不过了。比如,我们可以通过在 3 台服务器部署 6-9 个实例,然后交叉做主从同步备份及读写分离,来实现 6-9 台服务器才能够达到的效果
2、公司业务访问量不是太大的时候,服务器的资源基本都是过剩状态。此时就很适合 mysql 多实例的应用。如果对 SQL语句 优化做的比较好,mysql 多实例 是一个很值得去使用的技术。即使后期业务并发很大,只要合理分配好系统资源,也不会有太大的问题
3、为了规避 mysql 对 SMP 架构不支持的缺陷,我们可以使用 mysql 多实例绑定处理器的办法(NUMA处理器必须支持,不过现在大部分处理器都支持的)将不同的数据库分配到不同的实例上提供数据服务;
4、传统游戏行业的 MMO/MMORPG以及Web Game,会将每个服都对应一个数据库,而且可能经常要做很多数据查询和数据订正工作。此时,为了减少维护而出错的概率,我们也可以采用多实例的部署方式,按区的概念来分配数据库。
.
Mysql多实例实现的3种方式
mysql 多实例常规来讲,有三种方案可以实现,这三种方案各有利弊,如下:
1、基于多配置文件
通过使用多个配置文件来启动不同的进程,以此来实现多实例。
优点:逻辑简单,配置简单
缺点:管理起来不方便
2、基于mysqld_multi
通过官方自带的 mysqld_multi 工具,使用单独配置文件来实现多实例
优点:?便于集中管理管理
缺点:?不方便针对每个实例配置进行定制
3、基于IM
使用 MySQL 实例管理器(MYSQLMANAGER),这个方法好像比较好不过也有点复杂
优点:便于集中管理
缺点:耦合度高。IM一挂,实例全挂
不方便针对每个实例配置进行定制
环境 [ 关闭SeLinux ]
[[email protected] ~]# cat /etc/RedHat-release
CentOS release 6.9 (Final)
[[email protected] ~]# uname -r
2.6.32-696.3.2.el6.x86_64
[[email protected] ~]# getenforce
Disabled
注意:如已安装mysql 则有些部分是不用做的,所以这里突出显示出来的是配置的多实例部分,第一部分和第二部分用------分割
部署 [ 4个实例 ]
- 下载 MySQL 5.7 二制包 [ 推荐官方下载 ] 此下载版本大于5.7.5
[[email protected] ~]# wget wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
-
解压 MySQL 5.7 二进制包到指定目录
[[email protected] ~]# tar zxvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/ -
创建 MySQL 软链接
[[email protected] ~]# ln -s /usr/local/mysql-5.7.18-linux-glibc2.5-x86_64 /usr/local/mysql -
创建 MySQL 用户
[[email protected] ~]# useradd -r -s /sbin/nologin mysql - 在 MySQL 二进制包目录中创建 mysql-files 目录 [MySQL 数据导入/导出数据专放目录]
[[email protected] ~]# mkdir -v /usr/local/mysql/mysql-files
mkdir: created directory `/usr/local/mysql/mysql-files‘
- 创建多实例数据目录
[[email protected] ~]# mkdir -vp /data/mysql_data{1..4}
mkdir: created directory/data‘ <br/>mkdir: created directory
/data/mysql_data1‘
mkdir: created directory `/data/mysql_data2‘mkdir: created directory
/data/mysql_data3‘ <br/>mkdir: created directory
/data/mysql_data4‘
-
修改 MySQL 二进制包目录的所属用户与所属组
1 [[email protected] ~]# chown root.mysql -R /usr/local/mysql-5.7.18-linux-glibc2.5-x86_64 - 修改 MySQL 多实例数据目录与 数据导入/导出专放目录的所属用户与所属组
[[email protected] ~]# chown mysql.mysql -R /usr/local/mysql/mysql-files /data/mysql_data{1..4}
- 配置 MySQL 配置文件 /etc/my.cnf
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /tmp/mysql_multi.log[mysqld1]
设置数据目录 [多实例中一定要不同]
datadir = /data/mysql_data1
设置sock存放文件名 [多实例中一定要不同]
socket = /tmp/mysql.sock1
设置监听开放端口 [多实例中一定要不同]
port = 3306
设置运行用户
user = mysql
关闭监控
performance_schema = off
设置innodb 缓存大小
innodb_buffer_pool_size = 32M
设置监听IP地址
bind_address = 0.0.0.0
关闭DNS 反向解析
skip-name-resolve = 0[mysqld2]
datadir = /data/mysql_data2
socket = /tmp/mysql.sock2
port = 3307
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0[mysqld3]
datadir = /data/mysql_data3
socket = /tmp/mysql.sock3
port = 3308
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0[mysqld4]
datadir = /data/mysql_data4
socket = /tmp/mysql.sock4
port = 3309
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0
- 初始化各个实例 [ 初始化完成后会自带随机密码在输出日志中 ]
[[email protected] ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
[[email protected] ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2
[[email protected] ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3
[[email protected] ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data4
- 各实例开启 SSL 连接
[[email protected] ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
[[email protected] ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2
[[email protected] ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3
[[email protected] ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data4
复制多实例脚本到服务管理目录下 [ /etc/init.d/ ]
[[email protected] ~]# cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi添加脚本执行权限
[[email protected] ~]# chmod +x /etc/init.d/mysqld_multi- 添加进service服务管理
[[email protected] ~]# chkconfig --add mysqld_multi
- 启动测试
- 查个多实例状态
[[email protected] ~]# /etc/init.d/mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is not running
MySQL server from group: mysqld3 is not running
MySQL server from group: mysqld4 is not running
- 查个多实例状态
-
启动多实例
[[email protected] ~]# /etc/init.d/mysqld_multi start
- 查看多实例状态
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
MySQL server from group: mysqld3 is running
MySQL server from group: mysqld4 is running
- 查看实例监听端口
[[email protected] ~]# netstat -lntp | grep mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0: LISTEN 2673/mysqld
tcp 0 0 0.0.0.0:3307 0.0.0.0: LISTEN 2676/mysqld
tcp 0 0 0.0.0.0:3308 0.0.0.0: LISTEN 2679/mysqld
tcp 0 0 0.0.0.0:3309 0.0.0.0: LISTEN 2682/mysqld
连接
* 实例1
[[email protected] ~]# /usr/local/mysql/bin/mysql -S /tmp/mysql.sock1 -p‘z+Ilo*>s:3kw‘
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 6
Server version: 5.7.18
Copyright (c) 2000, 2017, 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> set password = ‘123456‘;
Query OK, 0 rows affected (0.00 sec)
每个实例进行独立配置
mysql安装路径: /usr/local/mysql
mysql数据路径: /usr/local/mysql/data
mysql端口号: 3306
mysql 版本:5.7. Source distribution
环境:Centos 7 (x86_64)
初始化实例
#为新实例创建数据目录并赋权
mkdir -p /usr/local/mysql/data3307 mkdir -p /usr/local/mysql/data3308 chown mysql:mysql -R /usr/local/mysql/data3307
chown mysql:mysql -R /usr/local/mysql/data3308
#初始化实例
suse11:~ # cd /usr/local/mysql
[[email protected] ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/3307/data
[[email protected] ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/3308/data
配置各实例的my.cnf文件这里只举例一个
vi //usr/local/mysql/3307/my3307.cnf
[client]
socket=/usr/local/mysql/mysql7.sock
port=3307
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/3307/data
user=mysql
log-error=/usr/local/mysql/3307/data/mysql.err
pid-file=/usr/local/mysql/3307/data/mysqld.pid
socket=/usr/local/mysql/mysql7.sock
port=3307
[mysql]
no-auto-rehash
socket = /usr/local/mysql/mysql7.sockchown -R mysql:mysql //usr/local/mysql/3307/data/my3307.cnf
chown -R mysql:mysql /usr/local/mysql/3307/data/my3308.cnf
启动关闭多实例
suse11:~ # mysqld_safe --defaults-file=/usr/local/mysql/3307/my3307.cnf >> /dev/null
suse11:~ # mysqld_safe --defaults-file=/usr/local/mysql/3307/my3308.cnf >> /dev/null
suse11:~ # netstat -nltp|grep mysql
tcp 0 0 :::3307 ::: LISTEN 64277/mysqld
tcp 0 0 :::3308 ::: LISTEN 64597/mysqld
Grep password /usr/local/mysql/data/mysql.err
将临时密码cp到-p后面#下面使用套接字方式连接到实例
mysql -uroot -p’v98hasg2.’ -S /usr/local/mysql/mysql7.sock
[email protected][(none)]>
#下面使用TCP方式连接到实例
suse11:~ # mysql -uroot -pxxx -P3606 --protocol=tcp
[email protected][(none)]> exit
suse11:~ # mysql -uroot -pxxx -P3706 --protocol=tcp
[email protected][(none)]>
#关闭mysql实例
mysqladmin -uroot -pxxx -S/usr/local/mysql/mysql7.sock shutdown
mysqladmin -uroot -pxxx -S /usr/local/mysql/mysql7.sock shutdown
以上是关于mysql多实例的主要内容,如果未能解决你的问题,请参考以下文章