前言
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障,本次是基于Docker容器部署MySQL高可用双主+Keepalived。
🚀 1.Keepalived简介
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。
Keepalived高可用故障切换,是通过VRRP虚拟路由器冗余协议来实现的
一般中小型公司都使用这种架构,搭建比较方便简单;可以采用主从或者主主模式,
在 master 节点发生故障后,利用keepalived 高可用机制实现快速切换到 slave 节点。
原来的从库变成新的主库。
使用 Keepalived 的 HA 功能,实现 MySQL 主从复制的自动故障切换。
它的工作原理是:初始将 MySQL 的主从两个主机赋予不同的优先级别,
当 Keepalived 启动时,会将 VIP 绑定到高优先级的主库上。
在 Keepalived 中调用自定义脚本 check_run,每分钟检查一次本机 MySQL 的服务器状态,
如果 MySQL 不可用,则杀掉本机的 keepalived 进程。
Keepalived 每秒钟会检查一次本机的 keepalived 进程,如果进程不存在,则将 VIP 绑定到另一台机器上,
如果这台机器原来是从库,则同时调用master.sh 脚本执行从库切换为主库的操作。
🚩 与主从复制相比,双主复制需要注意以下三个参数的设置:
1.log_slave_updates:要设置为 true,将复制事件写入本机 binlog。
一台服务器既做主库又做从库时此选项必须要开启。
2.auto_increment_offset 和 auto_increment_increment:为避免自增列冲突,需要设置这两个参数,例如在双主复制中,可以配置如下:
masterA 自增长 ID
auto_increment_offset=1
auto_increment_increment=2 #奇数 ID
masterB 自增加 ID
auto_increment_offset=2
auto_increment_increment=2 #偶数 ID
🚀 2.双主部署
🌈 2.1 容器部署
🚩 Master1
docker run -d --name MMK-JEM-Master1-ip31
-h MMK-JEM-Master1-ip31
–network mhajem --ip 192.168.68.31 --privileged=true
-p 33461:3306 -p 2241:22
centos:8.2 init
🚩 Master2
docker run -d --name MMK-JEM-Master2-ip32
-h MMK-JEM-Master2-ip32
–network mhajem --ip 192.168.68.32 --privileged=true
-p 33462:3306 -p 2242:22
centos:8.2 init
🚩 网络创建
docker network create --subnet=192.168.68.0/16 mhajem
docker network inspect mhajem
docker network connect bridge MMK-JEM-Master1-ip31
docker network connect bridge MMK-JEM-Master2-ip32
🌈 2.2 部署MySQL
mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz
📢📢拷贝安装包到容器
docker cp mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz MMK-JEM-Master1-ip31:/
docker cp mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz MMK-JEM-Master2-ip32:/
📢📢进入容器
docker exec -it MMK-JEM-Master1-ip31 /bin/bash
docker exec -it MMK-JEM-Master2-ip32 /bin/bash
📢📢组及用户创建
groupadd mysql
useradd -r -g mysql mysql
📢📢压缩及创建快捷方式
tar -xf mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
ln -s /usr/local/mysql-8.0.19-linux-glibc2.12-x86_64 /usr/local/mysql
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/mysql /usr/bin/mysql
📢📢环境变量及初始化
echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/bashrc
source /etc/bashrc
chown -R mysql.mysql /usr/local/mysql-8.0.19-linux-glibc2.12-x86_64
📢📢初始化MySQL
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
📢📢yum安装依赖包
yum install -y net-tools
yum install -y libtinfo*
yum -y install numactl
yum -y install libaio*
yum -y install perl perl-devel
yum -y install autoconf
yum -y install numactl.x86_64
🌈 2.3 参数文件
🚩 Master1参数文件
cat>/etc/my.cnf<<“EOF”
#M1
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id=330631
log-bin=
binlog_format=STATEMENT
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
log-slave-updates
auto-increment-increment=2
auto-increment-offset=1
skip_name_resolve
log_timestamps=SYSTEM
default-time-zone=’+8:00’
gtid-mode=ON
enforce-gtid-consistency=on
EOF
🚩 Master2参数文件
cat>/etc/my.cnf<<“EOF”
#M2
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id=330632
log-bin=
binlog_format=STATEMENT
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
log-slave-updates
auto-increment-increment=2
auto-increment-offset=2
skip_name_resolve
log_timestamps=SYSTEM
default-time-zone=’+8:00’
gtid-mode=ON
enforce-gtid-consistency=ON
EOF
🌈 2.4 创建用户
##2个主库都创建
mysql> create user repl@’%’ identified with mysql_native_password by ‘root’;
mysql> grant all on . to repl@’%’ with grant option;
mysql> flush privileges;
show master status\G;
--M2 change master to master_host='192.168.68.31', master_port=3306, master_user='repl', master_password='root', master_auto_position=1; start slave; show slave status\G; --M1 change masterto master_host='192.168.68.32', master_port=3306, master_user='repl', master_password='root', master_auto_position=1; start slave; show slave status\G; 测试数据 --主库 create database jemdb; use jemdb; create table jemdb.mytb1(id int,name varchar(30)); SET SESSION binlog_format='STATEMENT'; insert into jemdb.mytb1 values(2,@@hostname); select * from jemdb.mytb1; create database jemdb2; use jemdb2; create table jemdb2.mytb2(id int,name varchar(30)); SET SESSION binlog_format='STATEMENT'; insert into jemdb2.mytb2 values(2,@@hostname); select * from jemdb2.mytb2;
🚀 3.配置 keepalived
🚩 master1 和 master2 两台机器上同样进行如下操作:
yum install -y keepalived
– M1 和 M2 机器上的 keepalived.conf 配置,如果需要设置不同的优先级,那么需要修改 state 和 priority 的值。
cat > /etc/keepalived/keepalived.conf << “EOF”
! Configuration File for keepalived
global_defs {
router_id MySQL-MM-HA
}
vrrp_script chk_mysql_port { #检测 mysql 服务是否在运行。有很多方式,比如进程,用脚本检测等等
script “/etc/keepalived/chk_mysql.sh” #这里通过脚本监测
interval 2 #脚本执行间隔,每 2s 检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非 0)则优先级 -5
fall 2 #检测连续 2 次失败才算确定是真失败,会用 weight 减少优先级(1-255 之间)
rise 1 #检测 1 次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state BACKUP #建议设置为 BACKUP
interface eth1 #指定虚拟 ip 的网卡接口
virtual_router_id 51 #路由器标识,MASTER 和 BACKUP 必须是一致的才能保证是同一套系统
priority 100 #定义优先级,数字越大,优先级越高,在同一个 vrrp_instance 下,MASTER 的优先级必须大于 BACKUP 的优先级。这样 MASTER 故障恢复后,就可以
将 VIP 资源再次抢回来
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.68.36
}
track_script {
chk_mysql_port
}
}
EOF
🚩 配置参数文件
cat > /etc/keepalived/chk_mysql.sh << "EOF" #!/bin/bash counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${counter}" -eq 0 ]; then systemctl stop keepalived fi EOF chmod 755 /etc/keepalived/chk_mysql.sh systemctl start keepalived systemctl enable keepalived
🚩 数据校验
mysql -uroot -proot -h192.168.68.36 -P3306
select @@server_id,@@hostname;
create database jemdb3;
use jemdb3;
create table jemdb3.mytb1(id int,name varchar(30));
SET session binlog_format = ‘STATEMENT’;
insert into jemdb3.mytb1 values(1,@@hostname);
select * from jemdb3.mytb1;
此时如果主库挂了,另外一个主库会继续工作
MySQL从入门到精通
https://blog.csdn.net/weixin_41645135/category_11595820.html