===========================================================================摘抄自hellodba

 

MySQL单机多实例方案,是指在一台物理的PC服务器上运行多个MySQL数据库实例,为什么要这样做?这样做的好处是什么?

1.存储技术飞速发展,IO不再是瓶颈

普通PC服务器的CPU与IO资源不均衡,因为磁盘的IO能力非常有限,为了满足应用的需要,往往需要配置大量的服务器,这样就造成CPU资源的大量浪费。但是,Flash存储技术的出现改变了这一切,单机的IO能力不再是瓶颈,可以在单机运行多个MySQL实例提升CPU利用率。

2.MySQL对多核CPU利用率低

MySQL对多核CPU的利用率不高,一直是个问题,5.1版本以前的MySQL,当CPU超过4个核时,性能无法线性扩展。虽然MySQL后续版本一直在改进这个问题,包括Innodb plugin和Percona XtraDB都对多核CPU的利用率改进了很多,但是依然无法实现性能随着CPU core的增加而提升。我们现在常用的双路至强服务器,单颗CPU有4-8个core,在操作系统上可以看到16-32 CPU(每个core有两个线程),四路服务器可以达到64 core甚至更多,所以提升MySQL对于多核CPU的利用率是提升性能的重要手段。下图是Percona的一份测试数据:

===========================================================================摘抄自hellodba

 

mysqld_multi可以管理多个帧听不同Unix套接字文件和TCP/IP端口的连接的mysqld进程。它可以启动或停止服务器,或报告它们的当前状态。

要想调用mysqld_multi,使用下面的语法:

shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR] ...]

start、stop和report表示你想要执行的操作。你可以在单个服务器或多个服务器上执行指定的操作,取决于选项名后面的GNR列。如果没有该列,mysqld_multi为选项文件中的所有服务器执行该操作。

具体配置如下:

 
  
  1. # pwd  
  2.  
  3. /usr/local/mysql/etc/  
  4.  
  5. # cat multi.cnf   
  6.  
  7. [mysqld_multi]  
  8.  
  9. mysqld     = /usr/local/mysql/bin/mysqld_safe  
  10.  
  11. mysqladmin =/usr/local/mysql/bin/mysqladmin  
  12.  
  13. user       = multi_admin 
  14.  
  15. password   = 123123 #确保之后赋权的密码是这里的密码,否则无法关闭实例  
  16.  
  17.    
  18.  
  19. [mysqld2]  
  20.  
  21. socket     = /tmp/mysql.sock2  
  22.  
  23. port       = 3307 
  24.  
  25. pid-file   = /var/run/mysqld/mysql.pid2  
  26.  
  27. datadir    = /data2  
  28.  
  29.    
  30.  
  31. [mysqld3]  
  32.  
  33. socket     = /tmp/mysql.sock3  
  34.  
  35. port       = 3308 
  36.  
  37. pid-file   = /var/run/mysqld/mysql.pid3  
  38.  
  39. datadir    = /data3  
  40.  
  41.    
  42.  
  43. [mysqld4]  
  44.  
  45. socket     = /tmp/mysql.sock4  
  46.  
  47. port       = 3309 
  48.  
  49. pid-file   = /var/run/mysqld/mysql.pid4  
  50.  
  51. datadir    = /data4  
  52.  
  53. # mkdir /data2 /data3 /data4  
  54.  
  55. # chown myql:mysql -R  /data2/data3 /data4  
  56.  
  57. # cd /usr/local/mysql  
  58.  
  59. # ./scripts/mysql_install_db --user=mysql --datadir=/data2  
  60.  
  61. # ./scripts/mysql_install_db --user=mysql --datadir=/data3  
  62.  
  63. # ./scripts/mysql_install_db --user=mysql --datadir=/data4  
  64.  
  65. # /usr/local/mysql/bin/mysqld_multi \  
  66.  
  67. --defaults-file=/usr/local/mysql/etc/multi.cnfstart 2-4  //开启2到4的实例  
  68.  
  69. //# /usr/local/mysql/bin/mysqld_multi \  
  70.  
  71. --defaults-file=/usr/local/mysql/etc/multi.cnfstart 2,4 开启2和4两个实例  
  72.  
  73. # netstat -tulnp | grep mysql  
  74.  
  75. tcp        0     0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      15080/mysqld         
  76.  
  77. tcp        0     0 0.0.0.0:3308               0.0.0.0:*                   LISTEN      15088/mysqld         
  78.  
  79. tcp        0     0 0.0.0.0:3309               0.0.0.0:*                   LISTEN     15097/mysqld         
  80.  
  81. # mysql -u root -S /tmp/mysql.sock2   
  82.  
  83. Welcome to the MySQLmonitor.  Commands end with ; or \g.  
  84.  
  85. Your MySQL connection id is 1  
  86.  
  87. Server version:5.5.8-debug-log Source distribution  
  88.  
  89.    
  90.  
  91. Copyright (c) 2000, 2010,Oracle and/or its affiliates. All rights reserved.  
  92.  
  93. This software comes withABSOLUTELY NO WARRANTY. This is free software,  
  94.  
  95. and you are welcome to modifyand redistribute it under the GPL v2 license  
  96.  
  97.    
  98.  
  99. Type 'help;' or '\h' forhelp. Type '\c' to clear the current input statement.  
  100.  
  101.    
  102.  
  103. mysql> grant shutdown on *.* to multi_admin@'localhost' identified by'123123';  
  104.  
  105. Query OK, 0 rows affected(0.00 sec)  
  106.  
  107.    
  108.  
  109. mysql> flush privileges;  
  110.  
  111. Query OK, 0 rows affected(0.01 sec)  
  112.  
  113.    
  114.  
  115. mysql> quit  
  116.  
  117. Bye  
  118.  
  119. #  
  120.  
  121. 之后的实例依次连接执行命令赋权即可  
  122.  
  123. mysql> grant shutdown on *.* to multi_admin@'localhost' identified by'123123';  
  124.  
  125. mysql> flush privileges;  
  126.  
  127. # /usr/local/mysql/bin/mysqld_multi \  
  128.  
  129. --defaults-file=/usr/local/mysql/etc/multi.cnfstop 2-4  
  130.  
  131. # netstat -tulnp | grep mysql  
  132.  
  133. #  
  134.  

另外NUMA对MySQL多实例的性能调优较大的联系,笔者会对这方面做一个详细的测试