我们可能出于各种原因,而考虑在同一台物理服务器上部署多个实例,而多实例的部署方式简单,但是如何才能减少我们生产环境的维护成本,如何减少我们出错的机会,如何方便我们后续的迁移和清理等工作,以及如何借助多实例绑定的方式提高服务器的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中国
作者
相关推荐
-
甲骨文进军SDN 发布最新Netra网络服务器产品
本周,在西班牙巴塞罗那举办的2015世界移动通信大会上,甲骨文展出了4款新系统和网络产品。
-
甲骨文宣布MySQL Cluster 7.4全面上市
甲骨文公司今天宣布MySQL Cluster 7.4全面上市。MySQL Cluster是一款ACID兼容的开源事务处理型数据库,具有实时内存性能和99.999%的可用性。
-
解读MySQL数据库的双向复制
在主-从复制中,主机影响从机。但从数据库中的任何更改不会影响主数据库,这篇文章将帮助你实现双向复制。
-
多种不同的MySQL数据库SSL配置
SSL通过加密网络防止有针对性的监听。在与正确的服务器进行交互时,可以有效应对中间人攻击。本文介绍了不同的使用MySQL数据库的SSL配置方法。