生產環境中一臺mysql 主機存在單點故障,因此咱們要確保 mysql 的高可用性,即兩臺 MySQLhtml
服務器若是其中有一臺 MySQL 服務器掛掉後,另一臺能立馬接替其進行工做。mysql
MySQL 的高可用方案通常有以下幾種:linux
keepalived+雙主,MHA,PXC,MMM,Heartbeat+DRBD 等,比較經常使用的是 keepalived+雙主, MHA 和 PXC。git
本節主要介紹了利用 keepalived 實現 MySQL 數據庫的高可用。github
Keepalived+mysql 雙主來實現MySQL-HA,咱們必須保證兩臺MySQL 數據庫的數據徹底同樣,基本思路是兩臺 MySQL 互爲主從關係,經過 Keepalived 配置虛擬 IP,實現當其中的一臺MySQL 數據庫宕機後,應用可以自動切換到另一臺 MySQL 數據庫,保證系統的高可用。拓撲環境sql
OS:centos6.5 x86_64數據庫
Mysql 版本:mysql 5.5.38centos
Keepalived: keepalived-1.2.20 Mysql-vip:192.168.1.100 Mysql-master1:192.168.1.101 Mysql-master2:192.168.1.102緩存
1、配置兩臺 mysql 主主同步服務器
該過程的第一部分就是 master 記錄二進制日誌。在每一個事務更新數據完成以前,master 在二日誌記錄這些改變。MySQL 將事務寫入二進制日誌。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
下一步就是slave 將 master 的 binary log 拷貝到它本身的中繼日誌。首先,slave 開始一個工做線程——I/O 線程。I/O 線程在master 上打開一個普通的鏈接,而後開始 binlog dump process。Binlog dump process 從 master 的二進制日誌中讀取事件,若是已經同步了 master,它會睡眠並等待 master 產生新的事件。I/O 線程將這些事件寫入中繼日誌。
SQL slave thread(SQL 從線程)處理該過程的最後一步。SQL 線程從中繼日誌讀取事件,並重放其中的事件而更新 slave 的數據,使其與 master 中的數據一致。只要該線程與 I/O 線程保持一致,中繼日誌一般會位於 OS 的緩存中,因此中繼日誌的開銷很小。
主主同步就是兩臺機器互爲主的關係,在任何一臺機器上寫入都會同步。若 mysql 主機開啓了防火牆,須要關閉防火牆或建立規則。
1、修改 MySQL 配置文件
兩臺 MySQL 均要開啓 binlog 日誌功能,開啓方法:在 MySQL 配置文件[MySQLd]段中加上log-bin=MySQL-bin 選項,兩臺 MySQL 的 server-ID 不能同樣,默認狀況下兩臺 MySQL 的serverID 都是 1,需將其中一臺修改成 2 便可。
master1 中有關複製的配置以下:
log-bin = mysql-bin binlog_format = mixed server-id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index auto-increment-increment = 2
auto-increment-offset = 1
重啓 mysqld 服務
#service mysqld restart
master2 中有關複製的配置以下:
log-bin = mysql-bin binlog_format = mixed server-id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index auto-increment-increment = 2
auto-increment-offset = 2
重啓 mysqld 服務
#service mysqld restart
注:master1 和 master2 只有 server-id 不一樣和 auto-increment-offset 不一樣。
mysql 中有自增加字段,在作數據庫的主主同步時須要設置自增加的兩個相關配置:
auto_increment_offset 和 auto_increment_increment。
auto-increment-increment 表示自增加字段每次遞增的量,其默認值是 1。它的值應設爲整個結構中服務器的總數,本案例用到兩臺服務器,因此值設爲 2。
auto-increment-offset 是用來設定數據庫中自動增加的起點(即初始值),由於這兩能服務器都設定了一次自動增加值 2,因此它們的起點必須得不一樣,這樣才能避免兩臺服務器數據同步時出現主鍵衝突,
注:能夠在 my.cnf 文件中添加「binlog_do_db=數據庫名」配置項(能夠添加多個)來指定要同步的數據庫
2、將 master1 設爲 master2 的主服務器
在 master1 主機上建立受權帳戶,容許在 master2(192.168.1.102)主機上鍊接
查看 master1 的當前 binlog 狀態信息
在 master2 上將 master1 設爲自已的主服務器並開啓 slave 功能。
設置防火牆:
設置防火牆:
#iptables I INPUT –p tcp –dport 3306 –j ACCEPT #service iptables save
查看從的狀態,mysql>show slave status\G;如下兩個值必須爲 yes,表明從服務器能正常鏈接主服務器
能正常鏈接主服務器
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
3、將 master2 設爲 master1 的主服務器
在 master2 主機上建立受權帳戶,容許在 master1(192.168.1.101)主機上鍊接
查看 master2 的當前 binlog 狀態信息
在 master1 上將 master2 設爲自已的主服務器並開啓 slave 功能。
設置防火牆:
#iptables I INPUT –p tcp –dport 3306 –j ACCEPT #service iptables save
查看從的狀態,如下兩個值必須爲 yes,表明從服務器能正常鏈接主服務器Slave_IO_Running:Yes
Slave_SQL_Running:Yes
4、測試主主同步
在 master1 上建立要同步的數據庫如 test_db,並在 test_db 中建立一張測試表如 tab1
查看 master2 主機是否同步了 master1 上的數據變化
從上圖能夠看出master2 同步了 master 的數據變化
在 master2 主機上向 tab1 表中插入數據
查看 master1 主機是否同步了 master2 上的數據變化
如今任何一臺MySQL 上更新數據都會同步到另外一臺MySQL,MySQL 同步完成。
注:若主 MYSQL 服務器已經存在,只是後期才搭建從 MYSQL 服務器,在置配數據同步前應先將主 MYSQL 服務器的要同步的數據庫拷貝到從 MYSQL 服務器上(如先在主 MYSQL 上備份數據庫,再用備份在從MYSQL 服務器上恢復)
下面咱們就完成keepalived 的高可用性。
keepalived 是集羣管理中保證集羣高可用的一個軟件解決方案,其功能相似於 heartbeat,用來防止單點故障
keepalived 是以 VRRP 協議爲實現基礎的,VRRP 全稱 Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。
虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將 N 臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個 master 和多個 backup,master 上面有一個對外提供服務的 vip,master 會發組播(組播地址爲 224.0.0.18),當 backup 收不到 vrrp 包時就認爲 master 宕掉了,這時就須要根據 VRRP 的優先級來選舉一個 backup 當 master。這樣的話就能夠保證路由器的高可用了。
keepalived 主要有三個模塊,分別是 core 、check 和 vrrp。core 模塊爲 keepalived 的核心, 負責主進程的啓動、維護以及全局配置文件的加載和解析。check 負責健康檢查,包括常見的各類檢查方式。vrrp 模塊是來實現 VRRP 協議的。
2、keepalived 的安裝配置
1、在 master1 和 master2 上安裝軟件包 keepalived
安裝 keepalived 軟件包與服務控制
在編譯安裝 Keepalived 以前,必須先安裝內核開發包 kernel-devel 以及 openssl-devel、popt-devel 等支持庫。
若沒有安裝則經過rpm 或yum 工具進行安裝編譯安裝 Keepalived