MySQL复制

能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障。但是MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换。

这篇文章下面要介绍如何通过LVS+Keepalived的方式来是实现MySQL的高可用性,同时解决以上问题。

Keepalived和LVS介绍

Keepalived

是一个基于VRRP(虚拟路由冗余协议)可用来实现服务高可用性的软件方案,避免出现单点故障。Keepalived一般用来实现轻量级高可用性,且不需要共享存储,一般用于两个节点之间,常见有LVS+Keepalived、Nginx+Keepalived组合。

LVS

(Linux Virtual Server)是一个高可用性虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS主要用于多服务器的负载均衡,作用于网络层。LVS构建的服务器集群系统中,前端的负载均衡层被称为Director Server;后端提供服务的服务器组层被称为Real Server。通过下图可以大致了解LVS的基础架构。

LVS有三种工作模式,分别是DR(Direct Routing 直接路由)、TUN(Tunneling IP隧道)、NAT(Network Address Translation 网络地址转换)。其中TUN模式能够支持更多的Real Server,但需要所有服务器支持IP隧道协议;DR也可以支持相当的Real Server,但需要保证Director Server虚拟网卡与物理网卡在同一网段;NAT扩展性有限,无法支持更多的Real Server,因为所有的请求包和应答包都需要Director Server进行解析再生,影响效率。 同时,LVS负载均衡有10中调度算法,分别是rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq(详细介绍本文不在说明)

本文中将利用LVS实现MySQL的读写负载均衡,Keepalived避免节点出现单点故障。​​​

LVS+Keepalived配置

环境准备

LVS1:172.30.8.192

​LVS2:172.30.8.193

MySQL Server1:172.30.8.190

MySQL Server2:172.30.8.191

VIP:172.30.8.200

OS: CentOS 6.5

Mysql安装及双主配置

MySQL:5.1.73

本文为了方便直接采用的yum安装方式安装将不在介绍

全局配置(即MAster,Slave都需配置)

1)修改配置文件

#vim /etc/my.cnf
添加
log-bin=mysql-bin
server-id=

修改完需要重启数据库

注:server-id是唯一id一般都采用ip末尾

2)分配复制权限,主库和从库均需要执行

mysql> grant replication client,replication slave on *.* to root@'172.30.8.%' identified by 'root';
Query OK, rows affected (0.00 sec)

2)清空日志文件,主从库都是默认开启二进制日志文件

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
| mysql-bin. | |
+------------------+-----------+
rows in set (0.00 sec) mysql> reset master;
Query OK, rows affected (0.01 sec) mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin. | |
+------------------+-----------+
row in set (0.00 sec)

需要注意的是,如果不想清空日志文件的话,需要记录当前master的log_file和log_pos,并在下面启用复制操作时指定这两个参数或者在slave的配置文件指定。

Slave配置

1)启用复制
让slave连接master并开始重做master二进制日志中的事件

mysql> change master to  master_host='172.30.8.190',master_user='root',master_password='',master_port=,master_log_file='mysql-bin.000001',master_log_pos=;

master_log_pos如果是日志的开始位置值可以为0;master_log_file是初始日志文件。如果master日志没有被清空,这里就是当前master的日志信息

要注意的是,默认情况下,会同步该用户下所有的DB,如果想限定哪些DB,有3种思路

  1. 在master上的/etc/my.inf中通过参数binlog-do-db、binlog-ignore-db设置需要同步的数据库。
  2. 在执行grant分配权限操作的时候,限定数据库
  3. 在slave上限定数据库使用replicate-do-db=dbname

2)开启slave

mysql> start slave;
Query OK, rows affected (0.00 sec)

3)确认Slave是否和Mater成功通信。如果 Slave_IO_Running和Slave_SQL_Running都是yes,则证明配置成功

mysql> show slave status\G;
*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.30.8.190
Master_User: root
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin.
Read_Master_Log_Pos:
Relay_Log_File: mysqld-relay-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
row in set (0.00 sec) ERROR:
No query specified

至此mysql主从配置完毕,如果双主则操作相反即可。

附加:

1)mysql修改密码

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> update user set password=password("") where user="root";
Query OK, rows affected (0.00 sec)
Rows matched: Changed: Warnings: mysql> flush privileges;
Query OK, rows affected (0.00 sec)

2)授权远程连接

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;

同步测试

1)Master创建数据库

mysql> create database jingzi;
Query OK, row affected (0.00 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jingzi |
| mysql |
| test |
+--------------------+
rows in set (0.00 sec)

2)slave查看

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jingzi |
| mysql |
| test |
+--------------------+
rows in set (0.00 sec)

通过以上验证,可以看到主服务器上的修改能够正常同步到从服务器。

Keepalived安装及LVS安装(以下操作在lvs服务器主+从上操作)

Keepalived安装

keepalived下载地址

