lnmp 七之搭建mysql数据库+mysql主从复制(二进制日志、GTID、半同步)

mysql介绍

mysql官网
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

mysql安装

mysql安装前准备

cmake下载地址

准备阶段
yum install gcc gcc-c++ -y
tar zxf cmake-3.20.1.tar.gz
cd cmake-3.20.1
./configure
make
make install
which cmake

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mysql编译安装

2.开始安装mysql(server1上)
tar zxf mysql-boost-8.0.21.tar.gz
cd mysql-8.0.21
mkdir build               #新建build目录的目的是将所有的构建信息放在这个目录里,cmake完了可以删掉
cd build
cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \   #指定安装路径
                                -DMYSQL_DATADIR=/data/mysql \                #指定数据存放目录
                                -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \   #指定socket路径
                                -DWITH_INNOBASE_STORAGE_ENGINE=1 \           #安装innodb存储引擎
                                -DSYSCONFDIR=/etc \                          #配置文件路径
                                -DENABLED_LOCAL_INFILE=1 \
                                -DWITH_EXTRA_CHARSETS=all \                  #安装所有扩展字符集
                                -DDEFAULT_CHARSET=utf8mb4 \                  #使用utf-8字符集
                                -DDEFAULT_COLLATION=utf8mb4_unicode_ci \     #安装校验字符集
                                -DWITH_BOOST=/root/mysql-8.0.21/boost/boost_1_72_0
make -j2               #使用双核cpu编译,速度更快,内存至少4G
make install

在安装过程中解决 GCC 5.3 or newer is required (-dumpversion says 4.8.5) 报错
yum install centos-release-scl -y
yum install devtoolset-9 -y
yum install devtoolset-9-gcc* -y
scl enable devtoolset-9 bash
gcc --version

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解决报错:安装高版本GCC
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再次编译mysql
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置数据库相关

拷贝脚本文件

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

在这里插入图片描述

新建用户(用于访问数据库)

useradd -M -d /usr/local/mysql/ -s /sbin/nologin mysql
tail -n 1 /etc/passwd

在这里插入图片描述

创建数据库目录

mkdir -p /data/mysql
chown mysql.mysql /data/mysql

在这里插入图片描述

修改.bash_profile文件

cd ~
vim .bash_profile 
source .bash_profile

在这里插入图片描述
在这里插入图片描述

修改配置(/etc/my.cnf)

vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock

在这里插入图片描述
在这里插入图片描述

初始化数据库(得到首次登陆密码)

mysqld --initialize --user=mysql

在这里插入图片描述

启动数据库

1.首先启动数据库
/etc/init.d/mysqld start

2.初次进入数据库设置数据库密码
cd /usr/local/mysql/bin
mysql_secure_installation

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
登录成功
在这里插入图片描述

可视化数据库管理插件

phpMyAdmin是一款php语言开发的可视化数据库管理界面。
下载地址

unzip phpMyAdmin-5.1.1-all-languages.zip
mv phpMyAdmin-5.1.1-all-languages /usr/local/nginx/html/phpadmin   #放到nginx发布目录
nginx                 #如果nginx服务未开启,打开它
systemctl start php-fpm     #这个服务一定得开启

登陆错误问题解决
cd /usr/local/lnmp/php/etc
vim php.ini
systemctl reload php-fpm

cd /usr/local/nginx/html/phpadmin
cp config.sample.inc.php config.inc.php
vim config.inc.php
这几步还可以改为
ll /usr/local/mysql/data
chmod 755 /usr/local/mysql/data

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试(使用数据库用户root 123456)
在这里插入图片描述
登录失败
在这里插入图片描述
解决报错
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用之前的密码登陆成功,可以在此界面管理数据库。
在这里插入图片描述

mysql主从复制

基于二进制日志复制

在server2上配置mysql

