MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细

MySQL 运维 - 主从复制与读写分离

  • 一、概述
  • 二、应用场景
  • 三、案例实施
    • 1. 建立时间同步环境
      • 1.1 主服务器作为时间服务器
      • 1.2 在从服务器上进行时间同步
    • 2.配置主服务器MySQL
    • 3.配置从服务器
    • 4.验证复制效果
    • 5.搭建读写分离
      • 5.1 安装Amoeba
      • 5.2 配置Amoeba
    • 6.测试
  • 四、排错
    • 1.ERROR 2006 (HY000): MySQL server has gone away
    • 2.java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed

一、概述

单台MySQL服务器无法满足高可用和负载均衡,所以需要至少两台以上的MySQL服务器做主从复制以提高安全性和效率

二、应用场景

主服务器使用dump线程写入二进制日志文件,从服务器请求并通过I/O线程读取主服务器的日志并存入自己的中继服务器中,并通过SQL线程对主服务器更新的内容进行重读操作
MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细_第1张图片

三、案例实施

主机名 主机 操作系统 IP 地址 主要软件
CentOS 7-1 Master CentOS 7 192.168.0.10 ntp 、 mysql-server
CentOS 7-2 Amoeba CentOS 7 192.168.0.20 jdk6、amoeba
CentOS 7-3 Slave1 CentOS 7 192.168.0.30 ntp 、ntpdate 、 mysql-server
CengOS 7-4 Slave2 CentOS 7 192.168.0.40 ntp 、ntpdate 、mysql-server
CentOS 7-5 客户端 CentOS 7 192.168.0.50 mysql-client

1. 建立时间同步环境

1.1 主服务器作为时间服务器

yum -y install ntp;

#进入ntp配置文件
vim /etc/ntp.conf
server 192.168.0.10
fudge 192.168.0.10 stratum 8

systemctl start ntpd

#查看同步状态
ntpq -p | ntpstat

1.2 在从服务器上进行时间同步

yum -y install ntp;

systemctl start ntpd

ntpdate 192.168.0.10


设置crontab定时同步

crontab -e
#每隔30分钟同步一次时间
*/30 * * * * ntpdate 192.168.0.10

2.配置主服务器MySQL

vim /etc/my.cnf

[mysqld]
server-id = 1
#开启二进制日志
log-bin=master-bin
#允许从服务器从主服务器更新日志
log-slave-updates=true

#重启服务
systemctl restart mysqld

mysql -uroot -p
#给从服务器授权
grant replication slave on *.* to 'myslave'@'192.168.0.%' identified by '123456';

#刷新权限
flush privileges;
#查看状态
show master status;

Position项记得保存下来

3.配置从服务器

vim /etc/my.cnf

[mysqld]
#ID要与Master不同,两个Slave的id也要不同
server-id = 2
#开启中继日志,从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin
#定义中继日志文件的位置和名称
relay-log-index=slave-relay-bin.index

systemctl restart mysqld

mysql -uroot -p
#配置主服务器IP地址账户密码和文件
change master to master_host='192.168.0.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=602;

#启用同步
start slave;

#查看状态
show slave status\G

MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细_第2张图片

4.验证复制效果

主服务器创建test数据

create database test;

从服务器查看数据库

show databses;

MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细_第3张图片

5.搭建读写分离

Amoeba(变形虫)项目开源框架于 2008 年发布了一款 Amoeba for MySQL 软件
这个软件致力于 MySQL 的分布式数据库前端代理层,它主要为应用层访问 MySQL 时充当 SQL 路由,并具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关到目标数据库、可并发请求多台数据库
通过 Amoeba 能够完成多数据源的高可用、负载均衡、数据切片的功能
MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细_第4张图片

5.1 安装Amoeba

Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用

#安装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/ /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

#输出定义Java的工作目录
#输出指定的java类型
#将java加入路径环境变量
#输出定义amoeba工作目录
#加入路径环境变量


source /etc/profile
#执行修改后的全局配置文件
java -version
#查看java版本信息以检查是否安装成功


#下载Amoeba
wget -P /opt https://pilotfiber.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz
cd /opt
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

MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细_第5张图片

5.2 配置Amoeba

在主从服务器上都开启Amoeba的访问权限

grant all on *.* to test@'192.168.0.%' identified by '123456';

修改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">123456</property>
#115行修改
<property name="defaultPool">master</property>
#117去掉注释
<property name="writePool">master</property>
<property name="readPool">slaves</property>


MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细_第6张图片
修改dbServers.xml 文件

cp dbServers.xml dbServers.xml.bak

vim dbServers.xml
#修改数据库配置文件

#23行注释掉
作用:默认进入test库 以防mysql中没有test库时,会报错
<property name="schema">mysql</property>
#26行修改
<property name="user">test</property>
#28-30行去掉注释
<property name="password">123456</property>
#45行修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">
#48行修改,设置主服务器的地址
<property name="ipAddress">192.168.0.10</property>
#52行修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">
#55行修改,设置从服务器1的地址
<property name="ipAddress">192.168.0.20<property>
#58行复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.0.30</property>
#65行修改
<dbServer name="slaves" virtual="true">
#71修改
<property name="poolNames">slave1,slave2</property>

6.测试

/usr/local/amoeba/bin/amoeba start&
#启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java
#查看8066端口是否开启,默认端口为TCP 8066


客户机安装登录工具

yum install -y mysql mysql-server
mysql -u amoeba -p123456 -h 192.168.0.40 -P8066

主服务器创建数据库

create database bbs;
create table user(id int(10),name varchar(10));
insert into user values(1,'Chara'),(2,'Frisk');

客户机查看数据库

use bbs;
select * from user;

MySQL 运维 - 主从复制与读写分离 | 轻松实现负载均衡 | 含排错思路 | 超详细_第7张图片

四、排错

1.ERROR 2006 (HY000): MySQL server has gone away

① 查看packet允许最大值

mysql>show global variables like 'max_allowed_packet';

② 设置 packet 最大值

mysql> set global max_allowed_packet=1024*1024*16;

2.java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed

变形虫报错问题,客户端无法获取数据库信息
① 检查MySQL版本
5.65.7的他们存储用户名的数据库名不同
5.6为test 5.7为mysql
② 检查变形虫配置文件

vim dbServers.xml

#寻找23行
<property name="schema">mysql</property>

你可能感兴趣的:(mysql,运维,数据库,mysql,java,运维,服务器)