Linux—MySQL主从同步与读写分离
一.主从复制原理
1.MySQL的主从复制和MySQL的读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础之上进行数据的读写分离
2.MySQL支持三类主从复制类型:
基于语句的复制,在主服务器上的执行的语句SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高
基于行的复制,把改变的内容复制过去,而不是把命令在从服务器上执行一遍
混合类型的复制,默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
二.读写分离原理
1.读写分离就是用户基于第三方服务器,访问数据库时,写在主服务器上,在从服务器上读
基本原理是让主数据库处理事务性查询,而让从数据库处理select查询
数据库主从复制被用来把事务查询导致的变更同步到集群的从数据库
基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库,比如Mycat 、Amoeba
三.MySQL主从复制
准备一台主服务器两台从服务器
主服务器IP:192.168.88.131
从服务器IP:192.168.88.133
192.168.88.135
第一步:时间同步
主服务器上:
yum install ntp -y
vim /etc/ntp.conf
server 127.127.88.0 //本地是时钟源//
fudge 127.127.88.0 stratum 8 //设置时间层级为8//
关闭防火墙,开启服务:
systemctl start ntpd
systemctl stop firewalld
setenforce 0
从服务器上:
yum install ntp ntpdate -y
systemctl start ntpd
systemctl stop firewalld
setenforce 0
/usr/sbin/ntpdate 192.168.88.131 //同步主服务器时间
第二步安装MySQL5.6
yum install -y ncurses-devel autoconf cmake make gcc gcc-c++ libaio-devel bison
准备mysql-5.6.26.tar.gz包
具体安装过程参考LAMP架构
第三步配置主从同步
主服务上
vim /etc/my.cnf
log_bin=master-bin //主服务器日志文件//
log-slave-updates=true //从服务器更新二进制日志//
server_id = 11 //指定ID号
重启MySQL:
service mysqld restart
进数据库给所有库所有表权限:
mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.88.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
查看主服务器状态:
show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 | 411 | | | |
+-------------------+----------+--------------+------------------+-------------------+
两台从服务器上:
vim /etc/my.cnf
relay-log=relay-log-bin //主服务器上同步日志文件记录到本地//
relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称//
server_id = 22 //另一台23
重启MySQL服务:
service mysqld restart
mysql -uroot -p
change master to master_host='192.168.88.131',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=411;
开启从服务器功能
start slave;
查看
show slave status\G;
第四步测试:
主服务器上创建school数据库
两台从服务器上去查看school数据库:
四.读写分离
准备另一台amoeba服务器
1.配置Java环境:
关闭防火墙:
systemctl stop firewalld.service
setenforce 0
准备包:
amoeba-mysql-binary-2.2.0.tar.gz
jdk-6u14-linux-x64.bin
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/ /usr/local/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
2.安装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后会出现amoeba start|stop
3.三台主从服务器添加权限:
grant all on *.* to test@'192.168.88.%' identified by '123.com';
4.回到amoeba服务器上设置主配文件:
cd /usr/local/amoeba/conf
vim amoeba.xml
##### ---30/32行:---
<property name="user">amoeba</property>
<property name="password">123456</property>
##### ---117行去掉注释---
<property name="defaultPool">master</property>
<!-- -->
<property name="writePool">master</property>
<property name="readPool">slaves</property>
5.在amoeba服务器上设置数据库服务器文件参数
vim dbServers.xml
##### ---26-29去掉注释添加用户名密码---
<property name="user">test</property>
<!-- mysql password -->
<property name="password">123.com</property>
##### ---45行往后添加主从服务器名和地址---
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.88.131</property>
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.88.133</property>
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.88.135</property>
##### ---66行---
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>
6.开启amoeba:(后台)
/usr/local/amoeba/bin/amoeba start&
7.测试机上:
systemctl stop firewalld.service
setenforce 0
yum install mysql -y
mysql -u amoeba -p 123456 -h 192.168.88.170 -P8066
8.测试读写分离
在从服务器上关闭,主从复制功能
分别在主服务、从服务器上写入数据
在测试机上查看:
mysql [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bbb |
| mysql |
| performance_schema |
| school |
| test |
| xxx |
+--------------------+
7 rows in set (0.00 sec)
mysql [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ccc |
| mysql |
| performance_schema |
| school |
| test |
| xxx |
+--------------------+
7 rows in set (0.00 sec)
在测试机上写入ddd数据库,分别在主从服务器上查看:
主服务器:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| bbb |
| mysql |
| performance_schema |
| school |
| test |
| xxx |
+--------------------+
7 rows in set (0.00 sec)
从服务器:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bbb |
| mysql |
| performance_schema |
| school |
| test |
| xxx |
+--------------------+
7 rows in set (0.00 sec)