目录
1,项目介绍
本项目采用的是MM(双主复制)+Keepalived方案来构建一个高可用MySQL集群,加了一台slave做延时备份,并使用mysqlrouter实现读写分离。双主复制配合keepalived的vip飘逸能快速的fileover。slave服务器可以按照业务需求适当增添。为了消除mysqlrouter服务的单点故障,使用了两台服务器来做读写分离。此方案有效地提高了MySQL服务的性能和可靠性。
2,项目环境
操作系统 | 主机名 | ip | 软件1 | 软件2 |
---|---|---|---|---|
CentOS 7.9.2009 | master01 | 192.168.220.3 | MySQL5.7.38 | keepalived1.3.5 |
CentOS 7.9.2009 | master02 | 192.168.220.4 | MySQL5.7.38 | keepalived1.3.5 |
CentOS 7.9.2009 | slave01 | 192.168.220.5 | MySQL5.7.38 | |
CentOS 7.9.2009 | mysqlrouter01 | 192.168.220.6 | mysqlrouter8.0.30 | keepalived1.3.5 |
CentOS 7.9.2009 | mysqlrouter01 | 192.168.220.7 | mysqlrouter8.0.30 | keepalived1.3.5 |
3 ,步骤
3.1 搭建双主
安装MySQL
在MySQL官网下载mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz二进制安装包。
然后进行安装。
附录:一键安装MySQL脚本
修改配置
1、配置master01
[root@master01 ~]# cat /etc/my.cnf
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
server-id=1
log_bin
gtid-mode=on
enforce-gtid-consistency
log_slave_updates=1
[mysql]
auto-rehash
prompt=\u@\d \R:\m mysql>
2、配置master02
[root@master02 ~]# cat /etc/my.cnf
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
log_bin
server-id=2
gtid-mode=on
enforce-gtid-consistency
log_slave_updates=1
[mysql]
auto-rehash
prompt=\u@\d \R:\m mysql>
- server-id:区分服务器,防止循环复制。
- log_bin:开启二进制日志
- gtid-mode=on:开启gtid模式
- enforce-gtid-consistency:强制要求只允许复制事务安全的事务。像create table … select 和 create temporary table语句,以及同时更新事务表和非事务表的SQL语句或事务都不允许复制执行。
- log_slave_updates=1:将复制过来的操作记录到自己的二进制日志中。
3、启动MySQL
systemctl start mysql
开启半同步功能
参考
安装半同步插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看已安装的插件
SHOW PLUGINS\G;
开启半同步功能。
第一种方法:在配置文件[mysqld]中添加两行。
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
第二种方法:运行以下sql语句
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
第二种方法重启MySQL服务后配置会丢失,推荐修改配置文件的方法。
查看半同步功能有没有开启
select @@rpl_semi_sync_master_enabled;
select @@rpl_semi_sync_slave_enabled;
要想半同步功能生效需要重启SLAVE IO_THREAD线程,当然此时我的SLAVE IO_THREAD线程还没开启,等配置完后再开启。
新建用户
master01
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'192.168.220.%' IDENTIFIED BY '123456';
master02开启复制功能将用户复制过来
start slave
配置同步信息
master01
change master to master_host='192.168.220.4',
master_port=3306,
master_user='repl',
master_password='123456',
master_auto_position=1;
start slave;
master02
stop slave;
change master to master_host='192.168.220.3',
master_port=3306,
master_user='repl',
master_password='123456',
master_auto_position=1;
start slave;
测试双主复制
分别在两台master上新建一张表,开有没有同步。
master01
master02
master01
安装配置keepalived
master01
yum install keepalived -y
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 2
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.220.101
}
}
systemctl start keepalived
master02
yum install keepalived -y
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 2
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.220.101
}
}
systemctl start keepalived
3.2添加一台用来延时备份的slave
修改配置
设置server_id和开启gtid模式
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
symbolic-links=0
pid-file=/var/run/mysqld/mysqld.pid
server-id=3
gtid-mode=on
enforce-gtid-consistency
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
配置同步信息
change master to master_host='192.168.220.3',
master_port=3306,
master_user='repl',
master_password='123456',
master_delay=60,
master_auto_position=1;
start slave;
master_delay=60单位为秒,根据实际需求设置
测试延时复制
3.3 搭建高可用的读写分离集群
安装配置mysqlrouter
在mysql官网下载
下载地址:https://dev.mysql.com/downloads/router/
安装:
rpm -ivh mysql-router-community-8.0.30-1.el7.x86_64.rpm
配置
[root@mysqlrouter01 ~]# cat /etc/mysqlrouter/mysqlrouter.conf
[routing:read_write]
bind_address = 0.0.0.0
bind_port = 7001
mode = read-write
destinations = 192.168.220.3:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9
[routing:read_only]
bind_address = 0.0.0.0
bind_port = 7002
mode = read-only
destinations = 192.168.220.4:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9
mysqlrouter01和mysqlrouter02都要安装
安装配置keepalived
mysqlrouter01
yum install keepalived -y
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.220.100
}
}
systemctl start keepalived
mysqlrouter02
yum install keepalived -y
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 1
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.220.100
}
}
systemctl start keepalived
读写分离测试
在windows中测试
4,总结
此项目涉及到了MySQL的多种技术、mysqlrouter和keepalived。mm+keepalived方案能在故障发生时能自动转移。mysqlrouter的读写分离是非强制性的,即可以使用只读的端口进行写操作。如果想实现硬性的读写分离,可以将只读端口下的MySQL服务器设置为只读。使用半同步复制时,如果slave超出rpl_semi_sync_master_timeout设置的时间(默认10秒)还没给出确认,就会使用异步复制。想往集群中添加mysql服务器时需要先将除还保存在二进制日志中的数据之前的数据导入新的mysql服务器中。
5,附录:MySQL安装脚本
bash install_mysql.sh rpm包名
# 密码默认为123456
#!/bin/bash
#解决软件的依赖关系和一些常用工具
s_lst="cmake ncurses-devel gcc gcc-c++ vim lsof bzip2 openssl-devel"
for software in $s_lst
do
rpm -qa | grep "^$software">/dev/null && echo "$software is installed" || yum install -y $software
done
# 解压
if [ -e /usr/local/mysql ];then
echo '/usr/local/mysql已存在'
else
filename=`echo $1|sed 's/.tar.gz//'`
echo "得到$filename"
if [ ! -e `echo $1|sed 's/.tar.gz//'` ];then
echo '解压中...'
tar xf $1
fi
echo '文件移动中...'
mv `echo $1|sed 's/.tar.gz//'` /usr/local/mysql
fi
#关闭firewalld防火墙服务,并且设置开机不要启动
service firewalld stop
systemctl disable firewalld
#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
#新建存放数据的目录
#先判断/data/mysql是否为已存在,如果存在且目录不为空就退出,
# 如果不存在就新建/data/mysql
datadir='/data/mysql'
if [ -e $datadir ];then
if ((`ls $datadir 2>/dev/null | wc -l`!=0));then
echo "$datadir存在且不为空"
exit
fi
else
mkdir $datadir
fi
# 给数据目录设置权限
# 建立用户和组
grep '^mysql' /etc/group && echo 'mysql组已存在' || groupadd mysql
id mysql && echo 'mysql用户已存在' || useradd -r -g mysql -s /bin/false mysql
#修改/data/mysql目录的权限归mysql用户和mysql组所有,这样mysql用户可以对这个文件夹进行读写了
chown mysql:mysql /data/mysql/
#只是允许mysql这个用户和mysql组可以访问,其他人都不能访问
chmod 750 /data/mysql/
#进入/usr/local/mysql/bin目录
cd /usr/local/mysql/bin/
#初始化mysql
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=$datadir &>passwd.txt
# 获取临时密码
tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
if [ -z $tem_passwd ];then
echo '初始化失败,安装失败...'
exit
fi
#让mysql支持ssl方式登录的设置
./mysql_ssl_rsa_setup --datadir=/data/mysql/
# 修改PATH变量,加入mysql bin目录的路径
#临时修改PATH变量的值
export PATH=/usr/local/mysql/bin/:$PATH
#永久修改环境变量
sed -i "/^PATH/ c\/usr/local/mysql/bin:$PATH" ~/.bashrc
#复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
cp ../support-files/mysql.server /etc/init.d/mysqld
#修改/etc/init.d/mysqld脚本文件里的datadir目录的值
sed -i '70c datadir=/data/mysql' /etc/init.d/mysqld
#生成/etc/my.cnf配置文件
cat >/etc/my.cnf <<EOF
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m mysql>
EOF
#启动mysqld进程
service mysqld start
#将mysqld添加到linux系统里服务管理名单里
/sbin/chkconfig --add mysqld
#设置mysqld服务开机启动
/sbin/chkconfig mysqld on
#初次修改密码需要使用--connect-expired-password 选项
#-e 后面接的表示是在mysql里需要执行命令 execute 执行
mysql -uroot -p$tem_passwd --connect-expired-password -e "set password='123456'";
#检验上一步修改密码是否成功,如果有输出能看到mysql里的数据库,说明成功。
mysql -uroot -p123456 -e "show databases;"