MYSQL数据库 主从复制原理及部署 适合初入MYSQL

一、原理

在企业网站中,后端MySQL数据库只有一台时,会有以下问题:
单点故障,服务不可用
无法处理大量的并发数据请求
数据丢失—大灾难
在这里插入图片描述

改造办法:
增加MySQL数据库服务器,对数据进行备份,形成主备

确保主备MySQL数据库服务器数据是一样的
主服务器宕机了,备份服务器继续工作,数据有保障

MySQL主从复制与读写分离是密切相关的
在这里插入图片描述

当然还有更高级的解决方案,读写分离,今天我们只讲主从复制

1)主从知识扩展

MySQL主从复制的类型:

基于语句的复制(默认)在主服务器上执行的语句,从服务器执行同样的语句,
基于行的复制把改变的内容复制到从服务器
混合类型的复制—旦发现基于语句无法精确复制时,就会采用基于行的复制

2)主从复制的工作过程

在这里插入图片描述

复制的过程:
·在每个事物更新数据完成之前, Master在二进制日志记录这些改变。写入二进制日志完成后, Master通知存储引擎提交事物。

·Slave将Master的Binary log复制到中继日志,首先Slave开始一个工作线程–l/o线程, l/o线程在Master上开一个普通的连接,然后开始Binlog dump process,Binlog dump process从Master的二进制日志中读取事件,如果已经更上Master,它会睡眠并等待Master产生的新事件。l/o线程将这些日志写入中继日志

·SQL Slave thread (SQL从线程)处理该过程的最后一步, SQL线程从中继日志读取事件,并重放其的事件而更新Slave数据,使其与Master中的数据一致。只要该线程与1/0线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

二、Mysql主从服务搭建

环境介绍:
20.0.0.30 主服务器
20.0.0.31 从服务器
20.0.0.32 从服务器

###master, slave1, slave2####
关闭防火墙、关闭核心防护

1)建立时间同步环境
1、在主机 Master 搭建时间同步服务器NTP (20.0.0.30)
[root@localhost ~]# yum-y install ntp
[root@localhost ~]# vi /etc/ntp.conf               ####最后面添加这二行
server 127.127.1.0
fudge 127.127.1.0 stratum 8

[root@localhost ~]# service ntpd restart
[root@localhost ~]# systemctl restart ntpd
[root@localhost ~# systemctl enable ntpd

2、在从服务器上配置NTP同步
登录到从1服务器 20.0.0.31
[root@localhost ~]# yum-y install ntpdate
[root@localhost ~]# ntpdate 20.0.0.30
[root@localhost ~]# crontab -e
*/2 * * * * /usr/sbin/ntpdate 20.0.0.30 >>/var/log/ntpdate.log

[root@localhost ~]# systemctl restart crond
[root@localhost ~]# systemctl enable crond
[root@localhost ~]# tail -f /var/log/ntpdate.log             ###动态查看更新日志文件

登录到从2服务器 20.0.0.32
[root@localhost ~]# yum-y install ntpdate
[root@localhost ~]# ntpdate 20.0.0.30
[root@localhost ~]# crontab -e
*/2 * * * * /usr/sbin/ntpdate 20.0.0.30 >>/var/log/ntpdate.log
[root@localhost ~]# systemctl restart crond
[root@localhost ~]# systemctl enable crond
[root@localhost ~]# tail -f /var/log/ntpdate.log             ###动态查看更新日志文件
2)编译安装MySQL数据库
     ##三台都是此操作,可同步进行
#使用CRT登录3台主机, 登录以后检查, 登录是否正常, 确认下主机的IP地址是否正确, 各个主机通信是否正常。
登录 20.0.0.30 此终端, 在终端页面最下面, 右击打开 ---send conmands to all sessions
    ###此功能是敲一条命令, 其他终端全部同步执行


1、安装Mysq环境依赖包
[root@localhost ~]#
yum -y install \
ncurses \
ncurses-devel \
bison \
cmake \
gcc \
gcc-c++

2、创建运行用户
[root@localhost ~]# useradd -s /sbin/nologin mysql

3、编译安装
###上传mysql-boost-5.7.20.tar.gz到opt目录下###
[root@localhost ~]cd /opt
[root@localhost opt]# tar xzvf mysql-boost-5.7.20.tar.gz
[root@localhost opt]#cd /opt/mysql-5.7.20/

[root@localhost mysql-5.7.20]#
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1

######编译安装####

make && make install


#####数据库目录进行权限调整##############

chown -R mysql:mysql /usr/local/mysql/


