一 概述
1.1 解决mysql读压力大问题
1.进行读写分离,主服务器主要执行写操作。
2.读操作的压力平均分摊到不同的slave服务器上。
3.增加前端缓存服务器。如redis,memcache等。
1.2 服务资源介绍
本案例是使用192.168.1.86和192.168.1.126 这两台机器,服务详情见下表:
Ip |
数据库角色 |
用户 |
Mysql的路径 |
192.168.1.86 |
Master |
hd-mysql |
/home/hd-myql/mysql-5.7.32 |
192.168.1.126 |
slaver |
root |
/usr/local/mysql-5.7.32 |
其中192.168.1.86这台机器上的myql数据库隶属于hd-mysql用户,启动mysql需要此用户来启动;192.168.1.126这台机器上的myql数据库隶属于root用户,启动mysql需要root用户来启动。
https://www.cnblogs.com/opsprobe/p/12029618.html
1.3 常用命令解释
1.stop slave: 停止从库 2.reset master: 将删除日志索引文件中记录的所有二进制文件,创建一个新的日志文件起始值从000001开始。 注意:在生产环境的主从复制,禁止在主库中使用reset master;可以选择 expire 进行定期清理主库二进制日志。 3.reset slave: 使slave 忘记主从复制关系的位置信息。该语句旨在用于全新启动, 它删除master.info文件和relay-log.info 文件以及所有的relay log 文件并重新启用一个新的relaylog文件。 使用reset slave之前必须使用stop slave 命令将复制进程停止。 4.reset slave all: 在5.6版本中 reset slave 并不会清理存储于内存中的复制信息,比如这些信息master host, master port, master user, or master password,也就是说如果没有使用change master 命令做重新定向,执行start slave 还是会指向旧的master 上面。 在MySQL 5.6.3和更高版本中,可以使用reset slave all;重置这些连接参数。 |
1.4 主从复制的数据流向
主从复制是单向同步,master的修改后往slave同步。配置好主从复制的时候,两个库的数据可能是不一样的,当配置好主从复制开始,主库所有的更改都会同步到从库。主库只能同步到从库,从库不可同步到主库,主库具有可读可写,从库只有可读。
1.5 重启后主从不同步
在实际环境中,先别执行reset master,先查看一下主节点的信息:show master status,在从节点设置一值就ok了!参考下面章节【2.10】章节!
二 主从复制
这种手动版的主从配置潜在的风险是:关机后再重启,主从不再同步了;需要手动干预,将从服务器的日志文件名和读取位置信息和主库设置一致。
2.1 配置逻辑流程
1.主库将变更写入到主库的binlog的二进制文件中。
2.从库的IO进程读取主库的binlog日志内容,并存储到Relay Log日志文件中。
3.从库的SQL进程读取Relay Log日志文件中的内容,再重新存储到从库中。
如下图所示:
2.2 模拟主数据库(86)已经存在数据
模拟在实际环境中,主数据库可能已经存在数据,需要自己在配置主从复制之前,在主数据库中模拟一些数据出来,所以本案例用来演示如何对已经存在的数据进行数据同步备份。
2.2.1 使用hd-mysql启动mysql
[root@localhost etc]$ su hd-mysql [hd-mysql@localhost etc]$ service mysql restart Starting MySQL. SUCCESS! |
2.2.2 主数据库提前模拟数据
新建一个数据库xx_db; 数据表tb_student,新增一条数据。
[hd-mysql@localhost etc]$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.32 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> create database xx_db; Query OK, 1 row affected (0.01 sec) mysql> use xx_db; Database changed mysql> create table tb_student (id int(10) primary key auto_increment,user_name varchar(255) not null); Query OK, 0 rows affected (0.00 sec) mysql> insert into tb_student(id,user_name) values(1,'xinxiang'); Query OK, 1 row affected (0.01 sec) mysql> select * from tb_student; +----+-----------+ | id | user_name | +----+-----------+ | 1 | xinxiang | +----+-----------+ 1 row in set (0.01 sec) mysql> exit; Bye |
2.3 在主服务器(86)上开启二进制日志设置服务器编号
在主服务器上开启二进制日志并设置服务器编号,根据自己的实际情况进行设置,原则上使用ip的地址后一位即可。编辑/etc/my.cnf配置文件的内容,然后在 [mysqld] 段添加相应的配置选项。
2.3.1 对文件进行配置
对于/etc/my.cnf的配置文件,hd-mysql对此文件没有权限,需要切换到root用户进行修改,如下图
[hd-mysql@localhost etc]$ cd /etc [hd-mysql@localhost etc]$ su root Password: [root@localhost etc]# vi my.cnf |
编辑的内容如下:
# set zhucongfuzhi server_id = 86 # 设置服务器编号 log_bin = master-bin # 启用二进制日志,并设置二进制日志文件前缀 binlog-do-db=xx_db #要给从机同步的库 expire_logs_days=7 #自动清理 7 天前的log文件,可根据需要修改 #binlog-ignore-db=mysql #不给从机同步的库(多个写多行) #binlog-ignore-db=information_schema |
截图如下:binlog-do=xx_db 表示这里只同步xx_db这个数据库的内容
2.3.2 重启msyql服务
重启mysql服务,需要切换到hd-mysql用户,因为此用户对mysql有启动权限。
[root@localhost etc]# su hd-mysql [hd-mysql@localhost etc]$ service mysql restart Shutdown MySQL. SUCCESS! Starting MySQL. SUCCESS! [hd-mysql@localhost etc]$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.32-log MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. |
2.3.3 查看mysql的biglog日志
mysql> show variables like '%log_bin%'; +---------------------------------+---------------------------------------------------+ | Variable_name | Value | +---------------------------------+---------------------------------------------------+ | log_bin | ON | | log_bin_basename | /home/hd-mysql/mysql-5.7.32/data/master-bin | | log_bin_index | /home/hd-mysql/mysql-5.7.32/data/master-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON |+---------------------------------+---------------------------------------------------+ 6 rows in set (0.01 sec) |
2.4 在主服务器(86)上开启复制账号
执行数据复制时,所有的从服务器都需要使用账户与密码连接MySQL主服务器,所以在主服务器上必须存在至少一个用户账户及相应的密码供从服务器连接。这个账户必须拥有replication slave权限。
MySQL可以使用create