Mysql多实例数据库

笑着哭i 提交于 2019-11-28 16:18:45

什么是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...\n"        /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &      else        printf "MySQL is running...\n"        exit      fi  }  #stop function  function_stop_mysql()  {      if [ ! -e "$mysql_sock" ];then         printf "MySQL is stopped...\n"         exit      else         printf "Stoping MySQL...\n"         ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown     fi  }  #restart function  function_restart_mysql()  {      printf "Restarting MySQL...\n"      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}\n"  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...\n"        /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &      else        printf "MySQL is running...\n"        exit      fi  }  #stop function  function_stop_mysql()  {      if [ ! -e "$mysql_sock" ];then         printf "MySQL is stopped...\n"         exit      else         printf "Stoping MySQL...\n"         ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown     fi  }  #restart function  function_restart_mysql()  {      printf "Restarting MySQL...\n"      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}\n"  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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!