MySQL
MySQL主从复制
高可用集群
- High Available Cluster,HA Cluster
- 高可用集群是指通过特殊的软件把独立的服务器连接起来,组成一个能够提供故障切换(Fail Over)功能的集群
- 高可用的衡量标准
可用性级别(指标) | 年度宕机时间 | 描述 | 叫法 |
---|---|---|---|
99% | 3.65天/年 | 基本可用系统 | 2个9 |
99.9% | 8.76小时/年 | 可用系统 | 3个9 |
99.99% | 52.6分钟/年 | 高可用系统 | 4个9 |
99.999% | 5.3分钟/年 | 抗故障系统 | 5个9 |
99.9999% | 32秒/年 | 容错系统 | 6个9 |
计算方法:
1年 = 365天 = 8760小时
99 8760 * 1% = 8760 * 0.01 = 87.6小时=3.65天
99.9 8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99 8760 * 0.01% = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999 8760 * 0.001% = 0.0876小时 = 0.0876 * 60 = 5.26分钟
- MySQL常用集群
- MySQL Replication主从架构
- MySQL Cluster 集群架构
- MySQL Group Replication (MGR) 主复制,多主一从
- MariaDB Galera Cluster
- MHA|Keepalived|HeartBeat|Lvs,Haproxy等技术构建高可用集群
MySQL主从复制原理
-
Replication可以实现将数据从一台数据库服务器(master)复制到一台到多台数据库服务器(slave)。默认情况下,属于异步复制,所以无需维持长连接
-
master(主服务器)将数据库的改变写入二进制日志,slave(从服务器)同步这些二进制日志,并根据这些二进制日志进行数据重演操作,实现数据异步同步
-
具体过程
- slave端的IO线程发送请求给master端的binlog dump线程
- master端binlog dump线程将获取的二进制日志信息(文件名和位置信息)发送给slave端的IO线程
- salve端IO线程获取到的内容依次写到slave端**relay log(中继日志)**里,并把master端的bin-log文件名和位置记录到master.info里
- salve端的SQL线程,检测到relay log中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和master
数据一致
中继日志的开启:
在mysql的配置文件中添加relay-log字段,并指定路径和文件名,如:
relay-log=/mysql_3306/data/relaylog
MySQL复制架构
双机热备(AB复制)
- 传统的复制架构,也被称为M-S
- 默认情况下,master接受读写请求,slave只接受读请求以减轻master的压力
级联复制
- 可以进一步分担读压力,但slave1 出现故障,后面的所有级联slave服务器都会同步失败
并联复制(一主多从)
- 解决级联复制的单点故障,同时也分担读压力,但会间接增加master传输二进制日志的压力
双主复制
理论上,两台master好像都能接受读、写请求,但实际上,往往运作的过程中,同一时刻只有其中一台master会接受写请求,另外一台接受读请求
MySQL主从复制搭建(AB复制)
要求
- master和slave必须安装相同版本的mysql数据库软件
- master端必须开启二进制日志;slave端必须开启relay log日志
- master端和slave端的server-id号不能一致
- slave端配置主从复制,向master来同步数据
- master端必须创建一个用来主从复制的用户
- 保证master和slave端初始数据一致
IP地址 | 主机名 |
---|---|
192.168.226.20 | master |
192,168.226.30 | Slave |
环境准备
[root@server2 ~]# hostnamectl set-hostname master
[root@server2 ~]# su
[root@server3 ~]# hostnamectl set-hostname slave
[root@server3 ~]# su
#防止NetworkManager对静态ip及高可用软件产生影响
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
cat >> /etc/hosts <<EOF
192.168.226.20 master
192.168.226.30 slave
EOF
ntpdate cn.ntp.org.cn
#向xshell中传入mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz软件包
yum install -y lrzsz
rz
ls
tar -xzf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
MySQL安装要求
选项 | 采用默认形式 |
---|---|
安装路径 | /usr/local/mysql |
数据路径 | /usr/local/mysql/data |
端口号 | 3306 |
master上安装mysql
安装
[root@master ~]# vim mysql.sh
#!/bin/bash
#Desc='此脚本用于安装MySQL软件'
#Usage=source mysql.sh
yum install -y libaio
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
[root@master ~]# source mysql.sh
#脚本中含有source命令,调用脚本时也需要使用source 调用
查看随机密码
[root@master ~]# cat /root/password.txt |grep password
2021-09-28T06:41:36.468051Z 1 [Note] A temporary password is generated for root@localhost: 3KkY)iSsSJo7
安全配置
[root@master ~]# mysql_secure_installation
#顺便更改密码
Enter password for user root: #产生的随机密码
The existing password for the user account root has expired. Please set a new password.
New password: #新密码123
Re-enter new password: #123
配置my.cnf文件
[root@master ~]# cd /usr/local/mysql/
[root@master mysql]# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/mysql.err
log-bin=/usr/local/mysql/data/binlog
server-id=20
character_set_server=utf8mb4
[root@master mysql]# service mysqld restart
slave上安装mysql
相对于主服务器MySQL的安装与配置,从服务器端不需要进行初始化操作,因为其数据将来都来自于主服务器
安装
[root@slave ~]# vim mysql.sh
#!/bin/bash
#Desc='此脚本用于slave上安装MySQL软件'
#Usage=source mysql.sh
yum install -y libaio
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
#bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
#bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
#service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
[root@slave ~]# source mysql.sh
配置my.cnf文件
[root@slave mysql]# cd /usr/local/mysql/
[root@slave mysql]# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/mysql.err
#log-bin=/usr/local/mysql/data/binlog
relay-log=/usr/local/mysql/data/relaylog
server-id=30
character_set_server=utf8mb4
把master主服务器的数据目录同步到slave从服务器
#停止master的mysql
[root@master ~]# service mysqld stop
#删除master的/usr/local/mysql/data下的auto.cnf文件,该文件随安装mysql产生,记录了一个具有唯一性编号
[root@master ~]# rm -rf /usr/local/mysql/data/auto.cnf
#拷贝数据目录
yum install -y rsync.x86_64
[root@master ~]# rsync -av /usr/local/mysql/data root@192.168.226.30:/usr/local/mysql/
启动mysql
service mysqld start
[root@slave mysql]# mysql -uroot -p123
主从复制的配置
在master上创建专门用于主从复制的账号
[root@master ~]# mysql -uroot -p123
mysql> create user 'slave'@'192.168.226.%' identified by '123';
mysql> grant replication slave on *.* to 'slave'@'192.168.226.%';
mysql> flush privileges;
在master上锁表
mysql> flush tables with read lock;
在master中查看二进制文件的名称及位置
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 | 773 | | |