文章目录
一:应用场景
在企业网站中,后端Mysql数据库只有一台时,会有以下问题:
<1>:单点故障,mysql数据库一旦宕机 ,服务不可用
<2>:无法处理大量的并发数据请求
<3>:数据一旦丢失 会是一大事故
为了防止这类事故的发生,有了更安全有效的改造办法----设置主从同步。
主从的作用:
<1>:增加MySQL数据库服务器,对数据进行备份,形成主备。确保主备MySQL数据库服务器数据是一样的,主服务器宕机了,备份服务器继续工作,数据有保障。
<2>:通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力
二:MySQL主从备份原理
master 提供binlog二进制日志
slave 通过 I/O线程从master拿取binlog,并复制到slave的中继日志中
slave 通过 SQL线程从slave的中继日志中读取binlog ,然后解析到slave中
注意:主和从数据库版本必须是一样。或者主库的数据库版本必须比从库高,不然会导致很多故障的发生,最好版本一致。
Mysql主从复制部署环境:
主服务器:master 192.168.17.141
从服务器:slave1 192.168.17.135
从服务器:slave2 192.168.17.128
三:主从同步步骤
1:主服务器mysql-master 的配置:
<1>:master主服务器关闭Firewalld
[root@localhost ~]# hostnamectl set-hostname master 主机更名为master
[root@localhost ~]# su
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
<2>:建立时间同步环境,安装配置NTP时间同步服务器,并开启服务。
使用yum安装ntp服务
修改ntp.conf,设置主服务器为时间同步源
[root@master ~]# yum install ntp -y
[root@master ~]# vim /etc/ntp.conf
/server 查找 插入:
server 127.127.17.0 主服务器是时钟源
fudge 127.127.17.0 stratum 8 设置时间层级为8
[root@master ~]# systemctl start ntpd
<3>手工编译mysql(这里编译mysql5.7版本)
[root@localhost LNMP-C7]# tar zxvf mysql-boost-5.7.20.tar.gz -C /opt //解压mysql到/opt
[root@localhost LNMP-C7]# cd /opt/mysql-5.7.20/
[root@localhost mysql-5.7.20]# yum install ncurses ncurses-devel bison cmake expat-devel -y //下载mysql的环境包
[root@localhost mysql-5.7.20]# useradd -s /sbin/nologin mysql //创建mysql的程序用户
cmake配置nginx的编译选项
[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 \
-DWYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost -DWITH_SYSTEMD=1
[root@localhost mysql-5.7.20]# make && make install //编译和安装
[root@localhost mysql-5.7.20]# vim /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
[root@localhost mysql-5.7.20]# chown -R mysql:mysql /usr/local/mysql //数据库目录进行权限调整,更改属主和属组
[root@localhost mysql-5.7.20]# echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile //更改环境变量
[root@localhost mysql-5.7.20]# echo 'export PATH' >> /etc/profile //设置全局变量
[root@localhost mysql-5.7.20]# source /etc/profile 使/etc/profile的更改生效
[root@localhost mysql-5.7.20]# cd /usr/local/mysql
[root@localhost mysql]# //初始化数据库
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
[root@localhost mysql]# cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system
[root@localhost mysql]# systemctl start mysqld //开启mysql服务
[root@localhost mysql]# netstat -ntap | grep mysqld //查看mysql服务是否开启
[root@localhost mysql]# systemctl enable mysqld //设置开机自启动
[root@localhost mysql]# mysqladmin -uroot -p password //设置mysql的初始密码
[root@master ~]# echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
[root@master ~]# echo 'export PATH' >> /etc/profile
[root@master ~]# source /etc/profile
<4>:配置 Master主服务器,并开启服务。
修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项
[root@master ~]# vim /etc/my.cnf
更改插入:
server-id = 11
log-bin=master-bin
log-slave-updates=true
[root@master ~]# systemctl restart mysqld
<5>:登录MySQL服务,授权所有的从服务器复制二进制日志的权限。并查看二进制日志位置
[root@master ~]# mysql -uroot -p //登录数据库
mysql> grant replication slave on *.* to 'myslave'@'192.168.17.%' identified by '111';
mysql> show master status;
master-bin.000001 451
2:从服务器mysql-slave1 的配置:
<1>:slave1服务器关闭Firewalld
[root@slave1 ~]# systemctl stop firewalld
[root@slave1 ~]# setenforce 0
<2>:在从服务器上进行时间同步,并开启服务
使用yum安装ntpdate并进行时间同步
[root@slave1 ~]# yum install ntp ntpdate -y
[root@slave1 ~]# systemctl start ntpd
[root@slave1 ~]# /usr/sbin/ntpdate 192.168.17.141
<3>手工编译安装mysql5.7(和master主服务器 编译mysql数据库 步骤一样,可以看上面,这里省略)
<4>:配置slave1从服务器 ,并开启服务。
修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项
[root@slave1 ~]# vim /etc/my.cnf
插入更改:
server-id = 22
relay-log=relay-log-bin 从服务器同步日志文件记录到本地中继日志
relay-log-index=slave-relay-bin.index 定义relay-log的位置和名称
[root@slave1 ~]# systemctl restart mysqld
<5>:登录MySQL,配置主从同步
[root@slave1 ~]# mysql -uroot -p
mysql> change master to master_host='192.168.17.141',master_user='myslave',master_password='111',master_log_file='master-bin.000001',master_log_pos=451;
mysql> start salve; 启动主从同步
mysql> show slave status\G; 查看slave状态
Slave_l0_Running: Yes
Slave_SQL_Running: Yes
3:从服务器mysql-slave2 的配置:
<1>:slave2服务器关闭Firewalld
[root@slave2 ~]# systemctl stop firewalld
[root@slave2 ~]# setenforce 0
<2>:在从服务器上进行时间同步,并开启服务
使用yum安装ntpdate并进行时间同步
[root@slave2 ~]# yum install ntp ntpdate -y
[root@slave2 ~]# systemctl start ntpd
[root@slave2 ~]# /usr/sbin/ntpdate 192.168.17.141
<3>手工编译安装mysql5.7(和master主服务器 编译mysql数据库 步骤一样,可以看上面,这里省略)
<4>:配置slave1从服务器
修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项
[root@slave2 ~]# vim /etc/my.cnf
插入更改:
server-id = 23
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[root@slave1 ~]# systemctl restart mysqld
<5>:登录MySQL,配置主从同步
[root@slave1 ~]# mysql -uroot -p
mysql> change master to master_host='192.168.17.141',master_user='myslave',master_password='111',master_log_file='master-bin.000001',master_log_pos=451;
mysql> start salve;
mysql> show slave status\G;
4:同步配置完成,主从同步复制效果验证
主服务器master--创建数据库:
mysql> create database abc;
mysql> show databases;
从服务器slave1--查看数据库: mysql> show databases;
从服务器slave2--查看数据库: mysql> show databases;
在主服务器登录MySQL,新建数据库abc
在从服务器上登录MySQL,分别查看数据库,显示与主服务器数据库相同,则主从复制成功。
来源:CSDN
作者:LXF@??
链接:https://blog.csdn.net/weixin_45691464/article/details/103964962