目标:配置一个keepalived双机热备架构,并配置主从复制





规划:

master1     zlm177     192.168.17.177

master2     zlm188     192.168.17.188

vip                             192.168.17.166





环境: Red Hat Enterprise Linux 6.4

            Percona Server 5.6.15

一、软件安装

能够去官网http://www.keepalived.org/software/下载最新版本号的keepalived。眼下最新的是1.2.13版,例如以下:

keepalived-1.2.13.tar





cp keepalived-1.2.13.tar /usr/local/src

cd /usr/local/src

tar zxvf keepalived-1.2.13.tar -C /opt/

cd /opt/keepalived-1.2.13

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

make;makeinstall 或 make && makeinstall





注意,在编译过程中会提示缺少gcc和openssl包,用yum install装一下就能够了

RHEL6.4也能够配置CentOS的yum,详细方法这里就不讲了

yum install gcc

yum install openssl openssl-devel

还会提示xxx依赖包也须要安装,一并装上,用yum的优点就是安装方便。让系统自己主动推断须要哪些包,自己主动下载并安装。完毕编译以后,软件安装就结束了

二、配置软件參数(VRRP)

装完软件后,默认会配置文件的路径为:

/usr/local/keepalived/etc/keepalived/keepalived.conf





在主端打开该配置文件。把原有内容清空。再加入下面内容:





! Configuration File for keepalived





global_defs { --全局配置

   notification_email {

     aaron8219@xxx.xxx --接收通知的邮箱

   }

   router_id aaron8219 --能够用字母。也能够使数字。能够一致。也能够不一致,仅仅是一个标识

}





vrrp_instance my_177 {

    state BACKUP --BACKUP从端模式

    interface eth0

    virtual_router_id 88 --默觉得51。取值范围在1~255的整数,主从两端必须一致。才表示是同一个组

    priority 90

    advert_int 1 --检查间隔,默认1s

    nopreempt --设置非抢占模式,

    authentication {

        auth_type PASS

        auth_pass 1234

    }

    virtual_ipaddress { --指定vip,

        192.168.17.166

    }

}





##关于vip的说明:vip随着state的变化而添加删除,当state为master的时候就加入。当state为backup的时候删除。主要是由优先级来决定的,和state设置的值没有多大关系(state同样的情况下),至于vip究竟在主端还是从端,还和nopreempt有关,这里vip能够设置多个IP地址





##关于nopreempt的说明:仅仅能设置在state为backup的节点上。且这个节点的优先级必须比另外的高





virtual_server 192.168.17.166 3306 { --虚拟服务器ip和port

    delay_loop 2

    lb_algo wrr --带有权重的轮询

    lb_kind DR

    persistence_timeout 60

    protocol TCP





    real_server 192.168.17.177 3306 { --真实服务器ip和port

        weight 3 --权重为3

        notify_down /opt/mysql/mysql.sh  --指定自杀脚本的路径

        TCP_CHECK {

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

        }

    }

}





从端的配置文件大同小异,仅仅要把IP和实例名改成自己的就能够了,而且设置从端的priority为90,而主端为100

有一点要注意的是,主从两端的state,都配置成了backup,由于使用了nopreempt,即非抢占模式





举个样例,当主端先启动mysql实例和keepalived后,假设此时从端也启动了mysql实例和keepalived。那么vip不会跳到从端上去。即使它的优先级为100。要大于主端的90

而假设不设置nopreempt。那么这个时候。又分2种情况:





1.state同样,即都是master或都是backup

优先级高的,会占有vip。和角色无关





2.state不同。即master->backup或backup->master

优先级高的。会占有vip,和角色无关





前提不同。结果都是一样的,即优先级是主导,谁的优先级高。vip就漂到谁那里





创建一个自杀脚本来推断mysql进程是否启动

touch /opt/mysql/mysql.sh

加入下面内容:

#!/bin.sh

pkill keepalived  --表示kill掉keepalived进程

三、执行測试

/usr/local/keepalived/sbin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf -D





-f 指定keepalived的參数文件

-D 表示在操作系统日志里显示具体记录





推断keepalived进程是否正常启动,仅仅要查看/var/log/messages里的日志就能够了

tail -30f /var/log/message

注意。假设没有启动mysql而先启动了keepalived。那么之前notify_down參数中指定的脚本就会被运行,表示没有找到mysql进程,把keeplied自己的进程给kill掉。