1.按照server1的步骤,在server2上安装启动数据库
由于环境一样,直接将server1上编译好的mysql和相关文件拷贝到server2上
cd /etc
scp my.cnf server2:/etc
cd /etc/init.d
scp mysqld server2:/etc/init.d
cd /usr/local
scp -r mysql/ server2:/usr/local/

2.在server2上新建用户
useradd -M -d /usr/local/mysql/ -s /sbin/nologin mysql
tail -n 1 /etc/passwd

3.创建数据库目录
mkdir -p /data/mysql
chown mysql.mysql /data/mysql

4.修改.bash_profile文件
cd ~
vim .bash_profile 
source .bash_profile

5.初始化数据库
mysqld --initialize --user=mysql

6.初次进入数据库设置数据库密码
/etc/init.d/mysqld start
mysql_secure_installation

7.测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开始测试
在这里插入图片描述

正式配置

使用server_id系统变量指定唯一的服务器ID 。此服务器ID用于标识复制拓扑中的各个服务器。

  • 服务器ID为0时,master和slave互不连接,因此该值不能在复制拓扑中使用。除此之外,您还可以选择组织和选择服务器ID的方式,只要每个服务器ID与复制拓扑中任何其他服务器使用的每个其他服务器ID不同即可。
  • 必须在master上启用二进制日志记录,因为二进制日志是将更改从master复制到其slave的基础。如果使用该log-bin 选项未在master上启用二进制日志记录,则无法进行复制。
  • 每个slave使用MySQL用户名和密码连接到master,因此master上必须有一个用户,让slave用于连接。设置slave时,用户名由命令MASTER_USER上的选项指定 CHANGE MASTER TO。只要已被授予REPLICATION SLAVE 特权,任何帐户都可以用于此操作。您可以选择为每个slave创建一个不同的帐户,或为每个slave使用相同的帐户连接到master。

基于二进制日志文件位置的主从复制原理如下:

  • 主服务器上面的任何修改都会通过自己的 I/O thread(I/O 线程)保存在二进制日志 Binary log 里面。
  • 从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
  • 从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。
配置master
1.修改配置文件并重启服务
vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=binlog
/etc/init.d/mysqld restart

2.建立用户并授权
CREATE USER repl@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
show master status;

配置slave
3.修改配置文件并重启服务(和master类似)
vim /etc/my.cnf
[mysqld]
server-id=2           #此处需要不一样
log-bin=binlog        #二进制日志可要可不要
/etc/init.d/mysqld restart

4.配置mysql
mysql> CHANGE MASTER TO 
    -> MASTER_HOST='192.168.1.10',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='123456',
    -> MASTER_LOG_FILE='binlog.000003',
    -> MASTER_LOG_POS=688;

5.开启slave
start slave;

6.查看slave的状态
show slave status\G

7.解决报错
在server1上进行如下配置
ALTER USER repl@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
show master status;

在server2上进行如下操作
CHANGE MASTER TO  MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='binlog.000004', MASTER_LOG_POS=658;
show slave status\G

8.测试
在server1上执行:
CREATE DATABASE linux;
在server2上查看发现linux数据库

开始配置master
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开始配置slave
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决报错

在这里插入图片描述
在server1上配置
在这里插入图片描述
在server2上配置
在这里插入图片描述

测试

在这里插入图片描述
同步成功
在这里插入图片描述

基于GTID复制

为什么选择GTID:

  • GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启。
  • 开启GTID,直接change master to master_auto_postion=1即可,无需找到binlog和POS点,它会自动寻找同步。
  • 借助GTID,在发生主备切换的情况下,MySQL的其它Slave可以自动在新主机上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生错误操作的风险。
  • io线程负责从主库拉取binlog并存储到本地的relaylog,sql线程负责把relaylog中的事务在从库应用。

GTID的工作原理:

  • 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
  • binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的值并设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
  • SQL线程从relaylog中获取GTID,然后对比slave端的binlog是否有该GTID。如果有记录,说明该GTID的事务已经执行,slave会忽略。
  • 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

配置master

1.修改配置文件
vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=ON

