Mysql 集群Replication模式

154 阅读7分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

MySQL的安装

  1. 下载MySQL的安装包
cd /root/software
​
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.25-linux-glibc2.12-x86_64.tar
  1. 解压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
  1. 创建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
  1. 创建MySQL的日志文件
touch /usr/local/mysql/log/mariadb.log
  1. 为MySQL创建用户
groupadd mysql
useradd -g mysql mysql
  1. 修改MySQL的用户组
chown -R mysql:mysql /usr/local/mysql
chown -R mysql /usr/local/mysql
chmod -R 755 /usr/local/mysql
  1. 编辑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
  1. 初始化安装
# --user表示以指定的用户来初始化安装mysql
# --basedir其实就是指mysql解压之后的目录,mysql.server在运行的时候会读取这个目录下的内容
# --datadir就是数据库存储目录
# 这条命令执行成功的话会生成一个初始化密码,要记住,之后登录mysql的时候会用到
./mysqld --user=mysql --basedir=/root/software/mysql-8.0 --datadir=/usr/local/mysql/data --initialize
  1. 将MySQL加入到systemctl服务
cp /root/software/mysql-8.0/support-files/mysql.server /etc/init.d/mysql
  1. 关闭开机自启
## 注意最好不要设置开机自启,尤其是在集群的模式下,因为当该节点宕机比较长时间的话,重新启动的时候如果mysql自启了,那么会自动备份其他节点的数据,而由于宕机时间比较长,数据已经增加了很多,那么数据同步就会花费很长时间,导致服务一段时间内不可用,正确的做法应该是拷贝数据文件,然后再启动,这样的话,同步的数据就会变少
chkconfig mysql off
  1. 启动MySQL
systemctl start mysql
  1. 查看MySQL是否启动成功
# 该条命令可以查看mysql的运行状态,如果mysql运行出错的话,也会显示错误的原因
systemctl status mysql
  1. 修改MySQL的root用户密码
# 首先需要以root用户登录进mysql,root用户的初始化密码在之前初始化安装的时候会显示alter user user() identified by "123456";

Replication模式集群搭建

  1. 创建用于节点间数据同步的用户
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;
  1. 修改配置文件

因为MySQL节点之间进行数据同步是通过bin_log日志来进行的,所以在进行Reaplication配置前,需要开启bin_log日志

vim /etc/my.cnf
​
# 添加这两行,用来配置bin_log日志的文件名前缀的
log_bin = mysql_bin
relay_log = relay_bin
  1. 重新启动MySQL
systemctl restart mysql
  1. 配置节点数据同步
  • 节点一配置(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集群的负载均衡

  1. 安装HaProxy
yum install haproxy -y
  1. 编辑hosts文件,使得HaProxy可以通过hostname访问到每个Replication节点
vim /etc/hosts
​
172.18.86.241 mysql01
172.18.86.242 mysql02
  1. 编辑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
  1. 设置seLinux
sudo setsebool -P haproxy_connect_any=1
  1. 启动Haproxy
systemctl start haproxy

KeepAlived实现Replication集群的高可用

  1. 安装KeepAlived
yum install keepalived -y
  1. 编辑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
    }
}
  1. 编辑健康检测脚本
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
  1. 修改健康检测脚本执行权限
chmod +x /etc/keepalived/haproxy_check.sh
  1. 启动KeepAlived
systemctl start keepalived

SpringBoot连接Replication集群

  1. 修改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中新增加一个监控节点

  1. 修改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
  1. 重启Haproxy
systemctl restart haproxy

相关文件说明

  1. MySQL数据文件
/usr/local/mysql/data
  1. MySQL日志文件
/usr/local/mysql/log
  1. MySQL套接字文件
/usr/local/mysql/sock
  1. MySQL进程文件
/usr/local/mysql/pid
  1. MySQL安装路径
/root/software/mysql-8.0
  1. MySQL配置文件
/etc/my.cnf
  1. MySQL启动文件配置
# 该文件应用于systemctl服务
/etc/init.d/mysql

MySQL服务管理

  1. MySQL服务启动与暂停、重启
systemctl start mysql
systemctl stop mysql
systemctl restart mysql
  1. MySQL客户端启动
cd /root/software/mysql-8.0/bin
​
./mysql -u root -p
  1. 查看MySQL启动状态
systemctl status mysql
  1. 查看MySQL集群状态
# 首先进入MySQL
cd /root/software/mysql-8.0/bin
./mysql -u root -p
​
show slave status \G;

\