亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

mysql高可用架構(gòu)方案之二(keepalived+lvs+讀寫

系統(tǒng) 2029 0
mysql主從復(fù)制與lvs+keepalived實現(xiàn)負(fù)載高可用




文件夾
1、前言?? ?4
2、原理?? ?4
2.1、概要介紹?? ?4
2.2、工作原理?? ?4
2.3、實際作用?? ?4
3方案?? ?4
3.1、環(huán)境?? ?4
3.2、架構(gòu)圖?? ?5
3.3、設(shè)計原理?? ?6
4、相關(guān)軟件安裝?? ?6
4、配置mysql的主從?? ?7
5、通過lvs+keepalived實現(xiàn)負(fù)載與熱備,并實現(xiàn)讀寫分離?? ?8

?

1、前言
近期研究了下高可用的東西,這里總結(jié)一下mysql主從復(fù)制讀寫分離度的高可用方案,能夠提高server的使用效率,也能夠提高提高維護(hù)效率。同一時候應(yīng)用的效率也會有一定的提升,假設(shè)改造須要應(yīng)用改動讀取的ip地址與寫入的ip地址,改造起來還算easy。
2、原理???? ?
2.1、概要介紹
假設(shè)將TCP/IP劃分為5層,則Keepalived就是一個類似于3~5層交換機(jī)制的軟件,具有3~5層交換功能,其主要作用是檢測webserver的狀 態(tài),假設(shè)某臺webserver故障,Keepalived將檢測到并將其從系統(tǒng)中剔除,當(dāng)該webserver工作正常后Keepalived自己主動將其增加到server 群中,這些工作所有自己主動完畢,而不須要人工干預(yù),僅僅須要人工修復(fù)故障的webserver就可以。
2.2、工作原理
Keepalived基于VRRP協(xié)議來實現(xiàn)高可用解決方式,利用其避免單點故障,通常這個解決方式中,至少有2臺server執(zhí)行Keepalived,即一 臺為MASTER,還有一臺為BACKUP,但對外表現(xiàn)為一個虛擬IP,MASTER會發(fā)送特定消息給BACKUP,當(dāng)BACKUP收不到該消息時,則覺得 MASTER故障了,BACKUP會接管虛擬IP,繼續(xù)提供服務(wù),從而保證了高可用性,3層機(jī)理是發(fā)送ICMP數(shù)據(jù)包即PING給某臺server,假設(shè)不痛,則覺得其故障,并從server群中剔除。4層機(jī)理是檢測TCPport號狀態(tài)來推斷某臺server是否故障,假設(shè)故障,則從server群中剔除。5層機(jī)理是依據(jù)用戶的設(shè)定檢查某個server應(yīng)用程序是否正常執(zhí)行,假設(shè)不正常,則從server群中剔除。3、
2.3、實際作用
Keepalived+lvs主要用作RealServer的健康檢查,以及負(fù)載均衡設(shè)備MASTER和BACKUP之間failover的實現(xiàn)。
3方案
本案例先使用兩臺linux做雙機(jī)MASTER-SLAVE高可用,實現(xiàn)都寫分離,用于提高查詢性能),採用MYSQL5.6.x的半同步實現(xiàn)數(shù)據(jù)復(fù)制和同步,使用keepalived來監(jiān)控MYSQL和提供讀寫VIP浮動。Keepalived在這里主要用作RealServer的健康狀態(tài)檢查以及LoadBalance主機(jī)和BackUP主機(jī)之間failover的實現(xiàn)
不論什么一臺主機(jī)宕機(jī)都不會影響對外提供服務(wù)(讀寫vip能夠浮動),保持服務(wù)的高可用。

3.1、環(huán)境
主機(jī)A:192.168.150.171
主機(jī)B:192.168.150.172
W-VIP:192.168.150.173? (負(fù)責(zé)寫入)
R-VIP:192.168.150.174?? (負(fù)責(zé)讀取)
Client:隨意,僅僅要能訪問以上三個IP就可以

3.2、架構(gòu)圖
詳細(xì)架構(gòu)圖例如以下:
?
3.3、設(shè)計原理(異常情況)
1、?? ?serverA和B,通過mysql的slave進(jìn)程是用binlog同步數(shù)據(jù)。
2、?? ?通過keepalived啟用兩個虛IP:W-VIP/R-VIP,一個負(fù)責(zé)寫入,一個負(fù)責(zé)讀取,實現(xiàn)讀寫分離。
3、?? ?A和B都存在時,W-VIP下將請求轉(zhuǎn)發(fā)至主機(jī)A,R-VIP將請求轉(zhuǎn)發(fā)給A和B,實現(xiàn)負(fù)載均衡。
4、?? ?當(dāng)主機(jī)A異常時,B接管服務(wù),W-VIP/R-VIP此時漂到了主機(jī)B上,此時這兩個虛IP下都是主機(jī)B,實現(xiàn)高可用
5、?? ?當(dāng)主機(jī)B異常時,R-VIP會將B踢出,其它不變

