MySQL主从复制的介绍
- MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
- MySQL复制类型:
- 基于语句的复制。主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
- 基于行的复制。把改变的内容复制过去,而不是把命令在服务器上执行一遍。
- 混合类型复制。默认采用基于语句的复制,一旦发现语句无法精确复制时,就会采用基于行的复制。
MySQL读写分离的介绍
- 读写分离就是只在主服务器上写,只在从服务器上读。基本原理是让主数据处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。
基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库。
主从复制与读写分离的实验操作
实验准备
服务器名称 | 服务器ip |
---|---|
amoeba | 192.168.18.129 |
master | 192.168.18.147 |
slave1 | 192.168.18.135 |
slave2 | 192.168.18.146 |
- 操作系统:CentOS7
- 所需软件包:MySQL5.6,amoeba-mysql-binary ,dk1.6
主从复制实验步骤
- 安装ntp服务
master:
yum install ntp -y
vim /etc/ntp.conf
server 127.127.18.0 //本地是时钟源
fudge 127.127.18.0 stratum 8 //设置时间层级为8
slave1,2:
yum install ntp ntpdate -y
- 启动master,slave1,2服务
systemctl start ntpd
systemctl stop firewalld
setenforce 0
- slave1,2同步时间
/usr/sbin/ntpdate 192.168.18.147 //同步master时间
- 安装数据库(步骤略前面博客有)
- 配置主从数据库文件
master:
vim /etc/my.cnf
server_id = 1
log-bin=master-bin //主服务器日志文件记录到本地
log-slave-updates=true //从服务器更新二进制日志
service mysqld restart
mysql -u root -p
登录之后输入:
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.18.%' IDENTIFIED BY '123456';
show master status;
slave1,2:
vim /etc/my.cnf
server_id = 2 (slave1、2不能相同)
relay-log=relay-log-bin //从主服务器上同步日志文件到本地
relay-log-index=slave-relay-log.index //定义relay-log的位置和名称
service mysqld restart
mysql -u root -p
登录之后输入:
change master to master_host='192.168.18.147',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=411;
start slave;
show slave status \G
- 测试主从复制:
master上创建数据库:
slave1,2上查看:
实验成功,完成主从复制!
读写分离实验步骤
- 安装jdk1.6
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ jdk1.6
- 配置环境变量
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
- 安装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/
查看amoeba启动选项
/usr/local/amoeba/bin/amoeba
- 在三台MySQL服务器上授予amoeba权限
GRANT ALL ON *.* TO test@'192.168.18.%' IDENTIFIED BY '123.com';
- 修改amoeba配置文件
vim /usr/local/amoeba/conf/amoeba.xml
30行: <property name="user">amoeba</property>
32行: <property name="password">123456</property>
<property name="defaultPool">master</property>
117行: <property name="writePool">master</property>
<property name="readPool">slaves</property>
- 配置数据库:
vim /usr/local/amoeba/conf/dbServers.xml
26行:<property name="user">test</property>
29行:<property name="password">123.com</property>
42行一直往下:<dbServer name="master" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.18.147</property>
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.18.135</property>
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.18.146</property>
</factoryConfig>
</dbServer>
<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave1,slave2</property>
</poolConfig>
</dbServer>
- 启动服务
systemctl stop firewalld
setenforce 0
/usr/local/amoeba/bin/amoeba start &
- 读写分离测试:
客户端通过amoeba账户登录mysql
mysql -u amoeba -p 123456 -h 192.168.18.129 -P8066
在主从服务器中查看:
关闭同步
stop slave;
show slave status
在客户端写入数据:
在主服务器查看:
在从服务器查看:
在客户端查看:
读写分离实验成功!
再在从服务器上分别插入数据:
slave1:
slave2:
在客户端查看:
轮询读取,实验完成!