Liunx服务管理之mysql主从
主从简介
什么是主从?
MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
主从的作用
- 实时灾备,用于故障切换
- 读写分离,提供查询服务
- 备份,避免影响业务
主从解决的问题
- 数据分布
- 负载平衡
- 备份
- 高可用性和容错行
主从的几种形式

一主一从(成本最低):
- 并不是用来提高程序性能的,主要是用来做数据的热备(即如果master节点挂掉的话,slave节点能充当master节点),提高程序可用性,容灾性较好。
- 不存在数据一致性问题,因为只从一个节点中读取。
- 虽然可以做热备,但是无法做数据备份(非高可用),如果不小心在master节点执行了DROP,slave则马上同步这个操作,所以也无法在slave中找回数据
一主多从(通常2-4个Slave):
- 选取一个节点做master备份,如果master挂了,则有slave马上充当master节点继续进行服务(打个比方,master是皇帝,slave就是太子,如果皇帝驾崩了,太子马上担当重任)
- 选取另一个节点,专门用来做慢查询、或统计操作
双主:
-
使用场景通常是,你这个业务啊,大部分的并发都是写导致,实在是承载不了
-
如何保证数据不会出现重叠呢?如果ID是整型,可采用取模操作,进行分配;如果ID是字符串,可采用哈希操作,进行分配
-
弊端:
- 如果某一个节点挂掉,整个数据会造成紊乱,不到万不得已不要用
- 【masterA】后面提供服务的从库需要等到【masterB】先同步完了数据后,才能从【masterA】上同步数据,这样可能会造成一定的延时
级联同步:
-
主要用来减轻master压力,由于master既要写操作,又要被多个slave节点进行读操作,所以中间的slave进行分压操作
-
如果master挂掉了,那么剩下的slave节点自然就组成了一个天然的集群结构

环形多主(处理能力强,却又很危险): -
图中有所省略,其中每一个master又对应了多个slave节点
-
如果某一个master挂掉了,那么整个架构基本就崩了(如通赤壁之战中的曹操,把所有的船都连在一起)

主从复制原理

- 主库将所有的写操作记录到binlog日志中并生成一个log dump线程,将binlog日志传给从库的I/O线程
- 从库生成两个线程,一个I/O线程,一个SQL线程
- I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中
- SQL线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,达到最终数据一致的目的
- I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中
可以简化为三个步骤:
- Master 将改变记录到二进制日志中。
- Slave 将 Master 的二进制日志拷贝到它的中继日志( Relay_log )
- Slave 重做中继日志中的事件,将改变反映它自己的数据
主从复制配置
主从复制配置步骤:
- 确保从数据库与主数据库里的数据一样
- 在主数据库里创建一个同步账号授权给从数据库使用
- 配置主数据库(修改配置文件)
- 配置从数据库(修改配置文件)
mysql主从配置
分两种情况,第一种主数据库和从数据库数据是一样的,另外一种主数据库和从数据库数据不一样
第一步:先查看主和从数据库内容是否一样
//主数据库现在是没有内容的
[root@longnian ~]# mysql -uroot -p'longnian123.' -S /tmp/mysql3306.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
//从数据库现在也是没有内容的
[root@longnian ~]# mysql -uroot -p'longnian123.'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
//如果主数据库和从数据库不一样,就得把主数据库做一个全备,把数据导入到从数据库。然后把主数据库进行锁表操作,但这期间主数据库不能退出数据库!
//缩表操作
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
第二步:在主数据库里创建一个同步账号授权给从数据库使用
mysql> create user 'repl'@'192.168.159.132' identified by 'repl123.';
Query OK, 0 rows affected (0.05 sec)
mysql> grant replication slave on *.* to 'repl'@'192.168.159.132';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
第三步:配置主数据库
[mysqld3306]
datadir = /opt/data/3306
port = 3306
socket = /tmp/mysql3306.sock
pid-file = /opt/data/3306/mysql_3306.pid
log-error=/var/log/3306.log
//添加以下内容
log-bin=mysql-bin
server-id=1
symbolic-links=0
第四步:重启服务,查看主库状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
第五步:配置从数据库
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
//添加以下内容
server-id=2
relay-log=mysql-relay-bin
symbolic-links=0
第六步:配置并启动主从复制,并查看状态
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.16.12.128',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl123',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.33 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.159.132
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
第七步:测试
在主数据库上新建一个数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database school;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
在从数据库中查看数据是否同步:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ⁾⁾!

浙公网安备 33010602011771号