mysql+mmm實現HA

引言
Master-Slave的數據庫機構解決了很多問題,特別是read/write比較高的web2.0應用:
1、寫操作全部在Master結點執行,並由Slave數據庫結點定時(默認60s)讀取Masterbin-log
2、將衆多的用戶讀請求分散到更多的數據庫節點,從而減輕了單點的壓力
這是對Replication的最基本陳述,這種模式的在系統Scale-out方案中很有引力(如有必要,數據可以先進行Sharding,再使用replication)
它的缺點是:
1Slave實時性的保障,對於實時性很高的場合可能需要做一些處理
2、高可用性問題,Master就是那個致命點(SPOF:Single point of failure)
本文主要討論的是如何解決第2個缺點。
DB的設計對大規模、高負載的系統是極其重要的。高可用性(High availability)在重要的系統(critical System)是需要架構師事先考慮的。存在SPOF:Single point of failure的設計在重要系統中是危險的。

Master-Master Replication
1、使用兩個MySQL數據庫db01,db02,互爲MasterSlave,即:
一邊db01作爲db02master,一旦有數據寫向db01時,db02定時從db01更新
另一邊db02也作爲db01master,一旦有數據寫向db02時,db01也定時從db02獲得更新
(這不會導致循環,MySQL Slave默認不會記錄Master同步過來的變化)
2、但從AppServer的角度來說,同時只有一個結點db01扮演Master,另外一個結點db02扮演Slave,不能同時兩個結點扮演Master。即AppSever總是把write操作分配某個數據庫(db01),除非db01 failed,被切換。
3、如果扮演Slave的數據庫結點db02 Failed了:
a)此時appServer要能夠把所有的read,write分配給db01read操作不再指向db02
b)一旦db02恢復過來後,繼續充當Slave角色,並告訴AppServer可以將read分配給它了.
4、如果扮演Master的數據庫結點db01 Failed
a)此時appServer要能夠把所有的寫操作從db01切換分配給db02,也就是切換Masterdb02充當
b)db01恢復過來後,充當Slave的角色,Masterdb02繼續扮演。
Master-Master with n Slaves Replication

每一個MySQL服務器器結點需要運行mmmd_agent,同時在另外的一個機器上(可以是獨立的一臺機器,也可以是和AppServer共享同一個服務器)運行mmmd_mon。形成1 * mmmd_mon + n * mmmd_agent的部署架構。
MMM利用了虛擬IP的技術:1個網卡可以同時使用多個IP
(所以使用MMM時,需要2*n+1IPnmysql數據庫結點個數,包括master,slave)
當有數據庫結點fail時,mmmd_mon檢測不到mmmd_agent的心跳或者對應的MySQL服務器的狀態,mmmd_mon將進行決定,並下指令給某個正常的數據庫結點的mmmd_agent,使得該mmmd_agent“篡位使用()剛纔fail的那個結點的虛擬IP,使得虛擬IP實際從指向fail的那個機器自動轉爲此時的這個正常機器。

整體架構的原理:

配置步驟:
一、Node1 node2 雙向 master-master(此配置省略,可參考本博客mysql雙主配置文章)。
二、安裝部署MMM
目標主機:
Node1
192.168.1.2
Node2
192.168.1.3
Mon
192.168.1.4
1、三臺服務器所需安裝軟件包
yum -y install perl-DBD-MySQL
1)先安裝兩個perl包
Algorithm-Diff-1.1902.tar.gz
Proc-Daemon-0.03.tar.gz
perl安裝過程
perl Makefile.PL

make

make test

make install

2)安裝MMM

./install.pl

2、配置兩臺MMM客戶端

$cd /usr/local/mmm/etc/examples

$cp mmm_agent.conf.examples ../mmm_agent.conf

$cp mmm_common.conf.example ../mmm_common.conf

