MySQL-REPLICATION介绍
指尖二进制 • 1 年前 • 926 次点击 • MYSQL
使用一台slave作为中继,分担Master的压力,slave中继需要开启bin-log,并配置log-slave-updates
Slave中继可使用Black-hole存储引擎,不会把数据存储到磁盘,只记录二进制日志
主机名 | 角色 | mysql版本 | |
---|---|---|---|
jz_130 | master | mysql5.7.24 | 192.168.111.130 |
jz_131 | slave中继 | mysql5.7.24 | 192.168.111.131 |
jz_132 | slave | mysql5.7.24 | 192.168.111.132 |
jz_130创建需要同步的数据库:(三台数据库同时操作,用于同步使用)
mysql> create database test;
mysql> use test;
mysql> create table emp (empno numeric(4) not null,ename varchar(10),job varchar(9),mgr numeric(4),hiredate datetime,sal numeric(7, 2),comm numeric(7, 2),deptno numeric(2));
mysql> insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
mysql> select * from emp;
+-------+-------+-------+------+---------------------+--------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+-------+-------+------+---------------------+--------+------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
+-------+-------+-------+------+---------------------+--------+------+--------+
1 row in set (0.00 sec)
创建一个用户给jz_131服务器。jz_131作为中继使用。===授权
[root@jz_130 ~]# vim /etc/my.cnf
[mysqld]
validate-password=off
[root@jz_130 ~]# systemctl restart mysqld
[root@jz_130 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.111.131' identified by '123456';
修改主(192.168.111.130)配置文件
[root@jz_130 ~]# vim /etc/my.cnf
validate-password=off
server-id=1
binlog-do-db=test
log-bin=mysql-bin-master
binlog-ignore-db=mysql
sync-binlog=1 #启用二进制日志同步
binlog-format=row #启用二进制日志格式化,以行的方式格式化
[root@jz_130 ~]# systemctl restart mysqld
查看状态
[root@jz_130 ~]# mysql -uroot -p123456
mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-master.000001 | 154 | test | mysql | |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
在jz_131上创建一个用户给jz_132服务器。jz_132作为从服务器。===授权
[root@jz_131 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.111.132' identified by '123456';
[root@jz_131 ~]# vim /etc/my.cnf
validate-password=off
log-bin=mysql-bin-slave
server-id=2
log-slave-updates=1 #把它从relay-log当中读取出来的二进制日志并且这本机上执行的操作也记录这自己的二进制日志里面,这样才能使第三台slave通过中继slave读取到相应数据变化
binlog-format=row #启用二进制日志格式化,以行的方式格式化
[root@jz_131 ~]# systemctl restart mysqld
jz_131(192.168.111.131)(告诉主是谁。去谁那里抓取二进制日志...)
[root@jz_131 ~]# mysql -uroot -p123456
mysql> stop slave;
mysql> change master to master_host='192.168.111.130',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
配置jz_132的配置文件
[root@jz_132 ~]# vim /etc/my.cnf
validate-password=off
log-bin=mysql-bin-slave2 #启用二进制日志
server-id=3 #id
binlog-format=row #启用二进制日志格式化,以行的方式格式化
[root@jz_132 ~]# systemctl restart mysqld
[root@jz_132 ~]# mysql -uroot -p123456
mysql> stop slave;
mysql> change master to master_host='192.168.111.131',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在jz_130上操作
查看结构,默认三台服务器全部都是innodb引擎或者其他的引擎。
mysql> show create table emp;
在jz_130上插入数据
mysql> insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
在中继和slave查看是否插入成功(一定要先进入到test库,也就是同步的库。)
mysql> select * from emp;
jz_131(192.168.111.131)
假设中继不需要存储数据,只需要做一些分发的二进制的一个桥梁,可以修改成黑洞引擎。
在修改黑洞引擎是需要先把二进制日志同步功能关掉。否则slave会来中继抓取二进制日志,等于中继有什么操作slave有什么操作。
查询mysql存储引擎
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
临时关闭同步二进制日志功能
mysql> set sql_log_bin=off;
把emp表修改成黑洞引擎,(作为中继,存储数据了。只作为分发日禁止日志)
mysql> alter table emp engine=blackhole;
查看是不是黑洞引擎,(这种字眼儿的BLACKHOLE)
mysql> show create table emp;
mysql> set sql_log_bin=on;
在jz_130上插入数据
mysql> insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
mysql> select * from emp;
插入之后在三台jz_130\jz_131\jz_132\一次查看emp表,发现中继服务器没有任何数据显示。
减轻master的压力,中继服务器之提供一个二进制日志的暂存。所有的服务器都只需要去中继服务器抓取二进制日志。