搭建基于mm+keepalived方案的MySQL集群

1,项目介绍

本项目采用的是MM(双主复制)+Keepalived方案来构建一个高可用MySQL集群,加了一台slave做延时备份,并使用mysqlrouter实现读写分离。双主复制配合keepalived的vip飘逸能快速的fileover。slave服务器可以按照业务需求适当增添。为了消除mysqlrouter服务的单点故障,使用了两台服务器来做读写分离。此方案有效地提高了MySQL服务的性能和可靠性。
在这里插入图片描述

2,项目环境

操作系统主机名ip软件1软件2
CentOS 7.9.2009master01192.168.220.3MySQL5.7.38keepalived1.3.5
CentOS 7.9.2009master02192.168.220.4MySQL5.7.38keepalived1.3.5
CentOS 7.9.2009slave01192.168.220.5MySQL5.7.38
CentOS 7.9.2009mysqlrouter01192.168.220.6mysqlrouter8.0.30keepalived1.3.5
CentOS 7.9.2009mysqlrouter01192.168.220.7mysqlrouter8.0.30keepalived1.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;"
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值