Jul 25 02:51:22 zlm188 Keepalived[3440]: Starting Keepalived v1.2.13 (07/22,2014)

Jul 25 02:51:22 zlm188 Keepalived[3441]: Starting Healthcheck child process, pid=3442

Jul 25 02:51:22 zlm188 Keepalived[3441]: Starting VRRP child process, pid=3443

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Netlink reflector reports IP 192.168.17.188 added

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Netlink reflector reports IP 192.168.17.188 added

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Netlink reflector reports IP fe80::a00:27ff:fe71:6b7b added

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Registering Kernel netlink reflector

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Netlink reflector reports IP fe80::a00:27ff:fe71:6b7b added

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Registering Kernel netlink command channel

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Registering Kernel netlink reflector

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Registering Kernel netlink command channel

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Registering gratuitous ARP shared channel

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Opening file '/usr/local/keepalived/etc/keepalived/keepalived.conf'.

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Opening file '/usr/local/keepalived/etc/keepalived/keepalived.conf'.

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Configuration is using : 11566 Bytes

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Configuration is using : 62964 Bytes

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: Using LinkWatch kernel netlink reflector...

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: VRRP_Instance(my_178) Entering BACKUP STATE

Jul 25 02:51:22 zlm188 Keepalived_vrrp[3443]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Using LinkWatch kernel netlink reflector...

Jul 25 02:51:22 zlm188 Keepalived_healthcheckers[3442]: Activating healthchecker for service [192.168.17.188]:3306

Jul 25 02:51:25 zlm188 Keepalived_healthcheckers[3442]: TCP connection to [192.168.17.188]:3306 failed !!!

Jul 25 02:51:25 zlm188 Keepalived_healthcheckers[3442]: Removing service [192.168.17.188]:3306 from VS [192.168.17.166]:3306

Jul 25 02:51:25 zlm188 Keepalived_healthcheckers[3442]:
Executing [/opt/mysql/mysql.sh] for service [192.168.17.188]:3306 in VS [192.168.17.166]:3306

Jul 25 02:51:25 zlm188 Keepalived_healthcheckers[3442]: Lost quorum 1-0=1 > 0 for VS [192.168.17.166]:3306

Jul 25 02:51:25 zlm188 Keepalived[3441]: Stopping Keepalived v1.2.13 (07/22,2014)





在从端启动keepalived,跟踪日志文件能够发现,跑了一遍以后自己主动stopping了。这也说明。之前的配置是ok的了,否则就要检查一下。哪里配置有误,尤其要注意virtual_route_id必须保持一致,而route_id则不强行要求一致。实例名也不要反复





1.检验vip的情况

#ip address show或ip a show





2.用vip登录mysql数据库(前提是已开启了mysqld和keepalived进程)

#mysql -h192.168.17.166 -uaaron8219 -pzlm





3.关闭某一端网卡后,測试vip的去向。以及能否通过vip正常登陆

#ifdown eth0

#ip a show

#mysql -h192.168.17.166 -uaaron8219 -pzlm





4.重新启动某一端(主机模拟主机故障),測试vip的去向,以及能否通过vip正常登陆

#init 6

#ip a show

#mysql -h192.168.17.166 -uaaron8219 -pzlm





5.直接kill掉keepalived进程。測试vip的去向,以及能否通过vip正常登陆

#pkill keepalived

#ip a show

#mysql -h192.168.17.166 -uaaron8219 -pzlm

四、配置数据库同步

安装完keepalived。仅仅是保证了mysql数据库的高可用性,可是要真正做到互为主从,还须要配置MySQL主从复制模式,使数据库能够达到一致性状态





1.两端配置同步所需參数

确保server-id与slave不一致,通常server-id的格式能够设置成ip末尾2-3位+port号

比方我的环境master的ip是192.168.17.177,port是3306

那么server-id能够设置成1773306,对应地。slave就设置成1883306

下面參数都是在/etc/my.cnf文件里配置

server-id=1773306

log-bin=percona-bin --启用binlog

set-variable=binlog-ignore-db=mysql --不记录数据库mysql的更新日志,避免了Master上的权限设置等被同步到Slave上





2.两端加入复制用户

mysql> grant repliecation slave on *.* to 'rep'@'192.168.17.%' identified by 'rep';