需要安装以下软件包​

#yum install -y kernel-devel openssl openssl-devel gcc* (如果后边编译报错缺少什么包安装什么包就ok了)

安装

#wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz

#tar -zxvf keepalived-1.2..tar.gz​

​#cd keepalived-1.2.

#./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.-431.5..el6.x86_64/

默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件,将需要的配置文件拷贝到指定位置​

# mkdir /etc/keepalived

#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/​

#cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/​

#cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/

​#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

​#chkconfig keepalived on

LVS安装

ipvsadm下载地址

需要安装以下软件包​

#yum install -y libnl* popt*​ kernel-headers   popt-static

查看是否加载lvs模块​

#modprobe -l |grep ipvs​

解压安装​

#ln -s /usr/src/kernels/2.6.-431.5..el6.x86_64/ /usr/src/linux

​#tar -zxvf ipvsadm-1.26.tar.gz

​#make && make install​

LVS安装完成,查看当前LVS集群

#ipvsadm -ln​

至此keppalived+lvs安装完成接下来我们进行配置

​LVS+Keepalived配置(以下操作是在lvs-1上执行lvs-2类似)

配置Keepalived​

修改keepalived配置文件并添加以下代码

[root@lvs- ~]# vim /etc/keepalived/keepalived.conf 

global_defs {
router_id LVS_1 # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备
interface eth0 #虚拟ip所在网
virtual_router_id #虚拟路由编号,主备要一致
priority #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
172.30.8.200 #定义虚拟IP(VIP)为172.30.8.,可多设,每行一个
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 172.30.8.200 {
delay_loop # 设置健康检查时间,单位是秒
lb_algo wlc # 设置负载调度的算法为wlc 基于权重的调度算法
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 50 会话保持时间 (为了实验效果可以注释掉该选项)
protocol TCP
real_server 172.30.8.190 { # 指定real server1的IP地址
weight # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout
nb_get_retry
delay_before_retry
connect_port
}
}
real_server 172.30.8.191 { # 指定real server2的IP地址
weight # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout
nb_get_retry
delay_before_retry
connect_port
}
}
}
 

注意lvs-2操作类似只需修改以下选项即可

.state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备
改为 state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备
.priority #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
改为
priority #定义优先级,数字越大,优先级越高,主DR必须大于备用DR

 配置LVS(此脚本需要添加到lvs-1,Mysql-master,Mysql-slave)

编写LVS启动脚本/etc/init.d/realserver

[root@lvs- ~]# vim /etc/init.d/realserver 

SNS_VIP=172.30.8.200
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo: $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:
echo "" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null >&
echo "RealServer Start OK"
;;
stop)
ifconfig lo: down
route del $SNS_VIP >/dev/null >&
echo "" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit
esac
exit

将lvs脚本加入开机自启动 

#chmod +x /etc/init.d/realserver
#echo "/etc/init.d/realserver" >> /etc/rc.d/rc.local

分别启动LVS和keepalived

# service realserver start
# service keepalived start

注意此时网卡的变化,可以看到虚拟网卡已经分配到了realserver上。

此时查看LVS集群状态,可以看到集群下有两个Real Server,调度算法,权重等信息。ActiveConn代表当前Real Server的活跃连接数

[root@lvs- ~]# ipvsadm -ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.30.8.200: wlc
-> 172.30.8.190: Route
-> 172.30.8.191: Route

测试验证

关闭MySQL Server2

[root@mysql- ~]# service mysqld stop
Stopping mysqld: [ OK ]

在LVS1查看/var/log/messages中关于keepalived日志,LVS1检测到了MySQL Server2宕机,同时LVS集群自动剔除了故障节点

May  :: localhost Keepalived_healthcheckers[]: TCP connection to [172.30.8.191]: failed !!!
May :: localhost Keepalived_healthcheckers[]: Removing service [172.30.8.191]: from VS [172.30.8.200]:

从新启动MySQL Server2后自动将故障节点自动加入LVS集群

May  :: localhost Keepalived_healthcheckers[]: TCP connection to [172.30.8.191]: success.
May :: localhost Keepalived_healthcheckers[]: Adding service [172.30.8.191]: to VS [172.30.8.200]:

关闭LVS1上的Keepalived(模拟宕机操作),查看LVS1上的日志,可以看到Keepalived移出了LVS1上的VIP

May  :: localhost Keepalived[]: Stopping Keepalived v1.2.13 (/,)
May :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) sending priority
May :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) removing protocol VIPs.
May :: localhost Keepalived_healthcheckers[]: Netlink reflector reports IP 172.30.8.200 removed
May :: localhost Keepalived_healthcheckers[]: Removing service [172.30.8.190]: from VS [172.30.8.200]:
May :: localhost Keepalived_healthcheckers[]: Removing service [172.30.8.191]: from VS [172.30.8.200]:

