前言:上章和拐友们讲解了数据库中的高阶语句,这章来讲讲数据库的主从复制,因为在实际的生产环境中,如果对MySQL数据库的读和写都在一台数据库服务器中操作,无论在安全性,高可用性,还是高并发等各个方面都是不能满足实际需求的,本章首先讲解MySQL主从复制和MySQL读写分离的原理,然后介绍如何配置MySQL主从复制
目录
一.MySQL的主从复制
1.1MySQL主从复制的类型
1.2主从复制的工作过程和原理
1.2.1主从复制工作过程为两日志和三线程
1.2.2主从复制的工作原理
1.3主从复制延迟的原因
1.4主从复制的架构
1.5.MySQL四种同步方式
1.5.1异步复制(Async Replication)
1.5.2 同步复制(Sync Replication)
1.5.3 半同步复制(Semi-Sync Replication)
1.5.4增强半同步复制(lossless Semi-Sync Replication、无损复制)
二.Mysql的读写分离
2.1读写分离的原理以及概述
2.2为什么要写读写分离
2.3什么时候要写读写分离
2.4读写分离的种类
2.4.1基于程序代码内部实现
2.4.2基于中间代理层实现
2.5关于主从复制和读写分离
三.实际操作
3.1环境准备
3.2配置主服务器(192.168.226.10)
3.3配置从服务器1(192.168.226.20)
3.4.配置从服务器2(192.168.226.30)
3.5主服务器的mysql配置
3.6从服务器1的mysql配置
3.7从服务器2的mysql配置
3.8主从复制测试
3.8.1在主服务器上创建一张表
3.8.2查看从服务器1和2
4.搭建Amoeba 实现读写分离(192.168.226.50)
4.1配置amoeba读写分离
5.客户端测试(192.168.226.40)
6.总结
总结:master将数据保存在二进制日志中,I/O向dump发出同步请求,dump把数据发送给I/O线程,I/O写入本地的中继日志SQL会读取本地的中继日志数据,同步到自己的数据库中,完成同步
master服务器:192.168.226.10
slave1服务器:192.168.226.20
slave2服务器:192.168.226.30
Amoeba服务器: 192.168.226.50 jdk、Amoeba
客户端服务器: 192.168.226.40 mysql
systemctl stop firewalld
setenforce 0 #关闭防火墙和增强功能
yum install -y ntp #安装ntp服务
#修改配置文件
vim /etc/ntp.conf
server 127.127.226.0
fudge 127.127.226.0 stratum 8
service ntpd start #重启服务
yum install ntp ntpdate -y #安装所需要的包
service ntpd start
/usr/sbin/ntpdate 192.168.226.10
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.226.10
yum install ntp ntpdate -y #安装所需要的包
service ntpd start
/usr/sbin/ntpdate 192.168.226.10
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.226.10
vim /etc/my.cnf
server-id = 1
log-bin=master-bin #添加,主服务器开启二进制日志
log-slave-updates=true #添加,允许从服务器更新二进制日志
binlog_format = MIXED
systemctl restart mysqld
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.226.%' IDENTIFIED BY '123456';
#给从服务器授权
FLUSH PRIVILEGES;
show master status;
#File 列显示日志名,Fosition 列显示偏移量
vim /etc/my.cnf
server-id = 2 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志文件的位置和名称
relay_log_recovery = 1 #选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。
systemctl restart mysqld
mysql -u root -p
change master to master_host='192.168.226.10' , master_user='myslave',master_password='123456',master_log_file='master-bin.000004',master_log_pos=775;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,这里的是例子,每个人的都不一样
start slave; #启动同步,如有报错执行 reset slave;
show slave status\G #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
vim /etc/my.cnf
server-id = 3 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志文件的位置和名称
relay_log_recovery = 1 #选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。
systemctl restart mysqld
mysql -u root -p
change master to master_host='192.168.226.10' , master_user='myslave',master_password='123456',master_log_file='master-bin.000004',master_log_pos=775;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,这里的是例子,每个人的都不一样
start slave; #启动同步,如有报错执行 reset slave;
show slave status\G #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
################安装 Java 环境###############
1.#下载安装包:jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz
cd /opt
2.#把jdk复制到/usr/local下
cp jdk-6u14-linux-x64.bin /usr/local/
3.#赋予jdk权限并执行
chmod +x /usr/local/jdk-6u14-linux-x64.bin
cd /usr/local/
./jdk-6u14-linux-x64.bin #一路回车到底,最后输入yes 自动安装
4.#jdk改个名字
mv jdk1.6.0_14/ jdk1.6
5.#配置环境并刷新
vim /etc/profile
插入:
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 #刷新配置文件
java -version #查看java版本
############## 安装amoeba ###########
1.#在/usr/local目录下创建amoeba目录
mkdir /usr/local/amoeba
2.#切换至opt解压amoeba
cd /opt/
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
cd /usr/local/ 切换至目录查看
3.#给目录/usr/local/amoeba赋予执行权限
chmod -R 755 /usr/local/amoeba/
4.#运行amoeba
/usr/local/amoeba/bin/amoeba
###########配置 Amoeba读写分离 ###############
5.#先在Master、Slave1、slave2的mysql上开放权限给 Amoeba 访问
grant all on *.* to root@'192.168.226.%' identified by '123456';
flush privileges;
6.#备份amoeba配置
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
cp dbServers.xml dbServers.xml.bak
7.#修改amoeba配置
vim amoeba.xml
30 amoeba
#设置登录用户名
32123456
#设置密码
115master
#设置默认池为master
118master
#设置写池
119slaves
#设置读池
vim dbServers.xml
23
#23行注释
26test
#设置登录用户
28
#删除
29123456
#解决28注释,添加密码
45
#服务池名
48192.168.10.4
#添加地址
52
55192.168.10.5
复制6行 添加另一从节点
59
62192.168.10.6
66
#定义池名
72slave1,slave2
#写上从节点名
8.#启动amoeba,并测试
amoeba start
netstat -ntap |grep java
首先备份amoeba的配置文件
修改配置文件amoeba.xml
修改配置文件dbServers.xml
1.#安装mariadb
yum install mariadb mariadb-server.x86_64 -y
2.#登入并查看数据库
mysql -uamoeba -p123456 -h 192.168.10.7 -P8066
3.#测试读写分离
#停止slave1和slave2的slave同步功能
stop slave;
#在master、slave1和slave2上插入数据
总结一点就是当客户端写入数据的时候,主服务器上能够查询到客户端写入的数据,在写入的同时要关掉两台从服务器,这个时候主服务器上就能够看见客户端写入的数据,也验证了读写分离的实验结果
本章就是和拐友们介绍了数据库中的主从分离和读写分离.