MySQL主从配置

1.主从复制简介
MySQL 主从复制就是将一个 MySQL 实例(Master)中的数据实时复制到另一个 MySQL 实 例(slave)中,而且这个复制是一个异步复制的过程。
实现整个复制操作主要由三个进程完成的,其中两个进程在 Slave(sql_thread 和 IO_thread),另外一个进程在 Master(IO 进程)上。
2.主从复制原理、机制
要实施复制,首先必须打开 Master 端的 binary log(bin-log)功能,否则无法实现。 因为整个复制过程实际上就是 Slave 从 Master 端获取该日志然后再在自己身上完全顺序的 执行日志中所记录的各种操作。
复制的基本过程如下:
1)、Slave 上面的 IO_thread 连接上 Master,并请求从指定日志文件的指定位置(或者 从最开始的日志)之后的日志内容;
2)、Master 接收到来自 Slave 的 IO_thread 的请求后,通过负责复制的 IO 进程根据请 求信息读取制定日志指定位置之后的日志信息,返回给 Slave 的 IO_thread。返回信息中除 了日志所包含的信息之外,还包括本次返回的信息已经到 Master 端的 bin-log file 的以及 bin-log pos;
3)、Slave 的 IO_thread 接收到信息后,将接收到的日志内容依次添加到 Slave 端的 relay-log 文件的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master“我需要从某个 bin-log 的哪 个位置开始往后的日志内容,请发给我”;
4)、Slave的Sql_thread检测到relay-log中新增加了内容后,会马上解析relay-log 的内容成为在 Master 端真实执行时候的那些可执行的内容,并在本数据库中执行。
3.主从复制原理图

MySQL主从配置_第1张图片

 

主机(Master)配置

修改配置文件 /etc/my.cnf,在 [mysqld] 下面添加以下配置

# 设置binlog日志的位置并开启binlog日志的记录
log-bin=mysql-bin
# 2到232–1之间的一个正整数值,唯一,默认是1,建议使用ip的最后一段
server-id=1
# 需要记录binlog日志的数据库, 多个数据库使用‘,’隔开
binlog-do-db=test1
# 不需要记录binlog日志的数据库
# 与上一个配置是对立的,一般只使用其中一个就可以了,如果数据库多,我们可以使用binlog-ignore-db来忽略其中几个,其它没被忽略的就会记录binlog日志
# binlog-ignore-db=test2
# 手动启动同步服务,避免突然宕机导致的数据日志不同步
skip-slave-start
# 互为主从需要加入这一行,如果一个MASTER 挂掉的话,另外一个马上接管
# log-slave-updates
# relay-log、relay-log-index配置
# relay-log=/data/mysql_slave/relaylog/mysql-relay-bin.log 
# relay-log-index=/data/mysql_slave/relaylog/mysql-relay-bin.index
# read_only=1              #开启只读模式  
# read_only=0              #关闭只读,可以读写
# expire_logs_days=5       #binlog过期时间
# max_binlog_size=1024M    #binlog单文件最大值
# 多主机需要保证自增长ID不重复,需要添加以下两项
# auto_increment_offset=1       #自增id起始值为1
# auto_increment_increment=2    #自增基数为2,保证id为奇数

重启MySQL

service mysqld restart

创建账户,给从机赋予mysql权限

GRANT all ON *.* to username@slave_IP identified by 'password';

查看用户是否创建成功,如果存在刚刚创建的账户表示成功

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

从主机导出数据库(后面需要将文件导入从机

mysqldump -uroot -p --master-data=1 database_name > database.sql

注 --master-data  该选项将binlog的位置和文件名追加到输出文件中,如果为1,将会输出CHANGE MASTER 命令,后面从机导入数据库不需要改master_log_file,master_log_pos这两个配置;

从机(slave)配置

修改主机信息

change master to master_host='master-ip', master_user='slave', master_password='password';

按照上面步骤来可以忽略这一步,如果导出数据库不是按照刚才的方式导出,需要手动指定bin文件和同步位置 

change master to MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120;

进入数据库,输入以下命令导入数据

source database.sql

启动从机

start slave;

查看启动状态

show slave status \G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

这两行显示为Yes表示启动成功

一些其他相关的命令

重置master,会将 mysql-bin 文件删除,初始化

reset master;

查看master状态,文件 mysql-bin 的信息

show master status;

重置slave,删除slave_master_info ,slave_relay_log_info两个表中数据,删除所有relay log文件,并重新创建新的relay log文件;不会改变gtid_executed 或者 gtid_purged的值

reset slave;

遇到的问题

1、Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

由于从机是从主机克隆过来的,所以他们的MySQL server UUIDS是一样的,我们需要在从机重新生成一个,并重启数据库

mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.back
service mysqld restart

2、error connecting to master '[email protected]:3307' - retry-time: 60  retries: 1, Error_code: 2003

非标准端口上的 Mysql复制连接错误,解决办法:

i、关闭Selinux:点我查看如何关闭

ii、或者强制添加端口:

这个命令可以查看mysql允许的端口

semanage port -l | grep mysqld

强制添加端口 

semanage port -a -t mysqld_port_t -p tcp 3307

第二种方法我执行报错,不知道什么原因。更多信息请看这个:点我查看

3、IO_thread 异常,状态往往是 Slave_IO_Running: Connecting 或 NO。基本就是你master的密码错误,尝试去访问一些看master IP

mysql -uname -hmaster-ip -Pport -p

能访问上就没问题

4、sql_thread 发生异常,状态就会变为 Slave_SQL_Running: NO。在status里面看错误日志:

show slave status \G;

说两种我遇到过的问题:

  • Error_code: 1146.意思是某个表不存在,其实就是在导入数据的时候又问题,就是那个```all_database.sql `` 试着把原来的给删掉,然后主库从新导出一遍,从库从新导入一般就没问题啦。
  • Error_code: 1062.主键冲突问题。因为你导入数据时间修改的差异会导致这个问题,既然知道原因就可以去# vi /etc/my.cnf 的 [mysqld]下面添加一句slave_skip_errors=1062
  • 更多其他错误请点击查看 mysql主从同步错误解决和Slave_IO_Running:NO

5、主从复制延迟,可能的原因有:

  • a、主从同步延迟与系统时间的关系,查看主从两台机器间系统时间差 
  • b、主从同步延迟与压力、网络、机器性能的关系,查看从库的 io,cpu,mem 及网络 压力
  • c、主从同步延迟与 lock 锁的关系(myisam 表读时会堵塞写),尽量避免使用 myisam 表。一个实例里面尽量减少数据库的数量。 
  • d、主从复制发生异常而中断,过很久之后才发现复制异常。可通过查看 master 与 slave 的 status 估算相差的日志。如果相差太大,则可以考虑重做从库。

注意:

MySQL主从机制比较脆弱,需要谨慎操作。如果重启master,务必要先把slave停掉,也就是说需要在salve上去执行,salve stop 命令,然后再去重启master的MySQL服务,否则很可能就会中断了。当重启完后,还需要把salve给开启 salve start

参考:

1、https://blog.csdn.net/ldy1016/article/details/76068139

2、https://www.jianshu.com/p/19241a5a7594

3、https://blog.csdn.net/weixin_33695450/article/details/91436455

4、https://blog.csdn.net/qijkkwcw/article/details/83825745

你可能感兴趣的:(MySQL主从配置)