1. 原理篇
1.1 读写分离问题场景:
高并发场景,读数据操作远高于写数据操作 ——
为了实现读写分离,我们使用数据库的主从复制:
1.2 主从复制:
- 实现主从复制的流程如下:
- MySQL 的主从复制实现机制如下:
(1) master 将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映到它自己的数据。
2. 实战篇
2.1 搭建 MySQL 主从集群
2.1.1 环境说明
准备两个 CentOS7 ,在每个上都安装一下 MySQL 。
安装方法见:CentOS7 安装 MySQL 数据库~~~
安装完一个后,直接再克隆一个 CentOS 7 就 Ok 了,复制虚拟机见 WMWare 克隆CentOS虚拟机~~~
但是这里要注意一件事,使用克隆方式生成的虚拟中的 MySQL 和原 CentOS 中的 MySQL 具有相同的 uuid (MAC 地址),需要给克隆体更换一下 uuid,更换方法如下:
(注: 以下操作在 MySQL 客户端执行)
- 生成新的uuid,并记录下来
select uuid();
- 查看配置文件目录
MySQL 的 uuid 是存在 auto.cnf 配置文件中的,我们要找到这个配置文件的位置,执行如下语句:
show variables like 'datadir';
- 将 auto.cnf 中的 uuid 修改为上述第一步记录的 uuid (这步回到 CentOS 下执行,退出 mysql 客户端方式为 ,输入
exit;
)
vi /var/lib/mysql/auto.cnf
内容修改为:
server-uuid=xxxxxx
- 重启 mysql 服务
service mysqld restart
2.1.2 主库配置
- 查看数据库状态
systemctl status mysqld
- 停服务器
systemctl stop mysqld
- 修改配置文件
vi /etc/my.cnf
修改方式:在后面加入
server-id=1
log-bin=mysql-bin #解释:server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin
- 重启 mysql 服务
systemctl start mysqld
- 登录 mysql
mysql -uroot -p5201314love
- 在主库中新添加一个从库的账号
添加一个名称为repl,账号密码为5201314love,允许登录的从库ip为192.168.244.130的账号(%为任意ip)
mysql> CREATE USER 'repl 此处为用户名称'@'192.168.244.130此处为从服务器的ip地址' IDENTIFIED BY '5201314love 此处为登录密码';
执行完上述语句后,可以通过下列语句查看下授权是否创建成功
SELECT * FROM mysql.user where user = 'repl'\G;
可爱的题外话:如果提示密码太简单不复合策略加在前面加这句
mysql> set global validate_password_policy=0;
- 给从库账号添加授权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.244.130'; # 说明给用户repl一个从库复制的权限在这个ip上
- 查看主库的状态
mysql> SHOW MASTER STATUS
需记录: File是二进制日志文件名,Position 是日志开始的位置。后面设置从库的时候会用到,需要记录下来。
2.1.3 从库配置
- 查看数据库状态
systemctl status mysqld
- 停服务器
systemctl stop mysqld
- 修改配置文件
vi /etc/my.cnf
修改的内容为在后面加入:
server-id=2
- 重启
systemctl start mysqld
- 登录
mysql -uroot -p5201314love
- 使用主库授权的账号
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.244.130',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='5201314love',
-> MASTER_LOG_FILE='mysql-bin.000006',
-> MASTER_LOG_POS=324;
说明:
1)192.168.244.130
:主库主机ip,根据实际情况改写
2)repl
:主库授权的账号
3)5201314love
:主库授权账号密码
4)mysql-bin.000006
:主库日志文件名,上面记录过的
5)324
:主库日志文件位置,根据上面主库查询到的主库日志文件位置填写,上面记录过的
- 重启
systemctl stop mysqld
systemctl start mysqld
2.1.4 测试配置结果
在主库添加数据库、表、数据,检测从库是不是有同样操作,使用 Navicat 连接测试:
主从常用主从命令如下:
- 查看主库状态
mysql>show master status;
- 查看从库状态
mysql>show slave status;
2.1.5 关于从库停机无法同步
问题描述:从库停机修改配置,从起数据库之后,出现无法同步主库内容
解决方案:
1)停止主从
mysql> stop slave;
2)设置
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> START SLAVE;
3)重新启动主从,从库断开期间那部分丢失的数据会自动同步过来的