詳細(xì)實現(xiàn)后的效果
正常狀態(tài)
Prot LocalAddress:Port Scheduler Flags
? -> RemoteAddress:Port?????????? Forward Weight ActiveConn InActConn
TCP? 192.168.150.173:3306 wrr persistent 60
? -> 192.168.150.171:3306?????????? Local?? 3????? 0????????? 0??????? ?
TCP? 192.168.150.174:3306 wrr persistent 60
? -> 192.168.150.172:3306?????????? Route?? 3????? 0????????? 0??????? ?
? -> 192.168.150.171:3306?????????? Local?? 1????? 0????????? 0??????? ?

A故障后,B的狀態(tài)
Prot LocalAddress:Port Scheduler Flags
? -> RemoteAddress:Port?????????? Forward Weight ActiveConn InActConn
TCP? 192.168.150.173:3306 wrr persistent 60
? -> 192.168.150.172:3306?????????? Local?? 3????? 0????????? 0??????? ?
TCP? 192.168.150.174:3306 wrr persistent 60
? -> 192.168.150.172:3306?????????? Local?? 3????? 0????????? 0 ?
架構(gòu)圖

4、相關(guān)軟件安裝
1、?? ?mysql? 能夠依據(jù)須要進(jìn)行安裝,此處省略
2、?? ?lvs+keepalived的安裝

關(guān)聯(lián)lvs與keepalived的ipvs所需的內(nèi)核信息
ln -s /usr/src/kernels/2.6.18-194.el5-x86_64/ /usr/src/linux

安裝lvs
下載:wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
tar -zxvf ipvsadm-1.24.tar.gz
cd tar -zxvf ipvsadm-1.24
make
make install
yum install ipv* 安裝
驗證
ipvsadm –v
ipvsadm v1.24 2003/06/07 (compiled with getopt_long and IPVS v1.2.0)說明成功安裝

安裝keepalived
tar –zxvf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
./configure --prefix=/usr/local/keepalived/
make
make install
ln -s /usr/local/keepalived/etc/keepalived /etc/
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/bin/genhash /bin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

configure時注意Use IPVS Framework、IPVS sync daemon support 、Use VRRP Framework要返回yes,否則無法關(guān)聯(lián)ipvs功能

4、配置mysql的主從

Master(210.171)的配置
vi /etc/my.cnf

加入例如以下內(nèi)容:
server-id = 1??? ##master ID
binlog-do-db = ppl? ##同意同步的庫
binlog-ignore-db = mysql? ##忽略同步的庫,也就是不能同步的庫

##配置文件里還需開啟log-bin,比如log-bin = mysql-bin

mysql –uroot –p
下面內(nèi)容在mysql中運行
mysql> grant replication slave on *.* to ‘repdb01’@’%’ identified by '123456';
mysql>create database db01;
mysql>flush logs;
mysql>show master status;
mysql>use db01
mysql> create table test(name char);



返回一表格例如以下,記住File的內(nèi)容,等下slave的配置中要用到
?

Slave的配置
vi /etc/my.cnf

加入例如以下內(nèi)容:
server-id = 2? ##slave ID
master-host = 192.168.150.171? ##指定master的地址
master-user = repdb01??? ##同步所用的賬號
master-password = 123456?? ##同步所用的密碼
master-port = 3306???? ##master上mysql的端口
replicate-do-db = db01?? ##要同步的庫名
replicate-ignore-db = mysql? ##忽略的庫名
slave-skip-errors = 1062?? ##當(dāng)同步異常時,那些錯誤跳過,本例為1062錯誤
#log-slave-updates? ##同步的同一時候,也記錄自己的binlog日志,假設(shè)還有臺slave是通過這臺機(jī)器進(jìn)行同步,那須要添加此項,
#skip-slave-start? ##啟動時不自己主動開啟slave進(jìn)程
#read-only? ##將庫設(shè)為僅僅讀模式,僅僅能從master同步,不能直接寫入(避免自增鍵值沖突)

mysql –uroot –p
下面內(nèi)容在mysql中運行
mysql>create database db01;
mysql>change master to master_log_file=’mysql-bin.000007’,master_log=106;
mysql>slave start;
mysql>show slave status \G
在返回值中查看,假設(shè)slave_IO_Runing與slave_SQL_Runing的值都為Yes說明同步成功
?

5、通過lvs+keepalived實現(xiàn)負(fù)載與熱備,并實現(xiàn)讀寫分離

Master上的配置
vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
?? router_id MySQL-HA
}

