MySQL主主复制+keepalived高可用方案实现

时间:2020-06-06 10:19:04   收藏:0   阅读:54
1 前言

2 环境

!!!关闭防火墙,关闭selinux,时间同步!!!

3 二进制方式安装MySQL

3.1 安装相关包

# yum -y install libaio

3.2 创建用户和组

# groupadd mysql && useradd -r -g mysql -s /bin/false mysql

3.3 准备程序文件

# cd /usr/local/src/
# tar xf mysql-5.7.28-el7-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -s mysql-5.7.28-el7-x86_64/ mysql
# chown -R mysql.mysql mysql

3.4 准备环境变量

# echo ‘PATH=/usr/local/mysql/bin:$PATH‘ > /etc/profile.d/mysql.sh
# source /etc/profile.d/mysql.sh

3.5 生成数据库文件

# mysqld --initialize --user=mysql --datadir=/data/mysql
# mysqld --initialize --user=mysql --datadir=/data/mysql
···省略···
2020-06-03T08:47:23.556966Z 1 [Note] A temporary password is generated for root@localhost: (1BfO&>qmvo,  #注意这个生成的临时密码,后面需要用到

3.6 准备配置文件

# cp /etc/my.cnf{,.bak}
# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid

[client]
socket=/data/mysql/mysql.sock

3.7 准备服务脚本和启动服务

# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# service mysqld start

3.8 修改初始秘密

# mysqladmin -uroot -p‘(1BfO&>qmvo,‘ password 123.com
初始密码是刚才临时生成的那个

3.9 测试登录

# mysql -uroot -p123.com
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.28-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql>

以上操作在另一台MySQL也是一样,需要注意的是临时生成的密码要修改。

4 配置2台MySQL实现主主同步

技术分享图片

主主同步就是两台机器互为主从的关系,在任何一台机器上写入都会同步。若 MySQL 主机开启了防火墙,需要关闭防火墙或创建规则。

4.1 修改MySQL配置文件

两台 MySQL 均要开启 binlog 日志功能,开启方法:在 MySQL 配置文件[MySQLd]段中加上log-bin=MySQL-bin 选项,两台 MySQL 的 server-ID 不能一样,默认情况下两台 MySQL 的serverID 都是 1,需将其中一台修改为 2 即可。

4.1.1 master1中有关复制的配置

log-bin = mysql-bin
binlog_format = mixed
server-id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
auto-increment-increment = 2
auto-increment-offset = 1

4.1.2 master2中有关复制的配置

log-bin = mysql-bin
binlog_format = mixed
server-id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
auto-increment-increment = 2
auto-increment-offset = 2

注:master1 和 master2 只有 server-id 不同和 auto-increment-offset 不同。mysql 中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset 和auto_increment_increment。auto-increment-increment 表示自增长字段每次递增的量,其默认值是 1。它的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为 2。auto-increment-offset 是用来设定数据库中自动增长的起点(即初始值),因为这两能服务器都设定了一次自动增长值 2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突。
注:可以在 my.cnf 文件中添加“binlog_do_db=数据库名”配置项(可以添加多个)来指定要同步的数据库

4.2 将master1设置为master2的主服务器

4.2.1 创建授权账户

mysql> GRANT REPLICATION SLAVE ON *.* TO ‘rep‘@‘192.168.200.89‘ IDENTIFIED BY ‘123.com‘

4.2.2 查看master1当前的binlog状态信息

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

4.2.3 在master2上将master1设为自己的主服务器并开启slave功能

mysql> CHANGE MASTER TO
    -> MASTER_HOST=‘192.168.200.88‘,
    -> MASTER_USER=‘rep‘,
    -> MASTER_PASSWORD=‘123.com‘,
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE=‘mysql-bin.000001‘,
    -> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

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

4.2.4 查看同步状态

技术分享图片
Slave_IO_Running和Slave_SQL_Running这两个值必须为Yes,代表从服务器能正常连接服务器

4.3 将master2设置为master1的主服务器

4.3.1 创建授权账户

mysql> GRANT REPLICATION SLAVE ON *.* TO ‘rep‘@‘192.168.200.88‘ IDENTIFIED BY ‘123.com‘

4.3.2 查看master2当前的binlog状态信息

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

4.3.3 在master1上将master2设为自己的主服务器并开启slave功能

mysql> CHANGE MASTER TO
    -> MASTER_HOST=‘192.168.200.89‘,
    -> MASTER_USER=‘rep‘,
    -> MASTER_PASSWORD=‘123.com‘,
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE=‘mysql-bin.000001‘,
    -> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

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

4.3.4 查看同步状态

技术分享图片

4.4 测试主主同步

在master1上创建要同步的数据库如test_db,并在 test_db 中创建一张测试表如 tab1
技术分享图片
查看 master2 主机是否同步了 master1 上的数据变化
技术分享图片
从上图可以看出 master2 同步了 master 的数据变化
在 master2 主机上向 tab1 表中插入数据
技术分享图片
在 master1 主机查看是否同步了 master2 上的数据变化
技术分享图片
现在任何一台 MySQL 上更新数据都会同步到另一台 MySQL,MySQL 同步完成。
注:若主 MYSQL 服务器已经存在,只是后期才搭建从 MYSQL 服务器,在置配数据同步前应先将主 MYSQL 服务器的要同步的数据库拷贝到从 MYSQL 服务器上(如先在主 MYSQL 上备份数据库,再用备份在从 MYSQL 服务器上恢复)

5 安装配置keepalived

下面我们就完成 keepalived 的高可用性。

5.1 安装keepalived

以下操作在master1和master2都是一样的

# tar xf keepalived-2.0.20.tar.gz
# cd keepalived-2.0.20/
# ./configure --prefix=/apps/keepalived
# make -j $(lscpu | awk ‘NR==4{print $2}‘) && make install

5.2 修改keepalived配置文件

keepalived 只有一个配置文件 keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、vrrp_instance 和 virtual_server。

5.2.1 master1主机上的keepalived.conf文件修改

# mkdir /etc/keepalived
# cp /apps/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived //!表示注释

global_defs {
   router_id mysql-1 //表示运行 keepalived 服务器的一个标识
}

vrrp_instance VI_1 {
    state BACKUP //指定keepalived的角色,两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
    interface eth0 //指定 HA 监测网络的接口
    virtual_router_id 51 //虚拟路由标识,这个标识是一个数字(取值在 0-255 之间,用来区分多个
instance 的 VRRP 组播),同一个 vrrp 实例使用唯一的标识,确保和 master2 相同,同网内不同集群此项必须不同,否则发生冲突。
    priority 100 //用来选举 master 的,要成为 master,该项取值范围是 1-255(在此范围
之外会被识别成默认值 100),此处 master2 上设置为 50
    advert_int 1 //发 VRRP 包的时间间隔,即多久进行一次 master 选举(可以认为是健康查
