mysql主从复制与lvs+keepalived实现负载高可用

文件夹

1、前言    4

2、原理    4

2.1、概要介绍    4

2.2、工作原理    4

2.3、实际作用    4

3方案    4

3.1、环境    4

3.2、架构图    5

3.3、设计原理    6

4、相关软件安装    6

4、配置mysql的主从    7

5、通过lvs+keepalived实现负载与热备,并实现读写分离    8

1、前言

近期研究了下高可用的东西,这里总结一下mysql主从复制读写分离度的高可用方案,能够提高server的使用效率,也能够提高提高维护效率。同一时候应用的效率也会有一定的提升,假设改造须要应用改动读取的ip地址与写入的ip地址,改造起来还算easy。

2、原理

2.1、概要介绍

假设将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检測webserver的状 态,假设某台webserver故障,Keepalived将检測到并将其从系统中剔除,当该webserver工作正常后Keepalived自己主动将其增加到server 群中,这些工作所有自己主动完毕,而不须要人工干预,仅仅须要人工修复故障的webserver就可以。

2.2、工作原理

Keepalived基于VRRP协议来实现高可用解决方式,利用其避免单点故障,通常这个解决方式中,至少有2台server执行Keepalived,即一 台为MASTER,还有一台为BACKUP,但对外表现为一个虚拟IP,MASTER会发送特定消息给BACKUP,当BACKUP收不到该消息时,则觉得 MASTER故障了,BACKUP会接管虚拟IP,继续提供服务,从而保证了高可用性,3层机理是发送ICMP数据包即PING给某台server,假设不痛,则觉得其故障,并从server群中剔除。4层机理是检測TCPport号状态来推断某台server是否故障,假设故障,则从server群中剔除。5层机理是依据用户的设定检查某个server应用程序是否正常执行,假设不正常,则从server群中剔除。3、

2.3、实际作用

Keepalived+lvs主要用作RealServer的健康检查,以及负载均衡设备MASTER和BACKUP之间failover的实现。

3方案

本案例先使用两台linux做双机MASTER-SLAVE高可用,实现都写分离,用于提高查询性能),採用MYSQL5.6.x的半同步实现数据复制和同步,使用keepalived来监控MYSQL和提供读写VIP浮动。Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现

不论什么一台主机宕机都不会影响对外提供服务(读写vip能够浮动),保持服务的高可用。

3.1、环境

主机A:192.168.150.171

主机B:192.168.150.172

W-VIP:192.168.150.173  (负责写入)

R-VIP:192.168.150.174   (负责读取)

Client:随意,仅仅要能訪问以上三个IP就可以

3.2、架构图

详细架构图例如以下:

3.3、设计原理(异常情况)

1、    serverA和B,通过mysql的slave进程是用binlog同步数据。

2、    通过keepalived启用两个虚IP:W-VIP/R-VIP,一个负责写入,一个负责读取,实现读写分离。

3、    A和B都存在时,W-VIP下将请求转发至主机A,R-VIP将请求转发给A和B,实现负载均衡。

4、    当主机A异常时,B接管服务,W-VIP/R-VIP此时漂到了主机B上,此时这两个虚IP下都是主机B,实现高可用

5、    当主机B异常时,R-VIP会将B踢出,其它不变

详细实现后的效果

正常状态

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的状态

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

架构图

4、相关软件安装

1、    mysql  能够依据须要进行安装,此处省略

2、    lvs+keepalived的安装

关联lvs与keepalived的ipvs所需的内核信息

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,否则无法关联ipvs功能

4、配置mysql的主从

Master(210.171)的配置

vi /etc/my.cnf

加入例如以下内容:

server-id = 1    ##master ID

binlog-do-db = ppl  ##同意同步的库

binlog-ignore-db = mysql  ##忽略同步的库,也就是不能同步的库

##配置文件里还需开启log-bin,比如log-bin = mysql-bin

mysql –uroot –p

下面内容在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的内容,等下slave的配置中要用到

Slave的配置

vi /etc/my.cnf

加入例如以下内容:

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   ##当同步异常时,那些错误跳过,本例为1062错误

#log-slave-updates  ##同步的同一时候,也记录自己的binlog日志,假设还有台slave是通过这台机器进行同步,那须要添加此项,

#skip-slave-start  ##启动时不自己主动开启slave进程

#read-only  ##将库设为仅仅读模式,仅仅能从master同步,不能直接写入(避免自增键值冲突)

mysql –uroot –p

下面内容在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

在返回值中查看,假设slave_IO_Runing与slave_SQL_Runing的值都为Yes说明同步成功

5、通过lvs+keepalived实现负载与热备,并实现读写分离

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

将这两个參数前边的 # 去掉,重新启动mysql

#skip-slave-start

#read-only

登陆mysql,手动将slave进程启动

mysql>slave start;

先启动master上的keepalived,正常后再启动slave上的。

启动后 主库能够查看ip a

[root@rac3 ~]# ip a

1: lo: 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: 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: mtu 1480 qdisc noop

link/sit 0.0.0.0 brd 0.0.0.0

slave上查看

[root@rac1 keepalive]# ip a

1: lo: 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: 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: 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: mtu 1480 qdisc noop

