千亿级数据平滑扩容之MySQL+Keepalived数据库双主同步与高可用实现

1. 扩容之前的部署架构
为便于测试,这里假设有两台数据库节点Server1和Server2。

2. MariaDB服务安装
切换阿里云镜像服务(YUM安装过慢可以切换)
yum install -y wget
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache

配置YUM源
vim /etc/yum.repos.d/mariadb-10.2.repo
[mariadb]
name = MariaDB
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

执行安装
yum -y install mariadb mariadb-server MariaDB-client MariaDB-common

如果之前已经安装,需要先删除(如果之前没有安装, 可以忽略此步骤)
停止Mariadb服务
[root@localhost yum.repos.d]# ps -elf | grep -v grep | grep mysql
root 1954 1 0 Oct04 ? 00:05:43 /usr/sbin/mysqld --wsrep-new-cluster --user=root
[root@localhost yum.repos.d]# kill 1954

卸载Mariadb服务
yum -y remove Mariadb

删除数据与配置:
rm -rf /var/lib/mysql/*
rm -rf /etc/my.cnf.d/
rm -rf /etc/my.cnf

初始化配置
systemctl start mariadb
mysql_secure_installation

开启用户远程连接权限
将连接用户root开启远程连接权限;
mysql -h127.0.0.1 -u root -p mysql

进入MySQL服务,执行以下操作:
use mysql;
delete from user;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysql' WITH GRANT OPTION;
FLUSH PRIVILEGES;

3. MariaDB双主同步
在Server1增加配置:
在/etc/my.cnf中添加以下配置:

vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
log-slave-updates=on
slave-skip-errors=all
auto-increment-offset=1
auto-increment-increment=2
binlog_format=mixed
expire_logs_days=10
注意,Server1自增为奇数位:
auto-increment-offset=1 主键自增基数,从1开始。
auto-increment-increment=2 主键自增偏移量每次为2。

在Server2增加配置:
修改/etc/my.cnf:
[mysqld]
server-id = 2
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
log-slave-updates=on
slave-skip-errors=all
auto-increment-offset=2
auto-increment-increment=2
binlog_format=mixed
expire_logs_days=10
Server2自增为偶数位:
auto-increment-offset=2 主键自增基数,从2开始。
auto-increment-increment=2 主键自增偏移量每次为2。
配置修改完成后,重启数据库。

systemctl restart mysqld

同步授权配置
在Server1创建repl用于主从同步的用户:
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repl'@'%' identified by 'mysql';
mysql> flush privileges;

查询日志文件与偏移量,开启同步时需使用:
MariaDB [(none)]> show master status;

同样,在Server2创建repl用于主从同步的用户:
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repl'@'%' identified by 'mysql';
mysql> flush privileges;

查询日志文件与偏移量:
MariaDB [(none)]> show master status;

配置主从同步信息
在Server1中执行:
MariaDB [(none)]> change master to master_host='10.10.20.126',master_user='repl',master_password='mysql',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=663,master_connect_retry=30;

在Server2中执行:
MariaDB [(none)]> change master to master_host='10.10.20.125',master_user='repl',master_password='mysql',master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=663,master_connect_retry=30;

开启双主同步
在Server1和Server2中分别执行:
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

在Server1查询同步信息:
MariaDB [(none)]> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.20.126
Master_User: replica
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 663
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

在Server2查询同步信息:
MariaDB [(none)]> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.20.125
Master_User: replica
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 663
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Slave_IO_Running和Slave_SQL_Running 都是Yes,说明双主同步配置成功。

4. KeepAlived安装与高可用配置
在Server1与Server2两台节点安装keepalived:
yum -y install keepalived

关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

设置主机名称:
Server1节点:
hostnamectl set-hostname vip1

Server2节点:
hostnamectl set-hostname vip2

Server1节点配置
vim /etc/keepalived/keepalived.conf:
global_defs {
router_id vip1 # 机器标识,和主机名保持一致
}
vrrp_instance VI_1 { #vrrp实例定义
state BACKUP #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
interface ens33 #绑定对外访问的网卡
virtual_router_id 111 #虚拟路由标示,同一个vrrp实例采用唯一标示
priority 100 #优先级,100代表最大优先级, 数字越大优先级越高
advert_int 1 #master与backup节点同步检查的时间间隔,单位是秒
authentication { #设置验证信息
auth_type PASS #有PASS和AH两种
auth_pass 6666 #验证密码,BACKUP密码须相同
}
virtual_ipaddress { #KeepAlived虚拟的IP地址
10.10.20.130
}
}
virtual_server 10.10.20.130 3306 { #配置虚拟服务器IP与访问端口
delay_loop 6 #健康检查时间
lb_algo rr #负载均衡调度算法, rr代表轮询
lb_kind DR #负载均衡转发规则
persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
protocol TCP #转发协议类型,支持TCP和UDP
real_server 10.10.20.125 3306 { #配置服务器节点VIP1
notify_down /usr/local/shell/mariadb.sh #当服务挂掉时, 会执行此脚本,结束keepalived进程
weight 1 #设置权重,越大权重越高
TCP_CHECK { #r状态监测设置
connect_timeout 10 #超时配置, 单位秒
retry 3 #重试次数
delay_before_retry 3 #重试间隔
connect_port 3306 #连接端口, 和上面保持一致
}
}

}

创建关闭脚本mariadb.sh
vim /usr/local/shell/mariadb.sh
pkill keepalived

加入执行权限:
chmod a+x mariadb.sh

Server2节点配置:
global_defs {
router_id vip2 # 机器标识,和主机名保持一致
}
vrrp_instance VI_1 { #vrrp实例定义
state BACKUP #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
interface ens33 #绑定对外访问的网卡
virtual_router_id 111 #虚拟路由标示,同一个vrrp实例采用唯一标示
priority 98 #优先级,100代表最大优先级, 数字越大优先级越高
advert_int 1 #master与backup节点同步检查的时间间隔,单位是秒
authentication { #设置验证信息
auth_type PASS #有PASS和AH两种
auth_pass 6666 #验证密码,BACKUP密码须相同
}
virtual_ipaddress { #KeepAlived虚拟的IP地址
10.10.20.130
}
}
virtual_server 10.10.20.130 3306 { #配置虚拟服务器IP与访问端口
delay_loop 6 #健康检查时间
lb_algo rr #负载均衡调度算法, rr代表轮询, 可以关闭
lb_kind DR #负载均衡转发规则, 可以关闭
persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
protocol TCP #转发协议类型,支持TCP和UDP
real_server 10.10.20.126 3306{ #配置服务器节点VIP2
notify_down /usr/local/shell/mariadb.sh #当服务挂掉时, 会执行此脚本,结束keepalived进程
weight 1 #设置权重,越大权重越高
TCP_CHECK { #r状态监测设置
connect_timeout 10 #超时配置, 单位秒
retry 3 #重试次数
delay_before_retry 3 #重试间隔
connect_port 3306 #连接端口, 和上面保持一致
}
}

}
和Server1的差异项:
router_id vip2 # 机器标识,和主机名保持一致
priority 98 #优先级,100代表最大优先级, 数字越大优先级越高
real_server 10.10.20.126 3306 #配置服务器节点VIP2
注意, 两台节点都设为BACKUP
virtual_router_id 111 #同一个vrrp实例采用唯一标示
state BACKUP
如果不想重启后, 争夺备用节点的VIP, 可以设置此项
nopreempt #不主动抢占资源

验证高可用
停止主节点MariaDB服务,验证是否能够实现自动切换。

原文地址:https://www.cnblogs.com/OrcinusOrca/p/14746446.html