zoukankan      html  css  js  c++  java
  • Mysql多实例数据库

    什么是Mysql的多实例?
      简单的说,Mysql多实例就是一台服务器上同时开启多个不同的服务端口(如3306、3307)同时运行多个Mysql服务进程,这些服务进程通过不同socket监听不同的服务端口来提供服务。
    Msyql的多实例特点:
      这些Mysql共用一套Mysql的安装程序,使用不用的配置文件(my.cnf)启动程序和数据文件。在提供服务时,多实例Mysql在逻辑上看起来是各自独立的,它们根据配置文件的对应设定值,获得服务器响应数量的硬件资源。

    补充:
    其实很多网络服务器都是可以配置多实例的,例如Nginx Apache Redis Memcache 都可以配置多实例。

    mysql多实例的作用:

    1)有效的利用服务器资源
    当单个服务器资源有剩余的时候,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离。
    2)节约服务器资源
    当公司资金紧张,但是数据库又需要各自尽量独立提供服务,而且,需要主从复制等多实例就再好不过了。
    但是 mysql多实例也有弊端,当某个数据库实例并发很高或者SQL满查询时,会存在资源相互抢占的问题。
    

    Mysql多实例的生产应用场景
    1.资金紧张型公司的选择
    比如: 3台服务器部署9-15个实例,交叉做主从复制,数据备份及读写分离,这样就可以达到9-15台服务器每个只装一个数据库才有的效果。所谓的独立是相对的。
    2.并发访问不是很大的业务
    当公司业务量不太大时候,服务器的资源基本都是浪费的,这时就很适合多实例的应用,如果对SQL语句的优化做的比较好,Mysql多实例会是一个很值得使用的技术,即可并发很大,合理分配系统资源以及搭配好服务,也不会有太大问题。
    3.门户网站应用Mysql多实例场景
    例如:百度公司,某部门中IBM服务器为48核CPU,内存96GB 。这样配置服务器可以跑3-4个实例;sina网也是用的多实例,内存48G左右。
    补充:sina网的数据库单机1-4数据库实例居多,其中多数1-2个的最多,因为大业务占用的机器多。服务器是DELL R510居多,CPU E5210 48G内存 硬盘 12*300G SAS 做RAID10 ;另外,sina网站安装数据库时,一般采用编译安装方式安装,并在做好优化之后定制成rpm包,以便统一使用.

    Mysql多实例配置方案

    1.单一配置文件,单一启动程序多实例部署方案
    Mysql官方文档提到的单一配置文件,单一启动程序多实例部署实例,不推荐此方案,这里作为知识点提及。官方my.cnf配置文件示例配置如下:

    [mysqld_multil]
    mysqld    = /usr/bin/mysqld_safe
    mysqladmin = /usr/bin/mysqladmin
    user    = mysql
    [mysqld1]
    socket  = /var/lib/mysql/mysql.sock
    port    = 3306
    pid-file  = /var/lib/mysql/mysql.pid
    datadir   = /var/lib/mysql/
    user      = mysql
    [mysqld2]
    socket    =/mnt/data/db1/mysql.sock
    port      = 3302
    pid-file  = /mnt/data/db1/mysql.pid
    datadir   = /mnt/data/db1/
    user      = mysql
    skip-name-resolve
    server-id=10
    dafault-storage-engine=innodb
    innodb_buffer_pool_size=512M
    innodb_additional_mem_pool=10M
    default_character_set=utf8
    character_set_server=utf8
    #read-only
    relay-log-space-limit=3G
    expire_logs_day=20
    

    启动命令如下:
    mysqld_multi --config-file=/data/mysql/my_multi.cnf start 1,2
    对于该方案,缺点是耦合度太高,一个配置文件,不好管理,工作开发和运维的统一原则,降低耦合度
    2.多配置文件多启动程序部署方案
    多配置文件,多启动程序部署方案,是推荐的方案。下面来看配置示例:

    [root@Mysql /]tree /data
    /data
    |-- 3306
    |   |--data  《==3306实例的数据文件
    |   |--my.cnf  《==3306实例的配置文件
    |   |--mysql    《==3306实例的启动文件
    --3307
    |   |--data  《==3307实例的数据文件
    |   |--my.cnf  《==3307实例的配置文件
    |   |--mysql    《==3307实例的启动文件
    

    Mysql多实例配置流程:

      1.安装Msyql需要的依赖包
      2.编译安装Mysql需要的软件
      3.开始安装Mysql
      4.配置多实例
      5.初始化Mysql数据库
      6.启动Mysql
      7.登录mysql
      8.故障排除说明
      9.开机自启动
    

    Mysql多实例数据库安装

    1.安装Msyql需要的依赖包

    yum install ncurses-devel libaio-devel -y
    rpm -qa ncurses-devel libaio-devel
    libaio-devel-0.3.107-10.e16x86_64
    ncurses-devel-5.7-3.20090208.c16x86_64
    

    数据库:

    服务器名字           IP地址             host
    C3-Mysql数据库         172.16.1.52/24      db02

    2.编译安装Mysql需要的软件

    ls -lh cmake-2.8.8.tar.gz
    tar xf cmake-2.8.8.tar.gz
    cd cmake-2.8.8
    ./configure
    gmake
    gmake install
    which cmake
    /usr/local/bin/cmake
    cd ../
    

    或者也可以使用yum安装 (推荐yum安装)
    yum install cmake -y
    3.开始安装Mysql

    #创建mysql用户
    useradd mysql -s /sbin/nologin -M
    id mysql
    #进入程序下载的路径
    cd /home/oldboy/tools
    wget http://downloads.mysql.com/archives/get/file/mysql-5.5.32.tar.gz
    

    Mysql源码包和二进制包名称

    Mysql软件                 软件名
    Msyql源码安装包              mysql-5.5.32.tar.gz(本文使用的安装包)
    Mysql二进制安装包            mysql-5.5.32-linux-x86_64.tar.gz

    #解压安装包

    tar xf mysql-5.5.32.tar.gz
    cd mysql-5.5.32
    [root@db02 mysql-5.5.32]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 
    -DMYSQL_DATADIR=/application/mysql-5.5.32/data 
    -DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock 
    -DDEFAULT_CHARSET=utf8 
    -DDEFAULT_COLLATION=utf8_general_ci 
    -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii 
    -DENABLED_LOCAL_INFILE=ON 
    -DWITH_INNOBASE_STORAGE_ENGINE=1 
    -DWITH_FEDERATED_STORAGE_ENGINE=1 
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 
    -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 
    -DWITHOUT_PARTITION_STORAGE_ENGINE=1 
    -DWITH_FAST_MUTEXES=1 
    -DWITH_ZLIB=bundled 
    -DENABLED_LOCAL_INFILE=1 
    -DWITH_READLINE=1 
    -DWITH_EMBEDDED_SERVER=1 
    -DWITH_DEBUG=0
    [root@db02 mysql-5.5.32]# make && make install
    [root@db02 mysql-5.5.32]# ln -s /application/mysql-5.5.32/ /application/mysql
    [root@db02 mysql-5.5.32]# cd /application/mysql
    [root@db02 mysql]# ls
    bin      data  include         lib  mysql-test  scripts  sql-bench
    COPYING  docs  INSTALL-BINARY  man  README      share    support-files
    

    4.配置多实例

    [root@db02 mysql]# mkdir -p /data/{3306,3307}/data
    [root@db02 ~]# tree /data/
    /data/
    ├── 3306
    │   ├── data
    │   ├── my.cnf
    │   └── mysql
    └── 3307
        ├── data
        ├── my.cnf
        └── mysql
    4 directories, 4 files
    

    3306文件夹说明:
    ####vim my.cnf####

    [client]
    port            = 3306
    socket          = /data/3306/mysql.sock
    [mysql]
    no-auto-rehash
    [mysqld]
    user    = mysql
    port    = 3306
    socket  = /data/3306/mysql.sock
    basedir = /application/mysql
    datadir = /data/3306/data
    open_files_limit    = 1024
    back_log = 600
    max_connections = 800
    max_connect_errors = 3000
    table_cache = 614
    external-locking = FALSE
    max_allowed_packet =8M
    sort_buffer_size = 1M
    join_buffer_size = 1M
    thread_cache_size = 100
    thread_concurrency = 2
    query_cache_size = 2M
    query_cache_limit = 1M
    query_cache_min_res_unit = 2k
    #default_table_type = InnoDB
    thread_stack = 192K
    #transaction_isolation = READ-COMMITTED
    tmp_table_size = 2M
    max_heap_table_size = 2M
    long_query_time = 1
    #log_long_format
    #log-error = /data/3306/error.log
    #log-slow-queries = /data/3306/slow.log
    pid-file = /data/3306/mysql.pid
    log-bin = /data/3306/mysql-bin
    relay-log = /data/3306/relay-bin
    relay-log-info-file = /data/3306/relay-log.info
    binlog_cache_size = 1M
    max_binlog_cache_size = 1M
    max_binlog_size = 2M
    expire_logs_days = 7
    key_buffer_size = 16M
    read_buffer_size = 1M
    read_rnd_buffer_size = 1M
    bulk_insert_buffer_size = 1M
    #myisam_sort_buffer_size = 1M
    #myisam_max_sort_file_size = 10G
    #myisam_max_extra_sort_file_size = 10G
    #myisam_repair_threads = 1
    #myisam_recover
    lower_case_table_names = 1
    skip-name-resolve
    slave-skip-errors = 1032,1062
    replicate-ignore-db=mysql
    server-id = 1
    innodb_additional_mem_pool_size = 4M
    innodb_buffer_pool_size = 32M
    innodb_data_file_path = ibdata1:128M:autoextend
    innodb_file_io_threads = 4
    innodb_thread_concurrency = 8
    innodb_flush_log_at_trx_commit = 2
    innodb_log_buffer_size = 2M
    innodb_log_file_size = 4M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 90
    innodb_lock_wait_timeout = 120
    innodb_file_per_table = 0
    [mysqldump]
    quick
    max_allowed_packet = 2M
    [mysqld_safe]
    log-error=/data/3306/mysql_oldboy3306.err
    pid-file=/data/3306/mysqld.pid
    

    ####vim mysql####

    #!/bin/sh
    ################################################
    #this scripts is created by liuliya at 2016-12-09
    #oldboy QQ:865205026
    #site:http://www.liuliya.com
    ################################################
    #init
    port=3306
    mysql_user="root"
    mysql_pwd="oldboy"
    CmdPath="/application/mysql/bin"
    mysql_sock="/data/${port}/mysql.sock"
    #startup function
    function_start_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
          printf "Starting MySQL...
    "
          /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
        else
          printf "MySQL is running...
    "
          exit
        fi
    }
    #stop function
    function_stop_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
           printf "MySQL is stopped...
    "
           exit
        else
           printf "Stoping MySQL...
    "
           ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
       fi
    }
    #restart function
    function_restart_mysql()
    {
        printf "Restarting MySQL...
    "
        function_stop_mysql
        sleep 2
        function_start_mysql
    }
    case $1 in
    start)
        function_start_mysql
    ;;
    stop)
        function_stop_mysql
    ;;
    restart)
        function_restart_mysql
    ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}
    "
    esac
    

    3307文件夹说明:
    ####vim my.cnf

    [client]
    port            = 3307
    socket          = /data/3307/mysql.sock
    [mysql]
    no-auto-rehash
    [mysqld]
    user    = mysql
    port    = 3307
    socket  = /data/3307/mysql.sock
    basedir = /application/mysql
    datadir = /data/3307/data
    open_files_limit    = 1024
    back_log = 600
    max_connections = 800
    max_connect_errors = 3000
    table_cache = 614
    external-locking = FALSE
    max_allowed_packet =8M
    sort_buffer_size = 1M
    join_buffer_size = 1M
    thread_cache_size = 100
    thread_concurrency = 2
    query_cache_size = 2M
    query_cache_limit = 1M
    query_cache_min_res_unit = 2k
    #default_table_type = InnoDB
    thread_stack = 192K
    #transaction_isolation = READ-COMMITTED
    tmp_table_size = 2M
    max_heap_table_size = 2M
    #long_query_time = 1
    #log_long_format
    #log-error = /data/3307/error.log
    #log-slow-queries = /data/3307/slow.log
    pid-file = /data/3307/mysql.pid
    #log-bin = /data/3307/mysql-bin
    relay-log = /data/3307/relay-bin
    relay-log-info-file = /data/3307/relay-log.info
    binlog_cache_size = 1M
    max_binlog_cache_size = 1M
    max_binlog_size = 2M
    expire_logs_days = 7
    key_buffer_size = 16M
    read_buffer_size = 1M
    read_rnd_buffer_size = 1M
    bulk_insert_buffer_size = 1M
    #myisam_sort_buffer_size = 1M
    #myisam_max_sort_file_size = 10G
    #myisam_max_extra_sort_file_size = 10G
    #myisam_repair_threads = 1
    #myisam_recover
    lower_case_table_names = 1
    skip-name-resolve
    slave-skip-errors = 1032,1062
    replicate-ignore-db=mysql
    server-id = 3
    innodb_additional_mem_pool_size = 4M
    innodb_buffer_pool_size = 32M
    innodb_data_file_path = ibdata1:128M:autoextend
    innodb_file_io_threads = 4
    innodb_thread_concurrency = 8
    innodb_flush_log_at_trx_commit = 2
    innodb_log_buffer_size = 2M
    innodb_log_file_size = 4M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 90
    innodb_lock_wait_timeout = 120
    innodb_file_per_table = 0
    [mysqldump]
    quick
    max_allowed_packet = 2M
    [mysqld_safe]
    log-error=/data/3307/mysql_oldboy3307.err
    pid-file=/data/3307/mysqld.pid
    

    ####vim mysql####

    #!/bin/sh
    ################################################
    #this scripts is created by liuliya at 2016-12-09
    #oldboy QQ:865205026
    #site:http://www.liuliya.com
    ################################################
    #init
    port=3307
    mysql_user="root"
    mysql_pwd="oldboy"
    CmdPath="/application/mysql/bin"
    mysql_sock="/data/${port}/mysql.sock"
    #startup function
    function_start_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
          printf "Starting MySQL...
    "
          /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
        else
          printf "MySQL is running...
    "
          exit
        fi
    }
    #stop function
    function_stop_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
           printf "MySQL is stopped...
    "
           exit
        else
           printf "Stoping MySQL...
    "
           ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
       fi
    }
    #restart function
    function_restart_mysql()
    {
        printf "Restarting MySQL...
    "
        function_stop_mysql
        sleep 2
        function_start_mysql
    }
    case $1 in
    start)
        function_start_mysql
    ;;
    stop)
        function_stop_mysql
    ;;
    restart)
        function_restart_mysql
    ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}
    "
    esac
    

    #为mysql启动命令增加执行权限
    find /data -type f -name "mysql"|xargs chmod +x
    #更改/data目录的属组
    chwon -R mysql.mysql /data/
    5.初始化Mysql数据库(mysql加载自身的管理的库和表)

    [root@db02 ~]# cd /application/mysql/scripts/
    [root@db02 scripts]# ls
    mysql_install_db

    #3306实例初始化
    [root@db02 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
    返回2个OK证明成功
    #3307实例初始化
    [root@db02 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
    返回2个OK证明成功
    6.启动Mysql

    [root@db02 scripts]# /data/3306/mysql start
    [root@db02 scripts]# /data/3307/mysql start

    #查看端口
    netstat -lntup|grep 330
    #配置mysql的环境变量
    cp /application/mysql/bin/* /usr/local/sbin/
    #查看环境变量
    echo $PATH
    7.登录mysql(需要制定sock)

    mysql -S /data/3306/mysql.sock
    mysql -S /data/3307/mysql.sock

    8.故障排除说明
    1.查看日志
    cat mysql_oldboy3306.err
    2.启动如果发现没有显示Msyql对应实例的端口,请稍微等待几秒在检查,Mysql服务的启动比Web等慢一些。
    PS:经常查看各种服务运行日志是个很好的习惯,也是成为高手的必经之路。
    9.开机自启动
    具体命令:

    echo "//mysql mutil instances" >>/etc/rc.local
    echo "/data/3306/mysql start" >>/etc/rc.local
    echo "/data/3307/mysql start" >>/etc/rc.local
    

    如何增加一个mysql实例
    具体命令集合:

    mkdir -p /data/3308/data
    cp /data/3306/my.cnf /data/3308/
    cp /data/3306/mysql /data/3308/
    cd 3308/
    sed -i 's/3306/3308/g' /data/3308/my.cnf
    sed -i 's/server-id = 1/server-id = 8/g' /data/3308/my.cnf
    sed -i 's/3306/3308/g' /data/3308/mysql
    chown -R mysql.mysql /data/3308
    chmod 700 /data/3308/mysql
    

    #初始化3308 实例Mysql数据库

    [root@db02 ~]# cd /application/mysql/scripts/

    #3306实例初始化
    [root@db02 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3308/data --user=mysql
    #启动3308实例的数据库
    /data/3308/mysql start

  • 相关阅读:
    XML指南——XML 瀏覽器(Netscape、Explorer)
    XML指南——察看 XML 文件
    ASP中Dictionary的使用
    SQL Mobile的RDA数据同步开发
    XML指南——XML 確認
    简单的js分页脚本
    浏览器语种检测,适合于多语言版本的站点
    Com/Dcom/Com+的思考
    XML指南——XML數據島
    MOSS 2007 功能概述
  • 原文地址:https://www.cnblogs.com/flytor/p/11415128.html
Copyright © 2011-2022 走看看