这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
MySQL的安装
- 下载MySQL的安装包
cd /root/software
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.25-linux-glibc2.12-x86_64.tar
- 解压MySQL的安装包
tar xvf mysql-8.0.25-linux-glibc2.12-x86_64.tar
# 解压完之后会得到几个tar.xz的压缩包,其实根据名称就可以看出来是属于mysql的不同模块,我们主要选择mysql的那个tar.xz进行再次解压就可以了
tar -xvf mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz
# 由于文件夹的名称太长了,修改一下文件夹的名称
mv mysql-8.0.25-linux-glibc2.12-x86_64 mysql-8.0
- 创建MySQL数据存放相关文件夹
# 用来存放mysql的数据的
mkdir -p /usr/local/mysql/data
# 用来存放mysql的日志的
mkdir -p /usr/local/mysql/log
# 用来存放mysql的进程号的
mkdir -p /usr/local/mysql/pid
# 用来存放mysql的sock连接的
mkdir -p /usr/local/mysql/sock
- 创建MySQL的日志文件
touch /usr/local/mysql/log/mariadb.log
- 为MySQL创建用户
groupadd mysql
useradd -g mysql mysql
- 修改MySQL的用户组
chown -R mysql:mysql /usr/local/mysql
chown -R mysql /usr/local/mysql
chmod -R 755 /usr/local/mysql
- 编辑mysql的配置文件
vim /etc/my.inf
[client]
port=3306
socket=/usr/local/mysql/sock/mysql.sock
[mysqld]
# 这里的server-id要注意,尤其是在搭建集群的时候,每个节点的server-id应该是不一致的,特别注意
server-id=1
port=3306
user=mysql
socket=/usr/local/mysql/sock/mysql.sock
basedir=/root/software/mysql-8.0
datadir=/usr/local/mysql/data
symbolic-links=0
[mysqld_safe]
log-error=/usr/local/mysql/log/mariadb.log
pid-file=/usr/local/mysql/pid/mariadb.pid
- 初始化安装
# --user表示以指定的用户来初始化安装mysql
# --basedir其实就是指mysql解压之后的目录,mysql.server在运行的时候会读取这个目录下的内容
# --datadir就是数据库存储目录
# 这条命令执行成功的话会生成一个初始化密码,要记住,之后登录mysql的时候会用到
./mysqld --user=mysql --basedir=/root/software/mysql-8.0 --datadir=/usr/local/mysql/data --initialize
- 将MySQL加入到systemctl服务
cp /root/software/mysql-8.0/support-files/mysql.server /etc/init.d/mysql
- 关闭开机自启
## 注意最好不要设置开机自启,尤其是在集群的模式下,因为当该节点宕机比较长时间的话,重新启动的时候如果mysql自启了,那么会自动备份其他节点的数据,而由于宕机时间比较长,数据已经增加了很多,那么数据同步就会花费很长时间,导致服务一段时间内不可用,正确的做法应该是拷贝数据文件,然后再启动,这样的话,同步的数据就会变少
chkconfig mysql off
- 启动MySQL
systemctl start mysql
- 查看MySQL是否启动成功
# 该条命令可以查看mysql的运行状态,如果mysql运行出错的话,也会显示错误的原因
systemctl status mysql
- 修改MySQL的root用户密码
# 首先需要以root用户登录进mysql,root用户的初始化密码在之前初始化安装的时候会显示
alter user user() identified by "123456";
Replication模式集群搭建
- 创建用于节点间数据同步的用户
CREATE USER "oneths"@"%" IDENTIFIED by "Yj*181010";
CREATE USER "sync"@"%" IDENTIFIED WITH mysql_native_password by "Zkyjzn.181018";
GRANT all privileges ON *.* TO 'sync'@'%';
GRANT all privileges ON *.* TO 'oneths'@'%';
FLUSH PRIVILEGES;
- 修改配置文件
因为MySQL节点之间进行数据同步是通过bin_log日志来进行的,所以在进行Reaplication配置前,需要开启bin_log日志
vim /etc/my.cnf
# 添加这两行,用来配置bin_log日志的文件名前缀的
log_bin = mysql_bin
relay_log = relay_bin
- 重新启动MySQL
systemctl restart mysql
- 配置节点数据同步
- 节点一配置(172.18.86.241)
stop slave;
change master to master_host="172.18.86.242",master_port=3306,master_user="sync",master_password="Zkyjzn.181018";
start slave;
# 查看集群状态,如果没有报错,同时Slave_IO_Running和Slave_SQL_Running都为Yes,则表示已经同步成功,如果有错误,需要将错误解决掉再进行同步
show slave status \G;
- 节点二配置(172.18.86.242)
stop slave;
change master to master_host="172.18.86.241",master_port=3306,master_user="sync",master_password="Zkyjzn.181018";
start slave;
# 查看集群状态,如果没有报错,同时Slave_IO_Running和Slave_SQL_Running都为Yes,则表示已经同步成功,如果有错误,需要将错误解决掉再进行同步
show slave status \G;
Haproxy实现Replication集群的负载均衡
- 安装HaProxy
yum install haproxy -y
- 编辑hosts文件,使得HaProxy可以通过hostname访问到每个Replication节点
vim /etc/hosts
172.18.86.241 mysql01
172.18.86.242 mysql02
- 编辑HaProxy配置文件
vim /etc/haproxy/haproxy.cfg
global
# 日志输出配置、所有日志都记录在本机,通过 local0 进行输出
log 127.0.0.1 local0 info
# 最大连接数
maxconn 4096
daemon
# 默认配置
defaults
# 应用全局的日志配置
log global
# 使用4层代理模式,7层代理模式则为"http"
mode tcp
# 日志类别
option tcplog
# 不记录健康检查的日志信息
option dontlognull
# 3次失败则认为服务不可用
retries 3
# 每个进程可用的最大连接数
maxconn 2000
# 连接超时
timeout connect 5s
# 客户端超时
timeout client 120s
# 服务端超时
timeout server 120s
# 绑定配置
listen mysql_replication
bind :3307
# 配置TCP模式
mode tcp
# 采用加权轮询的机制进行负载均衡
balance roundrobin
# Replication 集群节点配置
server mysql01 mysql02:3306 check inter 3000 rise 1 fall 2 weight 1
server mysql02 mysql02:3306 check inter 3000 rise 1 fall 2 weight 1
# 配置监控页面
listen monitor
bind *:8100
mode http
option httplog
stats enable
stats uri /mysql
stats refresh 5s
- 设置seLinux
sudo setsebool -P haproxy_connect_any=1
- 启动Haproxy
systemctl start haproxy
KeepAlived实现Replication集群的高可用
- 安装KeepAlived
yum install keepalived -y
- 编辑KeepAlived配置文件
vim /etc/keepalived/keepalived.conf
主机配置文件
! Configuration File for keepalived
global_defs {
# router_id为唯一标识
router_id snow
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 执行脚本位置
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立则权重减20
}
vrrp_instance VI_1 {
# MASTER表示主机
state MASTER
# interface表示网卡接口,使用哪个接口发送数据
interface ens33
virtual_router_id 51
# 发送数据的源ip
mcast_src_ip 192.168.0.114
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.233
}
track_script {
chk_haproxy
}
}
热备机配置文件
global_defs {
router_id rain
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ##执行脚本位置
interval 2 ##检测时间间隔
weight -20 ##如果条件成立则权重减20
}
vrrp_instance VI_1 {
# BACKUP表示热备机
state BACKUP
interface ens33
virtual_router_id 51
mcast_src_ip 192.168.0.115
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.233
}
track_script {
chk_haproxy
}
}
- 编辑健康检测脚本
vim /etc/keepalived/haproxy_check.sh
该脚本主要是为了防止HaProxy服务挂掉了,但是KeepAlived还在正常运行,从而导致KeepAlived无法正常切换到BACKUP节点上,所以当HaProxy挂掉之后,这个脚本会尝试重新启动HaProxy,如果重启失败的话,就关闭掉KeepAlived,使得KeepAlived可以正常切换到BACKUP节点上
#!/bin/bash
COUNT=`ps -C haproxy --no-header |wc -l`
if [ $COUNT -eq 0 ];then
systemctl start haproxy
# 休眠一秒钟,需要配合应用程序中设置的超时时间来设置一个合理的值
sleep 1
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi
- 修改健康检测脚本执行权限
chmod +x /etc/keepalived/haproxy_check.sh
- 启动KeepAlived
systemctl start keepalived
SpringBoot连接Replication集群
- 修改mysql连接配置
# 配置数据源
# 这里的url中的host部分是KeepAlived虚拟出来的ip,port为3307是haproxy监听的端口
# 当springboot项目区连接192.168.0.233:3307的时候,首先KeepAlived会判断当前haproxy的master节点是谁,然后这个虚拟ip就会指向那个节点,比如当前haproxy的master节点是192.168.0.105,那么192.168.0.233其实就等价于192.168.0.105,然后haproxy节点收到3307的请求之后,就会将请求平均地分配给配置的N个mysql节点
spring.datasource.url=jdbc:mysql://192.168.0.233:3307/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=admin
spring.datasource.password=12345678
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Replication节点的添加
重复上述的MySQL安装和Replication模式集群搭建步骤即可,之后需要在Haproxy中新增加一个监控节点
- 修改Haproxy配置文件
vim /etc/haproxy/haproxy.cfg
# 绑定配置
listen rabbitmq_cluster
bind :3307
# 配置TCP模式
mode tcp
# 采用加权轮询的机制进行负载均衡
balance roundrobin
# RabbitMQ 集群节点配置
server mysql01 mysql02:3306 check inter 3000 rise 1 fall 2 weight 1
server mysql02 mysql02:3306 check inter 3000 rise 1 fall 2 weight 1
server mysql03 mysql03:3306 check inter 3000 rise 1 fall 2 weight 1
- 重启Haproxy
systemctl restart haproxy
相关文件说明
- MySQL数据文件
/usr/local/mysql/data
- MySQL日志文件
/usr/local/mysql/log
- MySQL套接字文件
/usr/local/mysql/sock
- MySQL进程文件
/usr/local/mysql/pid
- MySQL安装路径
/root/software/mysql-8.0
- MySQL配置文件
/etc/my.cnf
- MySQL启动文件配置
# 该文件应用于systemctl服务
/etc/init.d/mysql
MySQL服务管理
- MySQL服务启动与暂停、重启
systemctl start mysql
systemctl stop mysql
systemctl restart mysql
- MySQL客户端启动
cd /root/software/mysql-8.0/bin
./mysql -u root -p
- 查看MySQL启动状态
systemctl status mysql
- 查看MySQL集群状态
# 首先进入MySQL
cd /root/software/mysql-8.0/bin
./mysql -u root -p
show slave status \G;
\