MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。而Keepalived通过虚拟IP,实现了双主对外的统一接口以及自动检查、失败切换机制。联合使用,可以实现MySQL数据库的高可用方案。

实验环境:

OS:centos 6.x x86_64系统

MySQL版本: :mysql 5.6.22   64 位

A: master :192.168.79.3 3306

B: slave :192.168.79.4 3306

操作系统时间一致更改:

# date -s "20150319 15:51:42"

# hwclock --systohc

AB数据库安装及主从配置

新建mysql用户,用户组,创建 datadir

# groupadd mysql

# useradd mysql -g mysql -s /sbin/nologin -d /opt/mysql

解压mysql二进制安装包,对解压后的mysql目录加一个符号连接

# cd /opt/mysql

# tar -xvzf mysql-5.6.22-linux-glibc2.5-x86_64.tar.gz

# cd /usr/local/

# ln -s /opt/mysql/mysql-5.6.22-linux-glibc2.5-x86_64 mysql

# ls

bin etc games include lib lib64 libexec mysql sbin share src

创建mysql的安装目录并修改权限

# mkdir -p /data/mysql/mysql_3306/{data,logs,tmp}

chown -R mysql:mysql /data/mysql/

chown -R mysql:mysql /usr/local/mysql/

加环境变量,解决找不到mysql命令的问题

echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile

source /etc/profile

创建修改mysql配置文件

修改my.cnf

server_id

log_slave_updates

gtid-mode= off

binlog-ignore-db=mysql

replicate-ignore-db=mysql

auto_increment_offset= 1;

auto_increment_increment= 2;

ps:主从库的server_id不要一样。 如果从库是整个拷贝的uuid也不要一样,data下的auto.cnf.  从库:auto_increment_offset= 2;auto_increment_increment= 2;

初始化系统数据文件 ,在basedir下初始化

# ./scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf --datadir=/data/mysql/mysql_3306/data

安装mysql后的善后工作

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

/etc/init.d/mysql start

delete from mysql.user where user!='root' or host!='localhost';

truncate mysql.db;

drop database test;

grant all privileges on *.* to 'liyt'@'%' identified by 'liyt';

grant replication slave, replication client on *.* to 'repl'@'%' identified by 'replslave';

flush privileges;

reset master;

启动 slave mysql服务

A:

>show master status;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mybinlog.000001 | 120 | | | |

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

B:

change master to master_host='192.168.79.3', master_port=3306 ,master_user='repl', master_password='replslave', master_log_file='mybinlog.000001', master_log_pos=120;

B:

>show master status;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mybinlog.000001 | 120 | | | |

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

A:

change master to master_host='192.168.79.4', master_port=3306 ,master_user='repl', master_password='replslave', master_log_file='mybinlog.000001', master_log_pos=120;

测试双主同步:创建新的数据库和表看是否能同步

keepalived安装及配置

GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%' IDENTIFIED BY 'monitor';

#yum install keepalived

#yum install MySQL-python

配置A:

[root@taotao ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id MYSQL_3

}

vrrp_script chk_mysql {

script "/etc/keepalived/checkMySQL.py -h 192.168.79.3 -P 3306"

interval 60

}

vrrp_instance VI_MYSQL1 {

state BACKUP

nopreempt

interface eth0

virtual_router_id 82

priority 100

advert_int 5

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_mysql

}

virtual_ipaddress {

192.168.79.66

}

}

这里state不配置MASTER,是期望在MASTER宕机后再恢复时,不主动将MASTER状态抢过来,避免MySQL服务的波动。

由于不存在使用lvs进行负载均衡,不需要配置虚拟服务器virtual server,下同。

配置B:

[root@taotao ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id MYSQL_4

}

vrrp_script chk_mysql {

script "/etc/keepalived/checkMySQL.py -h 192.168.79.4 -P 3306"

interval 60

}

vrrp_instance VI_MYSQL1 {

state BACKUP

nopreempt

interface eth0

virtual_router_id 82

priority 90

advert_int 5

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_mysql

}

virtual_ipaddress {

192.168.79.66

}

}

checkMySQL.pyAB完全一样代码如下:

# cat /etc/keepalived/checkMySQL.py

#!/usr/bin/python

#coding: utf-8#

import sys

import os

importgetoptimport MySQLdb

import logging

dbhost='localhost'dbport=3306dbuser='monitor'dbpassword='monitor'def checkMySQL():

global dbhost

global dbport

global dbuser

global dbpassword

shortargs='h:P:'opts, args=getopt.getopt(sys.argv[1:],shortargs)for opt, value inopts:if opt=='-h':

dbhost=valueelif opt=='-P':

dbport=value