vrrp_instance VI_1 {
??? state BACKUP
??? interface eth0
??? virtual_router_id 90
??? priority 100
??? advert_int 1
??? notify_master "/usr/local/mysql/bin/remove_slave.sh"
??? nopreempt
??? authentication {
??????? auth_type PASS
??????? auth_pass abcd1234
??? }
??? virtual_ipaddress {
??????? 192.168.150.173 label eth0:1
?? ???? 192.168.150.174 label eth0:2
??? }
}

virtual_server 192.168.150.173 3306 {
??? delay_loop 2
lb_algo wrr
lb_kind DR
??? persistence_timeout 60
??? protocol TCP
??? real_server 192.168.150.171 3306 {
??? weight 3
?? ?notify_down /usr/local/mysql/bin/mysql.sh
?? ?TCP_CHECK {
??????????? connect_timeout 10
??????????? nb_get_retry 3
??????????? delay_before_retry 3
?? ???? connect_port 3306
??????? }
??? }
}

virtual_server 192.168.150.174 3306 {
??? delay_loop 2
??? lb_algo wrr
??? lb_kind DR
??? persistence_timeout 60
??? protocol TCP
??? real_server 192.168.150.171 3306 {
??? weight 1
?? ?notify_down /usr/local/mysql/bin/mysql.sh
?? ?TCP_CHECK {
??????????? connect_timeout 10
??????????? nb_get_retry 3
??????????? delay_before_retry 3
?? ???? connect_port 3306
??????? }
??? }
??? real_server 192.168.150.172 3306 {
??? weight 3
?? ?TCP_CHECK {
??????????? connect_timeout 10
??????????? nb_get_retry 3
??????????? delay_before_retry 3
?? ???? connect_port 3306
??????? }
??? }
}

vi /usr/local/mysql/bin/remove_slave.sh

#!/bin/bash
user=root
password=123456
log=/root/mysqllog/remove_slave.log
#--------------------------------------------------------------------------------------
echo "`date`" >> $log
/usr/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log
/bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf

chomd 755 /usr/local/mysql/bin/remove_slave.sh

vi /usr/local/mysql/bin/mysql.sh

#!/bin/bash
/etc/init.d/keepalived stop

Slave上的配置

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
?? router_id MySQL-HA
}

vrrp_instance VI_1 {
??? state BACKUP
??? interface eth0
??? virtual_router_id 90
??? priority 99
??? advert_int 1
??? notify_master "/usr/local/mysql/bin/remove_slave.sh"
??? authentication {
??????? auth_type PASS
??????? auth_pass ppl.com
??? }
??? virtual_ipaddress {
??????? 192.168.150.173 label eth0:1
?? ???? 192.168.150.174 label eth0:2
??? }
}

virtual_server 192.168.150.173 3306 {
??? delay_loop 2
??? lb_algo wrr
??? lb_kind DR
??? persistence_timeout 60
??? protocol TCP
??? real_server 192.168.150.172 3306 {
??????? weight 3
?? ?notify_down /usr/local/mysql/bin/mysql.sh
?? ?TCP_CHECK {
??????????? connect_timeout 10
??????????? nb_get_retry 3
??????????? delay_before_retry 3
?? ???? connect_port 3306
??????? }
??? }
}

virtual_server 192.168.150.174 3306 {
??? delay_loop 2
??? lb_algo wrr
??? lb_kind DR
??? persistence_timeout 60
??? protocol TCP
??? real_server 192.168.150.172 3306 {
??????? weight 3
?? ?notify_down /usr/local/mysql/bin/mysql.sh
?? ?TCP_CHECK {
??????????? connect_timeout 10
??????????? nb_get_retry 3
??????????? delay_before_retry 3
?? ???? connect_port 3306
??????? }
??? }
#??? real_server 192.168.150.172 3306 {
#??????? weight 3
#??????? TCP_CHECK {
#??????????? connect_timeout 10
#??????????? nb_get_retry 3
#??????????? delay_before_retry 3
#??????????? connect_port 3306
#??????? }
#??? }
}

vi /usr/local/mysql/bin/remove_slave.sh

#!/bin/bash
user=root
password=123456
log=/root/mysqllog/remove_slave.log
#--------------------------------------------------------------------------------------
echo "`date`" >> $log
/usr/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log
/bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf

chomd 755 /usr/local/mysql/bin/remove_slave.sh

vi /usr/local/mysql/bin/mysql.sh

#!/bin/bash
/etc/init.d/keepalived stop

vi /usr/local/keepalived/bin/lvs-rs.sh

#!/bin/bash
WEB_VIP=192.168.150.174

. /etc/rc.d/init.d/functions

case "$1" in
start)
?????? ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP
?????? /sbin/route add -host $WEB_VIP dev lo:0
?????? echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
?????? echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
?????? echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
?????? echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
?????? sysctl -p >/dev/null 2>&1
?????? echo "RealServer Start OK"

