MySQL主从搭建
环境准备
mysql安装
省略
架构图
转:https://www.cnblogs.com/honeylemon/p/10591899.html
异步复制
1.确保2台服务器已安装相同版本的mysql
2.在主库上,设置一个复制使用的账户,并授予 REPLICATION SLAVE权限。这里创建一个复制用户repl,可以从IP为192.168.1.109(从库)的主机进行连接:
命令文本:GRANT REPLICATION SLAVE ON . To 'rep1'@'192.168.1.109' IDENTIFIED BY '1234test';
3.修改主数据库服务器的配置文件 my.cnf,开启 BINLOG,并设置 server-id的值。这两个参数的修改需要重新启动数据库服务才可以生效
[mysqld]
log-bin=/data/ mysql/log/mysql-bin. log
server-id= 1
注意:如果mysql目录下无log目录,请先创建log目录
4.然后得到主库上当前的二进制日志名和偏移量值。这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复.
执行show master status:
5.修改从数据库的配置文件 my.cnf,增加 server-id参数。注意 server-id的值必须是唯一的,不能和主数据库的配置相同,如果有多个从数据库服务器,每个从数据库服务器必须有自己唯一的 server-id值。
在 mycnf中修改如下:
[mysqld]
server-id=2
6.在从库上,使用 - -skip-slave- start选项启动从数据库,这样不会立即启动从数据库服务上的复制进程,方便我们对从数据库的服务进行进一步的配置:
操作命令:./bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-slave-start
7.对从数据库服务器做相应设置,指定复制使用的用户,主数据库服务器的IP、端口
以及开始执行复制的日志文件和位置等,参考代码如下:
CHANGE MASTER TO MASTER_HOST='192.168.1.104',MASTER_PORT=3306,MASTER_USER='rep1',MASTER_PASSWORD='1234test' ,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;
8.在从库上,启动 slave线程:
9.这时slave上执行 show processlist命令将显示类似如下的进程:
10.执行show slave status;将显示:
11.在master上执行 show processlist命令将显示类似如下的进程:
12.测试
在主库上建一个test1数据库,发现在从库上也出现了,在主库test1上建area表,发现在从库上也出现了,在从库上建t_user表,发现主库上没有t_user,由此可以发现主从模式搭建完成。
半同步复制
在 MySQL5.5之前, MySQL的复制是异步操作,主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写人一个事务并提交成功,而从库尚未得到主库推送的 Binlog日志时,主库宕机了,例如主库可能因磁盘损坏、内存故障等造成主库上该事务 Binlog丢失,此时从库就可能损失这个事务,从而造成主从不一致。
而半同步复制,是等待其中一个从库也接收到Binlog事务并成功写入Relay Log之后,才返回Commit操作成功给客户端;如此半同步就保证了事务成功提交后至少有两份日志记录,一份在主库Binlog上,另一份在从库的Relay Log上,从而进一步保证数据完整性;半同步复制很大程度取决于主从网络RTT(往返时延),以插件 semisync_master/semisync_slave 形式存在。
1.首先,判断 MySQL服务器是否支持动态增加插件:
mysql> select @@have_dynamic_loading;
2.确认支持动态增加插件后,检查 MySQL的安装目录下是否存在插件:
安装插件:
在主库上安装插件semisync_master.so:
mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
从库上则安装 semisync_slave.so插件:
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
安装完成后,从 plugin表中能够看到刚才安装的插件
mysql> select * from mysql.plugin;
从库:
主库:
3.需要分别在主库和从库上配置参数打开半同步semi-sync,默认半同步设置是不打开的,主库上配置全局参数:
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_master_timeout=30000;
执行:show variables like '%rpl_semi%';
从库上一样配置全局参数:
mysql> set global rpl_semi_sync_slave_enabled=1;
执行:show variables like '%rpl_semi%';
注意,由于之前配置的复制是异步复制,所以要重启一下从库上的I/O线程(如果是全新配置的半同步复制则不需要):
mysql> stop slave io_thread;
mysql>start slave io_thread;
4.至此半同步配置完毕,下面可以来验证一下。主库上通过show status命令能够看到当前半同步复制的一些状态值:
mysql>show status like '%semi_sync%';
着重关注以下3个状态值:
Rpl_semi_sync_master_status:值为ON,表示半同步复制目前处于打开状态。
Rpl_semi_sync_master_yes_tx:值为0,表示主库当前尚未有任何一个事务时通过半同步复制到从库。
Rpl_semi_sync_master_no_tx: 值为0,表示当前有0个事务不是通过半同步模式下从库及时响应的(记住只给值,后面有对比)。
5.执行一个事务,再检查一下:
此时会发现Rpl_semi_sync_master_yes_tx值变为3,即刚才的create 和 insert事务通过半同步复制到从库上了
Rpl_semi_sync_master_yes_tx 基数增加到3,到从库上确认一下:
6.再尝试一下网络异常的场景下,主库等待rpl_semi_sync_master_timeout毫秒超时后,自动转成异步复制的场景。
7.首先,在主库上确认半同步会等待30秒超时;
8.停掉从库服务
9.在主库上执行一个事务并提交(默认提交即可),主库上的提交操作会被阻塞30秒:
delete from emp where emp_id=2;
10: 检查半同步的状态值
Rpl_semi_sync_master_status | OFF 半同步复制目前处于关闭状态。
Rpl_semi_sync_master_yes_tx | 3 刚才并没有通过半同步复制完成,所以半同步并没有累加
Rpl_semi_sync_master_no_tx | 1 当前有1个事务不是通过半同步模式下从库及时响应的
11:再执行一条sql:
insert into emp values(3,'cat');
此时执行时间很快,说明网络异常的场景下,主库等待rpl_semi_sync_master_timeout毫秒超时后,自动转成异步复制的场景。
12:再次检查半同步的状态值
Rpl_semi_sync_master_status | OFF 半同步复制目前处于关闭状态。
Rpl_semi_sync_master_yes_tx | 3 刚才并没有通过半同步复制完成,所以半同步并没有累加
Rpl_semi_sync_master_no_tx | 2 当前有2个事务不是通过半同步模式下从库及时响应的
13:恢复从库,确认是否会自动切换回半同步复制模式。
检查从库的状态:
从库恢复需要注意:需要启动slave线程,开启半同步
start slave;
set global rpl_semi_sync_slave_enabled=1;
注意启动顺序
如果先执行开启半同步,则需要重新启动I/O线程
mysql> stop slave io_thread;
mysql>start slave io_thread;
如果没有开启半同步,在向主库插入数据,从库仍然可以同步到数据,说明此时并非是半同步模式,而是异步模式
14.检查主库半同步复制状态值
Rpl_semi_sync_master_status 值自动由OFF变为 | ON ,说明主库检测到正常以后主库到从库的复制方式自动切换为半同步方式
15.在主库上做个测试
insert into emp values(5,'bob');
提交一个事务后,Rpl_semi_sync_master_yes_tx 由3变为4,确认刚才事务是半同步复制。