keepalived +mysql 构建MYSQL AAB架构

MYSQL AAB架构

近日做了一次MYSQL 主主从架构的实验。功能实现:用三台服务器(master1,master2,slave)搭建主主从服务器。master1和master2主主复制,并且互为主备。当slave服务器在复制过程中,VIP所在的主服务器的MYSQL、网络或者系统等出现故障,导致从服务器slave无法从该服务器复制时,系统自动把从服务器指向的主的IP转移到另外一台服务器上。从而实现了故障转移。本次实验,使用了mysql5.6后的新功能gtid保持主主复制的一致性。

一:实验环境


IP


mysql


keepalived


192.168.1.197


mysql主


master


192.168.1.198


mysql主


backup


192.168.1.199


slave


192.168.1.50


系统


Centos63 64位


MYSQL软件版本


mysql-5.7.4-m14-linux-glibc2.5-x86_64.tar.gz


keepalived软件版本


keepalived-1.2.6.tar.gz

二:系统架构

三:原理

1.Keepalived原理 :

keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件

core check vrrp libipfwc libipvs-2.4 libipvs-2.6

core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等

check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析

vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的

libipfwc:iptables(ipchains)库,配置LVS会用到

libipvs*:配置LVS会用到

注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已

keepalived启动后会有三个进程

父进程:内存管理,子进程管理等等

子进程:VRRP子进程

子进程:healthchecker子进程

有图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态.

2.replication原理

从高层来看,复制分成三步:

