具體架構圖以下html
兩個節點一主一從(從庫上面也能夠再掛一個從庫),或者是雙主,再利用keepalived在出現容災時進行高可用切換。python
Keepalived原理說明:mysql
其實這個原理能夠很簡單的用一個故事說明。sql
之前有一個幫派,像其餘全部的幫派同樣,有老大。這個老大活的也很憋屈,不只本身作全部的活,還要隔一段時間就要告訴全部小弟我是老大,大家老實點。全部的小弟也是很乖的,只要老大不死,他們確定不會搶奪老大的地位,可是一旦他們都收不到老大的通訊的話,他們就確信老大死了,他們就開始搶奪老大的地位了。不過他們搶奪老大的地位也是有規則的,他們都發出通告,等級高的人才能夠變成老大。又肩負起全部的任務,而且定時通告下面小弟,我是老大,都給我老實點。這個老大也是當得累啊,可是你們仍是很喜歡當老大啊。數據庫
這裏有一篇講解很詳細的文檔,地址爲http://blog.chinaunix.net/uid-27003384-id-3870083.html。多線程
具體實現:架構
這裏mysql的複製再也不作闡述(主要是作雙主),主要進行keepalived配置的講解。函數
個人環境是:性能
Centos6.7優化
Mysql5.6.27
安裝keepalived
yum –y install keepalived。
配置keepalived
Keepalived的配置文件是默認在/etc/keepalived/目錄下
配置文件詳情以下
Keepalived簡單配置說明(很簡單的配置)
vrrp_script vs_mysql_82 {
script "/etc/keepalived/checkMySQL.py -h 192.168.11.82 -P 3306" --檢測是否須要切換的腳本
interval 30 檢測時間,30s
}
vrrp_instance VI_82 {
state BACKUP 狀態(主要使用master,backup 兩種)
nopreempt 表示master死了之後活過來了,不會主動搶佔當前master地位的
interface eth0
virtual_router_id 82 組名
priority 100 等級
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
vs_mysql_82
}
virtual_ipaddress {
192.168.11.100
} 虛擬ip的設置
checkMySQL.py腳本解析
#!/usr/bin/python #coding: utf-8# import sys import os import getopt import MySQLdb import logging dbhost='localhost' #主機地址 dbport=3306 #端口號 dbuser='monitor' #帳號 dbpassword='m0n1tor' #密碼 def checkMySQL(): global dbhost global dbport global dbuser global dbpassword shortargs='h:P:' opts, args=getopt.getopt(sys.argv[1:],shortargs) for opt, value in opts: if opt=='-h': dbhost=value elif opt=='-P': dbport=value #print "host : %s, port: %d, user: %s, password: %s" % (dbhost, int(dbport), dbuser, dbpassword) db = instanceMySQL(dbhost, dbport, dbuser, dbpassword) st = db.ishaveMySQL()#主要調用這個函數 return st class instanceMySQL: conn = None def __init__(self, host=None,port=None, user=None, passwd=None): self.dbhost= host self.dbport = int(port) self.dbuser = user self.dbpassword = passwd def ishaveMySQL(self): cmd="ps -ef | egrep -i \"mysqld\" | grep %s | egrep -iv \"mysqld_safe\" | grep -v grep | wc -l" % self.dbport #查看mysql進程是否是活着,這裏須要注意的是,若是你用mysqld啓動的數據庫,須要對上面的命令進行修改。把egrep -iv \"mysqld_safe\"這個去掉
mysqldNum = os.popen(cmd).read() cmd ="netstat -tunlp | grep \":%s\" | wc -l" % self.dbport #檢查mysql端口號是否是正常接收 mysqlPortNum= os.popen(cmd).read() #print mysqldNum, mysqlPortNum if ( int(mysqldNum) <= 0): print "error" return 1 if ( int(mysqldNum) > 0 and mysqlPortNum <= 0): return 1 return 0if __name__== "__main__": st=checkMySQL() sys.exit(st)
須要注意的問題:
總結起來須要注意三個方面:
1:複製延遲
對於延遲的問題的話,能夠從兩個方面進行優化:
1:硬件方面
兩臺主機配置應該相差不大,一方面防止切換過來直接把一個乾死,另外一方面能夠減小延遲。
2:軟件方面
能夠直接使用半同步(性能上會有很大損失)或者是直接上5.7(5.7有多線程複製),還有使用mariadb分支,該分支有一個多線程複製的特性。比5.6的官方mysql好不少,mysql5.6官方多線程複製是schema級別的。
2:單邊寫在切換的時候須要注意的問題
須要注意的問題
1:防止腦裂(什麼是腦裂?)
兩個節點都設置成keepalived配置文件都配置成backup狀態,配置nopreempt。
2:再延遲的狀況下切換的話,可能會產生查不到信息或者是寫重複的狀況(好比自增加id可能會產生重複。能夠經過設置auto_increment_increment和auto_increment_offset來防止)
3:keepalived探測的準則肯定
最簡單的規則就是探測數據庫實例是否是存在,用ps,還有數據庫端口通不通。
須要在具體業務環境下進行適當的添加。還須要添加延遲的探測,在進行決定是否是直接切換,或者是另做處理。