一臺主機部署多個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 數據庫與運維自動化技術分享


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