华为云mysql主备keepalive_生产环境中mysql+keepalive双主模式,keepalive守护进程实现双主切换提供数据库服务...

mysql+keepalive实现浮动地址自动切换,由于keepalive无自带健康检查功能,所以必须自动编写健康检查守护进程(监控DB1和DB2数据库的监控状态,来保证浮动地址双机自动切换。)

一,部署说明及拓扑架构:

adb5492b401987bde9813dfc379da5c5.png

1、mysql安装在非root用户下(Mysql 版本5.7.18)

2、keepalive安装在root用户下

3、两台服务器安装mysql+keepalive,DB1真实ip地址为:10.112.188.70;DB2真实IP地址为:10.112.188.71;两台数据库除了建立同步账号rep1外,需建立用于守护进程账号check权限只有selecte。

4、DB1与DB2采用双主模式进行部署,但正常情况下只有DB1采用keepalive虚拟浮动IP:10.112.188.69提供服务;一旦DB2异常则由keepalive虚拟浮动IP地址:10.112.188.69自动切换至DB2主机上提供服务。

5、keepalive虚拟浮动地址切换思路(编写守护进程需要);

1)正常情况下只有DB1采用keepalive虚拟浮动IP:10.112.188.69提供服务;DB2中keepalive为stop状态。DB1采用守护进程检查自身mysql状态是否异常:mysql -ucheck-p'check1' -S /iddbs/mysql.sock -e "select version();"一旦DB1自身数据库异常则自动stop keepalive 否则保证 keepalive是启动状态;且还需监控浮动虚拟地址:10.112.188.69下的mysql是否能连接成功,若能连接不成功启动keepalive(备注:监控浮动虚拟地址主要用途是:当DB1异常发生且恢复后(此时DB2已经自动启动keepalive采用虚拟IP地址接管提供服务),监控DB2是否已经释放浮动IP,保证IP地址不冲突。)

2)正常情况下只有DB1采用keepalive虚拟浮动IP:10.112.188.69提供服务;DB2中keepalive为stop状态。DB2采用守护进程监控DB1(真实IP:10.112.188.70)Mysql数据状态(是否异常)采用mysql -ucheck -p'check1' -h 10.112.188.70 -e "select version();" 一旦DB1中MYSQL数据库出现异常(或者宕机)DB2则启动keepalive并浮动VIP为:10.112.188.69

6、keepalive浮动地址切换逻辑图:

0be71d016f3465c3599dc6dd281adb9e.png

二、mysql双主部署及权限账号建立:

1、同步账号建立:

在10.112.188.70上建立:

mysql> grant replication slave on *.* to 'rep1'@'10.112.188.71' identified by 'rep1';

在10.112.188.71

mysql> grant replication slave on *.* to 'rep1'@'10.112.188.70' identified by 'rep1';

2、守护进程账号建立:

在DB1和DB2上均建立守护进程状态查询权限,只授予select:

mysql> GRANT select ON *.* TO 'check'@'10.112.188.70' identified by 'check';

mysql> GRANT select ON *.* TO 'check'@'10.112.188.71' identified by 'check';

3、同步操作以下在DB2上操作:

1)在DB1和DB2库配置文件中my.cnf开启log-bin

server-id       = 1

# Uncomment the following if you want to log updates

log-bin=/iddbsdata/mysql-bin

2)mysql> show variables like 'log%';  #查看主库的binlog开关是否生效(ON状态)

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

| Variable_name     | Value                                       |

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

| log               | OFF                                        |

| log_bin           | ON                                         |

3)查看binlog节点位置。

mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000002 |      1160  |              |                  |

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

1 row in set (0.00 sec)

4)同步(以10.112.188.71同步10.112.188.70为例,及DB2同步DB1):

mysql>CHANGE MASTER TO

>MASTER_HOST='10.112.188.71',

>MASTER_PORT=3307,

>MASTER_USER='rep1',

>MASTER_PASSWORD='rep1',

>MASTER_LOG_FILE='mysql-bin.000002',

>MASTER_LOG_POS=1160;

4、在DB1上重复进行3操作。

