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

转至:http://www.mysqlops.com/2011/07/30/multi-mysqld.html

导读

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

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

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

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

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

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

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

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

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

n         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=…  读取给予的参数配置信息,或标准的参数配置文件之外,还可以指定

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

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

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

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

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

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

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

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

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

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

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

u       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

n         配置文件的部分参数介绍

u       mysqld_multi 节点

l         user = admin

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

l         password

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

l         log

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

u       client 节点

l         default-character-set

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

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

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

l         user

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

l         lower_case_table_names

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

l         default-character-set和collation

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

l         max_connect_errors

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

l         interactive_timeout

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

l         query_cache_type

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

l         expire_logs_days

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

l         binlog-format和transaction_isolation

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

l         innodb_file_per_table

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

n         后续

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

原创文章,转载请注明: 转载自MySQLOPS 数据库与运维自动化技术分享


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章