手把手教你搭建MySQL雙主MM+keepalived高可用架構

寫在前面的話

設計MySQL高可用架構的目的是爲了避免單點故障,減少因系統故障或者數據庫崩潰所造成的恢復或者停機時間,爲企業提供7*24的持續及高性能服務,基本原理大多數爲通過主從自動切換及vip漂移

比較常見的高可用架構有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高可用架構了(如下圖)。

image.png


現在有新的業務需要一套新的環境,在此記錄下部署過程,希望對剛接觸MySQL的同學有所幫助,前面MySQL安裝和主從搭建可以不看,廢話不多少,架構圖如下

image.png


環境準備

操作系統版本爲  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上的啓動日誌

image.png

156上的啓動日誌

image.png


vip出現在154上

image.png

驗證

模擬154服務器數據庫宕機

root@qsbilldatahis-db01:~# mysqladmin -uroot -p shutdown
Enter password:

查看日誌

154上keepalived檢查不到mysql的服務,狀態變爲fail ,將虛擬IP remove,執行腳本,殺掉keepalived進程

image.png

156上查看日誌 變爲master狀態

image.png

ip addr show

vip已經在156上,使用navicate工具連接VIP還是能正常提供服務

image.png

至此,所有的都搭建完成。




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

至此完成切回。

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