一.Mysql数据库

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性,其所使用的 SQL 语言是用于访问数据库的最常用标准化语言。支持多线程,充分利用 CPU 资源。优化的 SQL查询算法,有效地提高查询速度,既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。Linux作为操作系统,Apache或者Nginx作为web服务器,mysql作为数据库,php作为服务器脚本解释器,这四个开源软件搭建一个稳定的,免费的网站系统,“LNMP”或者“LAMP”架构。数据库的复制有多种类型:一主多从,一主一从,级联复制等

二.Mysql的主从复制

一台mysql作主服务器,一个或者多个服务器充当从服务器。注意,所有对数据库的更新都要在主库进行,以免从库和主库的数据发生冲突,数据库的复制是单向的,只能由主库指向从库,主从复制是异步的复制,不能确保数据的一致性。主库将更新都记录到二进制日志文件中,主库创建一个binlog Dump线程,将二进制日志文件发送到从库,从库创建一个IO线程,用于接收主库的二进制日志文件,并将数据复制到从库的数据库目录中,也就值中继日志。同时会创建一个SQL线程,把从库数据库目录的中继日志在从库执行。

实验环境:rhel7.3
主库:172.25.66.1(server1)
从库:172.25.66.2(server2)
数据库的安装包:mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
1.传统的主从复制

(1)mysql的安装(主库和从库都安装):

解压安装包

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库


查看mysql从库转成主库 mysql是主库还是从库_mysql_02


将解压好的安装包发送给server2

查看mysql从库转成主库 mysql是主库还是从库_mysql_03

查看mysql从库转成主库 mysql是主库还是从库_读写分离_04


(2)mysql的主从复制的配置(mysql的配置文件:/etc/my.cnf)分别重启mysql

查看mysql从库转成主库 mysql是主库还是从库_读写分离_05


server1配置

master:

设置server-id=1 必须保证全局唯一

log-bin=mysql-bin ##主库的二进制日志文件的前缀是mysql-bin,这也是主从复制的关键

查看mysql从库转成主库 mysql是主库还是从库_mysql_06


server2配置

slave:

查看mysql从库转成主库 mysql是主库还是从库_mysql_07


(3)mysql的初始化:初始化之后在数据库的日志里会生成一个临时密码,使用此密码进行登陆以及更改新的密码

mysq的登陆以及密码的更改(此命令mysql_secure_installation用于更改新密码)

查看mysql从库转成主库 mysql是主库还是从库_数据库_08


查看mysql从库转成主库 mysql是主库还是从库_mysql_09


主库授权一个用于同步的从库用户以及用户权限

查看mysql从库转成主库 mysql是主库还是从库_数据库_10


从库测试登陆

查看mysql从库转成主库 mysql是主库还是从库_读写分离_11


查看mysql从库转成主库 mysql是主库还是从库_数据库_12


show master status; ##查看主库的状态包含了二进制文件名,pos号(日志的位置),忽略的数据库,GTID等

查看mysql从库转成主库 mysql是主库还是从库_mysql_13


(4)在从库上面开启复制功能start slave ##打开从库

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_14


show slave status\G; ##查看从库状态(关键在于SQL线程和IO线程,这两个线程OK,那就没问题,主从复制完成

查看mysql从库转成主库 mysql是主库还是从库_mysql_15

(5)测试:

在主库创建一个数据库

查看mysql从库转成主库 mysql是主库还是从库_读写分离_16


从库也成功同步

查看mysql从库转成主库 mysql是主库还是从库_mysql_17

在主数据库中创建表,并且创建用户

查看mysql从库转成主库 mysql是主库还是从库_mysql_18


从库也同步过来

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_19


2.基于GTID的主从复制(mysql5.6以后支持GTID)

借助GTID,在发生主备切换的情况下,MySQL的其它Slave可以自动在新主上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。

(1)主库和从库的配置

master:

gtid_mode=on ##打开gtid的模块

enforce-gtid-consistency=true ##保证gtid安全的参数

server1配置

mysql的主从复制的配置(mysql的配置文件:/etc/my.cnf)

查看mysql从库转成主库 mysql是主库还是从库_读写分离_20


查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_21


server2配置

slave:同样也要打开gtid的模块

查看mysql从库转成主库 mysql是主库还是从库_数据库_22


(2)测试:

主库创建表插入数据

查看mysql从库转成主库 mysql是主库还是从库_读写分离_23


查看mysql从库转成主库 mysql是主库还是从库_mysql_24


查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_25

三.mysql的并行复制

在MySQL 5.6之前的版本里,有三个线程参与,都是单线程:Binlog Dump(主) ----->IO Thread (从) -----> SQL Thread(从),复制出现延迟,一个是从库的SQL线程(因为大量的数据需要同步,一时间忙不过来),另一个是因为网络的波动导致从库的IQ线程异常。

并行复制在slave上面配置(同时有16个worker线程去更新中继日志):

slave-parallel-type=LOGICAL_CLOCK ##基于组提交的并行复制

slave-parallel-workers=16 ##开启16个worker

mysql的主从复制的配置(mysql的配置文件:/etc/my.cnf)

查看mysql从库转成主库 mysql是主库还是从库_mysql_26


查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_27


master.info ##主库的信息

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_28


master_info_repository=TABLE ##默认以文件存储,原来是存在磁盘里,现在以表的形式存储

relay_log_info_repository=TABLE ##优化选项

relay_log_recovery=TRUE ##从库要求重新同步master日志 (当从库down掉,就会丢弃中继日志,重新请求relay-log)

查看mysql从库转成主库 mysql是主库还是从库_数据库_29


