如何搭建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数据库服务器数据是一样的
- 主服务器宕机了,备份服务器据需工作,数据有保障
1.3: 更可靠的解决方案
-
通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力
-
Amoeba:是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy,外号变形虫
读取请求发送给从服务器时,采用轮询调度算法(Amoeba我们这次不会用到)
-
主服务器挂掉,我们会采用MHA解决(此方法我们这次实验不会使用)
1.4: 主从复制的类型
- 基于语句的复制(默认)
- 在主服务器上执行的语句,从服务器执行同样的语句
- 基于行的复制
- 把改变的内容复制到从服务器
- 把改变的内容复制到从服务器
- 一旦发现基于语句无法精确复制时,就会采用基于行的复制
1.5: 工作流程
复制的过程:
- 在每个事物更新数据完成之前,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: 实验拓扑图
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)