轉至: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 數據庫與運維自動化技術分享