为什么会有主从复制和读写分离?
单台MySQL在安全新、高可用性和高并发方面都无法满足实际的需求
配置多台主从数据库服务器以实现读写分离可控的形式来让主从从服务器分别读写减轻服务器的压力
读写分离要建立在主从复制的基础上
★原理:
服务器要求:
至少三台MySQL服务器、一台amoeba、一台client
ip如下:
MySQL主master:192.168.150.30
MySQL从slave1:192.168.150.40
MySQL从slave2:192.168.150.50
amoeba:192.168.150.60
client:192.168.150.70
yum install -y ntp
vim /etc/ntp.conf
server 127.127.150.0
前2个127代表的是(192.168)fudge 127.127.150.0 stratum 8
允许150网段的主机与本机同步,时间环为8个systemctl start ntpd
vim /etc/my.cnf
server-id = 1
log-bin=master-bin
log-slave-updates=true
systemctl restart mysqld
ls /usr/local/mysql/data/
查看二进制日志文件是否生成mysql -uroot -p
grant replication slave on *.* to 'myslave'@'192.168.150.%' identified by '123456';
flush privileges;
show master status;
可以查看到使用哪个的二进制日志文件,刚搭建的服务位置点为604每个人都有所不同yum install -y ntp ntpdate
/usr/sbin/ntpdate 192.168.150.30
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.150.30 加入到计划任务程序vim /etc/my.cnf
server-id = 2
设置server id 为2 ,slave2为3log-bin=mysql-bin
开启二进制文件relay-log=relay-log-bin
从主服务器上同步日志文件记录到本地relay-log-index=slave-relay-bin.index
通过索引定位到中继日志systemctl restart mysqld
change master to master_host='192.168.150.30',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
start slave;
如果已经开启的话同步的命令会执行失败stop slave;可以关闭先再执行
show slave status\G
create database chen;
use chen
create table biao (id int(4),name varchar(20),age int(5));
insert into biao values(1,'chen',20);
select * from biao;
show databases;
use chen
show tables;
select * from biao;
主从同步原理?
通过三个线程和两个日志文件完成
主服务器数据更新通过dump线程会写入到二进制日志中,从服务器通过I/O线程读取二进制日志的内容写入到本地的中继日志中,最后从服务器通过SQL线程把更新的数据读取出来再重新执行一遍以达到同步
如何查看主从同步状态是否成功?
show slave status\G
show slave status 能看到那些信息比较重要?
last_Errno I/O状态和last_Errnr如果I/O线程和SQL线程显示不为yes能看到报错信息
如果I/O/线程和SQL线程不为yes如何排除?
可以通过last_Errnr查看错误信息
如果 Slave_IO_Running不为yes会是什么情况?
有遇到过的情况则是因为不在同一个局域网内(网络的问题);
如果 Slave_SQL_Running不为yes会是什么情况?
配置文件出错了可能是SQLid一样,或者二进制日志文件指定错误,Position位置错误等
主从复制慢(延迟)有哪些可能?
从库执行大量select请求,或业务大部分select请求被路由到从库实例上,甚至大量OLAP业务,或者从库正在备份等。
此时可能造成cpu负载过高,io利用率过高等,导致SQL Thread应用过慢
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
修改名称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:$SAMOEBA_HOME/bin
source /etc/profile
立刻生效mkdir /usr/local/amoeba
cd /opt
上传amoeba-mysql-binary-2.2.0.tar.gztar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
测试是否安装成功grant all on *.* to test@'192.168.150.%' identified by '123.com';
flush privileges;
刷新vim /usr/local/amoeba/conf/amoeba.xml
主配置文件amoeba
数据库访问amoeba服务器时使用的账号(root改为amoeba)123456
数据库访问amoeba服务器时使用账号时用的密码(自定义设置)master
master
slaves
vim /usr/local/amoeba/conf/dbServers.xml
mysql
test
amoeba访问三台mysql数据库的账户和密码(账户为test)123.com
修改访问数据库的密码
修改数据库主服务器名/地址192.168.150.30
修改master服务器ip
修改从服务器名192.168.150.40
修改从服务器地址
修改第二台从服务器名192.168.150.50
修改第二台从服务器地址
修改多个服务器池的名称slave1,slave2
添加两个从服务器的服务器名/usr/local/amoeba/bin/amoeba start &
netstat -natp | grep 8066
netstat -natp | grep java
jobs -l
客户端
yum install -y mariadb
amoeba服务器是否关联后端mysql
客户端进入数据库创建表
show databases;
use chen;
create table biao2(id int(4),name varchar(4));
show tables;
insert into biao2 values(1,'chen');
select * from biao2;
master 查看是否关联amoeba
两个slave查看是否关联amoeba
测试mysql 读写分离
2台从服务器关闭主从同步,测试amoeba读写分离
stop slave;
show slave status\G
然后在客户端插入数据
insert into biao2 values(2,'wang');
select * from biao2;
此时客户端读不到数据因为写是在master上进行,而客户端读的是在slave上进行的
master查看
slave读
读写分离架构,对于读的任务是怎么操作的?
测试方式
start slave;
先开启同步就会同步到之前插入的数据
分别正在slave1和slave2 chen库中插入不同数据,然后使用客户端进行select查询,查看结果
slave1
insert into biao2 values(3,'li');
在slave1中插入数据
select * from biao2;
slave2则读取不到
slave2
insert into biao2 values(4,'wu');
在slave2中插入数据
select * from biao2;
client端
select * from biao2;
流量 被轮询读取
在slave1中插入的数据不同步给slave2同理在slave2中插入的数据不同步给slave1所以客户端查看数据的请求会经过amoeba由amoeba通过轮询的方式依次读取slave1,slave2的数据所以看到的数据有区别从而体现了主从分离读写分割