mysql实战——Mysql8.0高可用之双主+keepalived

打印 上一主题 下一主题

主题 1007|帖子 1007|积分 3031

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、先容

利用keepalived实现Mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,两台Mysql数据库的数据保持完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库宕机后,应用能够自动切换到另外一台Mysql数据库上去,包管系统的高可用。
二、搭建前准备

mysql8.0.25
keepalivedkeepalibed-2.2.8
Mysql-master-1192.168.1.80
Mysql-master-2192.168.1.81
Mysql——vip192.168.1.82(这个只是假造IP,不用准备假造机)
准备两台机器都安装mysql。 
三、搭建

3.1 关闭防火墙

两台机器都关闭firewalld
   systemctl stop firewalld
  systemctl disable firewalld
  systemctl status firewalld
  
 
3.2 搭建双主同步

3.2.1修改master-1配置文件

现在必要搭建两个机器的主主同步
   vi /etc/my.cnf
 
[mysqld]
 
log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=1                                     #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中制止ID辩论。
auto_increment_offset=1                         #指定自增长ID的起始值为1,用于在主从复制中制止ID辩论。
 
##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 
  3.2.2修改master-2配置文件

   vi /etc/my.cnf 

[mysqld]

log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=2                                    #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中制止ID辩论。
auto_increment_offset=2                         #指定自增长ID的起始值为2,用于在主从复制中制止ID辩论。

##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 
  
 
 3.2.3 在两台节点分别创建同步用户

   mysql> create user 'test'@'%' identified by 'test123';
Query OK, 0 rows affected (0.04 sec)
mysql> grant replication slave on *.* to 'test'@'%';
Query OK, 0 rows affected (0.01 sec)
  mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
  
 
3.2.4搭建并启动双主复制

master-2
    show master status;
  
 记录file和position的值,在master-1中会用到
master-1
    change master to master_host='192.168.1.81',master_user='test',master_password='test123',master_log_file='mysql-bin.000001',master_log_pos=870,get_master_public_key=1;
    start slave; 
  
 
如上图io和 sql线程都为yes即成功;
master-1
   show master status;
  
记录file和position,master-2会用到 
 master-2
   change master to master_host='192.168.1.80',master_user='test',master_password='test123',master_log_file='mysql-bin.000001',master_log_pos=871,get_master_public_key=1;
    start slave; 
  
 
如上图两个线程都为yes,即成功。
两个机器都成功,即双主复制搭建成功。

3.2.5测试双主复制

master-1测试

master-2测试

如上面两图,主1创建数据库创建表之后在主2可以看到,主2插入数据主1也可以看到。

3.2.6主备库都关机后必要重新开启同步

若双主都关机后必要重新配置第3.2.4步

3.2.7配置过程中参数阐明

    状态参数阐明
Slave_IO_state 体现当前IO线程的状态,一般环境下就是体现等待主服务器发送二进制日志。
Master_log_file 体现当前同步的主服务器的二进制日志。
Read_master_log_pos 体现当前同步到主服务器上二进制日志的偏移量位置。
Relay_master_log_file 当前中继日志同步的二进制日志。
Relay_log_file 体现当前写入的中继日志。
Relay_log_pos 体现当前执行到中继日志的偏移量位置。
Slave_IO_running 从服务器中IO线程的运行状态,yes代表正常
Slave_SQL_running 从服务器中sql线程的运行状态,YES代表正常
Exec_Master_log_pos 表示同步到主服务器的二进制日志的偏移量位置。
  
slave启停常用命令
STOP SLAVE IO_THREAD; 制止IO进程
STOP SLAVE SQL_THREAD; 制止SQL进程
STOP SLAVE; 制止IO和SQL进程
START SLAVE IO_THREAD; 启动IO进程
START SLAVE SQL_THREAD; 启动SQL进程
START SLAVE; 启动IO和SQL进程
RESET SLAVE; 用于让从属服务器忘记其在主服务器的二进制日志中的复制位置, 它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志,当你不必要主从的时间可以在从上执行这个操作。
SHOW SLAVE STATUS; 检察MySQL同步状态
STOP SLAVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE; 经常会朋友mysql主从同步遇到错误的时间,好比一个主键辩论等,那么我就必要在确保那一行数据一致的环境下临时的跳过这个错误,那就必要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳事背面的n个变乱
CHANGE MASTER TO MASTER_HOST=‘10.1.1.75’, MASTER_USER=‘replication’, MASTER_PASSWORD=‘123456’, MASTER_LOG_FILE=‘mysql-bin.000006’, MASTER_LOG_POS=106; START SLAVE; 从指定位置重新同步
  
