一、MySQL主从复制:
1、主从复制的作用:
主从复制:主设备通过二进制日志传输到从设备,从设备通过二进制日志和主同步数据。
作用:负载均衡读操作,备份(实时备份,不能替换手动的备份),高可用和故障切换,数据分布,Mysql升级。
2.主从复制的原理:
- 主数据库处理用户写操作,从数据库处理用户读操作。
- 用户写入数据到主数据库时,主数据库更新数据并写入二进制日志(binlog)中。
- 主数据库开启dump线程一边读取二进制日志一边通过网络将日志传输给从数据库。
- 从数据库通过io线程接收二进制日志并保存为中继日志。
- 从数据库开启sql线程将中继日志写入从数据库主从数据库复制完成。
3.三个重要线程:
dump线程:由主数据库开启,用于读取主的二进制日志并传输给从数据库 。
io线程:由从数据库开启,用于接收二进制日志并保存为中继日志。
sql线程:由从数据库开启,用于将中继日志写入备数据库中完成主从复制。
4.主从复制的实现:
1.环境准备:
master服务器: 192.168.91.3
slave1服务器: 192.168.91.5
slave2服务器: 192.168.91.7
关闭防火墙和防护:
systemctl stop firewalld
setenforce 0
2. mysql主从服务器时间同步:
yum install ntp -y
vim /etc/ntp.conf
--末尾添加--
server 127.127.10.0 #设置本地是时钟源127.127 ,注意修改网段 10网段
fudge 127.127.10.0 stratum 8 #设置时间层级为8(限制在15内)
service ntpd start
3.从服务器配置:
yum install ntp ntpdeta -y
service ntpd start
/usr/sbin/ntpdate 192.168.91.3 #进行时间同步
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.91.3
安装:
开启服务:
指定与主服务器时间同步:
制定周期性任务:
4.主服务器MySQL配置:
vim /etc/my.cnf
server-id = 1
log-bin=master-bin #添加,主服务器开启二进制日志
binlog_format = MIXED
log-slave-updates=true #添加,允许slave从master复制数据时可以写入到自己的二进制日志
重启成功:
systemctl restart mysqld
mysql -u root -pabc123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.91.%' IDENTIFIED BY '123';
#给从服务器授权
FLUSH PRIVILEGES; ## 刷新权限
show master status;
授权命令:
刷新权限:
5.从服务器的mysql配置:
5.1 第一台从服务器:
vim /etc/my.cnf
server-id = 2 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relya-bin.index #添加,定义中继日志文件的位置和名称,一般和relay-log在同一目录
relay_log_recovery = 1 #选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。
#重新启动mysql配置文件
systemctl restart mysqld.service
systemctl restart mysqld
mysql -u root -p123456
CHANGE master tomaster_host='192.168.91.3',master_user='myslave',master_password='123',master_log_file='masterbin.000001',master_log_pos=603;
#配置同步,注意 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进程
5.2 第二台服务器:
vim /etc/my.cnf
server-id = 3 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relya-bin.index #添加,定义中继日志文件的位置和名称,一般和relay-log在同一目录
relay_log_recovery = 1 #选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。
#重启服务器:
systemctl restart mysqld.service
systemctl restart mysqld
mysql -u root -p123456
CHANGE master tomaster_host='192.168.91.3',master_user='myslave',master_password='123',master_log_file='masterbin.000001',master_log_pos=603;
#配置同步,注意 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进程
一般 Slave_IO_Running: No 的可能性:
1、网络不通
2、my.cnf配置有问题
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭
6.验证:
6.1 在主服务器新建表:
插入数据:
查看:
6.2 第一台从服务器查看:
查看数据:
6.3 第二台从服务器查看:
查看数据:
二、 MySQL 读写分离:
1.mysql读写分离原理:
- 读写分离就是只在主服务器上写 ,只在从服务器上读;
- 主数据库处理事务性查询,从数据库处理select查询;
- 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
2.读写分离的实现:
环境准备:
在上个实验的基础上添加amoeba服务器:
Amoeba(192.168.91.4)
Amoeba服务器配置
1.配置amoeba服务器:
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下。
cd /opt/
放入jdk安装包和amoeba安装包
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
按空格到最后一行
按yes,在按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile ##存放的是jdk环境变量
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 jdk
在最下方添加:
##安装 Amoeba软件##
mkdir /usr/local/amoeba
tar zxvf /opt/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 说明安装成功
2.服务器上配置 Amoeba读写分离,两个 Slave 读负载均衡:
grant all on *.* to test@'192.168.91.%' identified by 'abc123';
【在一主量从上都要配置】
主:
一从:
二从:
3.amoeba服务器配置amoeba服务:
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml #修改amoeba配置文件
30修改
<property name="user">amoeba</property>
32修改
<property name="password">abc123</property>
115修改
<property name="defaultPool">master</property>
117去掉注释–
<property name="writePool">master</property>
<property name="readPool">slaves</property>
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml #修改数据库配置文件
--23行--注释掉 作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->
--26--修改
<property name="user">test</property>
--28-30--去掉注释
<property name="password">123.com</property>
--45--修改,设置主服务器的名Master
<dbServer name="master" parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.10.10</property>
--52--修改,设置从服务器的名slave1
<dbServer name="slave1" parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.10.12</property>
--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.10.17</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>
/usr/local/amoeba/bin/amoeba start & #启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java #查看8066端口是否开启,默认端口为TCP 8066
vim dbServers.xml
4.测试读写分离:
使用yum快速安装MySQL虚拟客户端:
yum install -y mariadb-server mariadb
systemctl start mariadb.service
mysql -u amoeba -pabc123 -h 192.168.91.4 -P8066
#通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器
从1 :
从2:
轮询测试: