mysql下主从(主主)搭建
首先要准备两台服务器,一台主服务器(Master),另一台从服务器(Slave),然后要保证Master与Slave的版本要相同且Master不能高于Slave的版本,一般稳健的做法都是使其版本相同,因为MySQL不同版本之间的binlog(二进制日志)格式可能会不一样,最后会导致同步出现异常。
参考地址:https://blog.51cto.com/moerjinrong/2133121
环境
软件环境
系统:CentOS 7.3
MySQL版本:5.7.33
主机设置:
IP | 主机名 | 角色 |
---|---|---|
10.10.133.47 | master-jin | master |
10.10.133.48 | node1-jin | slave |
二、Mysql主从基本原理
Mysql的主从同步就是当master(主库)发生数据变化的时候,会实时同步到slave(从库)。
主从复制可以水平扩展数据库的负载能力,容错,高可用,数据备份。
不管是delete、update、insert,还是创建函数、存储过程,都是在master上,当master有操作的时候,slace会快速的接受到这些操作,从而做同步。
主要的实现原理
在master机器上,主从同步时间会被写道特殊的log文件中(binary-log);
在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改。
详细的主从同步主要有三种形式:statement、row、mixed
- statement:会将对数据库操作的sql语句写道binlog中
- row:会将每一条数据的变化写道binlog中。
- mixed:statement与row的混合。Mysql决定什么时候写statement格式的,什么时候写row格式的binlog。
在master机器上的操作:
当master上的数据发生变化的时候,该事件变化会按照顺序写入binlog中。当slave链接到master的时候,master机器会为slave开启binlog dunp线程。当master的binlog发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。
在slave机器上操作:
当主从同步开启的时候,slave上会创建两个线程:I\O线程。该线程连接到master机器,master机器上的binlog dump 线程会将binlog的内容发送给该I\O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log;sql线程。该线程读取到I/O线程写入的ralay log。并且根据relay log。并且根据relay log 的内容对slave数据库做相应的操作。
主从配置
- master配置文件设置
vim /etc/my.cnf
在[mysqld]下添加以下配置
#主从配置(master的配置)
server-id=1 # 服务器id (设置唯一标识)
binlog-do-db=UMS # 要给从机同步的库
binlog-ignore-db=mysql # 不给从机同步的库(多个写多行)
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
log-bin=mysql-bin # 打开日志(主机需要打开),可以指定绝对路径;
expire_logs_days=30 # 自动清理 30 天前的log文件,可根据需要修改
- slave配置文件设置
vim /etc/my.cnf
在[mysqld]下添加以下配置
#主从配置(slave配置)
server-id=2 # MySQLid 后面2个从服务器需设置不同
skip_slave_start=1 # 复制进程不会随着数据库的启动而启动,重启数据库后需手动启动;
#加上以下参数可以避免更新不及时,SLAVE 重启后导致的主从复制出错。
read_only = 1 # 从库普通账户只读;
master_info_repository=TABLE
relay_log_info_repository=TABLE
- 重启mysql生效配置
/etc/init.d/mysql restart
- master数据库中建立主从同步账号umpay
umpay为用户名,%表示任何远程地址,如下表示密码为'umpay'的10.10.133段地址的umpay都可以连接master主机,密码为umpay2010。
mysql> grant replication slave on *.* to 'umpay'@'10.10.133.%' identified by 'umpay2010' ; # 创建同步账户
mysql> flush privileges; # 刷新权限
mysql> select Host,User,authentication_string from mysql.user; # 检查是否创建
- master数据库事件查看
mysql> show master status \G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 771
Binlog_Do_DB: UMS
Binlog_Ignore_DB: mysql,information_schema,performance_schema,sys
Executed_Gtid_Set:
1 row in set (0.00 sec)
查看主服务器上当前的二进制日志名和偏移量值,在slave连接时需要用到
File: mysql-bin.000001和Position: 771
- slave连接主库
在slave尝试连接主库的授权用户是否可以连通
mysql -h 10.10.133.147 -u umpay -p
mysql>change master to master_host='10.10.133.147',master_port='3508',master_user='umpay', master_password='umpay2010', master_log_file='mysql-bin.000001', master_log_pos=771;
Query OK, 0 rows affected, 1 warning (0.31 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status \G
查看到以下值为YES,则主从搭建成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- 测试
在master上执行
mysql> create schema UMS default character set utf8 collate utf8_general_ci;
mysql> use UMS;
mysql> create table test001(id int auto_increment primary key,name varchar(20) not null);
mysql> insert into test001 values(null,'will');
mysql> insert into test001 values(null,'jim');
mysql> insert into test001 values(null,'tom');
在slave上查看
mysql> select * from UMS.test001;
+----+------+
| id | name |
+----+------+
| 1 | will |
| 2 | jim |
| 3 | tom |
+----+------+
3 rows in set (0.00 sec)
标签:binlog,slave,mysql5.7,master,mysql,线程,主从,搭建 From: https://www.cnblogs.com/xiaobaijin/p/18503751