Mysql主从搭建及同步原理

windos上安装比较简单且实际工作中我们的服务器都是linux。所以以linux上安装举例。

1.Mysql下载

1.1 查看操作系统

查看当前使用linux的操作系统使用的red hat 还是debian 还是ubuntn

uname -r
cat /etc/redhat-release

我自己这里使用的是red hat。

2.2 下载mysql安装包

// 官方下载网站
https://downloads.mysql.com/archives/community/

打开如下图
在这里插入图片描述

选择我们需要安装的 版本、系统。下载安装包
在这里插入图片描述
下载结果如下图
在这里插入图片描述

2.Mysql安装

前言:

  • 如果您之前使用操作系统本机包管理系统(例如 Yum 或 APT)安装了 MySQL,则使用本机二进制文件安装时可能会遇到问题。确保您以前安装的 MySQL 已被完全删除(使用您的包管理系统),并且所有其他文件(例如旧版本的数据文件)也已被删除。您还应该检查配置文件(例如/etc/my.cnf 或/etc/mysql目录)并将其删除。
  • MySQL对该库有依赖性libaio 。如果本地未安装此库,数据目录初始化和后续服务器启动步骤将失败。如有必要,请使用适当的包管理器安装它。例如,在基于 Yum 的系统上:
 yum search libaio  # search for info
 yum install libaio # install library

或者,在基于 APT 的系统上:

 apt-cache search libaio # search for info
 apt-get install libaio1 # install library`
  • Oracle Linux 8 / Red Hat 8 (EL8):这些平台默认情况下不安装 /lib64/libtinfo.so.5MySQL 客户端bin/mysql包 mysql-VERSION-el7-x86_64.tar.gz和 mysql-VERSION-linux-glibc2.12-x86_64.tar.xz. 要解决此问题,请安装该 ncurses-compat-libs软件包:
 $> yum install ncurses-compat-libs

以下操作使用root权限

2.1 解压

cd /usr/local
tar -zxvf mysql-8.0.20-el7-x86_64.tar.gz

2.2 目录重命名

mv mysql-8.0.20-el7-x86_64 mysql-8.0.20

2.3 创建data,存储文件

cd /usr/local/mysql-8.0.20
mkdir data

2.4 创建用户组

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

因为用户只需要用于所有权目的,而不需要用于登录目的,所以useradd命令使用-r和-s /bin/false选项来创建一个没有服务器主机登录权限的用户。如果您的useradd不支持这些选项,请忽略它们。

2.5 授权用户

 chown -R mysql.mysql /usr/local/mysql-8.0.20
 chmod 750 /usr/local/mysql-8.0.20/data -R

2.6 配置环境变量

vim /etc/profile
#在配置文件最后增加一行:
export PATH=$PATH:/usr/local/mysql-8.0.20/bin:/usr/local/mysql-8.0.20/lib
#使修改配置文件生效
source /etc/profile 

2.7 编辑my.cnf

vim /etc/my.cnf
[mysql]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.socket

[client]
port=3306
socket=/var/lib/mysql/mysql.socket

[mysqld]
port=3306
server-id=3306
user=mysql
general_log=1
general_log_file=/var/log/mysql/mysql.log    #如果系统中不存在需要自己创建
socket=/var/lib/mysql/mysql.socket
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
log-bin=/usr/local/mysql-8.0.20/data/mysql-bin
innodb_data_home_dir=/usr/local/mysql-8.0.20/data
innodb_log_group_home_dir=/usr/local/mysql-8.0.20/data/
character-set-server=utf8mb4
lower_case_table_names=1
autocommit=1
symbolic-links=0
default_authentication_plugin=mysql_native_password

[mysqld_safe]
log-error=/usr/local/mysql-8.0.20/data/mysql.log
pid-file=/usr/local/mysql-8.0.20/data/mysql.pid

2.8 创建相关目录和文件

mkdir -p /var/log/mysql/
mkdir -p /var/lib/mysql
touch /var/log/mysql/mysql.log
chown -R mysql:mysql /var/log/mysql/
chown -R mysql:mysql /var/lib/mysql/

2.9 初始化数据库

cd /usr/local/mysql-8.0.20/bin/
./mysqld --user=mysql --basedir=/usr/local/mysql-8.0.20 --datadir=/usr/local/mysql-8.0.20/data/ --initialize

在这里插入图片描述
第一个红色error,提示文件不存在。(检查下2.8是否漏掉了)

2.10 复制mysql.server到/etc/init.d/下,这样我们可以在任意目录使用mysql命令

cd /usr/local/mysql-8.0.20
cp -a ./support-files/mysql.server /etc/init.d/mysql 
cp -a ./support-files/mysql.server /etc/init.d/mysqld

2.11 赋予权限

chown 777 /etc/my.cnf
chmod +x /etc/init.d/mysql
chmod +x /etc/init.d/mysqld

2.12 启动

service mysql start

在这里插入图片描述

2.13 启动报错

12.
创建pid文件

vim /usr/local/mysql-8.0.20/data/localhost.localdomain.pid
## 随便写入一个数字

如果部署过程除了问题且解决不了,可以使用rm -rf /usr/local/mysql-8.0.20/ 删除目录,然后重新从第一步开始执行。步骤经过我多次验证应该是可以部署成功的!

如果启动失败了也可查看mysql.log查看报错原因。

2.14 修改数据库密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
flush privileges;
use mysql;
## 配置数据库可被远程连接
update user set host='%' where user='root';
flush privileges;

3.搭建主从集群

3.1主节点配置

vim /etc/my.cnf
# 找到mysqld增加如下配置
server-id=47
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
# 注释如下配置
#log-bin=/usr/local/mysql-8.0.20/data/mysql-bin

3.1.1 重启mysql

