【Mysql主从复制】
解决的问题
数据分布:比如一共150台机器,分别往电信、网通、移动各放50台,这样无论在哪个网络访问都很快。其次按照地域,比如国内国外,北方南方,这样地域性访问解决了。
负载均衡:Mysql读写分离,读写分开了,解决了部分服务器的压力,均衡分开。
数据备份:比如100台机器,实际数据是一样的,这样可以说每台机器都是数据备份。
高可用性和容错性:1台机器挂掉了无所谓,因为还有99台机器。
实现原理:
Mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或者多个其他服务器充当从服务器
Mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更改等操作。其实就是存储的SQL语句,只不过被二进制化。
每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存和更新。比如主服务器执行了插入操作,那么从服务器你就会把这个指令拿过来,在它自己的服务器执行插入操作。
实现步骤:
Master将改变日志记录到二进制日志中(binary log), 再然后Slave重做中继日志中的事件,将改变反应它自己的数据,也就是执行一遍日志。
流程图解说:
首先,如果主机有数据改变,会写到主机的bin-log日志中,然后从机会监听主机的bin-log日志,这时候会读主机的bin-log,然后写入自己(从机)的relay-log(中继日志)中,然后再从中继日志中读出来执行SQL事件。这样就会执行了主机的SQL操作。
开始搭建主从复制
192.168.9.164 主服务器,读操作在164
192.168.9.165 从服务器,写操作在165
因为主需要开启bin-log,从服务器需要监听主服务器的bin-log,那么首先去主服务器开启bin-log。
先编辑主服务器164的Mysql配置文件
#vim /etc/my.cnf //对照下面三行
log_bin = mysql-bin #是开启的
binlog_format = mixed #日志文件名称
Server-id = 164 #以为server-id是惟一的,用ip最合适。
先去mysql数据的存放目录,如果不知道的情况下,可以在/etc/my.cnf中查看 datadir的位置datadir = /data/mysql
看到这些文件,就是mysql的binlog文件,说明bin-log已经开启,重启Mysql服务。
然后进入主服务器客户端,执行命令查看主服务器状态
MySQL [(none)]> show master status;
然后配置从服务器:
同样编辑/etc/my.cnf文件,把server-id修改一下,暂时把两个选项注释掉,还需要加一个relay-log(中继日志)
#vim /etc/my.cnf
#log_bin = mysql-bin
#binlog_format = mixed
relay_log = mysql-relay-bin
Server-id = 165 #以为server-id是惟一的,用ip最合适。
配置为重启Mysql。
下面就需要让从服务器监听主服务器的bin-log日志文件,这样需要做的话就是主服务器允许授权。先去主服务器授权,回到164主服务器mysql客户端执行命令授权,
MySQL [(none)]> grant replication slave on *.* to slave@192.168.9.165 identified by '123456';
MySQL [(none)]> flush privileges; //刷新权限
这句话的意思是,允许slave这个用户通过密码123456在192.168.9.165这台服务器上访问164这台master。这时候就可以允许165监听164的bin-log了。
进入从服务器,先确定从服务器是否能ping的通主服务器。然后进入从服务器客户端,设定要监听的机器。进入从服务器mysql客户端习惯性执行 stop slave 命令。
然后准备在从服务器mysql客户端执行授权命令,but,在执行之前先看看主服务器的状态
这里由154变成了602,因为刚才在主服务器执行过命令。
MySQL [(none)]> change master to
-> master_host='192.168.9.164',
-> master_port=3306,
-> master_user='slave',
-> master_password='123456',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=450;
MySQL [(none)]> start slave; //OK没问题的话,开启监听。
MySQL [(none)]> show slave status\G; //查看状态
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.9.164
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 450
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 629
Relay_Log_Space: 527
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: d8d23a1f-341f-11e8-8102-000c29f3aa69
Master_Info_File: /data/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
然后在主服务器做相应的Mysql增删改,同样再查看一下从服务器的数据,都发生了相应的变化~
检查主从复制通信状态
Slave_IO_State #从站的当前状态
Slave_IO_Running: Yes #读取主程序二进制日志的I/O线程是否正在运行
Slave_SQL_Running: Yes #执行读取主服务器中二进制日志事件的SQL线程是否正在运行。与I/O线程一样
Seconds_Behind_Master #是否为0,0就是已经同步了
必须都是 Yes
如果不是原因主要有以下 4 个方面:
1、网络不通
2、密码不对
3、MASTER_LOG_POS 不对 ps
4、mysql 的 auto.cnf server-uuid 一样(可能你是复制的mysql)
$ find / -name 'auto.cnf'
$ cat /data/mysql/auto.cnf
[auto]
server-uuid=6b831bf3-8ae7-11e7-a178-000c29cb5cbc # 按照这个16进制格式,修改server-uuid,重启mysql即可
OK,这样主从复制的架构就配置完成了。但是别着急,接着往下看。
现有架构问题
现有架构问题有一个Master,可以扩展多个Slave,如果Master挂掉,那么影响现有的架构,如果Master一旦挂掉,写数据不知道往哪里写了,Slave也会失去监听的Master。
解决问题