码迷,mamicode.com
首页 > 数据库 > 详细

mysql多实例

时间:2018-07-04 19:29:22      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:client   系统   efault   web   方法   director   实现   epo   code   

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

  • 在 MySQL 二进制包目录中创建 mysql-files 目录 [MySQL 数据导入/导出数据专放目录]
    [root@MySQL ~]# mkdir -v /usr/local/mysql/mysql-files
    mkdir: created directory `/usr/local/mysql/mysql-files‘
  • 创建多实例数据目录
    [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/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


  • 初始化各个实例 [ 初始化完成后会自带随机密码在输出日志中 ]
    [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
  1. 启动测试
    • 查个多实例状态
      [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/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
[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.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.sock

chown -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
root@localhost[(none)]>

#下面使用TCP方式连接到实例
suse11:~ # mysql -uroot -pxxx -P3606 --protocol=tcp
root@localhost[(none)]> exit

suse11:~ # 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

mysql多实例

标签:client   系统   efault   web   方法   director   实现   epo   code   

原文地址:http://blog.51cto.com/13555423/2136244

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!