(1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

(2)    slave将master的binary log events拷贝到它的中继日志(relay log);

(3)    slave重做中继日志中的事件,将改变反映它自己的数据。

下图描述了这一过程:

该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

四:安装

分别在三台服务器上安装mysql

(一)、安装mysql

1.创建mysql账户和组

groupadd mysql

useradd -r -g mysql mysql

2.在这里我使用的是编译过的安装包,只需要解压就行,不再需要重新编译

tar zxf mysql-5.7.4-m14-linux-glibc2.5-x86_64.tar.gz -C /usr/local/

3.改名

mv   mysql-5.7.4-m14-linux-glibc2.5-x86_64 mysql

4.初始化

./usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql

5.匿名登录修改密码

./usr/local/mysql/bin/mysqld_safe --skip-grant-tables &

mysql

update mysql.user set password=password(‘sa‘) ;

flush privileges;

exit

6.停止mysql 服务

pkill mysql

7.复制MYSQL文件到指定位置

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

cp /usr/local/mysql/support-files/my-default.cnf  /etc/my.cnf

8.配置MYSQL为自启动

chkconfig --add mysqld

chkconfig mysqld on

9.启动MYSQL

service mysqld start

10.为MYSQL添加复制账户

grant replication all on *.* to ‘replicate‘@‘192.168.1.197‘ identified by ‘replicate‘;

flush privileges;

11.重置MYSQL的master和slave

reset master;

stop slave;

reset slave;

12.设置MYSQL的gtid值

set global gtid_purged=‘82ee3730-a135-11e4-8b94-b4b52fbacca8:1-2000‘;

13.修改MYSQL的复制对象

在198上

change master to master_host=‘192.168.1.197‘,master_user=‘replicate‘,master_password=‘replicate‘,master_auto_position= 1;

在197上

change master to master_host=‘192.168.1.198‘,master_user=‘replicate‘,master_password=‘replicate‘,master_auto_position= 1;

在199上

change master to master_host=‘192.168.1.50‘,master_user=‘replicate‘,master_password=‘replicate‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=191;

14.启动slave

start slave;

15.my.cnf 的配置

197:/etc/my.cnf

[mysqld]

server-id = 197

log_bin = /data/mysql/log_bin/mysql-bin.log

datadir = /data/mysql/data

basedir = /usr/local/mysql

replicate_do_db = test

replicate_ignore_db = mysql,information_schema,performance_schema

max_connections = 2000

expire_logs_days        = 100

max_binlog_size         = 1024M

binlog_format           =row

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

binlog-rows-query-log_events=1

sync_binlog=1

tmp_table_size = 256M

max_heap_table_size = 256M

key_buffer_size = 256M

query_cache_type=1

query-cache-size = 256M

read_rnd_buffer_size = 20M

read_buffer_size=20M

character-set-server = utf8

[client]

default-character-set = utf8

198:/etc/my.cnf

[mysqld]

server-id  = 198

#启用二进制日志,这是保证复制功能的基本前提

log_bin   = /data/mysql/log_bin/mysql-bin.log

datadir =       /data/mysql/data

basedir = /usr/local/mysql

max_connections = 2000

replicate_do_db = test

replicate_ignore_db = mysql,information_schema,performance_schema

expire_logs_days        = 100

max_binlog_size         = 1024M

binlog_format           = row   #二进制日志的格式

#用于启动GTID及满足附属的其它需求

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

#可用于实现在崩溃时保证二进制及从服务器安全的功能

master-info-repository=TABLE

relay-log-info-repository=TABLE

#启用可确保无信息丢失

sync-master-info=1

slave-parallel-workers=2  #设定从服务器的SQL线程数;0表示关闭多线程复制功能

#启用复制有关的所有校验功能

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

#启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度

binlog-rows-query-log_events=1

sync_binlog=1

tmp_table_size = 256M

max_heap_table_size = 256M

key_buffer_size = 256M

query_cache_type=1

query-cache-size = 256M

read_rnd_buffer_size = 20M

read_buffer_size=20M

character-set-server = utf8

[client]

default-character-set=utf8

199:/etc/my.cnf

[mysqld]

server-id = 199

#启用二进制日志,这是保证复制功能的基本前提

log_bin = /data/mysql/log_bin/mysql-bin.log

datadir = /data/mysql/data

max_connections = 2000

#replicate-do-db=super

#replicate-do-db=dianxin

binlog_ignore_db = mysql

binlog_ignore_db = information_schema

binlog_ignore_db = performance_schema

replicate_do_db = test

replicate_ignore_db = mysql

replicate_ignore_db = information_schema

replicate_ignore_db = performance_schema

expire_logs_days        = 100

max_binlog_size         = 1024M

#二进制日志的格式

binlog_format           = row

#用于启动GTID及满足附属的其它需求

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

#可用于实现在崩溃时保证二进制及从服务器安全的功能

master-info-repository=TABLE

relay-log-info-repository=TABLE

#启用可确保无信息丢失

sync-master-info=1

#设定从服务器的SQL线程数;0表示关闭多线程复制功能

slave-parallel-workers=2

#启用复制有关的所有校验功能

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

#启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度

binlog-rows-query-log_events=1

sync_binlog=1

tmp_table_size = 256M

key_buffer_size = 256M

query_cache_type=1

query-cache-size = 256M

read_rnd_buffer_size = 20M

read_buffer_size=20M

character-set-server = utf8

[client]

default-character-set = utf8

(二)、安装keepalived

     

         1.  软件安装

# tar zxf keepalived-1.2.6.tar.gz

#cd keepalived-1.2.6

#./configure --prefix=/usr/local/keepalived

#cp keepalived/etc/init.d/keepalived.sysconfig   /etc/sysconfig/keepalived

#cp keepalived/etc/init.d/keepalived.rh.init  /etc/init.d/keepalived

#chmod  +x   /etc/init.d/keepalived

#ln /usr/local/keepalived/sbin/keepalived  /sbin/keepalived

#chkconfig --add keepalived

#cp -a keepalived/etc/keepalived/   /etc/

#service keepalived start

#service keepalived stop

2.配置文件

master:不使用脚本,直接使用端口检测MYSQL是否在运行

[[email protected] ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

[email protected]

[email protected]

[email protected]

}

notification_email_from [email protected]

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

vrrp_script check_run {

script "</dev/tcp/127.0.0.1/3306"

interval 1

weight 2

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 52

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

check_run

}

virtual_ipaddress {

192.168.1.50/24

}

}

backup

! Configuration File for keepalived

global_defs {

notification_email {

[email protected]

[email protected]

[email protected]

}

notification_email_from [email protected]

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

vrrp_script check_run {

script "</dev/tcp/127.0.0.1/3306"

interval 1

weight 2

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 52

priority 99

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

check_run

}

virtual_ipaddress {

192.168.1.50/24

}

}

五:测试

     

1.停止197的MYSQL服务,发现vip漂移至198,199的replication运行正常