#####建立调整配置文件########

vi /etc/my.cnf

[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[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 = 1

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

chown mysql:mysql /etc/my.cnf

#######设置环境变量####
###为了让系统能够直接识别 mysql/bin下的命令   和mysql/lib 下的各种库

echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/bin:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile

cd /usr/local/mysql/

###########初始化##########
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

###为什么cp usr/而不是cp /usr/ ?因为现在是在这个目录底下
###为什么要cp?为了让systemctl进行管理,systemctl管理/usr/lib/systemd/system/下的程序
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/

systemctl enable mysqld
systemctl start mysqld
systemctl status mysqld
netstat -anpt | grep 3306

###刚开始没密码是空的直接回车,然后输入密码
mysqladmin -u root -p password 

mysql -u root -p     输入刚刚的密码
3)登录Master主服务器配置 20.0.0.30
 ###在原来server-id = 1的地方修改成11后面新增下面两行

[root@localhost mysq]# vi /etc/my.cnf 
server-id = 11
log_bin = master-bin
log-slave-updates = true

[root@localhost mysq]# systemct restart mysqld                 ###重启数据库

#登录Master数据库给从服务器授权
[root@localhost mysql# mysql -uroot -p

#下面的账号和密码是给从服务器使用的
mysql>grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by 'abc123';
mysąl> flush privileges;

#下面这条命令下的东西尤其重要,FILE和POS都是一会从服务器要使用的
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      600 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

4)登录salve 从服务器配置
[root@localhost mysql]# vi /etc/my.cnf     ##在原来server-id = 1的地方修改成22后面新增
server-id = 22
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

[root@localhost mysq]# systemctl restart mysqld     ##重启数据库

#登录Slave数据库配置同步   ###注意下这边的master_log_file='master-bin.000001', 
master_log _pos=600; 要和Master数据库信息一致, 不一致的话要更改先stop slave;
#然后更改同步信息

[root@localhost mysql]#mysql -uroot -p

##账号和密码是主服务器设置的,同步的日志文件和pos也是刚刚主服务器的
mysql>change master to master_host='20.0.0.30',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=600;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
********************* 1. row*********************************
Slave_lO_State: Waiting for master to send event
Master_Host: 192.168.32.11
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 604
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: master-bin.000001
Slave_lO_Running: Yes      ####开启
Slave SQL Running: Yes     ####开启

##看到上面两条的时候说明成功了,如果出现其他,请检查配置文件
#####登录salve2从服务器配置20.0.0.32 ####配置和上面从1服务器一样

[root@localhost mysq]# vi /etc/my.cnf       ##在原来server-id =1的地方修改成22 后面新增           
server-id = 33
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

[root@localhost mysq]# systemctl restart mysqld           ###重启数据库

#登录Slave 数据库配置同步   ###注意下这边的master_log_file= 'master-bin.000001',                  
master_log_pos= 600; 要和Master 数据库信息一致, 不一致的话要更改先stop slave;
#然后更改同步信息

[root@localhost mysqj]j# mysql -uroot -p

mysql> change master tomaster_host='20.0.0.30',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=600;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G
***************1. row**************************
Slave_lO_State: Waiting for master to send event
Master_Host: 192.168.32.11
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 604
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: master-bin.000001
Slave_lO_Running: Yes      ####开启
Slave SQL Running: Yes     ####开启
5)验证
主服务器操作:
mysql> create database qhdx;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| qhdx               |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

###从服务器1查看 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| qhdx               |
| qq                 |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

###从服务器2查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| qhdx               |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
MySQL数据库主从复制是一种用于解决MySQL单点故障和提高整体服务性能的技术。它的原理是通过将主数据库的更新操作复制到从数据库,使得从数据库可以保持与主数据库的数据一致性。[1] 在实际的生产环境中,主从复制被广泛应用于增加MySQL的可用性和性能。通过配置主从复制,可以实现数据的备份和读写分离,从而提高整体的系统性能。 主从复制MySQL中具有很多优势,它可以提供高可用性、高性能和灵活性。通过主从复制,可以简化MySQL部署过程,并根据不同的业务需求进行灵活的调整。 总结来说,MySQL数据库主从复制是一种解决单点故障和提高性能的技术,它通过复制主数据库的更新操作到从数据库来实现数据的备份和读写分离。这种技术可以提供高可用性、高性能和灵活性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL数据库——主从复制](https://blog.csdn.net/qq_41808387/article/details/107009748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [MySQL主从复制](https://blog.csdn.net/m0_62473957/article/details/124140928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值