一.主从复制原理
- MySQL的主从复制和MySQL的读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础之上进行数据的读写分离
- MySQL支持三类主从复制类型:
- 基于语句的复制,在主服务器上的执行的语句SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高
- 基于行的复制,把改变的内容复制过去,而不是把命令在从服务器上执行一遍
- 混合类型的复制,默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
- 工作过程
二.读写分离原理
- 读写分离就是用户基于第三方服务器,访问数据库时,写在主服务器上,在从服务器上读
- 基本原理是让主数据库处理事务性查询,而让从数据库处理select查询
- 数据库主从复制被用来把事务查询导致的变更同步到集群的从数据库
- 基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库,比如Mycat 、Amoeba
三.搭建主从复制、读写分离环境
1.群集拓扑
2.实验环境
主机 | 操作系统 | IP地址 | 主要软件 |
MySQL(master) | CentOS7 | 192.168.43.100 | mysql-5.6.26.tar.gz |
MySQL(slave1) | CentOS7 | 192.168.43.243 | mysql-5.6.26.tar.gz |
MySQL(slave2) | CentOS7 | 192.168.43.221 | mysql-5.6.26.tar.gz |
Amoeba | CentOS7 | 192.168.43.104 | amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin |
Client | CentOS7 | 192.168.43.244 | mariadb-5.5.64-1.el7.x86_64 |
3.搭建MySQL主从复制
主服务器
- 在主服务器上,安装时间服务器,且在主配置文件设置参数
yum install ntp -y
vim /etc/ntp.conf
server 127.127.43.0 ##写自己主服务器的IP地址的第三段
fudge 127.127.43.0 stratum 8 ##配置时区
##关闭安全性功能,重启服务
systemctl stop firewalld
setenforce 0
systemctl start ntpd
-
默认已经配置好MySQL5.6版本,修改MySQL的主配置文件
vim /etc/my.cnf
#指定id号,唯一标识服务器
server-id = 11
#开启二进制日志文件
log-bin=master-bin
#更新从服务器二进制日志
log-slave-updates=ture
- 进入数据库,修改权限
#进入数据库
mysql -u root -pabc123
#给从服务器权限,*.*所有数据库的所有表
CRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.43.%' IDENTIFIED BY '123456';
#刷新权限
FLUSH PRIVILEGES;
#查看主服务器的状态,获取file名和position
show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 411| | | |
+-------------------+----------+--------------+------------------+-------------------+
从服务器
-
在两台MySQL从服务器上做一样的操作,除了指定的ID号
-
安装时间服务器,关闭安全性功能,开启服务
yum install ntp ntpdate -y
systemctl start ntpd
systemctl stop firewalld
setenforce 0
-
时间同步主服务器
/usr/bin/ntpdate 192.168.43.100
- 修改配置文件
#指定id号,服务器的唯一标识(另外一台从服务器上要修改)
server-id = 22
##从服务器上同步日志文件记录
relay-log=relay-log-bin
##定义relay-log的位置和名称
relay-log-index=slave-relay-bin.index
-
重启服务
service -uroot -pabc123
-
进入数据库,指定主服务器
change master to master_host='192.168.43.101',
master_user='myslave',
master_password='123456',
master_log_file='master-bin.000001',
master_log_pos=441;
#开启从服务器
start slave;
#查看状态
show slave status\G;
测试主从同步
4.搭建Amoeba服务器,建立读写分离功能
- 配置Java环境
#把软件包复制到/usr/local下
cp jdk-6u14-linux-x64.bin /usr/local
#执行脚本(交互时,选择yes,用远程终端时弹窗选择否)
bash jdk-6u14-linux-x64.bin
#重命名,方便管理
mv jdk-1.6.0_14 /usr/local/jdk1.6
#配置环境变量
vim /et/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
- 安装amoeba
#解压amoeba包
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
#出现下列代码说明成功
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
[root@localhost ~]#
- 在amoeba服务器上设置主配置文件
cd /usr/local/amoeba
vim conf/amoeba.xml
第30行:<property name="user">amoeba</property>
第32行:<property name="password">123456</property>
117行去掉注释,且修改下列标签
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
- 在amoeba服务器上设置数据库服务器文件参数
vim conf/dbServers.xml
#26-29行:去掉注释,设置登录用户名和密码
<property name="user">test</property>
<property name="password">123.com</property>
##找到主服务器和从服务器模块,修改好名称和对应IP地址:
#主服务器:
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.43.100</property>
#第一台从服务器:
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.43.243</property>
#第二台从服务器:
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.43.221</property>
#指定从服务器池:
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>
- 启动amoeba服务
##放到后台执行
/usr/local/amoeba/bin/amoeba start&
##查看服务
[root@localhost ~]# netstat -antp|grep java
tcp6 0 0 127.0.0.1:38258 :::* LISTEN 61637/java
tcp6 0 0 :::8066 :::* LISTEN 61637/java
5.建立测试环境
- 在客户机安装数据库,关闭安全性功能
yum install -y mariadb
systemctl stop firewalld
setenforce 0
- 连接amoeba
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.43.104 -P8066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 730578010
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| class |
| mysql |
| performance_schema |
| school |
| test |
| you_db |
+--------------------+
7 rows in set (0.01 sec)
MySQL [(none)]>
- 测试是否能够读写分离
- 在从服务器上关闭,主从复制功能
- 分别在主服务、从服务器上写入数据
- 在client上查看数据库
- 在client上写入数据,分别在主从服务器上查看
注:在生产环境中,不能断开主从复制的服务。另外,使用MySQL版本的不同会导致,amoeba服务中的配置文件不同