如何搭建Mysq服务器主从服务

4 篇文章 0 订阅
2 篇文章 0 订阅
本文详述了为何要搭建MySQL服务器主从服务及其解决的痛点,包括单点故障、高并发问题和数据安全。并通过步骤介绍了如何配置主从复制,涉及防火墙配置、时间同步、数据库安装和权限设置,旨在实现高可用性和读写分离。
摘要由CSDN通过智能技术生成

如何搭建MySQL服务器主从服务

文章目录

前言

一、为何要搭建主从服务

1.1: 搭建的原因
1.2: 如何解决
1.3: 更可靠的解决方案
1.4: 主从复制的类型
1.5: 工作流程

二、如何去搭建主从服务

2.1: 部署环境
2.2: 实验拓扑图
2.3: 实验目的
2.4: 实验过程
2.4.1: 防火墙配置
2.4.2: 建立时间同步
2.4.3: 编译安装MySQL数据库
2.4.4: 配置主服务器
2.4.5: 配置从服务器
2.5:实验验证

前言

在实际生产环境中,如果对数据库的读和写都在同一个数据库服务中操作,无论是在安全性、高可用性,还是高并发等各方面都是完全不能满足实际需求的,因此,一般来说都是通过主从服务复制的方式来同步数据,在通过读写分离来提升数据库的并发负载能力这样的方案来部署与实施的。

一、为何要搭建主从服务器

1.1: 搭建的原因

在企业网站中,后端MySQL数据库只有一台是,会有以下几种故障:

  • 单点故障,服务不可用
  • 无法处理大量的并发数据请求
  • 数据因为不可抗因素丢失

在这里插入图片描述

1.2: 如何解决
  • 增加MySQL数据库服务器,对数据进行备份,形成主备
  • 确保主备MySQL数据库服务器数据是一样的
  • 主服务器宕机了,备份服务器据需工作,数据有保障

w6JYkD.png

1.3: 更可靠的解决方案
  • 通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力

  • Amoeba:是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy,外号变形虫

    读取请求发送给从服务器时,采用轮询调度算法(Amoeba我们这次不会用到)

  • 主服务器挂掉,我们会采用MHA解决(此方法我们这次实验不会使用)

在这里插入图片描述

1.4: 主从复制的类型
  • 基于语句的复制(默认)
    • 在主服务器上执行的语句,从服务器执行同样的语句
  • 基于行的复制
    • 把改变的内容复制到从服务器
  • 把改变的内容复制到从服务器
    • 一旦发现基于语句无法精确复制时,就会采用基于行的复制
1.5: 工作流程

[w6U9EV.png

复制的过程:

  • 在每个事物更新数据完成之前,Master在二进制日志记录这些改变,写入二进制日志完成后,Master通知存储引擎提交事物
  • Slave将Master的Binary log复制到中继日志,首先Slave开始一个工作线程–I/O线程,I/O线程在Master上开一个普通的连接,然后开始Binlog dump process,Binlog dump process从Master的二进制日志中读取时间,如果已经跟上Master,它会睡眠并等待Master产生的新事物,I/O线程将这些日志写入中继日志
  • SQL Slave thread(SQL从线程)处理该过程的最有一步,SQL线程从中继日志读取时间,并重放器的事件而更新Slave数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

二、如何去搭建主从服务

2.1: 部署环境
  • 3台安装了CentOS7.6的服务机3台
  • 1台Master服务器
  • 2他Slave服务器
2.2: 实验拓扑图

w6rVJ0.png

2.3: 实验目的

模拟真实环境,搭载主从服务器

2.4: 实验过程
2.4.1: 防火墙配置
  • 关闭防火墙以及核心防护
[root@mysqlmaster ~]# systemctl stop firewalld      ####关闭防火墙
[root@mysqlmaster ~]# systemctl disable firewalld   ####关闭自启
[root@mysqlmaster ~]# systemctl status firewalld    ####查看防火墙状态
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@mysqlmaster ~]# vi /etc/selinux/config    ####关闭核心防护

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     disabled - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of disabled.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled      ####此处改成disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
2.4.2: 建立时间同步
  • 在主服务器上建立NTP服务器
    • 通过yum安装
[root@mysqlmaster ~]# yum -y install ntp
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
centos                                                                                                                                                                                    | 3.6 kB  00:00:00     
软件包 ntp-4.2.6p5-28.el7.centos.x86_64 已安装并且是最新版本
无须任何处理
[root@mysqlmaster ~]# vi /etc/ntp.conf     ####在最后一行插入

server 127.127.1.0
fudge 127.127.1.0 stratum 8

[root@mysqlmaster ~]# service ntpd restart     ####重启ntpd服务
Redirecting to /bin/systemctl restart ntpd.service
[root@mysqlmaster ~]# systemctl restart ntpd   ####重启ntpd
[root@mysqlmaster ~]# systemctl enable ntpd    ####开启开机自启
  • 在两台从服务器上安装NTPDATE时间同步
    • 通过yum安装
    • 同步主服务器
