zoukankan      html  css  js  c++  java
  • 基于mysqld_multi实现MySQL 5.7.24多实例多进程配置

    学习环境:
    操作系统
    IP地址
    主机名
    软件包
    备注
    CentOS7.5
    192.168.200.111
    localhost
       
     
    实验初始配置:所有主机关闭防火墙与selinux
    [root@localhost ~]# iptables -F
    [root@localhost ~]# systemctl stop firewalld
    [root@localhost ~]# systemctl disable firewalld
     
    [root@localhost ~]# setenforce 0
    [root@localhost ~]# sed -i '/SELINUX/ s/enforcing/disabled/g' /etc/sysconfig/selinux
     
     
    基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
     
    MySQL多实例的原理
     
    • mysql多实例,简单理解就是在一台服务器上,mysql服务开启多个不同的端口(如3306、3307、3308)运行多个服务进程。这些 mysql 服务进程通过不同的 socket来监听不同的数据端口,进而互不干涉的提供各自的服务。
    • 在同一台服务器上,mysql 多实例会去共用一套 mysql 应用程序,因此你在部署 mysql 的时候只需要部署一次 mysql程序即可,无需多次部署。但是,mysql多实例之间会各自使用不同的 my.cnf 配置文件、启动程序和数据文件。在提供服务方面,mysql多实例在逻辑上看起来是各自独立,互不干涉的,并且多个实例之间是根据配置文件的设定值,来获取相关服务器的硬件资源。
     
    优点如下:
    • 有效利用服务器资源
      • 当单个服务器资源过剩时,可以充分利用剩余的资源来提供更多的服务
    • 节约服务器资源
      • 当公司资金紧张,但数据库又需要数据库之间各自提供服务时,并且还想使用主从同步等技术,此时多实例就再好不过了
    • 方便后期架构扩展
      • 当公司的某个项目才启动时,启动初期并不一定有很大的用户量,因此可以先用一组物理数据库服务器,在上面部署多个实例,方便后续架构扩展、迁移
    缺点如下:
    • 资源互相抢占问题
      • 当某个服务实例并发很高或者有慢查询时,整个实例会消耗更多的内存、CPU和IO资源,这将导致服务器上的其它实例提供服务的质量下降
     
    mysql 多实例在生产环境下的应用场景!
    • 当一个公司业务访问量不太大,又想节俭成本,并且还希望不同业务的数据库服务能够各自尽量独立,提供服务能够互相不受影响。另外还需要应用主从同步等技术来提供数据库备份或读写分离服务,以及方便后期业务量增大时,数据库架构的扩展和迁移。此时,Mysql 多实例就再好不过了。比如,我们可以通过在 3 台服务器部署 6-9 个实例,然后交叉做主从同步备份及读写分离,来实现 6-9 台服务器才能够达到的效果
    • 公司业务访问量不是太大的时候,服务器的资源基本都是过剩状态。此时就很适合 mysql 多实例的应用。如果对 SQL语句优化做的比较好,mysql 多实例是一个很值得去使用的技术。即使后期业务并发很大,只要合理分配好系统资源,也不会有太大的问题
    • 为了规避 mysql 对 SMP 架构不支持的缺陷,我们可以使用 mysql 多实例绑定处理器的办法(NUMA处理器必须支持,不过现在大部分处理器都支持的)将不同的数据库分配到不同的实例上提供数据服务;
    • 传统游戏行业的 MMO/MMORPG以及Web Game,会将每个服都对应一个数据库,而且可能经常要做很多数据查询和数据订正工作。此时,为了减少维护而出错的概率,我们也可以采用多实例的部署方式,按区的概念来分配数据库。
     
     
    Mysql多实例实现的3种方式
     
    1、基于多配置文件
    通过使用多个配置文件来启动不同的进程,以此来实现多实例。
    优点:逻辑简单,配置简单
    缺点:管理起来不方便
     
    2、基于mysqld_multi
    通过官方自带的 mysqld_multi 工具,使用单独配置文件来实现多实例
    优点: 便于集中管理管理
    缺点: 不方便针对每个实例配置进行定制
     
    3、基于IM
    使用 MySQL 实例管理器(MYSQLMANAGER),这个方法好像比较好不过也有点复杂
    优点:便于集中管理
    缺点:耦合度高。IM一挂,实例全挂
    不方便针对每个实例配置进行定制
     
    MySQL本身就可以通过多实例方式运行,只要修改启动脚本和配置文件,把端口、basedir、datadir 文件夹分开后,多个实例的运行就会互不影响。但是这种方式操作起来太过繁杂,所以MySQL官方提供了一个mysqld_multi 的程序来辅助实现多实例操作。
     
     
    一、创建并初始化数据目录
    几个实例要分开运行,必然要把数据库文件放到不同目录中,所以第一步是要建立各个实例的数据目录,这里假设我们要运行三个实例,端口分别是3306,3307,3308,为了方便维护,我们把数据文件夹也按照端口号来命名:
    [root@localhost ~]# mkdir -p /data/mysql/{3306,3307,3308}
    [root@localhost ~]# chown mysql:mysql /data/mysql/{3306,3307,3308}
    [root@localhost ~]# ls -ld /data/mysql/{3306,3307,3308}
    drwxr-xr-x 2 mysql mysql 6 12月 7 16:37 /data/mysql/3306
    drwxr-xr-x 2 mysql mysql 6 12月 7 16:37 /data/mysql/3307
    drwxr-xr-x 2 mysql mysql 6 12月 7 16:37 /data/mysql/3308
     
    通过配置文件指定并初始化数据目录
    [root@localhost ~]# cp /etc/my.cnf /data/mysql/3308.cnf
    [root@localhost ~]# vim /data/mysql/3308.cnf
    [mysqld]
    port=3308
    datadir=/data/mysql/3308/
    socket=/tmp/mysql3308.sock
    symbolic-links=0
     
    [mysqld_safe]
    log-error=/data/mysql/3308.log
    pid-file=/usr/local/mysql/data/3308.pid
     
    [client]
    port=3308
    socket=/tmp/mysql3308.sock
     
    [root@localhost ~]# mysqld --defaults-file=/data/mysql/3308.cnf --initialize-insecure --user=mysql
     
    初始化完成之后,后续的配置不需要3308.cnf文件,实例的参数会在my.cnf中集中配置。
    注意,data目录在初始化前,必须为空,不然初始化是会报错
     
    重复上面两个步骤,把3307、3306目录初始化好。
    [root@localhost ~]# cat /data/mysql/3306.cnf
    [mysqld]
    port=3306
    datadir=/data/mysql/3306/
    socket=/tmp/mysql3306.sock
    symbolic-links=0
     
    [mysqld_safe]
    log-error=/data/mysql/3306.log
    pid-file=/usr/local/mysql/data/3306.pid
     
    [client]
    port=3306
    socket=/tmp/mysql3306.sock
    [root@localhost ~]# cat /data/mysql/3307.cnf
    [mysqld]
    port=3307
    datadir=/data/mysql/3307/
    socket=/tmp/mysql3307.sock
    symbolic-links=0
     
    [mysqld_safe]
    log-error=/data/mysql/3307.log
    pid-file=/usr/local/mysql/data/3307.pid
     
    [client]
    port=3307
    socket=/tmp/mysql3307.sock
    [root@localhost ~]# mysqld --defaults-file=/data/mysql/3307.cnf --initialize-insecure --user=mysql
    [root@localhost ~]# mysqld --defaults-file=/data/mysql/3306.cnf --initialize-insecure --user=mysql
     
    二、配置my.cnf文件集中管理多个实例
    [root@localhost ~]# cp /etc/my.cnf /etc/my.cnf.bak
    [root@localhost ~]# vim /etc/my.cnf
    [mysqld_multi]
    mysqld=/usr/local/mysql/bin/mysqld_safe
    mysqladmin=/usr/local/mysql/bin/mysqladmin
     
    [mysqld1]
    port=3306
    socket=/tmp/mysql3306.sock
    datadir=/data/mysql/3306/
    skip-external-locking
    log-bin=/data/mysql/3306/mysql-bin
    server-id=3306
    user=mysql
     
    [mysqld2]
    port=3307
    socket=/tmp/mysql3307.sock
    datadir=/data/mysql/3307/
    skip-external-locking
    log-bin=/data/mysql/3307/mysql-bin
    server-id=3307
    user=mysql
     
    [mysqld3]
    port=3308
    socket=/tmp/mysql3308.sock
    datadir=/data/mysql/3308/
    skip-external-locking
    log-bin=/data/mysql/3308/mysql-bin
    server-id=3308
    user=mysql
     
    [mysql]
    no-auto-rehash
     
    mysqld_multi的配置文件和一般MySQL配置不同,没有[mysqld]段,取而代之的是[mysqld1]、[mysqld2]等配置段,每个配置段代表一个MySQL实例。
     
    三、管理多个MySQL实例
    1,启动多个MySQL实例
    启动多个实例时需要一个启动脚本,这个脚本一般在/usr/local/mysql/support-files目录下的mysqld_multi.server文件
    [root@localhost ~]# cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
     
    启动多个MySQL实例
    [root@localhost ~]# /etc/init.d/mysqld_multi start 1-3
     
    启动三个MySQL实例,注意这里的数字和my.cnf中的[mysqldN]对应,1-3就是启动[mysqld1]、[mysqld2]、[mysqld3]配置段的MySQL实例。
     
    [root@localhost ~]# netstat -lnpt | grep -E "3306|3307|3308"
    tcp6 0 0 :::3306 :::* LISTEN 2744/mysqld
    tcp6 0 0 :::3307 :::* LISTEN 65502/mysqld
    tcp6 0 0 :::3308 :::* LISTEN 65499/mysqld
     
    查看端口,看MySQL有没有正常启动,如果没有启动或报错,一般报错详细日志存在各个实例data目录下的 主机名.err文件中,打开此文件查找错误原因,逐步排错就可以了。
     
    2,关闭多个MySQL实例
    [root@localhost ~]# /etc/init.d/mysqld_multi stop 1-3
    [root@localhost ~]# netstat -lnpt | grep -E "3306|3307|3308"
     
    也可以使用以下命令:
    killall -u mysql 或者 kill -9 the-mysql-pid
     
    四、root账户管理
    前面初始化数据库时用的是--initialize-insecure参数,所以我们初始化的数据库,root账户是没有密码的,要先改密码为123456:
    mysqladmin -uroot password '123456' -S /tmp/mysql3306.sock
    mysqladmin -uroot password '123456' -S /tmp/mysql3307.sock
    mysqladmin -uroot password '123456' -S /tmp/mysql3308.sock
     
    或者:
    mysqladmin -uroot password '123456' -P3306 -h127.0.0.1
    mysqladmin -uroot password '123456' -P3307 -h127.0.0.1
    mysqladmin -uroot password '123456' -P3308 -h127.0.0.1
     
    五、连接mysql多实例:
    [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3306.sock
    [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3307.sock
    [root@localhost ~]# mysql -u root -p123456 -S /tmp/mysql3308.sock
  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/canflyfish/p/11650501.html
Copyright © 2011-2022 走看看