l 安装配置:
略
l 机器分布
IP |
作用 |
用途 |
192.168.15.3 |
master |
主库 |
192.168.15.4 |
Slave1 |
备库 |
192.168.15.5 |
Slave2 |
备库 |
l 基本的MySQL主从配置
MySQL复制过程分成三步:
master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的
Master配置
1)分配复制权限
主库和从库均需要执行
mysql> grant replication client,replication slave on *.* to 'replck1'@'192.168.15.%' identified by "replck1#!123";
mysql> flush privileges;
2)将master中的数据dump到slave1 slave2中
/opt/app/mysql/bin/mysqldump -uroot -p'' --opt --default-character-set=utf8
--triggers -R --master-data=2 --hex-blob --single-transaction --no-autocommit --all-databases > all.sql
在每台机上安装
[root@MASTER_03 ~]# yum -y install openssh-clients
导入
[root@SLAVE_04 ~]# /opt/app/mysql/bin/mysql < /tmp/all.sql
[root@SLAVE_05 data]# /opt/app/mysql/bin/mysql < /tmp/all.sql
导入后,进入master 清除日志
mysql> reset master;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
在slave1 slave2中进行指定
mysql> change master to
-> master_host='192.168.15.3',
-> master_user='replck1',
-> master_password='replck1#!123',
-> master_port=3306,
-> master_log_file='mysql-bin.000001',
-> master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
在master中创建一个iot2库,发现已经同步
开启半同步
1,在Master上装插件:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled=ON;
在my.cnf配置文件里,加入 rpl_semi_sync_master_enabled = 1
2,在Slave上装插件:
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled =ON;
在my.cnf配置文件里,加入rpl_semi_sync_slave_enabled = 1
参数:
当所有的Slave崩溃,或则断开,甚至是只有Master没有Slave(不可能)。从而Slave接受不到Master的事务,导致M得不到S返回的确认信息。M会一直等待。这里有2个参数可以设置:
Master上:
rpl_semi_sync_master_enabled:表示在 master 上已经开启半同步复制模式。
rpl_semi_sync_master_timeout :为了防止半同步复制在没有收到S发出的确认发生堵塞,该可以设置一个计时器,用来设置超时,超过这个时间值没有收到信息,则切换到异步复制,执行操作。(默认为10000毫秒,等于10秒,这个参数动态可调,表示主库在某次事务中,如果等待时间超过10秒,那么则降级为异步复制模式,不再等待SLAVE从库。如果主库再次探测到,SLAVE从库恢复了,则会自动再次回到半同步复制模式。)
rpl_semi_sync_master_wait_no_slave :当一个事务被提交,但是Master没有Slave连接,这时M不可能收到任何确认信息,但M会在时间限制范围内继续等待。如果没有Slave链接,会切换到异步复制。(是否允许master每个事务提交后都要等待slave的接收确认信号。默认为on,每一个事务都会等待。如果为off,则slave追赶上后,也不会开启半同步复制模式,需要手工开启。)
Slave上:
rpl_recovery_rank:当 slave 从库宕机后,假如 Relay-Log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 MASTER 上获取日志,这样保证 relay-log 的完整。默认情况下该功能是关闭的, relay_log_recovery 的值设置为 1 时,将可在 slave从库上开启该功能。
在master中
mysql> show variables like 'rpl%';
+------------------------------------+----------+
| Variable_name | Value |
+------------------------------------+----------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_stop_slave_timeout | 31536000 |
+------------------------------------+----------+
5 rows in set (0.00 sec)
在slave 中
mysql> show variables like 'rpl%';
+---------------------------------+----------+
| Variable_name | Value |
+---------------------------------+----------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------+----------+
3 rows in set (0.01 sec)
状态:
如何知道是半同步复制?
Rpl_semi_sync_master_clients:说明支持和注册半同步复制的已链接Slave数。
Rpl_semi_sync_master_status:ON是活动状态(半同步),OFF是非活动状态(异步),要么是他没有启用或则已恢复到异步复制状态。用于指示主服务器使用的是异步复
制模式,还是半同步复制模式。
Rpl_semi_sync_master_yes_tx:成功提交数量。
Rpl_semi_sync_master_no_tx :不成功提交数量。
Rpl_semi_sync_slave_status :Slave上的半同步复制状态,ON表示已经被启用,OFF表示非活动状态。
复制正常的测试
mysql> insert into test1 values(5,'d5');
Query OK, 1 row affected (0.00 sec)
mysql> show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 7022 |
| Rpl_semi_sync_master_net_wait_time | 21066 |
| Rpl_semi_sync_master_net_waits | 3 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 4 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 3146 |
| Rpl_semi_sync_master_tx_wait_time | 6293 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 2 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
停掉slave1然后在master插入
mysql> insert into test1 values(6,'d6');
Query OK, 1 row affected (10.01 sec)
此时的状态
mysql> show global status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
+-----------------------------+-------+
1 row in set (0.00 sec)
重新开启slave 查看master
mysql> show global status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.00 sec)
插入
mysql> insert into test1 values(7,'d7');
Query OK, 1 row affected (0.06 sec)
没有问题