[root@mysqlsalve ~]# yum -y install ntpdate
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
centos                                                                                                                                                                                    | 3.6 kB  00:00:00     
软件包 ntpdate-4.2.6p5-28.el7.centos.x86_64 已安装并且是最新版本
无须任何处理
[root@mysqlsalve ~]# ntpdate 20.0.0.31
15 Sep 22:16:27 ntpdate[18849]: adjust time server 20.0.0.31 offset -0.000889 sec
                                                                     ####时间同步已建立
2.4.3: 编译安装MySQL数据库

如何安装MySQL数据可以可以参看我前面的博客:https://editor.csdn.net/md/?articleId=108501500(数据库初体验以及MySQL数据库的安装)

2.4.4: 配置主服务器
  • 修改/etc/my.cnf配置文件,更改服务器id,配置二进制日志选项
[root@mysqlmaster ~]# vi /etc/my.cnf

[client]
省略字段...
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 11                    ####更改服务id,这边会用到,不能乱设
log_bin = master-bin              ####设置二进制日志的日志文件名
log-slave-updates = true          ####从服务器可以更新日志

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

[root@mysqlmaster ~]# systemctl restart mysqld.service     ####重启MySQL数据库服务
  • 登陆mysql服务,授权所有从服务器可以复制二进制日志的权限
[root@mysqlmaster ~]# mysql -uroot -p
Enter password:
####192.168.79.0段的从服务器拥有复制权限,可以使用myslave身份12345密码复制所有的库和表####
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'20.0.0.%' IDENTIFIED BY '12345';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;             ####刷新数据库
mysql> show master status;	####查看日志名和偏移值,后面会用到
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000003 |      599 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
2.4.5: 配置从服务器
  • 修改从服务器/etc/my.cnf配置文件,更改服务器id,配置二进制日志选项
[root@mysqlsalve ~]# vi /etc/my.cnf
省略字段...
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 22
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

[root@mysqlsalve ~]# systemctl restart mysqld.service     ####重启MySQL数据库

※如何理解***relay-log***?

relay log很多方面都跟binary log差不多。

区别是:从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致

  • 登陆mysql服务,配置同步
[root@mysqlsalve ~]# mysql -uroot -p
Enter password: 

mysql> change master to master_host='20.0.0.31',master_user='myslave',master_password='12345',master_log_file='master-bin.000003',master_log_pos=599;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                         省略段落......
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes        ####两个值为YES说明进程正确
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
2.5: 实验验证
  • 分别登陆主、从服务器
  • 在主服务器上新建一个名为text的数据库
 mysql> create database text;
 Query OK, 1 row affected (0.00 sec)
  • 在主、从服务器上分辨查看数据库,显示数据库相同,则实验验证成功
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| text               |
+--------------------+
5 rows in set (0.01 sec)

库,显示数据库相同,则实验验证成功

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| text               |
+--------------------+
5 rows in set (0.01 sec)
要在Windows上搭建MySQL 8版本的主从复制,可以按照以下步骤进行操作: 1. 安装Docker Desktop:前往Docker官网下载并安装Docker Desktop。 2. 下载MySQL 8镜像:打开命令行窗口,运行以下命令下载MySQL 8镜像: ``` docker pull mysql:8 ``` 3. 创建MySQL主节点容器:运行以下命令创建MySQL主节点容器,并指定MySQL的root用户密码和服务器ID: ``` docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_SERVER_ID=1 -d mysql:8 ``` 4. 创建MySQL从节点容器:运行以下命令创建MySQL从节点容器,并指定MySQL的root用户密码、服务器ID和主节点IP地址: ``` docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_SERVER_ID=2 -e MYSQL_MASTER_HOST=your_master_ip -e MYSQL_MASTER_PORT=3306 -e MYSQL_MASTER_USER=root -e MYSQL_MASTER_PASSWORD=your_master_password -d mysql:8 ``` 其中,your_master_ip和your_master_password分别应替换为主节点的IP地址和root用户密码。 5. 配置MySQL主从复制:打开MySQL主节点容器的命令行窗口,运行以下命令配置主从复制: ``` GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepassword'; FLUSH PRIVILEGES; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; ``` 记下该命令输出的File和Position值。 6. 在MySQL从节点容器中启动复制:打开MySQL从节点容器的命令行窗口,运行以下命令启动复制: ``` CHANGE MASTER TO MASTER_HOST='your_master_ip',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='your_master_password',MASTER_LOG_FILE='File值',MASTER_LOG_POS=Position值; START SLAVE; ``` 其中,your_master_ip和your_master_password分别应替换为主节点的IP地址和root用户密码,File值和Position值分别应替换为步骤5中输出的值。 7. 验证MySQL主从复制是否成功:在MySQL主节点容器的命令行窗口中插入一些数据,然后在MySQL从节点容器的命令行窗口中查询是否能看到这些数据。 以上就是在Windows上搭建MySQL 8版本的主从复制的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值