假设想要在Slave上有权限运行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 Select 权限:

mysql> GRANT FILE,Select,REPLICATION SLAVE ON *.* TO 'rep'@'%' IDENTIFIED BY 'rep';





3.设置同步

假设是新库,两边直接重置master的binlog

mysql> reset master;

(否则,须要把master的库用mysqldump导出(或直接打包压缩)。再拷贝到从库主机,大致过程例如以下:

①mysql> flush tables with read lock;

②mysql> mysqldump -uroot -p --all-databases -l -F >full_db.sql

scp full_db.sql root@192.168.17.188:/data/mysql/percona_3306/data



②cd /data/mysql/percona_3306

tar zcvf data.tar.gz ./data

scp data.tar.gz root@192.168.17.188





③mysql> unlock tables;

从库导入主库的数据库

mysql> mysql -uroot -p </data/mysql/percona_3306/data/full_db.sql



mysql> source /data/mysql/percona_3306/data/full_db.sql

)





4.主库查询日志状态

mysql> show master status\G





5.从库依据主库的binlog位置和position来运行同步

mysql> change master to master_host='192.168.17.177',master_user='rep',master_password='rep',

master_log_file='percona-bin.000001',master_log_pos='120';

6.启动slave

mysql> start slave;





启动后报错

Slave I/O: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593





由于从库是直接通过虚拟机拷贝镜像的方式创建的。所以UUID反复了,UUID是存放在

/data/mysql/percona_3306/data/auto.cnf文件里的

能够把这个文件直接删除。或者编辑该文件,改动里面的UUID和主库不同就可以,正常以后。应该是下面的状态:

(testing)root@localhost [(none)]> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.17.177

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: percona-bin.000011

          Read_Master_Log_Pos: 540

               Relay_Log_File: node78-relay-bin.000018

                Relay_Log_Pos: 285

        Relay_Master_Log_File: percona-bin.000011

             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: 0

                   Last_Error: 

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 540

              Relay_Log_Space: 459

              Until_Condition: None

               Until_Log_File: 

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File: 

           Master_SSL_CA_Path: 

              Master_SSL_Cert: 

            Master_SSL_Cipher: 

               Master_SSL_Key: 

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error: 

               Last_SQL_Errno: 0

               Last_SQL_Error: 

  Replicate_Ignore_Server_Ids: 

             Master_Server_Id: 773306

                  Master_UUID: 917ecbfc-10dc-11e4-b624-080027267b03

             Master_Info_File: /data/mysql/percona_3306/data/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind: 

      Last_IO_Error_Timestamp: 

     Last_SQL_Error_Timestamp: 

               Master_SSL_Crl: 

           Master_SSL_Crlpath: 

           Retrieved_Gtid_Set: 

            Executed_Gtid_Set: 

                Auto_Position: 0





7.測试

主库測试数据库zlm的tb_zlm表中运行插入一行数据:





(testing)root@localhost [(none)]> select * from zlm.tb_zlm;

+------+-----------+

| id   | name      |

+------+-----------+

|    1 | aaron8219 |

|    2 | zlm       |

|    3 | abc       |

+------+-----------+

3 rows in set (0.00 sec)





(testing)root@localhost [(none)]> insert into zlm.tb_zlm values(4,'def');

Query OK, 1 row affected (0.03 sec)





从库查询zlm.tb_zlm表:





(testing)root@localhost [(none)]> select * from zlm.tb_zlm;

+------+-----------+

| id   | name      |

+------+-----------+

|    1 | aaron8219 |

|    2 | zlm       |

|    3 | abc       |

|    4 | def       |

+------+-----------+

4 rows in set (0.00 sec)





从库上也进行相同的配置,就可以完毕互为主从,仅仅要从对应的master的binlog的pos位置開始change maseter就能够了





结论:仅仅要配置的VRRP组里面有一台机器开启了mysqld和keepalived进程,不论什么通过vip实现的数据库连接訪问,都是正常的。这样不管是哪个节点down掉了,都不会影响mysql数据库的可用性,是一个最简单的mysql高可用架构。自此,通过keepalived来实现互为主从的双机热备架构就完毕了,假设再复杂一点。安装lvpsadm来实现虚拟server的配置,那么就是一个经典的keepalived+lvs架构