#print"host : %s, port: %d, user: %s, password: %s" % (dbhost, int(dbport), dbuser, dbpassword)

db=instanceMySQL(dbhost, dbport, dbuser, dbpassword)

st=db.ishaveMySQL()#if ( db.connect() != 0 ):# return1#db.disconnect()

return st

class instanceMySQL:

conn=None

def __init__(self, host=None,port=None, user=None, passwd=None):

self.dbhost=host

self.dbport= int(port)

self.dbuser=user

self.dbpassword= passwddef ishaveMySQL(self):

cmd="ps -ef | egrep -i \"mysqld\" | grep %s | egrep -iv \"mysqld_safe\" | grep -v grep | wc -l" %self.dbport

mysqldNum=os.popen(cmd).read()

cmd="netstat -tunlp | grep \":%s\" | wc -l" %self.dbport

mysqlPortNum=os.popen(cmd).read()

#print mysqldNum, mysqlPortNumif ( int(mysqldNum) <= 0):

print"error"return1

if ( int(mysqldNum) > 0 and mysqlPortNum <= 0):

return1return0def connect(self):

# print"in db conn"# print"host : %s, port: %d, user: %s, password: %s" %(self.dbhost, self.dbport, self.dbuser, self.dbpassword)

try:

self.conn=MySQLdb.connect(host="%s"%self.dbhost, port=self.dbport,user="%s"%dbuser, passwd="%s"%self.dbpassword)

except Exception, e:

# print"Error"print e

return1return0def disconnect(self):if(self.conn):

self.conn.close()

self.conn=Noneif __name__== "__main__":

st=checkMySQL()

sys.exit(st)

View Code

A B启用keepalived# /etc/init.d/keepalived startshell>chkconfig –level 2345 keepalived onps:先启动,你内心期望成为对外服务的机器,确认VIP绑定到那台机器上,然后在启动另外一台的keepalived

观察配置A的日志:

[root@taotao ~]# /etc/init.d/keepalived start

[root@taotao ~]# tail -f /var/log/messages

Mar 20 05:09:01 taotao Keepalived[56536]: Starting Keepalived v1.2.13 (10/15,2014)

Mar 20 05:09:01 taotao Keepalived[56538]:Starting Healthcheck child process, pid=56539

Mar 20 05:09:01 taotao Keepalived[56538]: Starting VRRP child process, pid=56540

Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP 192.168.79.3 added

Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP fe80::20c:29ff:fed8:3944 added

Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Registering Kernel netlink reflector

Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Registering Kernel netlink command channel

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Netlink reflector reports IP 192.168.79.3 added

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Netlink reflector reports IP fe80::20c:29ff:fed8:3944 added

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Registering Kernel netlink reflector

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Registering Kernel netlink command channel

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Registering gratuitous ARP shared channel

Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Opening file '/etc/keepalived/keepalived.conf'.

Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Configuration is using : 6251 Bytes

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Opening file '/etc/keepalived/keepalived.conf'.

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Configuration is using : 63953 Bytes

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Using LinkWatch kernel netlink reflector...

Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Using LinkWatch kernel netlink reflector...

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1)Entering BACKUP STATE

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]

Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: VRRP_Script(chk_mysql) succeeded

Mar 20 05:09:16 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Transition to MASTER STATE

Mar 20 05:09:21 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Entering MASTER STATE

Mar 20 05:09:21 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) setting protocol VIPs.

Mar 20 05:09:21 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPs on eth0 for 192.168.79.66

Mar 20 05:09:21 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP 192.168.79.66 added

Mar 20 05:09:26 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPs on eth0 for 192.168.79.66

ps:包含了三个进程: keepalived healthcheck vrrp协议 三个进程

测试:

1)关闭A服务的mysql服务观察A和B的日志

A:

[root@taotao ~]# /etc/init.d/mysqld stop

Shutting down MySQL....[ OK ]

[root@taotao ~]# tail -f /var/log/messages

Mar 20 05:36:04 taotao Keepalived_vrrp[56540]: VRRP_Script(chk_mysql) failed

Mar 20 05:36:07 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Entering FAULT STATE

Mar 20 05:36:07 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) removing protocol VIPs.

Mar 20 05:36:07 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Now in FAULT state

Mar 20 05:36:07 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP 192.168.79.66 removed

B:

[root@taotao ~]# tail -f /var/log/messages

Mar 20 05:36:03 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1)Transition to MASTER STATE

Mar 20 05:36:08 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1)Entering MASTER STATE

Mar 20 05:36:08 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) setting protocol VIPs.

Mar 20 05:36:08 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPson eth0 for 192.168.79.66

Mar 20 05:36:08 slave1 Keepalived_healthcheckers[48657]: Netlink reflector reports IP192.168.79.66 added