同时查看LVS2上日志,可以看到LVS2成为了Master,并接管了VIP

May  :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Transition to MASTER STATE
May :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Entering MASTER STATE
May :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) setting protocol VIPs.
May :: localhost Keepalived_healthcheckers[]: Netlink reflector reports IP 172.30.8.200 added
May :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 172.30.8.200
May :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 172.30.8.200

在LVS2上查看LVS集群状态,一切正常

[root@lvs- ~]# ipvsadm -ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.30.8.200: wlc
-> 172.30.8.190: Route
-> 172.30.8.191: Route

总结

  • MySQL主主复制是集群的基础,组成Server Array,其中每个节点作为Real Server。
  • LVS服务器提供了负载均衡的作用,将用户请求分发到Real Server,一台Real Server故障并不会影响整个集群的。
  • Keepalived搭建主备LVS服务器,避免了LVS服务器的单点故障,出现故障时可以自动切换到正常的节点。

Mysql双主 keepalived+lvs实现mysql高可用性的更多相关文章

  1. mysql双主+keepalived【转】

    简单原理 1.在两台服务器上分别部署双主keepalived,主keepalived会在当前服务器配置虚拟IP用于mysql对外提供服务 2.在两台服务器上分别部署主主mysql,用于故障切换 3.当 ...

  2. mysql双主+keepalived

    环境 OS: centos7Mysql 版本: mysql 5.7Keepalived: keepalived-1.2.20Mysql-vip:192.168.41.100Mysql-master1: ...

  3. MySQL 双主+keepalived 详细文档 M-M+keepalived

    1. 操作系统,系统环境,目结结构,用户,权限,日志路径,脚本2. 配置规范化 1.1 操作系统准备 操作系统 Kylin Linux release 3.3.1707 (Core)数据库版本 mys ...

  4. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  5. centos7下mysql双主+keepalived

    一.keepalived简介 keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipvs规则,并能够对各RS的健康状态进行检测 ...

  6. MySQL双主+keepalived实现高可用实现(热备)

    环境:centos6.7 最小化安装 192.168.100.152 master 主192.168.100.153 slave 从192.168.100.132 v_ip 浮动IP 配置ssh密码登 ...

  7. MySQL双主+Keepalived高可用

    原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 基础环境 二 实际部署 2.1 安装MySQL 2.2 初始化MySQL 2. ...

  8. mysql双主+keepalived架构

    架构展示 操作系统 centos6.5 数据库 mysql5.7 master1 10.0.254.148 master2 10.0.254.147 VIP 10.0.254.88 (keepaliv ...

  9. 004.MySQL双主+Keepalived高可用

    一 基础环境 主机名 系统版本 MySQL版本 主机IP Master01 CentOS 6.8 MySQL 5.6 172.24.8.10 Master02 CentOS 6.8 MySQL 5.6 ...

随机推荐

  1. C# 函数 递归

    函数:独立完成某项功能的一个个体,有固定功能函数有 高度抽象函数. 作用: 提高代码的重用性 提高功能开发的效率 提高程序代码的可维护性 函数四要素:   输入       输出       函数名  ...

  2. c# 对文件的各种操作

    C# 获取文件名及扩展名 string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastI ...

  3. Java基础——Servlet(二)

    好久没有写博客了,最近有在学习.可能是遇到瓶颈了,学到Servlet这里觉得有些吃力.前几天已经学完一遍了,但是学完之后觉得还是很迷茫.去知乎和百度上搜索,遇到的都是一些概念之类的讲解.核心的介绍说, ...

  4. 撩课-Web大前端每天5道面试题-Day29

    1.https协议的优点? 使用HTTPS协议可认证用户和服务器, 确保数据发送到正确的客户机和服务器: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输. 身份认证的网络协议,要比http ...

  5. 十分钟搞定mac下的phpstorm增加xdebug调试

    一.版本信息 mac 10.10.5 php  5.5.38 phpstorm 10.0.3 xdebug   版本需要与php匹配,匹配地址 :点我匹配  点我查看所有版本 提示:不确定xdebug ...

  6. Java 初级面试题及答案

    1.Java中的重载与重写有什么区别 重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重 ...

  7. Singleton(单例)模式和Double-Checked Locking(双重检查锁定)模式

    问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进 ...

  8. Docker:集装箱式“运输”在软件上的实现

    Docker是由PaaS提供商dotCloud在2013年年初创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量.可移植.自包涵的容器引擎.开发者构建的应用可以一次构建全平台运行,包括本 ...

  9. python学习之老男孩python全栈第九期_day011作业

    1. 编写函数.(函数执行的时间是随机的) import timeimport randomdef random_time(): ''' 执行时间随机的函数 :return: ''' time.sle ...

  10. MySQL中使用连接查询

    连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接): 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)! 连接查询的意义: 在用户查看数据的时候 ...