1.主从复制:
mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份的数据库中。实现mysql数据库的热备份。
要想实现双机的热备,首先要了解主从数据库服务器的版本的需求。要实现热备mysql的版本都高于3.2。还有一个基本的原则就是作为从数据库的数据版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。
当然要实现mysql双机热备,除了mysql本身自带的REPLICATION功能可以实现外,也可以用Heartbeat这个开源软件来实现 主从复制的根本操作就是把从主服务器上所执行过的sql在从机上再执行一遍,只要两个机器的数据库初态(数据库结构,数据,配置)是一样的,那么我们开启主从复制之后就能保证他们一直都是一样的状态。这些都是mysql自己实现的,我们就配置一下就可以了。
从图中我们可以看出来了,主服务器需要做的事情非常简单的,就只是把执行的sql语句存储到二进制文件binary-log中,而从服务器需要做的事情比较多,而且还得使用两个线程进行整个事件的监听和处理。
mysql复制的优点:
- 如果主库出现问题,可以快速切换到从库提供服务
- 可以在从库执行查询操作,降低主库的访问压力。
- 可以在从库进行备份,以免备份期间影响主库的服务。
mysql主从复制的原理
(1)首先,mysql主库在事务提交时会把数据库变更作为事件Events记录在二进制文件binlog中;mysql主库上的sys_binlog控制binlog日志刷新到磁盘。
(2)主库推送二进制文件binlog中的事件到从库的中继日志relay log,之后从库根据中继日志重做数据库变更操作。通过逻辑复制,以此来达到数据一致。
Mysql通过3个线程来完成主从库之间的数据复制:其中BinLog Dump线程跑在主库上,I/O线程和SQL线程跑在从库上。当从库启动复制(start slave)时,首先创建I/O线程连接主库,主库随后创建Binlog Dump线程读取数据库事件并发给I/O线程,I/O线程获取到数据库事件更新到从库的中继日志Realy log中去,之后从库上的SQl线程读取中继日志relay log 中更新的数据库事件并应用。
由于主从复制的一些特性,为了保证数据一一致,所以这里有些原则需要遵守
- 每个slave只有一个master
- 每个slave只能有一个唯一的服务器ID
- 每个master可以有多个salve
环境准备
主服务器(Master服务器Linux中Ubuntu版本):192.168.222.128
从服务器(Slave服务器Linux中Ubuntu版本):192.168.222.129
Mysql数据库:5.6
防火墙3306端口要开放
两台服务器数据库的数据表结构,配置都必须是一样的。
Master服务器配置:
1.开放防火墙3306端口
首先,检查防火墙端口是否打开,输入命令如下:
netstat -an|grep 3306
然后,打开mysql配置文件,将bind-address = 127.0.0.1注销,
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
重启服务器,再次查看,如图所示即为端口打开。
2.创建slave用户,并授权于slave用户,输入命令如下:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO slave@"%" IDENTIFIED BY "123456";
3.修改数据库配置文件my.cnf(my.cnf在路径/etc/mysql/)下
log-bin:开启二进制日志,该日志是在事务提交时写日志文件的。默认大小是1G,后面加001,002这样的后缀顺加。
server-id,唯一标识主机,mysql主从每个mysql实例配置都不一样就行。这个值默认是0,如果是0,主服务器拒绝任何从服务器的连接。
skip-grant-tables:开启免密登录
3.重启数据库服务,输入命令:
systemctl restart mysql
Slave服务器配置:
1.配置my.cnf文件
server-id=2
replicate-do-db=test
skip-slave-start=true
2.重启数据库服务
systemctl restart mysql
配置从服务器认主服务器
获取binlog的信息
我们先到主(master)服务器上获取binlog的信息,在mysql的命令界面输入:
show master status;
这里展示的就是我们当前主服务器使用的binlog的文件名,其中position是文件中偏移量,我们之后配置slave需要用到这些信息,这个文件在每次服务器状态变化后都不同
进入从服务器输入以下指令:
stop slave; //先停止slave服务线程
change master to
master_host='192.168.222.128',
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.000009',
master_log_pos=154;
这里user和password就是我们第一步在主服务器上创建的用户名和密码,然后MASTER_LOG_FILE 就是我们上一步查看到的master在使用的binlog文件(这个文件在每次主服务器状态变化后都不同),MASTER_LOG_POS 就是binlog的偏移量,用于同步扫描使用。master_log_file对应File, master_log_pos对应Position。Mysql 5.x以上版本已经不支持在配置文件中指定主服务器相关选项。
开启slave线程
start slave;
查看slave状态:
show slave status\G;
图中Slave _IO_Running:Yes和Slave_SQL_Running:Yes,就表示我们的从服务器已经在完全运行了。
现在我们可以在主服务器的数据库上做一个修改数据看看是否同步到从服务器的数据库上来证明可用性。
主从验证
因为之前数据库的数据都是一样的,现在就都新建个test 库,并且在test 库新建表 user_test.
这里需要注意两个数据库都要执行
#创建新库
CREATE DATABASE test;
#指定编码
CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;
#创建新表
create table user_test( id int comment'ID',name VARCHAR(20) comment'名称', create_time timestamp DEFAULT now() comment'创建时间' );
准备条件完成,进入测试
在主服务器上进行主库查询
在从服务器上进行从库查询
主服务器上手动插入条数据
use test;
insert INTO user_test value(1,"test",NOW());
在从服务器上直接查询从库看有没有数据同步
数据同步成功
双机热备
实现双机热备,原理其实就是做两个机器的互相主从,我们把上述步骤主从对调,然后做一遍就能实现了双机热备了
同时在主从服务器建立一个连接帐户,该帐户必须授予REPLIATION SLAVE权限。这里因为服务器A和服务器B互为主从,所以都要分别建立一个同步用户。
master服务器:
mysql> grant replication slave on *.* to 'slave'@'192.168.222.129' identified by '123456';
mysql> flush privileges;
slave服务器:
mysql> grant replication slave on *.* to 'slave'@'192.168.222.128' identified by '123456';
mysql> flush privileges;
修改my.cnf文件,master服务器配置:
log-bin=mysql-bin
server-id=1
# 双机热备需要添加
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
slave服务器配置:
log-bin=mysql-bin
server-id=2
# 双机热备需要添加
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
-
Server-id:ID值唯一的标识了复制群集中的主从服务器,因此它们必须各不相同。Master_id必须为1到232-1之间的一个正整数值,slave_id值必须为2到232-1之间的一个正整数值。
-
Log-bin:表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提。
-
Binlog-do-db:表示需要记录二进制日志的数据库。如果有多个数据可以用逗号分隔,或者使用多个binlog-do-dg选项。
-
Binglog-ingore-db:表示不需要记录二进制日志的数据库,如果有多个数据库可用逗号分隔,或者使用多binglog-ignore-db选项。
-
Replicate-do-db(从数据库配置):表示需要同步的数据库,如果有多个数据可用逗号分隔,或者使用多个replicate-do-db选项。
-
Replicate-ignore-db(从数据库配置):表示不需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项。
-
Master-connect-retry:master-connect-retry=n表示从服务器与主服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从服务器存在mater.info文件,它将忽略些选项。
-
Log-slave-updates:配置从库上的更新操作是否写入二进制文件,如果这台从库,还要做其他从库的主库,那么就需要打这个参数,以便从库的从库能够进行日志同步。
-
skip-slave-start 从机服务器重启后slave 不会自动开始,要手动执行,防止出错
- Sync_binlog=1 Or N
Sync_binlog的默认值是0,这种模式下,MySQL不会同步到磁盘中去。这样的话,Mysql依赖操作系统来刷新二进制日志binary log,就像操作系统刷新其他文件的机制一样。因此如果操作系统或机器(不仅仅是Mysql服务器)崩溃,有可能binlog中最后的语句丢失了。要想防止这种情况,可以使用sync_binlog全局变量,使binlog在每N次binlog写入后与硬盘同步。当sync_binlog变量设置为1是最安全的,因为在crash崩溃的情况下,你的二进制日志binary log只有可能丢失最多一个语句或者一个事务。但是,这也是最慢的一种方式(除非磁盘有使用带蓄电池后备电源的缓存cache,使得同步到磁盘的操作非常快)。
即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。如果使用InnoDB表,Mysql服务器处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍然存在binlog中。可以用-innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。(注释:在Mysql 5.1版本中不需要-innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),该选项可以提供更大程度的安全,使每个事务的binlog(sync_binlog=1)和(默认情况为真)InnoDB日志与硬盘同步,该选项的效果是崩溃后重启时,在滚回事务后,Mysql服务器从binlog剪切回滚的InnoDB事务。这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收回滚的语句)。
- Auto_increment_offset和Auto_increment_increment
Auto_increment_increment和auto_increment_offset用于主-主服务器(master-to-master)复制,并可以用来控制AUTO_INCREMENT列的操作。两个变量均可以设置为全局或局部变量,并且假定每个值都可以为1到65,535之间的整数值。将其中一个变量设置为0会使该变量为1。
这两个变量影响AUTO_INCREMENT列的方式:auto_increment_increment控制列中的值的增量值,auto_increment_offset确定AUTO_INCREMENT列值的起点。
如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值被忽略。例如:表内已有一些数据,就会用现在已有的最大自增值做为初始值。
分别在主,从服务器重启mysql服务,输入命令:
systemctl restart mysql
分别在主、从服务器上查看作为主服务器的状态,输入命令如下:
show master status\G;
master服务器下查看的状态如图所示:
slave服务器 下查看的状态如果所示:
分别在Master服务器和Slave服务器,使用change master to指定位置:
Master服务器,输入命令如下所示:
mysql> change master to
-> master_host='192.168.222.129',
-> master_user='slave',
-> master_password='123456',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=154;
Slave服务器,输入命令如下:
mysql> change master to
-> master_host='192.168.222.128',
-> master_user='slave',
-> master_password='123456',
-> master_log_file='mysql-bin.000011',
-> master_log_pos=154;
分别在Master和Slave服务器上重启Slave线程
mysql>start slave;
分别在Master和Slave服务器上查看从服务器状态,输入命令如下:
mysql>show slave status\G;
查看下面两项值均为Yes,即表示设置从服务器成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master服务器上的状态,如下图所示:
Slave服务器上的状态,如下图所示:
测试主主同步,从Master中插入一条数据,看Slave中是否存在,如下图所示:
从Slave服务器中查看数据是否存在,如下图所示:
在Slave服务器中删除数据,看Master服务器中数据是否存在,如下图所示:
在Master服务器查看是否存在此条数据,如下图所示:
由此,测试即为成功。