?????? ;;
stop)
?????? ifconfig lo:0 down
?????? route del $WEB_VIP >/dev/null 2>&1
?????? echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
?????? echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
?????? echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
?????? echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
?????? echo "RealServer Stoped"
?????? ;;
status)
??????? # Status of LVS-DR real server.
??????? islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP`
??????? isrothere=`netstat -rn | grep "lo:0" | grep $web_VIP`
??????? if [ ! "$islothere" -o ! "isrothere" ];then
??????????? # Either the route or the lo:0 device
??????????? # not found.
??????????? echo "LVS-DR real server Stopped."
??????? else
??????????? echo "LVS-DR Running."
??????? fi
;;
*)
??????? # Invalid entry.
??????? echo "$0: Usage: $0 {start|status|stop}"
??????? exit 1
;;
esac
exit 0

chmod 755 /usr/local/keepalived/bin/lvs-rs.sh
echo “/usr/local/keepalived/bin/lvs-rs.sh start” >>/etc/rc.local

vi /etc/my.cnf
將這兩個參數(shù)前邊的 # 去掉,重新啟動mysql
#skip-slave-start ?
#read-only
登陸mysql,手動將slave進(jìn)程啟動
mysql>slave start;

先啟動master上的keepalived,正常后再啟動slave上的。
啟動后 主庫能夠查看ip a
[root@rac3 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
??? link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
??? inet 127.0.0.1/8 scope host lo
??? inet6 ::1/128 scope host
?????? valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
??? link/ether 00:50:56:95:06:1f brd ff:ff:ff:ff:ff:ff
??? inet 192.168.150.171.171/24 brd 192.168.0.255 scope global eth0
??? inet 192.168.150.173/32 scope global eth0:1
??? inet 192.168.150.174/32 scope global eth0:2
??? inet6 fe80::250:56ff:fe95:61f/64 scope link
?????? valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
slave上查看
[root@rac1 keepalive]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
??? link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
??? inet 127.0.0.1/8 scope host lo
??? inet 192.168.150.174/32 brd 192.168.150.174 scope global lo:0
??? inet6 ::1/128 scope host
?????? valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
??? link/ether 00:50:56:95:5e:b4 brd ff:ff:ff:ff:ff:ff
??? inet 192.168.150.188/24 brd 192.168.0.255 scope global eth0
??? inet 192.168.150.252/24 brd 192.168.0.255 scope global secondary eth0:1
??? inet 192.168.150.186/24 brd 192.168.0.255 scope global secondary eth0:4
??? inet6 fe80::250:56ff:fe95:5eb4/64 scope link
?????? valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
??? link/ether 00:50:56:95:11:ba brd ff:ff:ff:ff:ff:ff
??? inet 10.10.10.188/24 brd 10.10.10.255 scope global eth1
??? inet 169.254.157.163/16 brd 169.254.255.255 scope global eth1:1
??? inet6 fe80::250:56ff:fe95:11ba/64 scope link
?????? valid_lft forever preferred_lft forever
4: sit0: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0

發(fā)現(xiàn)210.174 讀的vip 在主備機(jī)上都能夠看到
210.173 寫入vip在主上才干看到

興許多臺實驗進(jìn)行中,敬請等待

mysql高可用架構(gòu)方案之二(keepalived+lvs+讀寫分離+負(fù)載均衡)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美19综合中文字幕 | 亚洲视频一区二区在线观看 | 新久草在线视频 | 看毛片网 | 日本不卡高清中文字幕免费 | 青青草a | 九一视频在线免费观看 | 香蕉视频在线观看黄 | 在线一级视频 | 免费一级特黄 欧美大片 | 涩涩精品 | 亚洲精品一区二区三区香蕉在线看 | 久久不雅视频 | 久久2017| 色综合天天综合高清网国产 | 日日摸日日碰夜夜爽久久 | 日本一线一区二区三区免费视频 | 国产精品第六页 | a资源在线| 久久视频国产 | 伊人快播 | 日本欧美一区二区三区在线观看 | 波多野结衣久久一区二区 | 成人青草亚洲国产 | 国四虎影永久 | 国产成人亚洲综合一区 | 亚洲系列中文字幕一区二区 | 精品玖玖玖视频在线观看 | 国产网红在线观看 | 99视频在线播放 | 九九精品视频一区在线 | 成人精品一区二区www | 久久久国产精品va麻豆 | 国产在线观看91精品一区 | 国产欧美日韩亚洲精品区2345 | 日韩中文字幕精品一区在线 | 四虎永久在线精品视频播放 | 精品久久久久久中文字幕专区 | 国产精品手机在线观看 | 五月亭亭激情五月 | 日本一区二区三区免费看 |