检时间间隔)
    authentication { //认证区域,认证类型有 PASS 和 HA(IPSEC),推荐使用 PASS(密码只识别前 8 位)
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {  //VIP 区域,指定 vip 地址
        192.168.200.200 
    }
}
virtual_server 192.168.200.200 3306 { //设置虚拟服务器,需要指定虚拟 IP 地址和服务端口,
IP 与端口之间用空格隔开
    delay_loop 2 //设置运行情况检查时间,单位是秒
    lb_algo rr  //设置后端调度算法,这里设置为 rr,即轮询算法
    lb_kind DR //设置 LVS 实现负载均衡的机制,有 NAT、TUN、DR 三个模式可选
    persistence_timeout 50 //会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
    protocol TCP //指定转发协议类型,有 TCP 和 UDP 两种
    real_server 192.168.200.88 3306 { //配置服务节点 1,需要指定 real server 的真实 IP 地址和
端口,IP 与端口之间用空格隔开
        weight 1  //配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权
值大小为了区分不同性能的服务器
        notify_down /etc/keepalived/bin/mysql.sh //检测到 realserver 的 mysql 服务 down 后执行的脚本
        TCP_CHECK {
           connect_timeout 3  //连接超时时间
           nb_get_retry 3 //重连次数
           delay_before_retry 3 //重连间隔时间
           connect_port 3306 //健康检查端口
        }
    }
}

5.2.2 master2主机上的keepalived.conf文件修改

Master2 主机的 keepalived.conf 文件配置与 master1 基本相同,只是 router_id,priority,
real_server 三处不同,其他配置都相同

# mkdir /etc/keepalived
# cp /apps/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id mysql-2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.200
    }
}
virtual_server 192.168.200.200 3306 {
    delay_loop 2
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.200.89 3306 {
        weight 1
        notify_down /etc/keepalived/bin/mysql.sh
        TCP_CHECK {
           connect_timeout 3
           nb_get_retry 3
           delay_before_retry 3
           connect_port 3306
        }
    }
}

5.2.3 在master1和master2上面分别启动keepalived并设置开机启动

# systemctl enable --now keepalived

5.3 在master1和master2上添加检测脚本

作用是当 mysql 停止工作时自动关闭本机的keepalived,从而实现将故障机器剔除(因为每台机器上 keepalived 只添加了本机为 realserver)当 mysqld 正常启动起来后,要手动启动 keepalived 服务。

# mkdir /etc/keepalived/bin
# cat /etc/keepalived/bin/mysql.sh 
#!/bin/bash
systemctl stop keepalived
(/sbin/ifdown eth0 && /sbin/ifup eth0)
# chmod +x /etc/keepalived/bin/mysql.sh

6 测试

在 master1 和 master2 分别执行 ip addr show dev eth0 命令查看 master1 和 master2 对 VIP(群集虚拟 IP)的控制权。
master1
技术分享图片
master2
技术分享图片
从上图可以看出 master1 是主服务器,master2 为备用服务器。

6.1 停止 MySQL 服务,看 keepalived 健康检查程序是否会触发我们编写的脚本

6.1.1 停止 master1 主机的 mysql 服务

技术分享图片

6.1.2 对应的日志也有详细的输出

技术分享图片

6.1.3 查看master2上是否有vip

技术分享图片

6.1.4 相关的日志信息

技术分享图片
这说明在主服务上停止 MySQL 服务,触发了我们编写的脚本,进行自动故障切换。

6.2 MySQL 远程登录测试

6.2.1 在master1和master2上授权

(root@192.168.200.88) [(none)] 03:26:45> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123.com‘;
(root@192.168.200.89) [(none)] 03:26:45> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123.com‘;

6.2.2 在客户端测试登录

技术分享图片
上图显示说明在客户端访问 VIP 地址,由 master1 主机提供响应的,因为 master1 当前是主服务器,将 master1 的 mysql 服务停止,在客户端执行 show variables like ‘server_id‘;
技术分享图片
上图显示说明在客户端的查询请求是由 master2 主机响应的。故障切换成功。

7 总结:

Keepalived+mysql 双主一般来说,中小型规模的时候,采用这种架构是最省事的。在 master 节点发生故障后,利用 keepalived 的高可用机制实现快速切换到备用节点。在这个方案里,有几个需要注意的地方:

原文:https://blog.51cto.com/hexiaoshuai/2501771

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!