主从复制原理:
适用于吞吐量大的企业环境,主从复制技术是建立一个和主数据库服务器一模一样的数据库,当主数据库故障的时候,可以切换到从数据库服务器继续工作。尽可能短的缩小故障期间造成的损失。在mysql主从复制的架构中,主服务器会在本地执行写操作的时候,将数据既保存在数据库中一份,还要写到二进制日志中一份,而后,在主服务器中为每一个从服务器启动一个mysql_dump线程,将二进制日志信息以明文的方式发给从服务器的I/O thread线程,(所以为了安全起见,主从同步应该只在内网进行,或者使用SSL加密传输数据)从服务器在收到了二进制日志后,将其保存在中继日志中,然后从服务器在本地启动一个SQL thread线程,该线程从中继日志中读取一个事件,应用一个事件。以此实现在本地应用这个数据更新。mysql5.6支持多线程复制,指的就是SQL thread可以启动多个,可以有多个线程同时从中继日志中读数据,同时并行应用,可以大大的提高从服务器的速度。但是多线程复制只支持一个库,如果有多个库,才能开启多个线程。如果主服务器的dump线程故障了,将导致从服务器的I/O thread线程不能工作。
建立主从复制的要求:
数据库的版本要求要一致。(主版本号和次版本号)
有需要同步的数据库
同步需要数据库帐号
给同步帐号授权
主服务器可以有多个从服务器,但从服务器只能有一个主服务器
主从复制的基本操作步骤:
一、master配置
1、启用二进制日志
vim /etc/my.cnf
log-bin = master-bin #二进制日志选项要在[mysqld]段中添加。
log-bin-index = master-bin.index
2、启动同步二进制日志,启动后事件将不写入缓冲区,而直接写入二进制日志。
sync-binlog = ON #要写在[mysqld]段中
3、选择一个唯一的server-id号
server-id = 1 #主从服务器的server-id号不能相同。
4、创建数据库同步帐号
grant replication slave on *.* to ‘repluser‘@‘从服务器的IP‘ identified by ‘123456‘;
二、slave配置
1、启用中继日志
vim /etc/my.cnf
relay-log = relay-log #中继日志也要在[mysqld]段中添加。
relay-log-index = relay-log.index
2、启用只读
read-only = ON #对具有super权限的用户,依然能写
3、选择一个唯一的server-id #一定不能和主服务器的server-id相同
server-id = 2
4、连接至主服务器
change master to master_host = ‘192.168.10.1‘ ,master_port = ‘3306‘ ,master_user = ‘repluser‘ ,master_password = ‘123456‘ ,master_log_file = ‘master-bin.0000019‘ , master_log_pos = 633;
执行完毕后会在mysql的数据目录生成两个文件,一个是master.info,用来记录主服务器的二进制日志,position位置,主服务器IP、端口、同步用户、密码、超时时间等信息。一个是relay-log.info,用来记录当前中继日志和位置和正在读取的主服务器上的二进制日志和位置
5、启动slave
start salve;
6、查看slave的同步状态
show slave status;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.1 #主服务器的IP地址
Master_User: repl_user #复制帐号
Master_Port: 3306 #主服务器的mysqld端口号
Connect_Retry: 60 #超时重试时间
Master_Log_File: master-bin.000019 #主服务器的当前二进制日志
Read_Master_Log_Pos: 27472961 #已经读到的二进制日志位置
Relay_Log_File: slave-relay-bin.000009 #从服务器所处的中继日志
Relay_Log_Pos: 1531586 #从服务器所处的中继日志位置
Relay_Master_Log_File: master-bin.000019 #从服务器的中继日志
Slave_IO_Running: Yes #I/Othread线程状态必须是YES(重要)
Slave_SQL_Running: Yes #SQLthread线程状态必须是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: 27472961 #已经执行到的二进制位置
Relay_Log_Space: 1534068 #中继日志的剩余空间
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No #是否允许SSL加密
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
1 row in set (0.00 sec)
ERROR:
—————————————————————————————————————————————
三、实现半同步复制
当主服务器超时,从服务器没有联系,主服务器会自动降级为半同步模式
1、主服务器配置
安装插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘;
SHOW GLOBAL VARIABLES LIKE ‘rpl%‘
rpl_recovery_rank 0
rpl_semi_sync_master_enabled OFF #半同步功能是否开启
rpl_semi_sync_master_timeout 10000 #从服务器的超时时间,过了这个时间,主服务器将不再等待从服务器的响应,毫秒单位。
rpl_semi_sync_trace_level 32 #追踪级别
rpl_semi_sync_master_wait_no_slave ON #是否必须有一个可用的slave
配置开启半同步:在主服务器中的配置文件[mysqld]段中增加(永久生效,需要重启mysqld)
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 3000 #1秒
临时生效:在mysql命令行输入
SET GLOBAL VARIABLES rpl_semi_sync_master_enabled = 1
SET GLOBAL VARIABLES rpl_semi_sync_master_timeout = 3000
SHOW GLOBAL VARIABLES LIKE ‘rpl%‘; #查看同步状态,命令行设置完后必须要重启从服务器的IO_THREAD线程。
Rpl_semi_sync_master_clients 0
2、从服务器配置
安装插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;
SHOW VARIABLES LIKE ‘rpl%‘
rpl_recovery_rank 0
rpl_semi_sync_slave_enabled OFF #是否启动
rpl_semi_sync_slave_trace_lavel 32 #追踪级别
配置开启半同步:在从服务器中的配置文件[mysqld]段中增加(永久生效,需要重启mysqld)
rpl_semi_sync_slave_enabled = 1
临时生效:在mysql命令行输入
SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled = 1
STOP SLAVE IO_THREAD;START SLAVE IO_THREAD;
本文出自 “初心、始终” 博客,谢绝转载!
原文地址:http://gouyc.blog.51cto.com/1594451/1682760