mysql+keepalivdnginx+keepalived+lvs+keepalived+mysqlWord文档下载推荐.docx
《mysql+keepalivdnginx+keepalived+lvs+keepalived+mysqlWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《mysql+keepalivdnginx+keepalived+lvs+keepalived+mysqlWord文档下载推荐.docx(36页珍藏版)》请在冰豆网上搜索。
![mysql+keepalivdnginx+keepalived+lvs+keepalived+mysqlWord文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/25/a0026661-c876-4f63-9d65-32c3a71f171a/a0026661-c876-4f63-9d65-32c3a71f171a1.gif)
Lvs+keepalived架构数据流向流程
参考地址
1.双主Master1和Master2通过keepalived虚拟出的VIP地址对外提供服务
2.Slave1和Slave2通过主从复制,获取与主库相同数据,对外提供读服务
3.通过lvs+keepalived实现mysql读服务的高可用
1.通过读写分离的方式,减轻了主库的压力(设定环境读远大于写)
2.通过lvs+keepalived实现mysql读服务的高可用
3.通过keepalived实现了mysql双主的同时对外提供服务,实现了写的高可用(当然还有heartbeat+drdb的方案)
4.通过lvs+keepalived的会话保持功能简单的避免了裂脑的风险
1.双主同时对外提供服务,必须保持两端数据的一致性。
这就要求Master1和Master2之间必须实时的进行数据的同步。
这样一来,当有大量数据插入的时候,Master1和Master2之间既要同步,又要将数据给Slave,所以Master端压力依然很重,数据延迟是一个问题。
2.Master和Slave之间,也需要做主从同步,势必会导致Master端的压力过大,所以我们在做监控的时候,应注意slave端与主库的延迟的问题,这里我会用脚本来简单实现的通过检查slave端的状态,来实现自动剔除功能。
3.同时基于高可用的考虑lvs+keepalived应尽量也采用主备的模式,因此此方案,的成本控制也会成为一个问题。
4.如果是基于vip地址的同步,同时设置了lvs的会话保持功能,那Slave会只跟这一台机器同步,如果采用的wrr一类的调度算法,很有可能会使,后端所有的Slave,跟同一台Master同步,那这台主库的压力就可想而知了。
所以在Slave端同步的选择上,必须跟同一台固定的MASTER同步我们也要注意。
5.当mysql主主切换的时候,主从会出现很多问题。
下面我们就开始基于一个原点,开始逐步配置我们的Mysql高可用
架构思路
1.首先在Master1和Master2之间做双向同步
2.配置三个Slave端
3.在Master1和Master2之间做keeplived的高可用
4.开发shell脚本检查slave的状态
5.做两台lvs+keepalived主备的读高可用
具体的实施思路
主机地址规划
主机IP地址
主机用途
VIP地址
Master1
10.0.0.104
主库
10.0.0.253
Master2
10.0.0.102
Apache
10.0.0.120
Web服务器
测试程序:
Discuz_:
下载地址:
[root@APACHEwww]#cat/etc/hosts
#Donotremovethefollowingline,orvariousprograms
#thatrequirenetworkfunctionalitywillfail.
127.0.0.1APACHE
:
1localhost6.localdomain6localhost6
10.0.0.253mysql.master.vip此为VIP地址
#10.0.0.252mysql.slave.vip
[root@APACHEwww]#pingmysql.master.vip
PINGmysql.master.vip(10.0.0.253)56(84)bytesofdata.
64bytesfrommysql.master.vip(10.0.0.253):
icmp_seq=1ttl=64time=0.322ms
2.在Mysql上授权使用用户(这个两端都要设置,因为我们不同步授权表)
mysql>
grantallprivilegesonweb.*to'
web'
@'
10.0.0.%'
identifiedby'
123'
;
复制前的说明:
①两边都要开启binlog功能
②server-id不能一样
③建议两端使用同一个用户进行授权
1)在Master1上的备份sql语句
flushtableswithreadlock;
QueryOK,0rowsaffected(0.01sec)
showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
|mysql-bin.000001|512|||
1rowinset(0.00sec)
unlocktables;
QueryOK,0rowsaffected(0.00sec)
备份sql语句
[root@rsyncbak]#mysqldump-uroot-pbbs-B|gzip>
./bbs_B.sql.gz
授权用户
grantreplicationslaveon*.*to'
slave'
在Master2上从库设置
2)导入sql语句
[root@apache~]#mysql-uroot-p<
bbs_B.sql
CHANGEMASTERTOMASTER_HOST='
10.0.0.104'
MASTER_PORT=3306,MASTER_USER='
master_password='
MASTER_LOG_FILE='
mysql-bin.000001'
MASTER_LOG_POS=512;
这样Master2到Master1的从库就完成了
3)设置Master1到Master2的从库
|mysql-bin.000001|513|||
然后在Master1上重复上面操作
10.0.0.102'
MASTER_LOG_POS=513;
QueryOK,0rowsaffected(0.03sec)
这里注意下,两端的POS点可能不一样。
为了避免多余的复制,我们还忽略授权表,或者只复制这一个库。
(这里即使我上面指定的*.*,后来发现并没有同步授权表)
在Master1上查看
[root@rsync~]#mysql-uroot-p-e"
showslavestatus\G"
|grepYes
Enterpassword:
Slave_IO_Running:
Yes
Slave_SQL_Running:
在Master2上查看
[root@apache~]#mysql-uroot-p-e"
1)配置安装keepalived
[root@rsynckeepalived]#ln-s/usr/src/kernels/2.6.18-194.el5-i686//usr/src/linux/
tarzxfkeepalived-1.1.17.tar.gz
cdkeepalived-1.1.17
./configure
make
makeinstall
2)规范配置,复制文件
[root@rsynckeepalived]#\cp/usr/local/etc/rc.d/init.d/keepalived/etc/init.d/
[root@rsynckeepalived]#\cp/usr/local/sbin/keepalived/usr/sbin/
[root@rsynckeepalived]#mkdir/etc/keepalived/
[root@rsynckeepalived]#\cp/usr/local/etc/sysconfig/keepalived/etc/sysconfig/
[root@rsynckeepalived]#\cp/usr/local/etc/keepalived/keepalived.conf/etc/keepalived/
3)测试启动
[root@rsynckeepalived]#ps-ef|grepkeep
root95241018:
11?
00:
00:
00keepalived-D
root95259524018:
root95269524018:
root97356476018:
20pts/000:
00grepkeep
在另一边执行相同的操作
4)给出两端的配置文件
主keepalived配置
Keepalived.conf
global_defs{
notification_email{
xinpengbj@
}
notification_email_from748152983@
smtp_server192.168.200.1
smtp_connect_timeout30
router_idLVS_xp_2
}
vrrp_instanceVI_1{
stateMASTER
interfaceeth0绑定的网卡
virtual_router_id92
priority100主上面的优先级要高于从的优先级
advert_int1
authentication{
auth_typePASS
auth_pass0229使用的密码
virtual_ipaddress{
10.0.0.253VIP的地址
virtual_server10.0.0.2533306{vip上的监控的端口
delay_loop6
lb_algorr
lb_kindDR
nat_mask255.255.255.0
persistence_timeout50
protocolTCP
real_server10.0.0.1023306{
weight1
notify_down/server/script/kill_keepalived.sh如果mysql宕机了,执行的脚本
TCP_CHECK{
connect_timeout8
nb_get_retry3
delay_before_retry3
connect_port3306
Kill脚本的内容
[root@apache~]#cat/server/script/kill_keepalived.sh
#!
/bin/sh
/etc/init.d/keepalivedstop
real_server两端都只有一台主机
这里也有一个问题,就是网上一些人说的keepalived两端都是备机状态,不抢占vip。
这个后来想了想,看需求,如果的确是需要主宕机恢复后,仍能切回去,就不要让它抢占vip,反之咋根据上面配置即可(可以在优先级较高的一边加入nopreempt)
备keepalived的配置
[root@rsyncdata]#cat/etc/keepalived/keepalived.conf
!
ConfigurationFileforkeepalived
router_idLVS_xp_1
stateBACKUP
interfaceeth0
priority50
nopreempt
auth_pass0229
10.0.0.253
virtual_server10.0.0.2533306{
real_server10.0.0.1043306{
weight1
1)主keepalived状态
[root@apache~]#ipvsadm-L-n--stats
IPVirtualServerversion1.2.1(size=4096)
ProtLocalAddress:
PortConnsInPktsOutPktsInBytesOutBytes
->
RemoteAddress:
Port
TCP10.0.0.253:
330693060319630
10.0.0.102:
330693060319630
2)从keepalived状态
[root@rsyncdata]#ipvsadm-L-n--stats
330600000
10.0.0.104:
330600000
首先我们先测试正常访问下的web
此时我们停掉Master1上的数据库,此时主keepalived上面的数据,
[root@apache~]#ipadd|grep253
inet10.0.0.253/32scopeglobaleth0
[root@apache~]#/etc/init.d/mysqldstop
ShuttingdownMySQL...[OK]
[root@apache~]#
VIP已经没有了
在备keepalived上面检查
[root@rsyncdata]#ipadd|grep253
inet10.0.0.253/32scopeglobaleth0
VIP已经跳转过来
客户端验证
此时我们在网页上发帖子
可以看到两个数据库之间的数据是同步的。
恢复主库测试
此时,我们启动主keepalived上面的数据库,然后启动Keepalived服务
[root@apache~]#/etc/init.d/mysqldstart
StartingMySQL..[OK]
[root@apache~]#/etc/init.d/keepalivedstart
Startingkeepalived:
[OK]
此时在在网站上测试
问题1
这个在keepalivedVIP漂移的时候,两边都出现的问题
No
Last_Errno:
1062
Last_Error:
Error'
Duplicateentry'
1'
forkey'
PRIMARY'
'
onquery.Defaultdatabase:
'
bbs'
.Query:
INSERTINTOpre_common_onlinetimeSET`uid`='
`thismonth`='
10'
`total`='
`lastupdate`='
1352792067'
问题描述
重复insert相同primarykey导致slaveSQLthread终止。
而SlaveI/Othread正常运行。
如果日志中出现了这样代码,可能是错误的select,或update操作,master是跳过这些操作,但是被记录到了二进制日志中,slave会依据二进制中的语句做相同的动作,就会报错,知道原理了要做的操作就很简单了
网上找的办法
编辑f
[mysqld]
slave_skip_errors=1062
问题2
主keepalived重启后,从keepal