第三阶段基础
时 间:2023年6月28日
参加人:全班人员
内 容:
mysql主从复制和读写分离
目录
一、mysql基础
(一)优点:
(二)类型:
(三)支持的复制方式:
二、mysql主从复制部署
(一)环境配置
1.关闭防火墙
2.时间同步
3.安装mariadb数据库
主库配置:
步骤一:修改配置文件 vim /etc/my.cnf
步骤二:启动数据库并登录
步骤三:创建复制账户
步骤四:获得Master DB的相关信息
从库1配置:
步骤一:修改配置文件
步骤二:启动服务并登录
步骤三:进行主从配置
主从验证:
从库2配置:
步骤一:修改配置文件
步骤二:启动服务并登录
步骤三:进行主从配置
主从验证:
三、mysql读写分离配置
(一)概 念
(二)实现方法
(三)安装java环境
1.降版本(只支持1.5/1.6版本)
2.rz上传
3.给执行权限
4.运行
5.移动
6.添加变量
(四)安装amoeba
1.rz
2.创建目录
3.解压
4.给执行权限
(五)配置amoeba
1.在Master、Slave1、Slave2服务器中
配置Amoeba的访问授权
2.修改配置文件(用户连接amoeba的设置)
3.修改配置文件(主从数据服务器对ameoba的设置)
4.启动服务放入后台
客户端配置:
步骤一:安装mariadb
步骤二:登录amoeba
结果验证:(写入是主,读取是从)
断开主从复制
开启主从复制
一、mysql基础
(一)优点:
1.安全;2.可靠; 3.实时数据
(二)类型:
异步复制:不可靠;
主库在执行完客户端提交地事务后会立刻将结果返回给客户端,并不关心从库是否已经接受并处理了事务;
全部复制:耗时长;
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端;
半同步复制:比异步可靠比全部时间短;
主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接受到并写到relay log中才返回给客户端。
(三)支持的复制方式:
基于SQL语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的SQL语句,效率比较高
基于行的复制:主服务器把表的行变化作为事件写入到二进制日志中,主服务器把代表了行变化的事件复制到从服务器中
混合模式复制:先采用基于语句的复制,一旦发现基于语句无法精确复制时,再采用行
二、mysql主从复制部署
(一)环境配置
五台服务器:
192.168.59.137 huyang1 主
192.168.59.140 huyang2 从1
192.168.59.142 huyang3 从2
192.168.59.138 huyang0 Amoeba
192.168.59.143 localhost 客户
搭建主从复制(huyang1,huyang2,huyang3)
1.关闭防火墙
systemctl stop firewalld
iptables -F
setenforce 0
2.时间同步
yum -y install ntp
永久配置:vim /etc/ntp.conf
server 192.168.59.137
真机,有网,可以同步世界时间
fudge 192.168.1.1 stratun 8
systemctl start ntpd 开启
systemctl enable ntpd 开机自启
临时配置:或者让其他主机同步指定的主机
yum -y install ntpdate
ntpdate 192.168.1.2
可以写入计划任务,定时执行
3.安装mariadb数据库
yum -y install mariadb mariadb-server
主库配置:
步骤一:修改配置文件 vim /etc/my.cnf
server-id=1
log-bin=mysql-binlog
log-slave-updates=true
步骤二:启动数据库并登录
systemctl restart mariadb
mysql
步骤三:创建复制账户
grant replication slave on *.* to
'myslave'@'192.168.59.%' identified by '123456';
刷新
flush privileges;
步骤四:获得Master DB的相关信息
show master status;
从库1配置:
步骤一:修改配置文件
vim /etc/my.cnf
server-id=2
编号
relay-log=relay-log-bin
中继日志
relay-log-index=slave-relay-bin.index
定义日志索引,主库上有,自己没有,定义之后,开启有
步骤二:启动服务并登录
systemctl restart mariadb
mysql
步骤三:进行主从配置
1.停止从服务stop slave;
2.授权
change master to
master_host='192.168.59.137',
主服务器IP
master_user='myslave',
主服务器授权的用户
master_password='123456',
授权的密码
master_log_file='mysql-binlog.000001',
开始同步的二进制文件名字
master_log_pos=563;
开始同步位置
3.开始从服务start slave;
4.查看状态show slave status\G
主从验证:
主:create databases huyang1;
从:show databases;
结果:出现huayng1数据库,主从复制配置成功
从库2配置:
步骤一:修改配置文件
vim /etc/my.cnf
server-id=3
编号
relay-log=relay-log-bin
中继日志
relay-log-index=slave-relay-bin.index
定义日志索引,主库上有,自己没有,定义之后,开启有
步骤二:启动服务并登录
systemctl restart mariadb
mysql
步骤三:进行主从配置
1.停止从服务stop slave;
2.授权
change master to
master_host='192.168.59.137',
主服务器IP
master_user='myslave',
主服务器授权的用户
master_password='123456',
授权的密码
master_log_file='mysql-binlog.000001',
开始同步的二进制文件名字
master_log_pos=563;
开始同步位置
3.开始从服务start slave;
4.查看状态show slave status\G
主从验证:
主:create databases huyang2;
从1:show databases;
从2: show databases;
结果:从1、从2均出现huayng2数据库,
主从复制配置成功
三、mysql读写分离配置
(一)概 念
基本的原理:让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库
1.只在主服务器上写,只在从服务器上读;
2.登录amoeba服务,他本身连接主和从数据库,根据操作不同调用相应数据库,和负载均衡相似;
3.至少五台主机,一台主数据库,两台以上从数据库,一台maoeba服务器,一个客户端;
4.负载均衡,高可用性,SQL过滤,读写分离。
端 口:8066
(二)实现方法
基于程序代码内部实现:在代码中根据select,insert进行路由分类,这类方法也是目前大型生产环境应用最广泛的,优点是性能最好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手;
基于中间代理层实现:代理一般位于客户端和数据库服务器之间,代理服务器接到客户端请求后通过判断转发到后端数据库,代表性程序:
(1)mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境;
(2)Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。
(三)安装java环境
1.降版本(只支持1.5/1.6版本)
查看当前的java版本,为1.8,找到存放位置并删除
2.rz上传
jdk-6u31-linux-x64.bin
本身是一个二进制文件,脚本
省略了编译的过程,直接给执行权限安装
3.给执行权限
chmod +x jdk-6u31-linux-x64.bin
4.运行
./jdk-6u31-linux-x64.bin
中途回车
命令不是存在一个目录里
5.移动
mv jdk1.6.0_31/ /usr/local/jdk1.6
6.添加变量
vim /etc/profil
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$HOME/bin
设置变量
export AMOEBA_HOME=/usr/Tocal/amoeba
export PATH=SPATH:$AMOEBA_HOME/bin
source /etc/profile
java -version
可以发现,此时java版本已经降到1.6版本
(四)安装amoeba
1.rz
amoeba-mysql-binary-2.2.0.tar
2.创建目录
mkdir /usr/local/amoeba
3.解压
tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
4.给执行权限
chmod -R 755 /usr/local/amoeba/
(五)配置amoeba
1.在Master、Slave1、Slave2服务器中
配置Amoeba的访问授权
grant all on *.* to 'test'@'192.168.59.%' identified by '123.com';
flush privileges;
2.修改配置文件(用户连接amoeba的设置)
vim /usr/local/amoeba/conf/amoeba.xml
用户连接amoeba的设置
30 <property name="user">amoeba</property>
用户名
32 <property
name="password">123456</property>
连接amaeba的密码
115 <property
name="defaultPool">master</property>
默认池
118 <property
name="writePool">master</property>
写的池
119 <property
name="readPool">slaves</property>
读的池
可以发现此时是被注释的,需要打开
3.修改配置文件(主从数据服务器对ameoba的设置)
vim /usr/local/amoeba/conf/dbServers.xml
22 端口号
<property name="port">3306</property>
23 连接mysql的用户,MySQl授权的用户
<property name="schema">test</property>
这个用户可以不改,如果数据库设置的其他用户的话,只要下面的用户名是设置的用户即可
否则可以登录但是查不到数据显示断开数据连接
26 登录用户和授权用户一致
<property name="user">test</property>
29 MySQL授权的密码
<property name="password">123.com</property>
45 定义master 48 master的IP地址
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.200.111</property>
52-56 定义从和从IP,几个从数据库几段
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.200.112</property>
65 定义读的池slave
<dbServer name="slaves" virtual="true">
68 轮询
71 从数据库slave1 slave2
property name="loadbalance">1</property>
<property name="poolNames">slave1,slave2</property>
4.启动服务放入后台
/usr/local/amoeba/bin/amoeba start &
等8066端口号出来
查看端口是否开启
netstat -lnpt|grep 8066
netstat -lanpt|grep 3306
客户端配置:
步骤一:安装mariadb
yum -y install mariadb*
步骤二:登录amoeba
mysql -uamoeba -p123456 -h 192.168.200.114 -P 8066
结果验证:(写入是主,读取是从)
断开主从复制
主 库:写入一段数据:插入
INSERT INTO customer (name, email) VALUES ('master4', 'master4'); 验证主从复制断开
从库一:select * from customer; 没有master4
从库二:select * from customer; 没有master4
结果显示已经断开主从复制
客户端:写入一段数据:
插入INSERT INTO customer (name, email) VALUES
('master5', 'master5');
主 库:select * from customer;有了master5
从库1:select * from customer; 没有master5
从库2:select * from customer; 没有master5
客户端读取数据:
select * from customer;
select * from customer;
两次呈现不同的结果,证明了读写分离
开启主从复制
客户端写入数据:
INSERT INTO customer (name, email) VALUES ('master6', 'master6');
主库:select * from customer;有了master6
从库1:select * from customer; 有了master6
从库2:select * from customer; 有了master6