主从配置实验
MySQL从3.25.15版本开始提供数据库复制(replication)功能。MySQL复制是指从一个MySQL主服务器(master)将数据复制到另一台或多台MySQL从服务器(slaves)的过程,将主数据库的DDL和DML操作通过二进制日志传到从服务器上,然后在从服务器上对这些日志重新执行,从而使得主从服务器的数据保持同步。
因为二进制日志包含备份后已完成的所有更新,这里利用了二进制日志的这个特性,从而最大可能地恢复数据库。
MySQL主从复制/架构优势
- 主库负责写,从库负责读,增强效率。
- 数据热备,主库宕机后能够及时替换主库,保证业务可用性和持续性。
- 分布式结构,支持业务弹性扩展。
主从的方式
- 一主一从
- 一主多从
- 多主一从 (从5.7开始支持)
- 双主复制
- 级联复制,部分slave的数据同步不连接主节点,而是连接从节点
架构与流程
MySQL数据库复制操作大致可以分成3个步骤:
- 步骤01 主服务器将数据的改变记录到二进制日志(binarylog)中。主服务器会记录二进制日志,每个事务更新数据完成之前,主服务器将这些操作的信息记录在二进制日志里面,在事件写入二进制日志完成后,主服务器通知存储引擎提交事务。
- 步骤02 从服务器将主服务器的binary log events复制到它的中继日志(relay log)中。Slave上面的I/O进程连接上Master,并发出日志请求,Master接收到来自Slave的IO进程的请求后,根据请求信息添加位置信息后,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置。
- 步骤03 从服务器重做中继日志中的事件,将数据的改变与从服务器保持同步。Slave的I/O进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到Master端的bin-log文件名和位置记录到master-info文件中。Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时的那些可执行内容,并在自身执行。 MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点。
实验部分
环境
MySQL版本主服务器必须一致
Key | IP | 主机OS | MySQL版本 |
---|---|---|---|
Master | 10.105.130.10 | CentOS 7(2009) | 8.0.24 |
Slave | 10.105.130.61 | CentOS 7 (2009) | 8.0.24 |
实验步骤
在主从节点安装MySQL并初始化MySQL
简单的使用官方源安装
- rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm
- sed -i ’s/enabled=1/enabled=0/’ /etc/yum.repos.d/mysql-community.repo
- yum –enablerepo=mysql80-community install mysql-community-server
- systemctl start mysqld
- grep “A temporary password” /var/log/mysqld.log#查看初始密码
- mysql_secure_installation
配置Master
- 登录主服务器,设置一个复制使用的账户,并授予REPLICATION SLAVE权限。
mysql> create user 'slave'@'%' identified by 'VMware1!';
Query OK, 0 rows affected (0.01 sec)
mysql> grant replication slave on *.* to 'slave';
Query OK, 0 rows affected (0.01 sec)
如果用root账号的话,这一步可以省略。
- 在CentOS下修改my.cnf文件配置以下参数,开启BINLOG,并设置server-id的值。
[mysqld]
server_id = 1
log_bin = mysql-bin
- 需要重启MySQl:
[root@s-mysql-61 ~]# systemctl restart mysqld
- 登录MyQSL查询主服务器上当前的二进制日志名和偏移值。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 156 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
配置Slave
- 测试Master server的连接:
[root@s-mysql-61 ~]# mysql -h 10.105.130.10 -u 'root' -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '10.105.130.10:3306' (113)
前面已经检查过/etc/my.cfg,没有问题 在Master上查看root的权限:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| slave | % |
| zyi | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
root只有localhost权限,需要赋权。
mysql> update user set host='%' where user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
赋予root ‘%’权限
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| slave | % |
| zyi | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)
- 在CentOS下修改my.cnf文件配置以下参数,设置server-id的值。
[mysqld]
server_id = 2 #唯一标识
重启MySQL
[root@s-mysql-61 ~]# systemctl restart mysqld
- 对从数据库服务器做相应的设置,指定复制使用的用户、主数据库服务器的IP和端口,以及开始执行复制的日志文件和位置
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to
-> master_host='10.105.130.10',
-> master_user='root',
-> master_password='xxxxxx!',
-> master_log_file='mysql-bin.000006',
-> master_log_pos=156;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
- 查看连接状态
mysql> show slave status\\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.105.130.10
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 156
Relay_Log_File: s-mysql-61-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 156
标志性提示:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
检查效果
1.在Slave上查看数据库情况
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| BUNOON |
| Market |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
可以看到Master的BUNOON和Market数据库已经同步了。在查看一张table
mysql> use Market;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from fruits;
+------+------+------------+---------+
| f_id | S_id | f_name | f_price |
+------+------+------------+---------+
| 12 | 104 | lemon | 6.40 |
| a1 | 101 | apple | 5.20 |
| a2 | 103 | apricot | 2.20 |
| b2 | 104 | berry | 7.60 |
| b5 | 107 | xxxx | 3.60 |
| bl | 101 | blackberry | 10.20 |
| bs1 | 102 | orange | 11.20 |
| bs2 | 105 | melon | 8.20 |
| c0 | 101 | cherry | 3.20 |
| m1 | 106 | mango | 15.70 |
| m2 | 105 | xbabay | 2.60 |
| m3 | 105 | xxtt | 11.60 |
| o2 | 103 | coconut | 9.20 |
| t1 | 102 | banana | 10.30 |
| t2 | 102 | grape | 5.30 |
| t4 | 107 | xbababa | 3.60 |
+------+------+------------+---------+
16 rows in set (0.00 sec)
- 在Master上面新增数据库
mysql> create database et;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| BUNOON |
| Market |
| et |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.01 sec)
Slave:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| BUNOON |
| Market |
| et |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
以上。