一台主机部署多个mysqld实例方案

日期: 2011-07-31 作者:Eugene 来源:TechTarget中国

  我们可能出于各种原因,而考虑在同一台物理服务器上部署多个实例,而多实例的部署方式简单,但是如何才能减少我们生产环境的维护成本,如何减少我们出错的机会,如何方便我们后续的迁移和清理等工作,以及如何借助多实例绑定的方式提高服务器的CPU资源利用率,mysqld实例绑定处理器的方法可参考文章NUMA处理器绑定多实例到固定核心。

  文章的开篇我们分析一下,什么情况下我们会考虑一台物理服务器上部署多个实例,大致有以下几种情况:

  采用了数据伪分布式架构的原因,而项目启动初期又不一定有那多的用户量,为此先一组物理数据库服务器,但部署多个实例,方便后续迁移;

  为规避mysql对SMP架构不支持的缺陷,使用多实例绑定处理器的办法,把不同的数据库分配到不同的实例上提供数据服务;

  一台物理数据库服务器支撑多个数据库的数据服务,为提高mysql复制的从机的恢复效率,采用多实例部署;

  已经为双主复制的mysql数据库服务器架构,想部分重要业务的数据多一份异地机房的热备份,而mysql复制暂不支持多主的复制模式,且不给用户提供服务,为有效控制成本,会考虑异地机房部署一台性能超好的物理服务器,甚至外加磁盘柜的方式,为此也会部署多实例;

  传统游戏行业的MMO/MMORPG,以及Web Game,每一个服都对应一个数据库,而可能要做很多数据查询和数据订正的工作,为减少维护而出错的概率,也可能采用多实例部署的方式,按区的概念分配数据库;

  以上五种应用场景,其中四种是我在不同公司,根据公司业务和维护的实际情况,在生产环境中使用过。

  多实例部署的争论点:采用多个my.cnf配置文件,还是使用一个。个人推荐使用一个配置文件的方式,这种方式维护成本更低更加方便快捷,那我们将围绕使用一个服务器端参数配置文件讲述,以下篇幅分为三段讲述:mysqld_multi命令、配置文件中的节点作用及配置样例、配置文件的部分参数介绍。

  mysqld_multi 命令

  命令执行语法:

  mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR…]

  或者

  mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,…]

  参考示例:

  mysqld_multi start 3306,3307,3308,3309

  或者

  mysqld_multi start 3306-3309

  OPTIONS:

  –no-defaults没有需要读取的默认文件;

  –defaults-file=…. 对于实例的启动、关闭和其他维护动作,只根据此配置文件来确定,

  不接受其他方式给予的参数配置信息;

  –defaults-extra-file=… 读取给予的参数配置信息,或标准的参数配置文件之外,还可以指定

  一个额外的参数配置文件;

  配置文件中的节点作用及参考配置样例

  服务器端参数配置文件my.cnf中,有哪些节点呢?常用到需配置参数的节点名称如下:

  mysqld_multi:配置用于传递给命令工具mysqld_multi的参数信息;

  client:配置用于传递给每个客户端的参数信息;

  mysqld实例需配置的参数信息,节点名称例如:mysqld3306,此节点名称可以自定义;

  mysql:给命令行工具mysql配置的默认参数信息;

  mysqld_safe:给mysqld服务启动工具mysqld_safe配置的默认参数;

  mysqldump:给用于数据备份的命令工具mysqldump配置的默认参数;

  myisamchk:给用于myisam类引擎检查、修复数据命令行工具myisamchk配置的默认参数;

  mysqlhotcopy:给用于myisam类引擎的数据备份命令行工具mysqlhotcopy配置的默认参数信息;

  my.cnf文件参考配置样例

  [mysqld_multi]
  mysqld = /usr/bin/mysqld_safe
  mysqladmin = /usr/bin/mysqladmin
  user = admin
  log = /data/multi.log
  [client]
  default-character-set = utf8
  [mysqld3306]
  user = mysql
  port = 3306
  socket = /data/mysqldata3306/sock/mysql.sock
  pid-file = /data/mysqldata3306/sock/mysql.pid
  datadir = /data/mysqldata3306/mydata
  tmpdir = /data/mysqldata3306/tmpdir
  big_tables
  skip_external_locking
  skip-locking
  skip-name-resolve
  lower_case_table_names = 1
  back_log = 100
  default-storage-engine = INNODB
  default-character-set = utf8
  collation = utf8_general_ci
  max_connections = 800
  max_connect_errors = 100000
  interactive_timeout = 172800
  connect_timeout = 10
  max_allowed_packet = 4M
  max_heap_table_size = 128M
  tmp_table_size = 128M
  max_length_for_sort_data = 4096
  net_buffer_length = 8K
  sort_buffer_size = 8M
  join_buffer_size = 1M
  read_buffer_size = 1M
  read_rnd_buffer_size = 2M
  table_cache = 1024
  thread_cache_size = 64
  thread_concurrency = 8
  query_cache_type = 0
  #query_cache_size = 64M
  query_cache_limit = 1M
  #******************************* Logs related settings ***************************
  log-error = /data/mysqldata3306/log/error.log
  log_warnings
  long_query_time = 1
  slow_query_log
  slow_query_log_file = /data/mysqldata3306/log/slow-query.log
  #log_slow_queries = /data/mysqldata3306/log/slow-query.log
  log_queries_not_using_indexes
  binlog_cache_size = 8M
  max_binlog_size = 512M
  log_long_format
  log-bin = /data/mysqldata3306/binlog/mysql-bin3306
  log-bin-index = /data/mysqldata3306/binlog/mysql-bin3306.index
  expire_logs_days = 3
  #******************************* Replication related settings **********************
  #master
  server-id = 3306
  bind-address = 10.10.1.157
  report_host = 10.10.1.157
  report_port = 3306
  report_user = repl
  slave_net_timeout = 60
  innodb_flush_log_at_trx_commit = 2
  sync_binlog = 0
  binlog-format = mixed
  transaction_isolation = REPEATABLE-READ
  #******************************* MyISAM Specific options ****************************
  key_buffer_size = 32M
  bulk_insert_buffer_size = 16M
  myisam_sort_buffer_size = 64M
  myisam_max_sort_file_size = 10G
  myisam_max_extra_sort_file_size = 10G
  myisam_repair_threads = 1
  myisam_recover
  #***************************** INNODB Specific options ******************************
  innodb_file_per_table
  innodb_autoinc_lock_mode = 1
  innodb_fast_shutdown = 2
  innodb_additional_mem_pool_size = 64M
  innodb_buffer_pool_size = 1G
  innodb_data_home_dir = /data/mysqldata3306/innodb_ts
  innodb_data_file_path = ibdata1:256M:autoextend
  innodb_file_io_threads = 4
  innodb_thread_concurrency = 0
  innodb_log_buffer_size = 8M
  innodb_log_file_size = 256M
  innodb_log_files_in_group = 10
  innodb_log_group_home_dir = /data/mysqldata3306/innodb_log
  innodb_max_dirty_pages_pct = 20
  innodb_lock_wait_timeout = 120
  innodb_flush_method=O_DIRECT
  [mysqld3307]
  user = mysql
  port = 3307
  socket = /data/mysqldata3307/sock/mysql.sock
  pid-file = /data/mysqldata3307/sock/mysql.pid
  datadir = /data/mysqldata3307/mydata
  tmpdir = /data/mysqldata3307/tmpdir
  big_tables
  skip_external_locking
  skip-locking
  skip-name-resolve
  lower_case_table_names = 1
  back_log = 100
  default-storage-engine = INNODB
  default-character-set = utf8
  collation = utf8_general_ci
  max_connections = 800
  max_connect_errors = 100000
  interactive_timeout = 172800
  connect_timeout = 10
  max_allowed_packet = 4M
  max_heap_table_size = 128M
  tmp_table_size = 128M
  max_length_for_sort_data = 4096
  net_buffer_length = 8K
  sort_buffer_size = 8M
  join_buffer_size = 1M
  read_buffer_size = 1M
  read_rnd_buffer_size = 2M
  table_cache = 1024
  thread_cache_size = 64
  thread_concurrency = 8
  query_cache_type = 0
  #query_cache_size = 64M
  query_cache_limit = 1M
  #******************************* Logs related settings ***************************
  log-error = /data/mysqldata3307/log/error.log
  log_warnings
  long_query_time = 1
  slow_query_log
  slow_query_log_file = /data/mysqldata3307/log/slow-query.log
  #log_slow_queries = /data/mysqldata3307/log/slow-query.log
  log_queries_not_using_indexes
  binlog_cache_size = 8M
  max_binlog_size = 512M
  log_long_format
  log-bin = /data/mysqldata3307/binlog/mysql-bin3307
  log-bin-index = /data/mysqldata3307/binlog/mysql-bin3307.index
  expire_logs_days = 3
  #******************************* Replication related settings **********************
  #master
  server-id = 3307
  bind-address = 10.10.1.157
  report_host = 10.10.1.157
  report_port = 3307
  report_user = repl
  slave_net_timeout = 60
  innodb_flush_log_at_trx_commit = 2
  sync_binlog = 0
  binlog-format = mixed
  transaction_isolation = REPEATABLE-READ
  #******************************* MyISAM Specific options ****************************
  key_buffer_size = 32M
  bulk_insert_buffer_size = 16M
  myisam_sort_buffer_size = 64M
  myisam_max_sort_file_size = 10G
  myisam_max_extra_sort_file_size = 10G
  myisam_repair_threads = 1
  myisam_recover
  #***************************** INNODB Specific options ******************************
  innodb_file_per_table
  innodb_autoinc_lock_mode = 1
  innodb_fast_shutdown = 2
  innodb_additional_mem_pool_size = 64M
  innodb_buffer_pool_size = 5G
  innodb_data_home_dir = /data/mysqldata3307/innodb_ts
  innodb_data_file_path = ibdata1:256M:autoextend
  innodb_file_io_threads = 4
  innodb_thread_concurrency = 0
  innodb_log_buffer_size = 8M
  innodb_log_file_size = 256M
  innodb_log_files_in_group = 10
  innodb_log_group_home_dir = /data/mysqldata3307/innodb_log
  innodb_max_dirty_pages_pct = 20
  innodb_lock_wait_timeout = 120
  innodb_flush_method=O_DIRECT
  [mysql]
  no-auto-rehash
  prompt=”\u@\h : \d \r:\m:\s>”
  #tee=”/tmp/query.log”
  #pager=”less -i -n -S”
  max_allowed_packet = 1G
  [mysqldump]
  quick
  max_allowed_packet = 1G
  [mysqld_safe]
  open-files-limit = 8192
  [myisamchk]
  key_buffer = 512M
  sort_buffer_size = 128M
  read_buffer = 8M
  write_buffer = 8M
  [mysqlhotcopy]
  interactive-timeout

  配置文件的部分参数介绍

  mysqld_multi 节点

  user = admin

  user参数是为ssmysqld_multi命令配置一个统一默认的管理帐号,能够统一管理旗下所有mysqld服务节点的运行、管理、检查等相关信息,若在此设置的话,命令方式执行时没制定就使用此参数的值;

  该参数是对应user的密码,但是密码信息我们一般都不写到配置文件中,以避免泄漏,而是执行命令的时候再输入;

  log

  该参数用于记录mysqld_multi执行命令的日志信息,以及出错信息,以便于我们查找问题的根源;

  client 节点

  default-character-set

  若是客户端连接请求没有主动设置字符集,则使用该参数为所有连接mysqld服务器的客户端的默认字符集,但是使用mysqlbinlog命令行工具的时候,5.1系列版本会报错,使用时请暂时在配置文件中进行注释即可;

  mysqld服务节点,以mysql3306节点内容为例

  一台主机部署要多个实例,就涉及到各个实例各自的数据文件如何存放和隔离的问题,处于实例相关的目录和数据清理方便,以及维护成本更低,减少维护时的出错概率,我们采用上述样例配置文件中的目录结构,以及目录和数据文件命名方式,接下来我们主要阐述部分参数设置的意义:

  user

  该参数为mysqld服务启动后,mysqld使用何系统帐号运行mysqld服务的问题,不是指mysql授权表中创建的帐号,而是指操作系统级别中的帐号。我们安装mysql软件的时候,一般都会创建一个mysql帐号及为其制定用户编号,那么就可以把帐号名称mysql 或 mysql名称对应的用户编号,设置成参数user的值;

  lower_case_table_names

  类unix或Linux类中的文件系统一般都区分大小写,为减少程序员区分数据库对象名称的大小写问题,建议设置此参数,从而降低风险和降低开发成本;

  default-character-set和collation

  这一组参数是用于指定mysqld服务的字符集和校对规则,为减少字符集转换带来的开销,以及转换而可能带来的乱码问题,我们每个mysqld服务上的数据字符集和校对规则都统一,但是校对规则可以针对需要,设置表或某字段的校对规则不同,不会被全局的覆盖;

  max_connect_errors

  若某一客户端异常断开次数超过该参数设置的值,不重新启动mysqld服务或者执行SQL命令:FLUSH HOSTS 的话,将永远无法再成功连接到数据库服务器上,为此防止出现极端的情况,此参数的值至少要设置大于10W;

  interactive_timeout

  该参数用于设置客户端最长多少时间不发送任何命令给服务器端,除检查客户端是否活着的名另外,时间单位为秒。业务场景中可能存在使用长连接或连接池,但是某个时间段无业务运行或业务低谷时期,防止数据库连接被强制断开,一般设置为48小时;

  query_cache_type

  该参数是设置是否打开查询缓存和设置什么样的SQL可以加入到查询缓存中,特意把次参数列出的原因,是查询缓存有其特殊的场景:适合读为主的业务,且查询缓存大小设置要合理,毕竟查询缓存可能会增加修改类型处理的负荷,而导致性能下降;

  expire_logs_days

  可以借助设置此参数的值,不需要借助外部脚本或工具,就可让mysqld自动完成二进制日志文件的清理工作,该参数只能设置为整数n,表示的是保留n+1天的二进制日志文件,超过的则会在生成新的二进制日志文件时候,自动进行检测和删除掉;

  binlog-format和transaction_isolation

  二个参数分别是控制二进制日志登记模式、事务隔离方式,这2组参数组合在一起会共同决定最终登记二进制日志的格式,以及复制的模式,关于这方面信息,可参考文章解读MySQL事务的隔离级别和日志登记模式选择技巧;

  innodb_file_per_table

  对于InnoDB引擎的表,为减少维护表空间的大小,以及磁盘空间占用而不释放的问题,推荐使用单表表空间的模式,效率也更高,维护成本也更低;

  后续

  为帮助我们减少数据库结构和数据操作、维护或应用程序连接时出错的概率,mysql数据库系统中数据库访问的帐号名称及密码上需要花一些心思,帮助我们减少失误的概率,而且维护成本合理。我们可以对用户名称进行一些特殊设置,比如采用:站点名称_也许代号_端口号的模式,比如:xy_brmms_3306,帐号对应的密码我,们也可以在自动生成的基础上做一些对应的设置。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

Eugene
Eugene

相关推荐