MySQL高可用之——keepalived+互为主从的更多相关文章

  1. MySQL高可用HA——keepalived配置

    0. Keepalived介绍   Keepalived是基于VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)协议的一款高可用软件.Keepaili ...

  2. 基于Keepalived的MySQL高可用

    keepalived负责的是故障转移,至于故障转以后的节点之间数据的一致性问题依赖于具体的复制模式.不管是主从.一主多从还是双主.集群节点个数.主从具体的模式无关(常规复制,半同步复制,GTID复制, ...

  3. Lvs+Keepalived实现MySQL高可用

    LVS+Keepalived+MySQL高可用配置 本文所有配置前提是已实现MySQL双主备份(MySQL双主) 安装前的准备: VIP:192.168.0.201 Keepalived: Keepa ...

  4. MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移

    系统信息: mysql主库 mysql从库 VIP 192.168.1.150 mysql 主主同步都设置 auto-increment-offset,auto-increment-increment ...

  5. MySQL高可用基础之keepalived+双主复制【转】

    环境:MySQL-VIP:192.168.1.3MySQL-master1:192.168.1.1MySQL-master2:192.168.1.2 OS版本:CentOS release 6.4 ( ...

  6. Centos7源码安装mysql及读写分离,互为主从

       Linux服务器 -源码安装mysql 及读写分离,互为主从   一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...

  7. (5.1)mysql高可用系列——高可用架构方案概述

    关键词:mysql高可用概述,mysql高可用架构 常用高可用方案 20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置高可用与外部实现,内置高可用有如下: ...

  8. MySQL高可用架构之MHA

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  9. Heartbeat+DRBD+MySQL高可用方案

    1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证.默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自 ...

随机推荐

  1. linux各种版本查看方法

    1.linux内核版本 cat /proc/version Linux version 4.13.0-39-generic (buildd@lgw01-amd64-038) (gcc version ...

  2. 【mysql优化 2】索引条件下推优化

    原文地址:Index Condition Pushdown Optimization 索引条件下推(ICP:index condition pushdown)是mysql中一个常用的优化,尤其是当my ...

  3. golang语法要点笔记

    golang学习笔记 读<go学习笔记第四版> <学习go语言> <gopl-zh><Go语言实战>记录 多变量赋值时,先计算所有相关值,然后再从左到右 ...

  4. iOS-----5分钟学会枚举的正确使用姿势-Enumeration宏

    前言 Enum,枚举,相信大部分编程语言都有对应的枚举类型,功能可能有多有少,但是枚举最核心的功能是 “规范的定义代码中的状态.状态码.选项”. 状态.状态码.选项 什么是状态:同时只能出现一个值(状 ...

  5. 【Luogu】P3047附近的牛(树形DP)

    题目链接 树形DP,设f[i][j]是当前在i点,j步之内有多少牛.从相邻点to的f[to][j-1]转移而来,减去重复计算即可. #include<cstdio> #include< ...

  6. kb-07线段树-03--区间修改查询--lazy思想

    /* 区间修改,区间查询和: 第一次使用lazy思想: poj3468 */ #include<iostream> #include<cstdio> #include<c ...

  7. HDU——1982Kaitou Kid - The Phantom Thief (1)(坑爹string题)

    Kaitou Kid - The Phantom Thief (1) Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/327 ...

  8. [luoguP1129] [ZJOI2007]矩阵游戏(二分图最大匹配)

    传送门 每一行的1和每一列的1不管怎么换还是在同一行和同一列 目标状态中有n个1是不同行且不同列的 那么就是能否找出n个不同行不同列的1 就是每一行选一个不同列的1 如果矩阵中位置i,j为1,那么点i ...

  9. 都系坤坤-微信助手V 0.1,解放双手发信息

    端午节刚过,相信大家在端午节都收到不少微信祝福信息,有复制长篇大论的祝福语群发的,有人工手打的简单祝福群发,我更喜欢人工手打带上称呼的祝福信息,这样看起来更加亲切. 那么问题来了,当你的通讯录里好友多 ...

  10. 区间求mex的几种方法

    Tags : 总结 莫队 线段树 区间取mex的几种方法 题目大意 无修改,求区间 \(mex\) 做法1 莫队+二分+树状数组 树状数组维护维护桶,每次扫完二分答案,用树状数组判断 \(O(n\sq ...