5、注意,由于DB1和DB2属于是新库(新安装无数据),在同步之前省去了mysqldump,如果是有数据的数据库必须进行mysqldump操作才能进行数据同步。

三、keepalive部署(需在root用户下)

1、安装部署:

yum install -y openssl openssl-devel

gunzip keepalived-1.2.12.tar.gz

tar -xvf keepalived-1.2.12.tar

cd keepalived-1.2.12

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

make

make install

ls -lart /usr/local/keepalived/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig

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

mkdir /etc/keepalived

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

cd /etc

cp keepalived.conf keepalived.conf.bak

2、配置文件

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

[root@xqcldb001 /etc/keepalived]#cat /etc/keepalived/keepalived.conf! Configuration File forkeepalived

global_defs {

notification_email {

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

# notification_email_from Alexandre.Cassen@firewall.loc

# smtp_server192.168.200.1# smtp_connect_timeout30router_id mysql

}

vrrp_instance VI_1 {

state BACKUPinterfacebond0

virtual_router_id60priority100nopreempt

advert_int1authentication {

auth_type PASS

auth_pass1111}

virtual_ipaddress {

#10.208.218.99 dev eth0 label eth0:1

10.112.188.69/26}

}

virtual_server10.112.188.69 3307{

delay_loop6lb_algo rr

lb_kind NAT

net_mask255.255.255.0persistence_timeout50protocol TCP

real_server10.112.188.70 3307{

weight1# notify_down/iddbs/app/check_mysql.sh

TCP_CHECK {

connect_timeout10nb_get_retry3connect_port8066}

}

}

DB1

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

[root@xqcldb002 /etc/keepalived]#cat /etc/keepalived/keepalived.conf! Configuration File forkeepalived

global_defs {

notification_email {

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

# notification_email_from Alexandre.Cassen@firewall.loc

# smtp_server192.168.200.1# smtp_connect_timeout30router_id mysql

}

vrrp_instance VI_1 {

state BACKUPinterfacebond0

virtual_router_id60priority100nopreempt

advert_int1authentication {

auth_type PASS

auth_pass1111}

virtual_ipaddress {

#10.208.218.99 dev eth0 label eth0:1

10.112.188.69/26}

}

virtual_server10.112.188.69 3307{

delay_loop6lb_algo rr

lb_kind NAT

net_mask255.255.255.0persistence_timeout50protocol TCP

real_server10.112.188.71 3307{

weight1# notify_down/iddbs/app/check_mysql.sh

TCP_CHECK {

connect_timeout10nb_get_retry3connect_port8066}

}

}

DB2

备注经测试VRRP state BACKUP两台必须均为BACKUP,否则一旦重启keepalive会导致网卡IP错误。

四、keepalive守护进程

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#!/bin/sh

while true

do

/iddbs/bin/mysql -uroot -p'Siina@678' -S /iddbsdata/mysql.sock -e "select version();">/dev/null 2>&1

if [ $? -eq 0]then

/etc/init.d/keepalived start >/dev/null 2>&1

else

/etc/init.d/keepalived stop >/dev/null 2>&1

fi

sleep 1

/iddbs/bin/mysql -h10.112.188.69 -ucheck -p'check1' -P 3307 -e "select version();">/dev/null 2>&1

if [ $? -eq 0]then

/etc/init.d/keepalived stop >/dev/null 2>&1

else

/etc/init.d/keepalived start >/dev/null 2>&1

fi

sleep 2

done

DB1守护进程

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#!/bin/sh

while true

do

/iddbs/bin/mysql -h10.112.188.70 -ucheck -p'check1' -P 3307 -e "select version();">/dev/null 2>&1

if [ $? -eq 0]then

/etc/init.d/keepalived stop >/dev/null 2>&1

sleep 2

else

/etc/init.d/keepalived start >/dev/null 2>&1

fi

sleep 3

done

DB2守护进程

守护进程启动:[root@xqcldb001 ~]#sh check_mysql.sh &

五、双主同步及模拟数据库异常keepalive自动切换浮动IP

1、正常情况下:

正常情况在备用服务器上bond0网卡上只有一个地址。

xqcldb002:/iddbs>ip a

10: bond0: mtu 1500 qdisc noqueue state UP

link/ether 70:79:90:a1:0b:48 brd ff:ff:ff:ff:ff:ff

inet 10.112.188.71/26 brd 10.112.188.127 scope global bond0

inet6 fe80::7279:90ff:fea1:b48/64 scope link

valid_lft forever preferred_lft forever

正常情况在主服务器上bond0网卡上有一个地址和一个虚拟IP地址

xqcldb001:/iddbs>ip a

10: bond0: mtu 1500 qdisc noqueue state UP

link/ether 70:79:90:7d:bf:3e brd ff:ff:ff:ff:ff:ff

inet 10.112.188.70/26 brd 10.112.188.127 scope global bond0

inet 10.112.188.69/26 scope global secondary bond0

inet6 fe80::7279:90ff:fe7d:bf3e/64 scope link

valid_lft forever preferred_lft forever

2、正常情况下:10.112.188.70数据库异常(模拟宕机):

此种情况下70(DB1)bond0网卡上有一个真实地址,已经无浮动IP地址10.112.188.69

xqcldb001:/iddbs>sh mysql_start stop

stop Mysql. [  OK  ]

xqcldb001:/iddbs>ip a

10: bond0: mtu 1500 qdisc noqueue state UP

link/ether 70:79:90:7d:bf:3e brd ff:ff:ff:ff:ff:ff

inet 10.112.188.70/26 brd 10.112.188.127 scope global bond0

inet6 fe80::7279:90ff:fe7d:bf3e/64 scope lin

71(DB2)bond0网卡上有一个真实地址,浮动IP地址10.112.188.69

xqcldb002:/iddbs>ip a

10: bond0: mtu 1500 qdisc noqueue state UP

link/ether 70:79:90:a1:0b:48 brd ff:ff:ff:ff:ff:ff

inet 10.112.188.71/26 brd 10.112.188.127 scope global bond0

inet 10.112.188.69/26 scope global secondary bond0

inet6 fe80::7279:90ff:fea1:b48/64 scope link

valid_lft forever preferred_lft forever

3、数据库恢复:

xqcldb001:/iddbs>sh mysql_start start

starting Mysql.... [  OK  ]

xqcldb001:/iddbs>

xqcldb001:/iddbs>

xqcldb001:/iddbs>ps -ef | grep mysql

root      2182 24200  0 11:30 pts/2    00:00:00 sh check_mysql.sh     #守护进程

iddbs     4485     1  0 11:35 pts/2    00:00:00 /bin/sh /iddbs/bin/mysqld_safe --defaults-file=/iddbs/my.cnf

iddbs     4890  4485 93 11:35 pts/2    00:00:06 /iddbs/bin/mysqld --defaults-file=/iddbs/my.cnf --basedir=/iddbs --datadir=/iddbsdata --plugin-dir=/iddbs/lib/plugin --log-error=/iddbsdata/mysql-error.log --pid-file=/iddbsdata/mysql.pid --socket=/iddbsdata/mysql.sock --port=3307

iddbs     4949  3619  0 11:36 pts/2    00:00:00 grep mysql

地址已经自动切换至DB1:

xqcldb001:/iddbs>ip a

10: bond0: mtu 1500 qdisc noqueue state UP

link/ether 70:79:90:7d:bf:3e brd ff:ff:ff:ff:ff:ff

inet 10.112.188.70/26 brd 10.112.188.127 scope global bond0

inet 10.112.188.69/26 scope global secondary bond0

inet6 fe80::7279:90ff:fe7d:bf3e/64 scope link

valid_lft forever preferred_lft forever

DB2只有真实地址而无虚拟浮动地址:

xqcldb002:/iddbs>ip a

10: bond0: mtu 1500 qdisc noqueue state UP

link/ether 70:79:90:a1:0b:48 brd ff:ff:ff:ff:ff:ff

inet 10.112.188.71/26 brd 10.112.188.127 scope global bond0

inet6 fe80::7279:90ff:fea1:b48/64 scope link

valid_lft forever preferred_lft forever

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值