mysql数据库之——主从复制读写分离的实验操作

Posted 丁CCCCC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库之——主从复制读写分离的实验操作相关的知识,希望对你有一定的参考价值。

一、主从复制

1.1 原理

主从复制类型

  • 基于语句的复制(STATEMENT,mysql默认类型)
  • 基于行的复制(ROW)
  • 混合类型的复制(MIXED)

工作过程

在这里插入图片描述

1.用户在主服务器执行一些写的操作后,会记录到主服务器的二进制日志(Binary log)中
2.然后从数据库开启IO线程,读取主服务器的二进制日志内的数据,同步复制到自己的中继日志(Relay log)中,中继日志在自己的缓存中
3.从服务器SQL线程读取缓存当中的中继日志,再把里面的事件重放到自己的服务器,实现重写操作
4.完成从服务器和主服务器操作一致

1.2 搭建服务

准备工作

Master 服务器 :192.168.253.22

Slave1 服务器 :192.168.253.33

Slave2 服务器 :192.168.253.44

关闭防火墙

systemctl stop firewalld 
systemctl disable firewalld
setenforce 0

MySQL主服务器设置

安装相应软件

yum -y install ntp

时间同步设置

  • vim /etc/ntp.conf

末行添加

server 127.127.253.0					# 设置本地为时钟源,网段为本机的
fudge 127.127.253.0 stratum 10			# 设置时间层级,范围15内即可

service ntpd start						# 开启服务

mysql设置

  • vim /etc/my.cnf
log-bin=master-bin				# 开启二进制日志
binlog_format = MIXED
log-slave-updates=tru			# 允许从服务器更新二进制日志

systemctl restart mysqld.service
  • mysql -u root -pcc123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.253.%' IDENTIFIED BY '123456';			# 给从服务器授权
FLUSH PRIVILEGES;
  • show master status;
    • File 显示日志名
    • Position 显示偏移量

在这里插入图片描述

从服务器设置(两台设置一样)

安装相应软件

yum -y install ntp ntpdate

时间同步

service ntpd start						# 开启服务

/usr/sbin/ntpdate 192.168.253.22		# 和主服务器进行时间同步

在这里插入图片描述

*/30 * * * * /usr/sbin/ntpdate 192.168.253.22			# 设置定时任务

mysql设置

  • vim /etc/my.cnf
server-id = 33								# id与master不同,和另一台也不能相同
relay-log=relay-log-bin						# 开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index		# 定义中继日志文件的位置和名称

systemctl restart mysqld.service

在这里插入图片描述

  • mysql -u root -pcc123
mysql> CHANGE master to 
    -> master_host='192.168.253.22',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;		# 配置同步,两个值和前面查询的需要一致

start slave;					# 启动同步,如果报错了输入:reset slave;
show slave status\\G				# 查看 Slave状态
Slave_IO_Running: Yes			# 负责与主机的IO通信
Slave_SQL_Running: Yes			# 负责自己的slave mysql进程

在这里插入图片描述

验证

主服务器添加新的库

create database ccd;

在这里插入图片描述
进入从服务器

在这里插入图片描述

二、读写分离

2.1 概述

原理

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

常见的MySQL读写分离

基于程序代码内部实现

  • 在代码中根据select、 insert 进行路由分类,这类方法也是目前生产环境应用最广泛的
  • 优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手
  • 但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大

基于中间代理层实现

  • 代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序
    • MySQL-Proxy。MySQL-Proxy为MySQL 开源项目,通过其自带的lua 脚本进行SQL"判断
    • Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
    • Amoeba。 由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程

2.2 搭建服务

准备工作

Master 服务器 :192.168.253.22

Slave1 服务器 :192.168.253.33

Slave2 服务器 :192.168.253.44

客户端 服务器 :192.168.253.55

Amoeba 服务器:192.168.253.66

关闭防火墙

systemctl stop firewalld 
systemctl disable firewalld
setenforce 0

Amoeba 服务器设置

安装环境