link/sit 0.0.0.0 brd 0.0.0.0

发现210.174 读的vip 在主备机上都能够看到

210.173 写入vip在主上才干看到

兴许多台实验进行中,敬请等待

lvs加MySQL读写分离_mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)相关推荐

  1. mysql lvs 读写分离_mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

    mysql主从复制与lvs+keepalived实现负载高可用 目录 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方案 ...

  2. mysql keepalived双主双活_mysql高可用架构方案之中的一个(keepalived+主主双活)

    Mysql双主双活+keepalived实现高可用 文件夹 1.前言... 4 2.方案... 4 2.1.环境及软件... 4 2.2.IP规划... 4 2.3.架构图... 4 3.安装设置MY ...

  3. MySQL 5.6通过MMM实现读写分离的高可用架构

    上一篇博文我们使用keepalived+主从同步搭建了一个简单的MySQL高可用架构(详见https://blog.51cto.com/jiangjianlong/1981994),今天再分享下通过M ...

  4. 《MySQL性能优化和高可用架构实践》阅读总结

    文章目录 介绍 第1章 MySQL架构介绍 1.1 MySQL简介 1.2 MySQL主流的分支版本 1.3 MySQL存储引擎 1.4 MySQL逻辑架构 1.5 MySQL物理文件体系结构 第2章 ...

  5. mysql复制架构迁移到pxc_mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程 特点: 1.没有改变就无所谓复制 ;改变是复制的根本与数据源 2.所有的改变:是指可以复制全部改变,也可以复制部分改变 ...

  6. Heartbeat+DRBD+MySQL高可用架构方案与实施过程细节 【转】

    文章出处:Heartbeat+DRBD+MySQL高可用架构方案与实施过程细节 [转]             mysql数据库高可用高扩展性架构方案实施[原] Heartbeat+DRBD+MySQ ...

  7. 《MySQL性能优化和高可用架构实践》简介与推荐序

    #好书推荐##好书奇遇季#<MySQL性能优化和高可用架构实践>,京东当当天猫都有发售.腾讯云架构师宋立桓倾情奉献,定价59元,网店打折销售其实没多少钱. 互联网公司里面几乎很少有公司不用 ...

  8. redis主从复制,复制功能是高可用Redis的基础,为满足故障恢复和负载均衡等需求把Redis数据复制多个副本部署到其他机器;如何实现redis的主从复制模式以及主从复制模式下常见的运维问题;

    目录 一.如何使用redis主从复制模式 1.建立复制 2.断开复制 3.安全性 4.只读模式 5.传输延迟 二.Redis的复制拓扑结构 1.一主一从结构 2.一主多从结构 3.树状主从结构 三.主 ...

  9. mysql有没有实现高可用_MySQL高可用架构:mysql+keepalived实现

    系统环境及架构 #主机名 系统版本 mysql版本 ip地址 mysqlMaster centos7.4 mysql5.7 192.168.1.42 mysqlSlave centos7.4 mysq ...

最新文章

  1. [cocos2d-x]cocos2d和cocos2d-x的一些通用性
  2. 怎么修照片多余的部分_10 个摄影小技巧,让你的照片拿到超多赞!
  3. 「完结」你对深度学习模型的理解是否足够深刻,这12篇文章了解下
  4. Android Service的绑定 基础概念篇
  5. 网站做好后不能用手机浏览吗_企业几年前制作的网站大部分都应该被淘汰掉
  6. 【PC工具】常用USB转串口芯片CH340G,更新驱动安装有可能遇到的问题及解决办法...
  7. aws lambda_如何为AWS Lambda实施日志聚合
  8. java 类 加载 初始化_java类的加载与初始化
  9. BIND DNS 软件修复高危 DoS 漏洞
  10. 推荐系统实例-基于矩阵分解
  11. JavaScript-68:数组的使用
  12. APP推广渠道ROI预测
  13. 计算机一级怎么截图保存到桌面,电脑怎么截图?截屏?(四种方法),划重点了...
  14. 抖音创作规范_抖音创作内容调整提示怎么办
  15. DataSource和SessionFactory的区别
  16. Zygote启动及其作用
  17. ssm私人牙科诊所病例管理系统的设计与实现毕业设计源码071128
  18. 约瑟夫环问题(用数学方法推出计算公式)
  19. CSIG图像图形技术挑战赛重磅来袭!人体目标检测分赛道正式开放注册!
  20. java代码在页面实现展示pdf文件

热门文章

  1. 全网最牛Linux内核Makefile系统文件详解(纯文字代码)
  2. 李岳恒:Libra是中小经济体的金融大杀器
  3. Word控件Spire.Doc 【Table】教程(1):在 Word 中创建表格-C#VB.NET
  4. 担心手机电池寿命,专家给出正确充电方式
  5. 朋友圈人设文案价值百万,打造你的微信变现玩法
  6. java endorsed
  7. 压力传感器的信号采集处理
  8. 网页html源码注入,注入html源码到浏览器的几种方式
  9. 【Python自查手册】之带参数请求params的用法
  10. html css画小猪佩琪,【前端切图】用css画一个卡通形象-小猪佩奇