2.启动197的MYSQL服务,发现VIP飘移会197,199的replication运行正常

时间: 2024-10-27 05:10:10

keepalived +mysql 构建MYSQL AAB架构的相关文章

构建MySQL+DRBD+Keepalived高性能架构

前言* DRBD(DistributedReplicatedBlockDevice)是一个基于块设备级别在远程服务器直接同步和镜像数据的开源软件,类似于RAID1数据镜像,通常配合keepalived.heartbeat等HA软件来实现高可用性.这里简单记录仅供参考. 一.实施环境 系统版本:CentOS 5.8 DRBD版本: drbd-8.3.15 Keepalived:keepalived-1.1.15 Master:192.168.149.128 Backup:192.168.149.1

LVS+Keepalived+Squid+Nginx+MySQL主从 高性能集群架构配置

原文地址:LVS+Keepalived+Squid+Nginx+MySQL主从 高性能集群架构配置 作者:gron 原文链接:http://www.linuxidc.com/Linux/2012-07/65547.htm 架构图 先进行优化 vi /etc/sysctl.conf   # 编辑sysctl.conf文件添加以下内容 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 65536 4194304 net.c

LVS+Keepalived+Squid+Nginx+MySQL主从高性能集群架构部署方案

方案一,在tomcat的workers.properties里面配置相关条件 worker.tomcat.lbfactor=50 worker.tomcat.cachesize=10 worker.tomcat.cache_timeout=600 worker.tomcat.socket_keepalive=1 worker.tomcat.socket_timeout=300 Linux内核优化: vi /etc/sysctl.conf   # 编辑sysctl.conf文件添加以下内容net.

keepalived + haproxy + mysql 构建高可用数据库

keepalived + haproxy + mysql 构建高可用1.keepalived 的高可用是主备,有一台作为备用2.keepalived + haproxy 搭建的高可用是可以两台都会调度的高可用 拓扑图:keepalived:负责抢占虚拟ip,使用vrrp协议haproxy:负责做访问调度,减轻单点压力,单独监听一个端口,这里用23306 1.安装mysql分别在两台机器上面搭建mysql,并做主从配置,这里不做介绍2.搭建haproxy1.download 源码包,下载地址:ht

Centos7+Mariadb+Keepalived实现Mariadb(MYSQL)的高可用(HA)

我们前面几篇文章中有介绍了Keepalived的功能--HA,关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储,但是它们各有优缺点.heartbeat.drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题:对于mmm,生产环境中很少有人用,且mmm 管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支:对于共享存储,个人觉得MySQL数据还是放在本

Linux服务篇之四:构建MySQL服务器

Linux服务篇之四:构建MySQL服务器  MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司, 目前属于Oracle公司,MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库. 对应目前主流的LAMP架构来说,Mysql更是得到各位IT运维.DBA的青睐,目前mysql已被orcacle收购,不过好消息是原来mysql创始

Linux下构建MySQL集群

构建MySQL集群 一.目标 1.安装MySQL-Cluster相关软件包. 2.依次配置管理/数据/SQL节点. 3.启动并测试MySQL-Cluster集群架构. 二.方案 使用6台RHEL 6.5虚拟机,如图所示.其中sql1和sql2作为SQL节点,ndb1和ndb2作为数据节点,mgmsvr作为管理节点,这5个节点构成MySQL Cluster体系:而另一台虚拟机192.168.4.1作为测试客户机. 构成MySQL集群体系的5个节点应安装Cluster版的MySQL相关软件包:测试用

构建MySQL服务器

MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司, 目前属于Oracle公司,MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库. 对应目前主流的LAMP架构来说,Mysql更是得到各位IT运维.DBA的青睐,目前mysql已被orcacle收购,不过好消息是原来mysql创始人已独立出来自己重新开发了一个MariaDB,

构建Mysql三部曲之三 主从案例

一.Mysql配置文件解读 (以mysql-server-5.1.73-3.el6_5.x86_64版本为例) Mysql配置文件一般位于/etc/my.cnf,默认配置如下[[email protected] /]# cat /etc/my.cnf [mysqld]datadir=/var/lib/mysql  ##从给定目录读取数据库文件socket=/var/lib/mysql/mysql.sock ##为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Lin