MySQL主从(AB)复制的搭建

MySQL复制原理

简单来说,master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据重演操作,实现数据异步同步。

master主服务器将自己的二进制日志发送给slave从服务器,slave先保存在自己的中继日志中,然后再执行自己本地的relay log里的sql达到数据库更改和master保持一致。


一、传统AB复制架构(M-S)

说明:在配置MySQL主从架构时,必须保证数据库的版本高度一致,这里我使用的统一版本为5.7.31

二、环境规划

编号主机名称主机IP地址角色信息
1jh10.1.1.10master主服务器
2yj10.1.1.100slave从服务器

三、安装前准备工作

第一步:首先启动MASTER,然后启动SLAVE,更改主机名称

Master:

# hostnamectl set-hostname jh
# su

Slave:

# hostnamectl set-hostname yj
# su

第二步:更改静态IP配置,把Master和Slave都配置与规划一致,然后关闭NetworkManager

Master:

# vim /etc/sysconfig/network-scripts/ifcfg-ens33
...
IPADDR=10.1.1.10
...

Slave:

# vim /etc/sysconfig/network-scripts/ifcfg-ens33
...
IPADDR=10.1.1.100
...

Master/Slave:(字符终端跳过这一步)

# systemctl stop NetworkManager
# systemctl disable NetworkManager

设置完成后,重启网络,然后使用MX连接Master与Slave。

第三步:由于两台机器处于集群架构,需要互相连接。绑定主机名称与IP地址到/etc/hosts

Master/Slave:

# vim /etc/hosts
10.1.1.10 jh
10.1.1.100 yj

第四步:关闭防火墙与SELinux

# systemctl stop firewalld
# setenforce 0

第五步:配置yum源(建议使用华为源)

第六步:时间同步

# ntpdate 182.92.12.11

四、MySQL主从复制核心思路

  1. slave必须安装相同版本的mysql数据库软件
  2. master端必须开启二进制日志;slave端必须开启relay log日志
  3. master端和slave端的server-id号不能一致
  4. slave端配置向master来同步数据
    • master端必须创建一个复制用户
    • 保证master和slave端初始数据一致
    • 配置主从复制(slave端)

五、主从复制的具体实践

第一步:上传MySQL软件包到Master与Slave
(这一步自行解决,我的mysql版本号是5.7.31,为glibc版,也就是绿色版)

第二步:在Master端安装、初始化以及运行mysql软件
安装需求:

选项值(主和从都采用这种路径安装)
安装路径/usr/local/mysql
数据路径/usr/local/mysql/data
端口号(主)3306/3310 (从)
① 安装MySQL软件(第二步操作全部是master的)
# vim mysql.sh
#!/bin/bash
yum install libaio -y
tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
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

# source mysql.sh  		<-(因为脚本中出现了source,所以执行脚本时记得source+上脚本名来执行)
② 配置my.cnf(重点开启二进制日志)-master
# cd /usr/local/mysql
# vim my.cnf		<-/usr/local/mysql/my.cnf

[mysqld]			<-不是省略项
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/master.err
log-bin=/usr/local/mysql/data/binlog		=>	  一定要开启二进制日志
server-id=10
character_set_server=utf8mb4			 	=>    utf8mb4相当于utf8升级版

配置完成后,重启mysqld服务
# service mysqld restart
# chkconfig --add mysqld
# chkconfig mysqld on

第三步:在Slave从服务器端安装mysql软件(不需要初始化)

① 安装MySQL软件–slave
# vim mysql.sh
#!/bin/bash
yum install libaio -y
tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
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
cp support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

#source mysql.sh

相对于主服务器MySQL的安装与配置,从服务器端不需要进行初始化操作,因为其数据将来都来自于主服务器

然后记得别直接启动slave的Mysql服务,启动不了的。

② 配置my.cnf文件–slave
# cd /usr/local/mysql
# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3310
log-error=/usr/local/mysql/data/slave.err
relay-log=/usr/local/mysql/data/relaylog			=>    	开启中继日志
server-id=100
character_set_server=utf8mb4
③ 把master主服务器的数据目录同步到slave从服务器

a. 把MASTER服务器中的mysqld停止掉

# service mysqld stop

b. 把MASTER服务器中的/usr/local/mysql/data目录下的auto.cnf文件删除

# rm -rf /usr/local/mysql/data/auto.cnf

每安装一个mysql软件,其data数据目录都会产生一个auto.cnf文件,里面是一个唯一性的编号,相当于我们每个人的身份证号码。

c. 把MASTER服务器中/usr/local/mysql中的data目录拷贝一份到SLAVE从服务器的/usr/local/mysql目录

# rsync -av /usr/local/mysql/data root@10.1.1.100:/usr/local/mysql/

d. 同步完成后,把主服务器与从服务器中的mysqld启动

# service mysqld start
④ 配置MASTER-SLAVE主从同步

a. 在MASTER主服务器中创建一个账号,专门用于实现数据同步

MySQL5.7及以下版本:

mysql> grant replication slave on *.* to 'slave'@'10.1.1.%' identified by '123';

MySQL新版本中:

mysql> create user 'slave'@'10.1.1.%' identified by '123';
mysql> grant replication slave on *.* to 'slave'@'10.1.1.%';
mysql> flush privileges;

b. 在MASTER中锁表,然后查看二进制文件的名称及位置

mysql> flush tables with read lock;
mysql> show master status;		<-(binlog.xx和后面的597数字记住)
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      597 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

c. 在SLAVE从服务器中,使用change master to指定主服务器,并实现数据同步

mysql> change master to master_host='10.1.1.10',master_user='slave',master_password='123',master_port=3306,master_log_file='binlog.000002',master_log_pos=597;

master_host:主机的IP地址
master_user:主机的user账号
master_password:主机的user账号密码
master_port:主机MySQL的端口号
master_log_file:二进制日志文件名称
master_log_pos:二进制日志文件位置
(这里就要在slave中写入刚才记住的binlog.xx和后面的数字了)

d. 启动slave数据同步

mysql> start slave;
mysql> show slave status\G
⑤ 主MASTER服务器解锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)


总结

  1. 主从复制必须保证两台数据库实例的server-id不一致
  2. 主服务器必须开启二进制日志;从服务器必须开启中继日志
  3. 主从复制搭建必须保证初始数据一致
  4. 主服务器必须要给从服务器创建一个复制用户,并授予复制权限
  5. Master—>Slave架构,主写会同步到从;而从写不会同步到主
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值