2.重启服务
/etc/init.d/mysqld restart

在这里插入图片描述
在这里插入图片描述

配置slave

1.修改配置文件
vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=ON

2.重启服务
/etc/init.d/mysqld restart

3.mysql配置
stop slave;
mysql> change master to 
       master_host='192.168.1.10',
       master_user='repl',
       master_password='123456',
       master_auto_position=1;

start slave;
show slave status\G;
            ...
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试

准备:提前建立好数据库及表
1.在server1库里添加内容
INSERT INTO linux.test values ('222','33');
select * from test;

2.再次在server2上查看
select * from linux.test; 
select * from mysql.gtid_executed;

3.在server1上删除表test数据
delete from test;
select * from test;

4.在server2上查看
select * from mysql.gtid_executed;
select * from linux.test; 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

半同步复制(基于GTID)

数据库的主从复制依赖网络同步,slave总是滞后于master,如果存在网络环境糟糕,延时过大,如存在几个小时的延时数据,这样会大大增加数据丢失风险,在一些特殊场合数据要比节约同步时间更重要,如银行,重要数据中心等,因此必须保证数据的安全性,半同步复制的意思是当数据已经到达slave端进行备份,才会给master返回确认信息,这时候,数据才被真正的写入数据库。

  • mysql异步复制(mysql复制默认是异步复制): mysql异步复制是指,mysql主库将事务信息写入binlog文件中的时候,此时主库会通过binlog dump线程给从库发送这些新的binlog变化,然后并不等待从库的响应继续提交事务并写入binlog,所以主库并不保证这些事务变化的binlog数据会传输并应用到任何从库。
  • mysql全同步复制: mysql全同步复制是指,当主库提交事务的binlog后,所有的从库节点必须全部收到事务并且apply并且提交这些内容之后,即io_thread和sql_thread完成所有binlog变化的接受的应用执行,主库的线程才可以继续进行后续操作,但是缺点是,主库完成一个事务的时间会被拉长,性能急剧降低。
  • mysql半同步复制: mysql半同步复制是介于异步和全同步之间,主库只需要等待至少一个从节点,收到并且flush binlog到relay log文件即可,主库不需要等待所有从库给主库反馈,这里只是一个收到的反馈,而并不是从库已经完成并提交的反馈,即从库只应用完成io_thread内容即可无需等到sql_thread的执行完成。半同步复制分为如下两种:
    (1)after commit(5.6默认值):master将每个事务写入binlog,传递到slave 刷新到磁盘(relay log),同时主库提交事务。master等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端。(在等待Slave ACK时候,虽然没有返回当前客户端,但事务已经提交,其他客户端会读取到已提交事务。如果Slave端还没有读到该事务的events,同时主库发生了crash,然后切换到备库。那么之前读到的事务就不见了,出现了幻读。)
    (2)after sync(5.7默认值,但5.6中无此模式):master 将每个事务写入binlog,传递到slave 刷新到磁盘(relay log)。master等待slave 反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。 即使主库crash,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。

配置master

master:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';       #安装半同步复制插件
SET GLOBAL rpl_semi_sync_master_enabled =1;
SHOW STATUS LIKE 'Rpl_semi%';

在这里插入图片描述

配置slave

slave:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD;           #以下两步是重启slave
START SLAVE IO_THREAD;
SHOW STATUS LIKE 'Rpl_semi%';

在这里插入图片描述

测试

1.在server1上执行
INSERT INTO test VALUES ('liu','love');
SHOW STATUS LIKE 'Rpl%';

2.在server2上执行
STOP SLAVE IO_THREAD; 

3.在server1上再次插入数据
INSERT INTO test VALUES ('yue','love');
SHOW STATUS LIKE 'Rpl%';

在这里插入图片描述
在这里插入图片描述
在server1上插入数据时发现等待了10s(默认时长),在现实应用中,我们可以将这个时间设置为无限长,这样就可以避免主从数据不同步的问题。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值