本文共 8456 字,大约阅读时间需要 28 分钟。
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 ]
[root@MySQL ~]# cat /etc/RedHat-release CentOS release 6.9 (Final)[root@MySQL ~]# uname -r
2.6.32-696.3.2.el6.x86_64[root@MySQL ~]# getenforce
Disabled注意:如已安装mysql 则有些部分是不用做的,所以这里突出显示出来的是配置的多实例部分,第一部分和第二部分用------分割部署 [ 4个实例 ]解压 MySQL 5.7 二进制包到指定目录
[root@MySQL ~]# tar zxvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/创建 MySQL 软链接
[root@MySQL ~]# ln -s /usr/local/mysql-5.7.18-linux-glibc2.5-x86_64 /usr/local/mysql创建 MySQL 用户
[root@MySQL ~]# useradd -r -s /sbin/nologin mysql创建多实例数据目录
[root@MySQL ~]# 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 [root@MySQL ~]# chown root.mysql -R /usr/local/mysql-5.7.18-linux-glibc2.5-x86_64修改 MySQL 多实例数据目录与 数据导入/导出专放目录的所属用户与所属组
[root@MySQL ~]# 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/mysqladminlog = /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_data2socket = /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_data3socket = /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_data4socket = /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
- 初始化各个实例 [ 初始化完成后会自带随机密码在输出日志中 ][root@MySQL ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1 [root@MySQL ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2 [root@MySQL ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3 [root@MySQL ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data4
* 各实例开启 SSL 连接
[root@MySQL ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1 [root@MySQL ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2 [root@MySQL ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3 [root@MySQL ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data4
复制多实例脚本到服务管理目录下 [ /etc/init.d/ ]
[root@MySQL ~]# cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi添加脚本执行权限
[root@MySQL ~]# chmod +x /etc/init.d/mysqld_multi- 添加进service服务管理[root@MySQL ~]# chkconfig --add mysqld_multi
5. 启动测试
- 查个多实例状态[root@MySQL ~]# /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
* 启动多实例
[root@MySQL ~]# /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
- 查看实例监听端口[root@MySQL ~]# 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[root@MySQL ~]# /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/mysqlmysql数据路径: /usr/local/mysql/datamysql端口号: 3306mysql 版本:5.7. Source distribution环境:Centos 7 (x86_64)初始化实例
#为新实例创建数据目录并赋权mkdir -p /usr/local/mysql/data3307mkdir -p /usr/local/mysql/data3308chown mysql:mysql -R /usr/local/mysql/data3307chown mysql:mysql -R /usr/local/mysql/data3308
#初始化实例
suse11:~ # cd /usr/local/mysql
[root@MySQL ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/3307/data[root@MySQL ~]# /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.sockport=3307[mysqld]basedir=/usr/local/mysqldatadir=/usr/local/mysql/3307/datauser=mysqllog-error=/usr/local/mysql/3307/data/mysql.errpid-file=/usr/local/mysql/3307/data/mysqld.pidsocket=/usr/local/mysql/mysql7.sockport=3307[mysql]no-auto-rehashsocket = /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/mysqldGrep password /usr/local/mysql/data/mysql.err
将临时密码cp到-p后面#下面使用套接字方式连接到实例
mysql -uroot -p’v98hasg2.’ -S /usr/local/mysql/mysql7.sock root@localhost[(none)]>
#下面使用TCP方式连接到实例
suse11:~ # mysql -uroot -pxxx -P3606 --protocol=tcproot@localhost[(none)]> exitsuse11:~ # mysql -uroot -pxxx -P3706 --protocol=tcp
root@localhost[(none)]>#关闭mysql实例
mysqladmin -uroot -pxxx -S/usr/local/mysql/mysql7.sock shutdown mysqladmin -uroot -pxxx -S /usr/local/mysql/mysql7.sock shutdown转载于:https://blog.51cto.com/13555423/2136244