什么是主从复制、读写分离以及为什么要使用
-
主从复制:是一种数据备份的方案
简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。
-
读写分离:是一种让数据库更稳定的使用数据库的方法
是在有从数据库的情况下使用,当主数据库进行对数据的增删改也就是写操作时,将查询的任务交给从数据库。
-
为什么要使用主从复制和读写分离操作呢?
主从复制: 1.当主数据库出现问题时,可以当从数据库代替主数据库,可以避免数据的丢失。 2.可以进行读写分离
读写分离: 1.避免从数据库进行写操作而导致的主从数据库数据不一致的情况,因为当主从数据库数据不一致时,那么从数据库最主要的备份任务就没有意义了。 2.减轻主数据库的压力。因为进行写操作更耗时,所以如果不进行读写分离的话,写操作将会影响到读操作的效率。
MySQL主从复制原理
-
1.主从复制原理图
-
2.主从复制工作(过程)原理
1.从库执行change master to 命令(主库的连接信息+复制的起点) 2.从库会将以上信息,记录到master.info文件 3.从库执行 start slave 命令,立即开启IO_T和SQL_T 4. 从库 IO_T,读取master.info文件中的信息,获取到IP,PORT,User,Pass,binlog的位置信息 5. 从库IO_T请求连接主库,主库专门提供一个DUMP_T,负责和IO_T交互 6. IO_T根据binlog的位置信息(mysql-bin.000002 , 448),请求主库新的binlog 7. 主库通过DUMP_T将最新的binlog,通过网络传输给从库的IO_T 8. IO_T接收到新的binlog日志,存储到TCP/IP缓存,立即返回ACK给主库,并更新master.info 9. IO_T将TCP/IP缓存中数据转储到磁盘relaylog中. 10. SQL_T读取relay.info中的信息,获取到上次已经应用过的relaylog的位置信息 11. SQL_T会按照上次的位置点回放最新的relaylog,再次更新relay.info信息 12. 从库会自动清理应用过的relay文件 补充说明: 一旦主从复制构建成功,主库当中发生了新的变化,都会通过dump_T发送信号给IO_T,增强了主从复制的实时性.
MySQL主从复制搭建步骤
-
部署环境
MASTER:192.168.1.11/24 SLAVE1:192.168.1.13/24 SLAVE2:192.168.1.14/24 提前已经安装了MYSQLD
-
搭建主从复制的前提
(1) 2个或以上的数据库实例 (2) 主库需要开启二进制日志功能 (3) server_id要不同,区分不同的节点 (4) 主库需要建立专用的复制用户 (replication slave) (5) 当从库为后建时,从库应该通过备份主库、恢复的方法进行"同步之前的数据" (6) 人为告诉从库一些复制信息(ip port user pass,二进制日志起点) (7) 从库应该开启专门的复制线程
-
1.建立时间同步环境,在主节点上搭建时间同步服务器
-
2.在从节点上进行时间同步(关闭防火墙/selinux)
yum install -y ntpdate ntpdate 192.168.1.11
-
3.主服务器配置:
-
3.1 修改主服务器配置文件
vim /etc/my.cnf server_id = 11 (增加) //用于识别主从 log_bin = master-bin(增加) //开启二进制日志 log_slave_updates = true(增加) //允许从服务器拉取数据
-
3.2 重启服务器
systemctl restart mysqld
-
3.3 登录mysql程序,给服务器授权
mysql -u root mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.1.%' IDENTIFIED BY '123456'; //授予只能在192.168.1网段进行远程登录数据库的用户myslave复制权限(8.0以前,可以自动创建用户并授权【创建用户myslave,密码是123456】) mysql> FLUSH PRIVILEGES; mysql> show master status; //查看当前数据库实例最新的二进制文件名称及节点编号
生成的二进制文件位置(/var/lib/mysql):
若遇到密码不符合,可进行修改
-
-
4.从服务器配置:
-
4.1 修改从服务器主配置文件
vim /etc/my.cnf server_id = 22 (修改) relay_log = relay-log-bin(增加) //开启中继日志 relay_log_index = slave-relay-bin.index(增加) //添加索引,加快速度
-
4.2 重启mysqld
systemctl restart mysqld
-
4.3 在从服务器上配置同步
mysql -u root -p mysql> change master to master_host='192.168.1.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=602; 启动同步: mysql> start slave; //启动同步 mysql> stop slave; //关闭同步 查看slave状态,确保以下两个值为yes mysql> show slave status\G; //\G:竖着显示,默认是横向显示
注意: 怎么证明主从复制成功了? IO线程、SQL线程都为yes的时候就表示主从复制成功了 MariaDB [(none)]> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes
-
-
5.验证
遇到过的错误
-
错误1
-
解决方法:
MariaDB [(none)]> stop slave; Query OK, 0 rows affected, 1 warning (0.00 sec) MariaDB [(none)]> reset slave; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> change master to master_host='192.168.1.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1050; Query OK, 0 rows affected (0.00 sec) //主数据库节点编号已修改为1050 MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec)
-
错误2(从数据库配置文件错误)
-
错误3(从数据库server_id未修改成功)
-
错误4
-
解决方法:
-
1.关闭slave(备库操作)
MariaDB [(none)]> stop slave; Query OK, 0 rows affected (0.00 sec)
-
2.查看master的binlog和pos值(在主库操作)
mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 2549 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
3.修改slave的pos和binlog值(备库)
MariaDB [(none)]> change master to master_host='192.168.1.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2549; Query OK, 0 rows affected (0.00 sec)
-
4.启动slave(备库)
MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec)
-
5.查看状态(备库)
MariaDB [(none)]> show slave status\G;
-
uery OK, 0 rows affected (0.00 sec)
```
* 4.启动slave(备库)
```
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
```
* 5.查看状态(备库)
```
MariaDB [(none)]> show slave status\G;
```