配置文件所需要修改的地方如下:
(1) 兩臺mmm客戶端的mmm_agent.conf主要內容
# Master-Master Manager config (agent)
#
include mmm_common.conf
# Paths
pid_path /usr/local/mmm/var/mmmd_agent.pid
# MMMD command socket tcp-port and ip
bind_port 9989
# Define current server id
this db1 //NODE2上將db1換成db2(this db2)
mode master
peer db2 //NODE2上將db2換成db1(peer db1)
# Cluster hosts addresses and access params
host db1
ip 192.168.1.2 //node1的真實IP
port 3306
user rep_agent
password RepAgent
host db2
ip 192.168.1.3 //node2的真實IP
port 3306
user rep_agent
password RepAgent
(2)兩臺mmm客戶端的mmm_common.conf主要內容
# Cluster interface
cluster_interface eth0

# Debug mode
debug no

# Paths
bin_path /usr/local/mmm/bin

# Logging setup
log mydebug
file /usr/local/mmm/var/mmm-debug.log
level debug

log mytraps
file /usr/local/mmm/var/mmm-traps.log
level trap
email root@localhost

# Email notification settings
email notify
from_address [email protected]
from_name MMM Control

# Define roles
active_master_role writer

# MMMD command socket tcp-port
agent_port 9989
monitor_ip 127.0.0.1


# Cluster hosts addresses and access params
host db1
ip 192.168.1.2
port 3306
user rep_monitor
password RepMonitor
mode master
peer db2

host db2
ip 192.168.1.3
port 3306
user rep_monitor
password RepMonitor
mode master
peer db1

# Define roles that are assigned to the above hosts
# Mysql Reader role
role reader //設置讀規則
mode balanced //模式爲均攤
servers db1, db2 //規則覆蓋db1 db2
ip 192.168.1.7, 192.168.1.8 //這裏是虛擬IP
# Mysql Writer role
role writer //寫規則
mode exclusive //模式爲獨佔
servers db1, db2 //規則負載db1 db2
ip 192.168.1.9 //兩臺數據庫公用一個虛擬ip爲寫,採用HA模式,默認db1使用,db1下線db2接管此ip
# Replication credentials used by slaves to connect to the master
#replication_user replication
#replication_password slave

# Checks parameters

# Ping checker
check ping
check_period 1
trap_period 5
timeout 2

# Mysql checker
# (restarts after 10000 checks to prevent memory leaks)
check mysql
check_period 1
trap_period 2
timeout 2
restart_after 10000

# Mysql replication backlog checker
# (restarts after 10000 checks to prevent memory leaks)
check rep_backlog
check_period 5
trap_period 10
max_backlog 60
timeout 2
restart_after 10000

# Mysql replication threads checker
# (restarts after 10000 checks to prevent memory leaks)
check rep_threads
check_period 1
trap_period 5
timeout 2
restart_after 10000
(3)兩臺mmm客戶端分別設置權限(MMM客戶端
#mysql -u root -p
GRANT ALL PRIVILEGES on *.* to 'rep_agent'@'%' identified by 'RepAgent';
GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'%' identified by 'RepMonitor';
3.配置MMM服務端
$cd /usr/local/mmm/etc/examples
$cp mmm_mon.conf.examples ../mmm_mon.conf
$cp mmm_common.conf.example ../mmm_common.conf
(1)mmm_mon.conf內容只改宕機切換模式
# Choose the default failover method [manual|wait|auto]
failover_method auto
(2)mmm_common.conf主要內容和node1和node2的內容一致。
4.MMM測試
(1)啓動MMM客戶端
#/usr/local/mmm/scripts/init.d/mmm_agent start
Starting MMM Agent daemon: MySQL Multi-Master Replication Manager
Version: 1.2.6
Ok
以上信息說明客戶端啓動正常
(2)啓動MMM服務端
#/usr/local/mmm/scripts/init.d/mmm_mon start
# mmm_control set_online db1
# mmm_control set_online db2
# mmm_control show 查看分配情況
正常情況下:
# mmm_control show
Servers status:
db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;), writer(192.168.1.9;)
db2(192.168.1.3): master/ONLINE. Roles: reader(192.168.1.8;)
停止 192.168.1.3 mysql服務
# mmm_control show
Servers status:
db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;), writer(192.168.1.9;)
db2(192.168.1.3): master/REPLICATION_FAIL. Roles: None
參考文獻:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章