点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!
01
MySQL双主(主主)架构方案思路
两台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
02
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。
03
mysql2配置
[mysqld]
#作为主从复制的唯一标识,集群中,不能重复
server-id = 2
#开启二进制日志
log-bin = master-log
#开启中继日志
relay-log = slave-log
auto_increment_offset = 2
auto_increment_increment = 2复制
04
重启mysql服务
systemctl restart mysqld
复制
05
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 status\G;
复制
06
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 status\G;
复制
至此, 主主同步复制配置完成!!!
07
在mysql1创建一个库test1:
Create database test1
复制
mysql1和mysql2都有。
Show databases;
复制
在mysql2创建一个库test2:
Create database test2
复制
Mysql1和msql2都有。
Show databases;
复制
主主同步复制配置便测试成功。
08
keepalived高可用
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也不会漂移回去。