查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_30

16个worker

查看mysql从库转成主库 mysql是主库还是从库_mysql_31

四.mysql的半同步复制

MySQL的复制功能默认是异步的,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收,就有可能出现当主服务器或从服务器端发生故障的时候,从库并没有接收到主服务器发送过来的binlog日志,这就会造成主库和从库的数据不一致,甚至在恢复时造成数据的丢失。

半同步复制的工作原理:当slave从库IO_Thread线程将binlog日志接收完成,会给master主库一个应答,如果超过10秒主库未收到slave从库的接受确认信号,那么就会自动切换为异步复制模式。

1.半同步复制的配置(基于mysql的内置插件)

master:

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_32


查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_33


查看mysql从库转成主库 mysql是主库还是从库_mysql_34


查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_35


slave:从库也同样配置,只不过不用配置超时时间

查看mysql从库转成主库 mysql是主库还是从库_读写分离_36


2,激活半同步复制

slave:停止slave的IO线程,再次开启即可

查看mysql从库转成主库 mysql是主库还是从库_读写分离_37

master:

show status like ‘rpl%’; ##查看半同步的状态(一个slave在线)

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_38


3.测试(1)关闭slave的IO线程

查看mysql从库转成主库 mysql是主库还是从库_mysql_39


(2)在master插入数据有10s的延迟之后才发送过去

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_40


有一个任务是没有收到slave的回应

查看mysql从库转成主库 mysql是主库还是从库_mysql_41


开启slave的IO线程

查看mysql从库转成主库 mysql是主库还是从库_读写分离_42


在master插入数据

查看mysql从库转成主库 mysql是主库还是从库_mysql_43


有一个任务是没有收到slave的回应 两个收到

查看mysql从库转成主库 mysql是主库还是从库_读写分离_44


rpl_semi_sync_master_enabled=1 \ON ##开启半同步

查看mysql从库转成主库 mysql是主库还是从库_读写分离_45


查看mysql从库转成主库 mysql是主库还是从库_mysql_46


重启mysqlbinlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。

看一下当前MySQL的binlog

查看mysql从库转成主库 mysql是主库还是从库_数据库_47


mysql给我们提供了一个用于查看binlog日志的工具,叫做mysqlbinlog

/var/lib/mysql/

查看mysql从库转成主库 mysql是主库还是从库_读写分离_48

五:使用Mysql-Proxy实现Mysql的读写分离

一,mysql读写分离原理

MYSQL所谓主从复制和MYSQL的读写分离两者有着紧密联系,首先部署主从复制,只有主从复制完了,才能在此基础上进行数据的读写分离。

MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。简单来说,读写分离就是在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

二、为什么要进行读写分离

因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。

所以读写分离,解决的是,数据库的写入,影响了查询的效率。

三、什么时候要进行读写分离

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。

四、MYSQL读写分离的实现
1,实验环境:
172.25.66.1 server1 master

172.25.66.2 server2 slave

172.25.66.3 server3 mysql-proxy

在server1和server2上做主从复制
在server3上做mysql-proxy(调度器)

2、配置读写分离

1)下载mysql-proxy数据包并解压,将解压后的目录放在/usr/local下

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_49


2)将mysql-proxy的二进制命令放进系统环境变量中,方便后续操作

cd /usr/local/mysql-proxy/bin

vim ~/.bash_profile

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_50


3)实现读写分离是有lua脚本实现的

vim rw-splitting #修改数据库读写分离时的最大最小值

min_idle_connections = 1 # 最小连接数

max_idle_connections = 2 #最大连接数

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_51


查看mysql从库转成主库 mysql是主库还是从库_mysql_52

4)配置mysql-proxy

编辑读写分离的配置文件

user=root #proxy运行的用户身份

proxy-address=172.25.66.3:3306 #proxy监听本机所有接口

proxy-read-only-backend-addresses=172.25.66.2:3306 #后端slave(读)服务器

proxy-backend-addresses=172.25.66.1:3306 #后端master(读写)服务器

proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua #lua脚本所在位置

log-file=/usr/local/mysql-proxy/log/mysql-proxy.log #日志存放位置

log-level=debug

daemon=true

keepalive=true

查看mysql从库转成主库 mysql是主库还是从库_数据库_53


查看mysql从库转成主库 mysql是主库还是从库_读写分离_54


5)启动mysql-proxy

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_55


修改启动文件权限,并再次启动

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_56


6)查看监听端口信息

查看mysql从库转成主库 mysql是主库还是从库_读写分离_57


查看mysql从库转成主库 mysql是主库还是从库_读写分离_58


7)三台虚拟机安装lsof监控工具,进行监控,查看3306端口哪个终端占用yum install lsof -y

查看mysql从库转成主库 mysql是主库还是从库_数据库_59


查看mysql从库转成主库 mysql是主库还是从库_mysql_60


查看mysql从库转成主库 mysql是主库还是从库_数据库_61


8)master端授权给远程登陆数据库的用户

查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_62

9)在真机进行登陆

10)向数据库中写入数据:

查看mysql从库转成主库 mysql是主库还是从库_mysql_63


同步成功

查看mysql从库转成主库 mysql是主库还是从库_读写分离_64


查看mysql从库转成主库 mysql是主库还是从库_mysql_65


此时,查看监控可知:连接到master端

查看mysql从库转成主库 mysql是主库还是从库_mysql_66


查看mysql从库转成主库 mysql是主库还是从库_查看mysql从库转成主库_67


查看mysql从库转成主库 mysql是主库还是从库_数据库_68