电子商务网站设计的基本要求,wordpress 相关文章 插件,百度点击软件,辽宁省建设厅安全员考试官方网站一、介绍
利用keepalived实现Mysql数据库的高可用#xff0c;KeepalivedMysql双主来实现MYSQL-HA#xff0c;两台Mysql数据库的数据保持完全一致#xff0c;实现方法是两台Mysql互为主从关系#xff0c;通过keepalived配置VIP#xff0c;实现当其中的一台Mysql数据库宕机…一、介绍
利用keepalived实现Mysql数据库的高可用KeepalivedMysql双主来实现MYSQL-HA两台Mysql数据库的数据保持完全一致实现方法是两台Mysql互为主从关系通过keepalived配置VIP实现当其中的一台Mysql数据库宕机后应用能够自动切换到另外一台Mysql数据库上去保证系统的高可用。
二、搭建前准备
mysql8.0.25keepalivedkeepalibed-2.2.8Mysql-master-1192.168.1.80Mysql-master-2192.168.1.81Mysql——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-binmysql-bin #开启主从binlog二进制日志主库必须开启 binlog_formatmixed #指定二进制日志格式为mixed即在语句和行两种模式之间自动切换 server-id1 #配置server-id唯一标识主机必须与从库不一致 relay-logrelay-bin #指定中继日志文件的名称为relay-bin用于在主从复制中传输数据 relay-log-indexslave-relay-bin.index #指定中继日志索引文件的名称用于记录中继日志文件的位置。 auto_increment_increment2 #指定自增长ID的增量为2用于在主从复制中避免ID冲突。 auto_increment_offset1 #指定自增长ID的起始值为1用于在主从复制中避免ID冲突。 ##保存退出并重启MySQL服务 [rootskymachine ~]# service mysql restart Shutting down MySQL.. SUCCESS! Starting MySQL.. SUCCESS! 3.2.2修改master-2配置文件 vi /etc/my.cnf [mysqld] log-binmysql-bin #开启主从binlog二进制日志主库必须开启 binlog_formatmixed #指定二进制日志格式为mixed即在语句和行两种模式之间自动切换 server-id2 #配置server-id唯一标识主机必须与从库不一致 relay-logrelay-bin #指定中继日志文件的名称为relay-bin用于在主从复制中传输数据 relay-log-indexslave-relay-bin.index #指定中继日志索引文件的名称用于记录中继日志文件的位置。 auto_increment_increment2 #指定自增长ID的增量为2用于在主从复制中避免ID冲突。 auto_increment_offset2 #指定自增长ID的起始值为2用于在主从复制中避免ID冲突。 ##保存退出并重启MySQL服务 [rootskymachine ~]# 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_host192.168.1.81,master_usertest,master_passwordtest123,master_log_filemysql-bin.000001,master_log_pos870,get_master_public_key1; start slave; 如上图io和 sql线程都为yes即成功
master-1 show master status; 记录file和positionmaster-2会用到 master-2 change master to master_host192.168.1.80,master_usertest,master_passwordtest123,master_log_filemysql-bin.000001,master_log_pos871,get_master_public_key1; 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_COUNTER1;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_POS106; START SLAVE; 从指定位置重新同步 3.3keepalived安装部署
在master-1master-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将文件复制到对应目录下两个节点步骤相同下面就写一份 [root128 keepalived-2.2.7]# mkdir /etc/keepalived [root128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf [root128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/ [root128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root128 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 将执行权限设置为可执行 [rootskymachine keepalived]# chmod x /etc/keepalived/shutdown.sh 3.3.5ifconfig查看网卡名称
master-1master-2网卡名称为ens33 3.3.6 修改master-1服务器keepalived配置文件配置文件两个机器不同3.3.7是master-2的配置
把原有的keepalived.conf更名为keepalived_bak.conf然后新建keepalived.conf配置文件 cd /etc/keepalived/ [rootskymachine keepalived]# ll 总用量 4 -rw-r--r-- 1 root root 3550 6月 27 09:34 keepalived.conf [rootskymachine keepalived]# mv keepalived.conf keepalived_bak.conf [rootskymachine keepalived]# ll 总用量 4 -rw-r--r-- 1 root root 3550 6月 27 09:34 keepalived_bak.conf [rootskymachine keepalived]# vi /etc/keepalived/keepalived.conf 将以下内容复制进去 ! Configuration File for keepalived #主要配置故障发生时的通知对象及机器标识 global_defs { notification_email { acassenfirewall.loc failoverfirewall.loc sysadminfirewall.loc } notification_email_from Alexandre.Cassenfirewall.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-255master-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 { #实际本地ip3306端口 weight5 #表示服务器的权重值。权重值越高服务器在负载均衡中被选中的概率就越大 #当该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 { acassenfirewall.loc failoverfirewall.loc sysadminfirewall.loc } notification_email_from Alexandre.Cassenfirewall.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-255master-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 { #实际本地ip3306端口 weight5 #表示服务器的权重值。权重值越高服务器在负载均衡中被选中的概率就越大 #当该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启动服务 两个节点步骤相同下面就写一份 [rootskymachine keepalived]# systemctl start keepalived [rootskymachine 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-1192.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 [rootcentos7 keepalived]# systemctl stop keepalived 开启master-1的keepalived vip自动飘过来了 3.4mysql双主双活keepalived高可用整体测试
3.4.1启动服务
将master-1、master-2两台服务器mysql、keepalived应用全部启动然后新建一个用户配置权限可以外网访问
mysql CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8m b4_general_ci;
Query OK, 1 row affected (0.02 sec)mysql show databases;
--------------------
| Database |
--------------------
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
| test |
--------------------
6 rows in set (0.01 sec)mysql create user user01% identified by Mysql12#$;
Query OK, 0 rows affected (0.03 sec)mysql grant all privileges on mydb.* to user01%;
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
mysql grant all privileges on mydb.* to user01%;
Query OK, 0 rows affected (0.02 sec)mysql flush privileges;
Query OK, 0 rows affected (0.01 sec)mysql select user,host from mysql.user;
-----------------------------
| user | host |
-----------------------------
| test | % |
| user01 | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
-----------------------------
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应用结束
mysql shutdown;
Query OK, 0 rows affected (0.00 sec)mysql exit
Bye
[mysqlcentos7 ~]$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Cant 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节点
[mysqlcentos7 ~]$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql/3306/data/mysql.sock (2)
[mysqlcentos7 ~]$ mysqld_safe --defaults-file/etc/my.cnf
[2] 11910
[1] Exit 127 mysql_safe --defaults-file/etc/my.cnf
[mysqlcentos7 ~]$ 2024-05-22T05:19:42.269350Z mysqld_safe Logging to /data/mysql/3306/data/mysqld.err.
2024-05-22T05:19:42.427430Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/3306/data
^C
[mysqlcentos7 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.25 MySQL Community Server - GPLCopyright (c) 2000, 2021, Oracle and/or its affiliates.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 select 12 from dual;
-----
| 12 |
-----
| 3 |
-----
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博客