3.3keepalived安装摆设

在master-1,master-2服务器分别安装keepalived,安装步骤相同,配置文件差别。按照我的步骤即可完成。
3.3.1安装依赖包,下载keepalived(两个节点步骤相同,下面就写一份)

下载到/opt目录下并解压
   yum -y install gcc openssl-devel popt-devel psmisc
  

    ​yum install wget
Is this ok [y/d/N]: y              #安装wget提示,输入y
  
 
   cd /opt/
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
ll
tar -zxvf keepalived-2.2.8.tar.gz   
  
 

 3.3.2配置keepalived并编译(两个节点步骤相同,下面就写一份)

   cd keepalived-2.2.8
 ./configure --prefix=/opt/keepalived-2.2.8
  
 

如上图即成功。 
   make && make install 
  
 

 如上图即编译成功。
3.3.3将文件复制到对应目录下(两个节点步骤相同,下面就写一份)

   [root@128 keepalived-2.2.7]# mkdir /etc/keepalived
[root@128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
[root@128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@128 keepalived-2.2.7]# cp bin/keepalived /usr/sbin/
  
 
3.3.4新建shutdown.sh文件(两个节点步骤相同,下面就写一份)

    vi /etc/keepalived/keepalived.conf
  复制下面内容,:wq保存并退出。 
   #!/bin/bash
#该脚本是在mysql服务出现非常时,将keepalived应用制止,从而使假造vip主机自动连接到另一台mysql上
killall keepalived 
  将执行权限设置为可执行 
    [root@skymachine keepalived]# chmod +x /etc/keepalived/shutdown.sh
  
 
3.3.5ifconfig检察网卡名称

master-1,master-2网卡名称为ens33

3.3.6 修改master-1服务器keepalived配置文件(配置文件两个机器差别,3.3.7是master-2的配置)

把原有的keepalived.conf更名为keepalived_bak.conf,然后新建keepalived.conf配置文件
   cd /etc/keepalived/
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived.conf
[root@skymachine keepalived]# mv keepalived.conf  keepalived_bak.conf
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived_bak.conf
[root@skymachine keepalived]#  vi /etc/keepalived/keepalived.conf 
  
 
 将以下内容复制进去
   ! Configuration File for keepalived

#主要配置故障发生时的通知对象及机器标识
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL-1                   #主机标识符,唯一即可
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#用来界说对外提供服务的VIP地区及相关属性
vrrp_instance VI_1 {
    state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考
    interface ens33                 #指定HA监听的网络接口,刚才ifconfig检察的接口名称
    virtual_router_id 151            #假造路由标识,取值0-255,master-1和master-2保持一致
    priority 100                     #优先级,用来选举master,取值范围1-255
    advert_int 1                     #发VRRP包时间隔断,即多久举行一次master选举
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {              #假造出来的地点
        192.168.1.82
    }
}

#假造服务器界说
virtual_server 192.168.1.82 3306 { #假造出来的地点加端口
    delay_loop 2                     #设置运行环境检查时间,单元为秒
    lb_algo rr                       #设置后端调治器算法,rr为轮询算法
    lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选
    persistence_timeout 50           #会话保持时间,单元为秒
    protocol TCP                     #指定转发协议,有 TCP和UDP可选

        real_server 192.168.1.80 3306 {          #实际本地ip+3306端口
       weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大
        #当该ip 端口连接非常时,执行该脚本
        notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本
        TCP_CHECK {
            #实际物理机ip地点
            connect_ip 192.168.1.80
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3

        }
    }
}
 
  注:假如你的ip和我差别,必要更改的位置有(master-2同理): 
 
 
 假如网卡和我差别也必要改网卡

 
3.3.7修改master-2服务器keepalived配置文件

下图和master-1步骤相同
 
 配置文件就和master-1配置差别了,差别的地方为router_id、priority、real_server、connect_ip四个配置
   ! Configuration File for keepalived

#主要配置故障发生时的通知对象及机器标识
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL-2                   #主机标识符,唯一即可
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#用来界说对外提供服务的VIP地区及相关属性
vrrp_instance VI_1 {
    state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考
    interface ens33                 #指定HA监听的网络接口,刚才ifconfig检察的接口名称
    virtual_router_id 151            #假造路由标识,取值0-255,master-1和master-2保持一致
    priority 40                      #优先级,用来选举master,取值范围1-255
    advert_int 1                     #发VRRP包时间隔断,即多久举行一次master选举
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {              #假造出来的地点
        192.168.1.82
    }
}

#假造服务器界说
virtual_server 192.168.1.82 3306 { #假造出来的地点加端口
    delay_loop 2                     #设置运行环境检查时间,单元为秒
    lb_algo rr                       #设置后端调治器算法,rr为轮询算法
    lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选
    persistence_timeout 50           #会话保持时间,单元为秒
    protocol TCP                     #指定转发协议,有 TCP和UDP可选

        real_server 192.168.1.81 3306 {          #实际本地ip+3306端口
       weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大
        #当该ip 端口连接非常时,执行该脚本
        notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本
        TCP_CHECK {
            #实际物理机ip地点
            connect_ip 192.168.1.81
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3

        }
    }
}
 
  3.3.8启动服务 (两个节点步骤相同,下面就写一份)

   [root@skymachine keepalived]# systemctl start keepalived
[root@skymachine keepalived]# systemctl status keepalived
systemctl enable keepalived #开机启动,根据需求设置
  
 
 3.3.9配置假造ip登任命户(两个节点步骤相同,下面就写一份)

在两台服务器上新建用户以验证keepalived服务是否配置成功
   useradd -m keepalived
passwd keepalived
Qwe135.
  
 
 
3.3.10测试keepalived服务

启动后相称于假造出一个vip 192.168.15.100,用ssh工具连接服务器,输入ip和用户名及密码,登录至假造ip上

 连接进去使用ifconfig,可以看到假造vip实际上使用的实体服务器是master-1(192.168.1.80)服务器。
 
将master-1(192.168.1.80)服务器的keepalived应用制止,vip192.168.1.82服务器会断线,重新连接,再次检察192.168.1.82服务ifconfig,可以看到,192.168.1.82服务器自动将实体机ip漂移到了master-2(192.168.1.81)服务器上
master-1
   [root@centos7 keepalived]# systemctl stop keepalived 
  
 
 开启master-1的keepalived vip自动飘过来了

3.4mysql双主双活+keepalived高可用整体测试

3.4.1启动服务

将master-1、master-2两台服务器mysql、keepalived应用全部启动,然后新建一个用户,配置权限可以外网访问
  1. mysql> CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8m                                                                                 b4_general_ci;
  2. Query OK, 1 row affected (0.02 sec)
  3. mysql> show databases;
  4. +--------------------+
  5. | Database           |
  6. +--------------------+
  7. | information_schema |
  8. | mydb               |
  9. | mysql              |
  10. | performance_schema |
  11. | sys                |
  12. | test               |
  13. +--------------------+
  14. 6 rows in set (0.01 sec)
  15. mysql> create user 'user01'@'%' identified by 'Mysql12#$';
  16. Query OK, 0 rows affected (0.03 sec)
  17. mysql> grant all privileges on 'mydb'.* to 'user01'@'%';
  18. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that                                                                                  corresponds to your MySQL server version for the right syntax to use near ''my                                                                                 db'.* to 'user01'@'%'' at line 1
  19. mysql> grant all privileges on `mydb`.* to 'user01'@'%';
  20. Query OK, 0 rows affected (0.02 sec)
  21. mysql> flush privileges;
  22. Query OK, 0 rows affected (0.01 sec)
  23. mysql> select user,host from mysql.user;
  24. +------------------+-----------+
  25. | user             | host      |
  26. +------------------+-----------+
  27. | test             | %         |
  28. | user01           | %         |
  29. | mysql.infoschema | localhost |
  30. | mysql.session    | localhost |
  31. | mysql.sys        | localhost |
  32. | root             | localhost |
  33. +------------------+-----------+
  34. 6 rows in set (0.01 sec)
复制代码
3.4.2连接keepalived假造服务器 

 用mysql连接工具连接keepalived假造出来的192.168.1.82服务器



3.4.3建立测试数据


3.4.4检察master-1、master-2同步环境

 
3.4.5检察192.168.1.82服务器实际物理机ip

 使用ifconfig命令检察实际使用的物理机为192.168.1.80,以是master-1(192.168.1.80)服务器mysql为主数据库。
 
3.4.6制止物理机mysql服务

 此时手动将master-1服务器mysql制止,keepalived检测到192.168.1.80服务3306端口连接失败,会执行/etc/keepalived/shutdown.sh脚本,将192.168.1.80服务器keepalived应用竣事
  1. mysql> shutdown;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> exit
  4. Bye
  5. [mysql@centos7 ~]$ mysql -uroot -p
  6. Enter password:
  7. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/3306/data/mysql.sock' (2)
复制代码
3.4.7检察漂移ip执行环境

此时再连接192.168.1.82服务下,ifconfig检察,发现已经实际将物理机由master-1(192.168.1.80)到master-2(192.168.1.81)服务器上

3.4.8在新的主服务器插入数据举行测试

再使用mysql连接工具连接192.168.1.82的mysql,插入一条数据,测试是否将数据存入master-2(192.168.1.81)服务器mysql中

3.4.9检察新主服务器数据

检察master-2服务器mysql数据,数据已同步,阐明keepalived搭建高可用成功,当master-1服务器mysql出现问题后keepalived自动漂移IP到实体机master-2服务器上,从而使master-2服务器mysql作为主数据库。

3.4.10重启master-1服务,检察数据同步环境(重启之后,vip会自动飘到master-1节点)

  1. [mysql@centos7 ~]$ mysql -uroot -p
  2. Enter password:
  3. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/3306/data/mysql.sock' (2)
  4. [mysql@centos7 ~]$ mysqld_safe --defaults-file=/etc/my.cnf &
  5. [2] 11910
  6. [1]   Exit 127                mysql_safe --defaults-file=/etc/my.cnf
  7. [mysql@centos7 ~]$ 2024-05-22T05:19:42.269350Z mysqld_safe Logging to '/data/mysql/3306/data/mysqld.err'.
  8. 2024-05-22T05:19:42.427430Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/3306/data
  9. ^C
  10. [mysql@centos7 ~]$ mysql -uroot -p
  11. Enter password:
  12. Welcome to the MySQL monitor.  Commands end with ; or \g.
  13. Your MySQL connection id is 10
  14. Server version: 8.0.25 MySQL Community Server - GPL
  15. Copyright (c) 2000, 2021, Oracle and/or its affiliates.
  16. Oracle is a registered trademark of Oracle Corporation and/or its
  17. affiliates. Other names may be trademarks of their respective
  18. owners.
  19. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  20. mysql> select 1+2 from dual;
  21. +-----+
  22. | 1+2 |
  23. +-----+
  24. |   3 |
  25. +-----+
  26. 1 row in set (0.00 sec)
复制代码

检察master-1数据库test2表数据,数据已同步成功。 


至此,双主双活+keepalived高可用摆设并测试完成。
四、总结

1、 接纳keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,制止因为不测环境下相互抢占导致两个节点内写入相同的数据而引发辩论;
2、 把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(字增起始值)设置成差别值,其目的是为了制止master节点不测宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原master上辩论,因此一开始就错开;
3、 Slave节点服务器配置不要太差,否则更容易导致复制延迟,作为热备节点的slave服务器,硬件配置不能低于master节点;
假如对延迟很敏感的话,可考虑使用MariaDB分支版本,利用多线程复制的方式可以很大降低复制延迟。
参考文章
Mysql8高可用之双主+keepalived_mysql keepalived-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表