您好,登錄后才能下訂單哦!
下文我給大家簡單講講關于搭建MySQL雙主MM+keepalived高可用架構的具體流程,大家之前了解過相關類似主題內容嗎?感興趣的話就一起來看看這篇文章吧,相信看完搭建MySQL雙主MM+keepalived高可用架構的具體流程對大家多少有點幫助吧。
比較常見的高可用架構有MHA,MM,PXC等
MM架構優點是:
搭建快速方便,適合中小型公司,MySQL互為主從,保證兩臺數據庫的一致性,keepalived實現虛擬IP和自動的服務監控功能,利用VIP自動切換保證高可用,基本可以滿足業務需要。
但是這種架構存在以下問題:
1 切換后出現雙vip的問題,腦裂問題等,可以通過增加仲裁節點。
2 切換時丟數據,可以配合腳本監控binlog日志或者采用5.7版本的增強半同步。
3 主從延遲不能避免,如果要求沒有主從延遲,可以采用PXC架構。
4 當發生故障的云服務器恢復后,不能自動切回,切換回來比較麻煩,還需要手動修改配置文件中的權重。
5 對腳本編寫的能力也有不小考驗。
想要了解keepalived工作原理和配置文件說明的童鞋可以自行百度,或者看看這篇很詳細, 傳送門keepalived工作原理與配置文件說明
公司大部分的架構為MM+keepalived或者MM+heartbeat,然后主庫下面掛上從庫作為讀庫,再配合mycat集群實現讀寫分離和分庫分表就是一套比較完善的MySQL高可用架構了(如下圖)。
現在有新的業務需要一套新的環境,在此記錄下部署過程,希望對剛接觸MySQL的同學有所幫助,前面MySQL安裝和主從搭建可以不看,廢話不多少,架構圖如下
一 環境準備
操作系統版本為 Ubuntu 14.04.5
云服務器為16G內存 4核CPU 1T數據目錄存儲
數據庫版本為 5.6.39-log
IP規劃
master1: 192.168.70.154
master2: 192.168.70.156
vip 192.168.70.157
二 MySQL雙主搭架
在兩臺數據庫云服務器上
上傳安裝包
mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
解壓
tar -zxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
將解壓后的包移動到MySQL的basedir
mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql
創建mysql組和用戶
groupadd mysql
useradd -r -m -s /bin/bash -g mysql mysql
修改相關目錄的權限
chown -R mysql:mysql /usr/local/mysql/
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /etc/my.cnf
編輯配置文件
配置文件需要特別注意的地方為:
1 server-id必須不同,否則主從搭建報錯。
2 主鍵自增參數,可以避免主鍵沖突的錯誤
master1 設置如下
auto-increment-increment = 2
auto-increment-offset = 1
master 2 設置如下
auto-increment-increment = 2
auto-increment-offset = 2
下面給出一個比較全的可以作為參考,其他的要根據自己的實際情況修改:
vim /etc/my.cnf
[client] #password = [your_password] port = 3306 socket = /tmp/mysql.sock #設置客戶端字符集 default-character-set = utf8 [mysqld] # generic configuration options port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/mysql datadir = /data/mysql user = mysql #設置云服務器時區,建議每次都顯示指定 default-time-zone='+8:00' #設置云服務器端字符集,注意和客戶端字符集一樣,建議都設置utf8,防止中文亂碼 character-set-server=utf8 skip-name-resolve #是否支持federated 分布式引擎默認不支持 #federated #設置sql校驗模式,該設置影響到數據庫對字段數據的校驗嚴格程度 #sql_mode = STRICT_TRANS_TABLES expire_logs_days = 15 #在同步配置中這個要額外注意否則容易導致主鍵沖突 auto-increment-increment = 2 auto-increment-offset = 1 back_log = 50 max_connections = 10000 max_connect_errors = 100000 table_open_cache = 1024 #external-locking max_allowed_packet = 16M binlog_cache_size = 2M max_heap_table_size = 64M read_buffer_size = 2M read_rnd_buffer_size = 4M sort_buffer_size = 8M join_buffer_size = 4M thread_cache_size = 64 #這個變量是針對Solaris系統的,如果設置這個變量的話,mysqld就會調用thr_setconcurrency()。#這個函數使應用程序給同一時間運行的線程系統提供期望的線程數目。 thread_concurrency = 4 #無論是否有misam表建議都16-128M,如果misam表多那么建議設置為128M最大不要超#過256M #query_cache_size = 64M #query_cache_limit = 2M ft_min_word_len = 4 #memlock #5.5以下版本建議顯示設置。5.5默認是innodb default-storage-engine = innodb thread_stack = 192K # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE transaction_isolation = REPEATABLE-READ tmp_table_size = 64M #防止夸庫更新混亂,同步里推薦的設置 #replicate_wild_do_table=tang_monitor_report.% replicate_wild_do_table=%.% #建議顯示指定binlog和relaylog的名字,防止因修改hostname而導致出錯 log-bin=mysql-bin relay-log=mysql-relay-bin #binlog記錄格式,建議設置row,防止statement格式導致的數據不一直無法檢測的問題 binlog_format=mixed #設置是否將主庫的更新寫入binlog ,一般情況關閉,建議關閉 log_slave_updates #log_warnings slow_query_log slow_query_log_file=/data/mysql/myslow.log long_query_time = 2 innodb_buffer_pool_instances=4 innodb_change_buffering =changes innodb_old_blocks_time=1000 innodb_autoextend_increment=50 sync_binlog=100 innodb_open_files=1024 innodb_file_per_table =1 open-files-limit = 8192 log-error =/data/mysql/error.log server-id = 3306154 #半同步配置參數,很簡單吧,簡單的讓人震驚 #rpl_semi_sync_slave_enabled=1 #rpl_semi_sync_master_enabled=1 #rpl_semi_sync_master_timeout=1000 #slave庫的時候有用,設置是否slave庫為只讀,建議開啟 #read_only #misam index 緩存如果misam表多建議適當的增大 key_buffer_size = 128M bulk_insert_buffer_size = 64M #當在REPAIR TABLE或用CREATE INDEX創建索引或ALTER TABLE過程中排序 MyISAM索引分#配的緩沖區。 myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 10G #設置misam表修復的線程數 myisam_repair_threads = 1 #myisam表自動崩潰恢復級別 myisam_recover= BACKUP,FORCE #設置innodb數據字典的緩存,一般16-20M基本可以,如果innodb表特別多可適當增大到#32M innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 10G innodb_data_file_path = ibdata1:512M:autoextend #5.1版本為(innodb_file_io_threads)及其之前的版本都是硬編碼為4,默認是4即使修改也無用 ,5.5之后可以修改最大#不超過64 innodb_write_io_threads = 8 innodb_read_io_threads = 8 #innodb_force_recovery=1 #設置innodb內部線程并發數 innodb_thread_concurrency = 16 #設置日志刷新的方式 innodb_flush_log_at_trx_commit = 1 #設置binlog刷新方式,1表示提交前寫入了二進制,但事務commit失敗。二進制日志無法回#滾解決:設置innodb_support_xa=1(默認開啟),能夠確保二進制日志和數據文件的同步 #sync_binlog = 1 #innodb_fast_shutdown innodb_log_buffer_size = 4M innodb_log_file_size = 256M innodb_log_files_in_group = 3 #配置數據臟葉的比例 innodb_max_dirty_pages_pct = 75 #設置mysql 數據刷新的方式默認是fdatasync # doublewrite flush logic. The default value is "fdatasync", another # option is "O_DSYNC". innodb_flush_method=O_DSYNC innodb_lock_wait_timeout = 15 #控制普通用戶show database的權限 #skip-show-database #控制是否支持UDF log_bin_trust_function_creators = 1 # 控制是否slave線程隨mysql server的重啟而重啟,建議開啟 #skip_slave_start ##之前是回滾當前query,現在是回滾整個事物,這樣可以更快的釋放資源 innodb_rollback_on_timeout = ON #設置連接的超時時間,如果不希望長連接可以設置相對較小的值,有個高手老王建議設置為10-15 interactive_timeout = 300 #wait_timeout只作用于TCP/IP和Socket鏈接的線程,一般設置值和interactive_timeout一樣 wait_timeout = 300 ##新連接時候用到,在高并發的系統里建議10-15默認10 connect_timeout=15 ####主從復制里面slave檢查主庫是否正常并試圖從新連接之前的等待時間的時間,默認1小時建議30秒 slave_net_timeout = 30 # 不復制的數據庫 replicate-ignore-db=performance_schema replicate-ignore-db=information_schema replicate-ignore-db=test replicate-ignore-db=mysql [mysqldump] # Do not buffer the whole result set in memory before writing it to # file. Required for dumping very large tables quick max_allowed_packet = 16M [mysql] no-auto-rehash # Only allow UPDATEs and DELETEs that use keys. #safe-updates [myisamchk] key_buffer_size = 512M sort_buffer_size = 512M read_buffer = 8M write_buffer = 8M
以上配置完成后開始初始化
mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql --defaults-file=/etc/my.cnf
出現讓你修改root密碼之類的信息說明初始化成功,如果沒成功也許會提示你安裝相關的依賴包
啟動
mysqld_safe --defaults-file=/etc/my.cnf &
驗證是否安裝成功可以通過查看MySQL進程是否存在,3306端口是否被監聽等
ps -ef |grep mysql
netstat -nat |grep 3306
配置主主架構
154(master)--156(slave) 搭建如下
在154上
創建復制用戶
grant replication slave on *.* to 'repl'@'192.168.70.156' dentified by 'mysql';
flush privileges;
查看日志號和偏移量
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000008 | 1106 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
在156上
CHANGE MASTER TO MASTER_HOST='192.168.70.154', MASTER_USER='repl', MASTER_PASSWORD='mysql', MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=1106;
start slave ;
show slave status\G
兩個同步進程都為yes說明主從復制成功。
Slave_IO_Running: Yes Slave_SQL_Running: Yes
156(master)-154(slave) 搭架同理;
至此主從搭建完成。
三 keepalived安裝配置
直接采用apt-get的方式安裝
apt-get -y install keepalived
修改配置文件154上
vim /etc/keepalived/keepalived.conf
! Configuration File forkeepalived vrrp_instance VI_154 { state BACKUP #兩臺都設置BACKUP interface eth0 #網卡 virtual_router_id 157 #主備相同,在同一個局域網中不是一對的keepalived router_id不能相同,否則報錯,這里用157 priority 100 #優先級,backup設置90 advert_int 1 nopreempt #不主動搶占資源,只在master這臺優先級高的設置,backup不設置 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.70.157 } } virtual_server 192.168.70.157 3306 { delay_loop 2 #lb_algo rr #LVS算法,用不到,我們就關閉了 #lb_kind DR #LVS模式,如果不關閉,備用云服務器不能通過VIP連接主MySQL persistence_timeout 50 #同一IP的連接60秒內被分配到同一臺真實云服務器 protocol TCP real_server 192.168.70.154 3306 { #檢測本地mysql,backup也要寫檢測本地mysql weight 3 notify_down /etc/keepalived/mysql.sh #當mysq服down時,執行此腳本,殺死keepalived實現切換 TCP_CHECK { connect_timeout 3 #連接超時 nb_get_retry 3 #重試次數 delay_before_retry 3 #重試間隔時間 } } ~
156上配置如下
! Configuration File forkeepalived vrrp_instance VI_156 { state BACKUP #兩臺都設置BACKUP interface eth0 virtual_router_id 157 #主備相同 priority 90 #優先級,backup設置90 advert_int 1 nopreempt #不主動搶占資源,只在master這臺優先級高的設置,backup不設置 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.70.157 } } virtual_server 192.168.70.157 3306 { delay_loop 2 #lb_algo rr #LVS算法,用不到,我們就關閉了 #lb_kind DR #LVS模式,如果不關閉,備用云服務器不能通過VIP連接主MySQL persistence_timeout 50 #同一IP的連接60秒內被分配到同一臺真實云服務器 protocol TCP real_server 192.168.70.156 3306 { #檢測本地mysql,backup也要寫檢測本地mysql weight 3 notify_down /etc/keepalived/mysql.sh #當mysq服down時,執行此腳本,殺死keepalived實現切換 TCP_CHECK { connect_timeout 3 #連接超時 nb_get_retry 3 #重試次數 delay_before_retry 3 #重試間隔時間 } }
編寫腳本,該腳本的作用就是當檢測不到mysql的服務的時候,kill掉keepalived的進程,實現VIP漂移
vim /etc/keepalived/mysql.sh
#!/bin/bash
pkill keepalived
授予執行權限
chmod +x /etc/keepalived/mysql.sh
啟動
/etc/init.d/keepalived start
查看日志
ubuntu系統日志在/var/log/syslog
centos系統日志在 /var/log/message
154上的啟動日志
156上的啟動日志
vip出現在154上
四 驗證
模擬154云服務器數據庫宕機
root@qsbilldatahis-db01:~# mysqladmin -uroot -p shutdown Enter password:
查看日志
154上keepalived檢查不到mysql的服務,狀態變為fail ,將虛擬IP remove,執行腳本,殺掉keepalived進程
156上查看日志 變為master狀態
ip addr show
vip已經在156上,使用navicate工具連接VIP還是能正常提供服務
至此,所有的都搭建完成。
VIP如何切換回來最安全呢?
現在模擬154恢復,讓VIP從156漂回到154。現在把154上的數據庫啟動,
root@qsbilldatahis-db01:~# mysqld_safe --defaults-file=/etc/my.cnf & [1] 592 root@qsbilldatahis-db01:~# 180411 17:24:49 mysqld_safe Logging to '/data/mysql/error.log'. 180411 17:24:49 mysqld_safe Starting mysqld daemon with databases from /data/mysql
154上啟動keepalived
oot@qsbilldatahis-db01:~# /etc/init.d/keepalived start * Starting keepalived keepalived [ OK ]
在156上停掉keepalived,vip就可以漂回154了
/etc/init.d/keepalived stop
至此完成切回。
大家覺得搭建MySQL雙主MM+keepalived高可用架構的具體流程這篇文章怎么樣,是否有所收獲。如果想要了解更多相關,可以繼續關注我們的行業資訊板塊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。