service mysqld restart

在这里插入图片描述

3.1.2 给root用户分配一个replication slave的权限

#登录主数据库
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;
#查看主节点同步状态:
show master status;

在这里插入图片描述
这个指令结果中的File和Position记录的是当前日志的binlog文件以及文件中的索引。

​ 而后面的Binlog_Do_DB和Binlog_Ignore_DB这两个字段是表示需要记录binlog文件的库以及不需要记录binlog文件的库。目前我们没有进行配置,就表示是针对全库记录日志。这两个字段如何进行配置,会在后面进行介绍。

3.2 从节点配置

vim /etc/my.cnf
# 找到mysqld增加如下配置
#主库和从库需要不一致
server-id=48
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#打开从服务二进制日志
log-bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1
# 注释如下配置
#log-bin=/usr/local/mysql-8.0.20/data/mysql-bin

3.2.1 重启mysql

service mysqld restart

在这里插入图片描述

3.1.2 主节点同步状态

#登录从服务
mysql -u root -p;
#设置同步主节点:
CHANGE MASTER TO
MASTER_HOST='192.168.80.136',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='master-bin.000002',
MASTER_LOG_POS=156;
#开启slave
start slave;
#查看主从同步状态
show slave status;
或者用 show slave status \G; 这样查看比较简洁

在这里插入图片描述
到这里mysql主从搭建完成。

4.Mysql主从同步

4.1 同步原理

MySQL服务的主从架构一般都是通过binlog日志文件来进行的。即在主服务上打开binlog记录每一步的数据库操作,然后从服务上会有一个IO线程,负责跟主服务建立一个TCP连接,请求主服务将binlog传输过来。这时,主库上会有一个IO dump线程,负责通过这个TCP连接把Binlog日志传输给从库的IO线程。接着从服务的IO线程会把读取到的binlog日志数据写入自己的relay日志文件中。然后从服务上另外一个SQL线程会读取relay日志里的内容,进行操作重演,达到还原数据的目的。
在这里插入图片描述
所以我们在上面搭建Mysql主从同步集群后,都会查询集群的状态。而且着重关注Slave_IO和Slave_SQL这两个线程的执行状态

MySQL的binlog不光可以用于主从同步,还可以用于缓存数据同步等场景。

例如Canal,可以模拟一个slave节点,向MySQL发起binlog同步,然后将数据落地到Redis、Kafka等其他组件,实现数据实时流转。

4.2 异步复制

主服务器在执行用户提交的事物后,写入binlog成功就返回客户端成功了,binlog会由一个dump线程异步发送给slave,至于slave到底有没有将binlog日志内容同步完是不确定的,如果此时主节点挂掉了,由于slave内容还没有同步就发生了数据的丢失。
在这里插入图片描述

4.3 半同步复制

主库在执行完客户端提交的事务后,并不是立即返回客户端响应,而是等待至少一个从库接收并写到relay log中,才会返回给客户端。MySQL在等待确认时,默认会等10秒,如果超过10秒没有收到ack,就会降级成为异步复制。
在这里插入图片描述

5.Mysql主从同步延迟问题

在我们搭建的这个主从集群中,有一个比较隐藏的问题,就是这样的主从复制之间会有延迟。这在做了读写分离后,会更容易体现出来。即数据往主服务写,而读数据在从服务读。这时候这个主从复制延迟就有可能造成刚插入了数据但是查不到。当然,这在我们目前的这个集群中是很难出现的,但是在大型集群中会很容易出现。

​ 出现这个问题的根本在于:面向业务的主服务数据都是多线程并发写入的,而从服务是单个线程慢慢拉取binlog,这中间就会有个效率差。所以解决这个问题的关键是要让从服务也用多线程并行复制binlog数据。

  • MySQL自5.7版本后就已经支持并行复制了。可以在从服务上设置slave_parallel_workers为一个大于0的数,然后把slave_parallel_type参数设置为LOGICAL_CLOCK,这就可以了。
  • 使用上面说的半同步复制,保证从节点能接受并确认了主节点的binlog日志
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建MySQL主从同步,你需要进行以下步骤: 1. 在主数据库的配置文件中,添加以下内容: ``` [mysqld] log-bin = mysql-bin server-id = 1 binlog-do-db = user_db binlog-ignore-db = mysql binlog-ignore-db = information_schema binlog-ignore-db = performance_schema ``` 这些配置项将开启二进制日志,并设置主数据库的服务ID和需要同步数据库。 2. 在从数据库的配置文件中,添加以下内容: ``` [mysqld] log-bin = mysql-bin server-id = 2 replicate-wild-do-table = user_db.% replicate-wild-ignore-table = mysql.% replicate-wild-ignore-table = information_schema.% replicate-wild-ignore-table = performance_schema.% ``` 这些配置项将开启二进制日志,并设置从数据库的服务ID和需要同步数据库。 3. 重启主数据库和从数据库,使配置生效。 4. 在从数据库上执行以下命令,连接到主数据库并开始同步: ``` CHANGE MASTER TO MASTER_HOST='主数据库IP地址', MASTER_USER='repluser', MASTER_PASSWORD='密码', MASTER_LOG_FILE='主数据库的二进制日志文件名', MASTER_LOG_POS=主数据库的二进制日志位置; START SLAVE; ``` 这些命令将配置从数据库连接到主数据库,并开始同步数据。 5. 使用以下命令检查主从同步的状态: ``` SHOW SLAVE STATUS\G ``` 在输出中,确保Slave_IO_Running和Slave_SQL_Running的值都为"Yes",表示主从同步正常工作。 请注意,以上步骤是基于MySQL的配置文件进行配置的。确保你在配置文件中正确地设置了主数据库的IP地址、用户名、密码、二进制日志文件名和位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值