cd /opt
cp jdk-6u14-linux-x64.bin /usr/local
cd /usr/local
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
yes确定
回车

mv jdk1.6.0_14/ /usr/local/jdk1.6
  • vim /etc/profile.d/java.sh
    末行添加
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
  • source /etc/profile.d/java.sh
  • java -version

安装软件

mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/

/usr/local/amoeba/bin/amoeba
amoeba start|stop					# 表示安装成功

配置服务

  • cd /usr/local/amoeba/conf/
  • cp amoeba.xml amoeba.xml.bak
  • vim amoeba.xml
# 修改以下行数

 30 <property name="user">amoeba</property>
 32 <property name="password">123456</property>
 115 <property name="defaultPool">master</property>
 117 去掉注释
 118 <property name="writePool">master</property>
 119 <property name="readPool">slaves</property>
  • cp dbServers.xml dbServers.xml.bak
  • vim dbServers.xml
    • 数据库配置文件
# 注释,作用:默认进入ccc库,以防mysql中没有ccc库会报错
 23 <!-- <property name="schema">test</property> -->
# 修改
 26 <property name="user">ccd</property>
# 取消注释并修改
 28 mysql password				# 此行删除
 29 <property name="password">123456</property>
 30     
# 设置主服务器名为master
 45 <dbServer name="master"  parent="abstractServer">     
# 设置主服务器地址
 48 <propertyname="ipAddress">192.168.253.22</property> 
# 设置从服务器名
 52 <dbServer name="slave1"  parent="abstractServer">
# 设置从服务器1的地址
 55 <property name="ipAddress">192.168.253.33</property>
# 复制从服务器1的名和地址,改为258 <dbServer name="slave2"  parent="abstractServer">
 59 <factoryConfig>
 60 <!-- mysql ip -->
 61 <property name="ipAddress">192.168.253.44</property>
 62 </factoryConfig>
 63 </dbServer>
# 修改
 65 <dbServer name="slaves" virtual="true">  
# 修改
71 <property name="poolNames">slave1,slave2</property>     
  • /usr/local/amoeba/bin/amoeba start&
    • 启动软件,按Ctrl+c返回
  • netstat -napt | grep java
    • 查看8066端口是否开启,默认为8066

在这里插入图片描述

Master 服务器设置

开放权限给Amoeba

grant all on *.* to ccd@'192.168.253.%' identified by '123456';

Slave 服务器设置

开放权限给Amoeba

grant all on *.* to ccd@'192.168.253.%' identified by '123456';

测试

  • yum install -y mariadb-server mariadb
  • systemctl start mariadb.service

客户端服务器

  • mysql -u amoeba -p123456 -h 192.168.253.66 -P8066

    • 通过amoeba服务器代理访问mysql,通过客户端连接后写入数据只有主服务器有记录,然后主服务器同步给从服务器
  • insert into cccc values(1);

    • 写入数据
  • 主服务器访问
    在这里插入图片描述

  • 从服务器也能看到
    在这里插入图片描述

服务器添加数据

  • 33从服务器
mysql> stop slave;							# 关闭同步
Query OK, 0 rows affected (0.02 sec)

mysql> insert into cccc values(2);			# 新增
  • 44从服务器
mysql> insert into cccc values(3);			# 新增
Query OK, 1 row affected (0.06 sec)
  • 22主服务器
mysql> insert into cccc values(4);			# 新增
Query OK, 1 row affected (0.06 sec)

客户端访问
在这里插入图片描述
在这里插入图片描述

  • 在两个从服务器上执行 start slave; 就可以实现同步在主服务器上添加数据

以上是关于mysql数据库之——主从复制读写分离的实验操作的主要内容,如果未能解决你的问题,请参考以下文章

搭建MySql主从复制与读写分离

实验案例MySQL主从复制与读写分离

实验案例MySQL主从复制与读写分离

实验案例MySQL主从复制与读写分离

数据库 之 Mysql主从复制的读写分离

MySQL主从复制与读写分离