Mar 20 05:36:13 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPs on eth0 for 192.168.79.66

2)开启A服务的mysql服务观察A日志

A:

[root@taotao ~]# /etc/init.d/mysqld start

Starting MySQL...........................[ OK ]

[root@taotao ~]# tail -f /var/log/messages

Mar 20 05:42:01 taotao Keepalived_vrrp[56540]: VRRP_Script(chk_mysql) succeeded

Mar 20 05:42:03 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1)Entering BACKUP STATE

通过vip连接mysql

# mysql -h 192.168.79.66 -P 3306 -uliyt -p

python mysql 双主_keepalived+mysql双主复制高可用方案相关推荐

  1. mysql mmm集群简介_mysql之MMM高可用方案简介

    MMM(Master-Master Replication Manager for MySQL) MySQL主主复制管理器,提供了MySQL主主复制配置的监控.故障转移和管理的一套可伸缩的脚本套件.在 ...

  2. mysql 双主 脑裂_MySQL高可用方案——双主

    MySQL高可用方案--双主 发布时间:2020-03-01 20:45:48 来源:51CTO 阅读:253 作者:warrent MySQL的高可用方案有很多种,双主.MHA.MMM等等,这里只是 ...

  3. mysql主主和F5高可用_MYSQL 主主热备高可用方案与实现

    咱们选择主主互热备作生产环境MYSQL高可用方案,该方案的优势是在压力大的时候,仍然能够经过设置负载均衡来作业务分发.并且最重要的是配置简单,两份配置都同样,改个IP就能够 就喜欢简单的东西.mysq ...

  4. mysql高可用_mysql高可用方案

    第一节:mysql 高可用方案 1.1 一主一从架构 mysql 配置为主从模式,从库是主库的 backup,同一时间设置其中一台为主服务器,提供读写,另一台服务器作为热备,不提供读写,通过复制与主服 ...

  5. 架构成长之路:常见的五种MySQL高可用方案分析

    1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中 ...

  6. mysql高可用方案MHA介绍

    mysql高可用方案MHA介绍 概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10-30秒内),完成故障切换,部署MHA, ...

  7. 高可用mysql笔记_MySQL笔记-高可用方案

    MySQL笔记-高可用方案 一.概述 MYSQL高可用方案有多种,本次针对其中部分方案进行实践.包括主从,双主,myql+keepalived, mysql+mycat+keepalived. 纸上得 ...

  8. 技术分享:从双11看实时数仓Hologres高可用设计与实践

    简介:本文将会从阿里巴巴双11场景出发,分析实时数仓面临的高可用挑战以及针对性设计. 2021年阿里巴巴双11完美落下为帷幕,对消费者来说是一场购物盛宴,对背后的业务支撑技术人来说,更是一场年度大考. ...

  9. MySQL高可用方案-PXC环境部署记录

    之前梳理了Mysql+Keepalived双主热备高可用操作记录,对于mysql高可用方案,经常用到的的主要有下面三种: 一.基于主从复制的高可用方案:双节点主从 + keepalived 一般来说, ...

最新文章

  1. 内部使用final参数的原因
  2. 协议层次及其服务模型
  3. 12行代码AC——UVa 151 - Power Crisis(约瑟夫环)
  4. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)
  5. java c s是什么_Java在C/S
  6. win10的11对战平台突然无法启动魔兽
  7. Laravel深入学习3 - 接口约定
  8. 现代科学家运用电极计算机,纳米技术在现代生活中的应用
  9. 野火stm32资源下载(视频,手册等)
  10. C++/MFC修行之路(5)Ribbon(功能区)的使用
  11. 报错:Exception opening socket
  12. 100+CAD常用机械零件图练习图限量获取
  13. 【蓝桥杯练习--递归】费解的开关
  14. AcWing 1083 Windy数
  15. 基于神经网络的车牌识别,卷积神经网络车牌识别
  16. 概率分布之二项分布、泊松分布
  17. TPM1.2到TPM 2.0的变化
  18. python两张图片无缝合成一张_Python将多张图片进行合并拼接
  19. 爬有道在线翻译(已完善)
  20. 微信小程序(下拉刷新数据)新手向

热门文章

  1. 【Linux】管道(Pipes)
  2. 集成显卡常见故障大全
  3. 计算机组成原理 原码一位乘法(C语言实现)
  4. 使用appium工具对漫画发表评论
  5. 三种线程安全的List
  6. “巴青虫草,雅魅天下 ”巴青县第三届冬虫夏草采挖体验活动盛大开幕
  7. java抽象类为什么不能实例化?
  8. 开源数据库HAWQ,架构调研
  9. python打包上传至pypi —— 具有多个目录的项目工程快速打包上传
  10. Android 应用 与 系统锁屏