两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;
masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;
两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务);
建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式)。
这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力。
1)环境
两台安装好mysql的服务器(yum安装比较快且方便),关闭防火墙,关闭selinux。
systemctl stop firewalld(临时关闭)
setenforce 0(临时关闭)
2)我的主机地址
mysql1:192.168.44.131
mysql2:192.168.44.133
虚拟ip:192.168.44.199
mysql1配置
在/etc/my.cnf新增以下内容:
[mysqld]
#作为主从复制的唯一标识,集群中,不能重复
server-id = 1
#开启二进制日志
log-bin = master-log
#开启中继日志
relay-log = slave-log
auto_increment_offset = 1
auto_increment_increment = 2
注:auto_increment_offset确定AUTO_INCREMENT列值的起点,也就是初始值。
auto_increment_increment控制列中的值的增量值,也就是步长。
mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。
在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,而要把auto_increment_offset分别配置为1和2。
mysql2配置
[mysqld]
#作为主从复制的唯一标识,集群中,不能重复
server-id = 2
#开启二进制日志
log-bin = master-log
#开启中继日志
relay-log = slave-log
auto_increment_offset = 2
auto_increment_increment = 2
重启mysql服务
systemctl restart mysqld
mysql1为主,mysql为从配置
进入mysql1数据库创建同步账号并赋予权限:
mysql> create user zjf@192.168.44.% identified by 123456;
mysql> grant replication slave on *.* to zjf@192.168.44.%;
mysql> show master status;
进入mysql2数据库执行以下语句:
#log_file和log_pos的数据是mariad1上show master status得到的数据。
mysql> change master to master_host=192.168.44.131,
master_user=zjf, master_password=123456,
master_log_file=master-log.000001, master_log_pos=441;
开启主从:
mysql> start slave;
mysql> show slave statusG;
mysql2为主,mysql1为从配置
进入mysql2数据库创建同步账号并赋予权限:
mysql> create user zjf@192.168.44.% identified by 123456;
mysql> grant replication slave on *.* to zjf@192.168.44.%;
show master status;
进入mysql2数据库执行以下语句:
#log_file和log_pos的数据是mariad1上show master status得到的数据。
mysql> change master to master_host=192.168.44.131,
master_user=zjf, master_password=123456,
master_log_file=master-log.000004, master_log_pos=441;
开启主从:
mysql> start slave;
mysql> show slave statusG;
至此, 主主同步复制配置完成!!!
在mysql1创建一个库test1:
Create database test1
mysql1和mysql2都有。
Show databases;
在mysql2创建一个库test2:
Create database test2
Mysql1和msql2都有。
Show databases;
主主同步复制配置便测试成功。
8.1 Mysql1和MySQL2都安装keepalived
yum -y install keepalived
8.2 mysql1的/etc/keepalived/keepalived.conf配置
! configuration File for keepalived
global_defs {
router_id mysql-01 #主机标示符,不一定要用主机名,默认值取主机名
}
vrrp_instance VI_1 {
state BACKUP #非抢占模式两台服务器都为BACKUP
interface ens33 #根据机器的ifconfig来定,vip要绑定的网卡
virtual_router_id 50 #虚拟路由ID,俩节点保持一致 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同
priority 100 #主节点的优先级(1-254),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
nopreempt #不抢占vip资源,防止故障节点恢复后因为优先级高导致vip再次飘移
authentication { #设置验证信息,两个节点必须一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟ip,两个节点必须一致
192.168.44.199
}
}
#虚拟主机是可选部分,主要用来配置负载均衡。这里可以绑定端口
virtual_server 192.168.44.199 3306 { #绑定端口为3306,0代表所有端口
delay_loop 2
lb_algo rr ##负载均衡轮训算法,详见官方文档
lb_kind DR #路由模式,同网段DR,不同网段NAT
persistence_timeout 50
protocol TCP
real_server 192.168.44.131 3306 {
weight 3
notify_down /etc/keepalived/bin/killkeepalived.sh
notify_down /etc/keepalived/bin/mysql_check.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
8.3 mysql2的/etc/keepalived/keepalived.conf配置
! configuration File for keepalived
global_defs {
router_id mysql-02 #主机标示符,不一定要用主机名,默认值取主机名
}
vrrp_instance VI_1 {
state BACKUP #非抢占模式两台服务器都为BACKUP
interface ens33 #根据机器的ifconfig来定,vip要绑定的网卡
virtual_router_id 50 #虚拟路由ID,俩节点保持一致 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同
priority 50 #主节点的优先级(1-254),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
nopreempt #不抢占vip资源,防止故障节点恢复后因为优先级高导致vip再次飘移
authentication { #设置验证信息,两个节点必须一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟ip,两个节点必须一致
192.168.44.199
}
}
#虚拟主机是可选部分,主要用来配置负载均衡。这里可以绑定端口
virtual_server 192.168.44.199 3306 { #绑定端口为3306,0代表所有端口
delay_loop 2
lb_algo rr ##负载均衡轮训算法,详见官方文档
lb_kind DR #路由模式,同网段DR,不同网段NAT
persistence_timeout 50
protocol TCP
real_server 192.168.44.133 3306 {
weight 3
notify_down /etc/keepalived/bin/killkeepalived.sh
notify_down /etc/keepalived/bin/mysql_check.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
8.4 脚本
在两台服务器上编写两个脚本,就在keepalived配置文件指定的地方创建notify_down,当Mysql和keepalived 出现问题的时候会触发此脚本,用于关掉本机的keepalived进程,之后才能进行切换到另外一个节点上去,并且授予执行权限+x。
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
8.5 结果
启动两台服务器的keepalived,可以看到一台服务器有虚拟ip,另一台没有。
8.6 测试
停掉有虚拟ip的那台主机的keepalived,虚拟ip会跑到另一台主机上,且配置了不抢占规则,即使恢复服务,ip也不会漂移回去。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129469.html
摘要:双主是一个比较简单的高可用架构,适用于中小集群,今天就说说怎么用做的高可用。缺点也比较明显,就是增加从节点的情况下,从节点不会主动切换同步对象,而且脚本需要自己实现,有一定风险。 双主 + keepalived 是一个比较简单的 MySQL 高可用架构,适用于中小 MySQL 集群,今天就说说怎么用 keepalived 做 MySQL 的高可用。 1 概述 1.1 keepalive...
摘要:双主是一个比较简单的高可用架构,适用于中小集群,今天就说说怎么用做的高可用。缺点也比较明显,就是增加从节点的情况下,从节点不会主动切换同步对象,而且脚本需要自己实现,有一定风险。 双主 + keepalived 是一个比较简单的 MySQL 高可用架构,适用于中小 MySQL 集群,今天就说说怎么用 keepalived 做 MySQL 的高可用。 1 概述 1.1 keepalive...
MySQL高可用方案测试 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margin...
阅读 1346·2023-01-11 13:20
阅读 1684·2023-01-11 13:20
阅读 1132·2023-01-11 13:20
阅读 1858·2023-01-11 13:20
阅读 4100·2023-01-11 13:20
阅读 2704·2023-01-11 13:20
阅读 1385·2023-01-11 13:20
阅读 3597·2023-01-11 13:20