根据上一博文我们了解到在MySQL群集中主从复制服务详解,本文将结合MySQL服务器主从复制同步服务实现读写分离操作。
为什么要实现读写分离操作?
- 在MySQL数据库中,在存储数据过程中,我们需要为不同数据类型以及表类型引用不同的存储引擎,比如MyISAM和InnoDB存储引擎。而这些存储引擎提供的读写机制会使得行或者表锁定,当用户访问调取数据时,若后台工作人员正在修改数据,导致行表锁定,进而使得客户端服务中断,带来的损失不可估量,进而需要实现修改数据与读取数据分割,而不影响服务。
- 当业务量非常大时,一台服务器的性能无法满足需求,就可以通过配置主从复制实现读写分离来分摊负载,避免因负载太高而造成无法及时响应请求。
MySQL读写分离原理
- 简而言之,读写分离要实现的功能就是在主服务器上写入数据,只在从服务器上读取数据。基本原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。
实验部署
实验环境拓扑
实验操作环境
主机 | 系统环境 | IP地址 | 操作软件 |
---|---|---|---|
Amoeba | centos7.3 x86_64 | 192.168.100.101 | Amoeba |
MySQL主 | centos7.3 x86_64 | 192.168.100.102 | ntp、MySQL 5.7 |
MySQL从1 | centos7.3 x86_64 | 192.168.100.103 | ntp、MySQL 5.7 |
MySQL从2 | centos7.3 x86_64 | 192.168.100.104 | ntp、MySQL 5.7 |
MySQL-client | Redhat6.5 x86_64 | 192.168.100.105 | MySQL 5.5 |
软件功能简介
- ntp时间同步软件
用于主从服务器之间时间同步,保证所有数据库复制及同步在同一时间点。保证复制同步的及时以及准确性。
- Amoeba代理服务软件
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。
主服务器设置
设置时间同步
- MySQL主服务器为时间源
yum install ntp -y //安装ntp软件,若没有,请用yum安装
vim /etc/ntp.conf
- 末行添加:
server 127.127.100.0 //本地是时钟源,请注意本机所在网段是100 fudge 127.127.100.0 stratum 8 //设置时间层级为8(限制在15内)
- 关闭防火墙,开启服务
systemectl stop firewalld.service
setenforce 0
systemctl start ntpd.service
安装MySQL
- 请参见MySQL5.7安装
主服务器的主从复制配置
- 开启二进制日志
vim /etc/my.cnf
server-id = 11 //设置主服务器ID号
log-bin=master-bin //主服务器日志文件//
log-slave-updates=true //从服务器更新二进制日志//
- 重启服务
systemctl restart mysqld.service
- 设置主从复制账户验证
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.100.%‘ IDENTIFIED BY ‘123456‘; //赋予从服务器同步权限
FLUSH PRIVILEGES; //刷新MySQL命令,使立即生效
show master status; //查看主状态
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000002 | 339 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
到此,主服务器设置完成。
从服务器设置
从服务器不论有多少个,除了每一个服务器本身IP地址不一样以及在MySQL配置文件中server-id不同,其他配置主从复制完全相同。
设置时间同步
- 安装ntp软件
yum install ntp -y
- 关闭防火墙,开启服务,进行与主服务器时间同步
systemctl stop firewalld.service
setenforce 0
systemctl start ntpd.service
/usr/sbin/ntpdate 192.168.100.102 //进行时间同步
安装MySQL5.7
设置slave状态
vim /etc/my.cnf
server-id = 22 //修改ID号,切记!每一个MySQL服务器都不一样
relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称
mysql -u root -p
change master to master_host=‘192.168.100.101‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000002‘,master_log_pos=339;
start slave;
show slave status\G; //查看状态//
- 另一从服务器配置类上。
配置Amoeba服务实现读写分离
systemctl stop firewalld.service
setenforce 0
cp jdk-6u14-linux-x64.bin /usr/local/ //将JDK安装命令复制到系统中
./jdk-6u14-linux-x64.bin //执行安装
- 安装完成后,在/usr/local下可看到一个jdk工作目录,将目录重命名,方便后面工作目录指定
mv jdk1.6.0_14/ /usr/local/jdk1.6
- 将Java环境加入环境变量
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 //指定amoeba工作目录
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile //刷新环境变量
- 创建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说明安装成功
在MySQL服务器上授予amoeba访问权限
- 每一台MySQL服务器进入数据库
mysql -u root -p
grant all on . to ‘test‘@‘192.168.100.%‘ identified by ‘123.com‘;
amoeba配置读写分离
cd /usr/local/amoeba
vim conf/amoeba.xml //amoeba主配置文件
---30行--
<property name="user">amoeba</property>
----32行---------
<property name="password">123456</property> //客户端登录amoeba验证
---117-去掉注释-
<property name="defaultPool">master</property> //默认数据库池为master
<property name="writePool">master</property> //设置可写入数据池的服务器为master
<property name="readPool">slaves</property> //设置可读数据库服务器为slaves
- 配置amoeba访问数据库配置文件
vim conf/dbServers.xml
--25行----
<!-- mysql schema -->
<property name="schema">test</property> //amoeba默认寻找test数据库,注意test存在否,若不存在可以在主服务器创建,也可注释,也可更改为mysql数据库
--26-29--去掉注释--
<property name="user">test</property>
<property name="password">123.com</property> //amoeba访问数据库池验证
-----42行-主服务器地址---
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.100.102</property>
--52行-从服务器主机名-
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.100.103</property>
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.100.104</property>
</factoryConfig>
</dbServer>
<dbServer name="slaves" virtual="true"> //切记,从服务器池名slaves
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
--末尾--
<property name="poolNames">slave1,slave2</property>
</poolConfig>
- 启动amoeba服务,查看启动状态
/usr/local/amoeba/bin/amoeba start&
netstat -anpt | grep java
- 当查看到amoeba可以监听所有MySQL服务器时即表示配置成功。
tcp6 0 0 127.0.0.1:25138 :::* LISTEN 68768/java
tcp6 0 0 :::8066 :::* LISTEN 68768/java
tcp6 0 0 192.168.100.101:38906 192.168.100.102:3306 ESTABLISHED 68768/java
tcp6 0 0 192.168.100.101:60784 192.168.100.103:3306 ESTABLISHED 68768/java
tcp6 0 0 192.168.100.101:57670 192.168.100.104:3306 ESTABLISHED 68768/java
客户端测试读写分离
- 客户端首先MySQL,然后通过客户端访问amoeba服务器IP即可,注意端口P为大写。
yum install mysql -y
mysql -u amoeba -p123456 -h 192.168.100.101 -P8066
此上,通过amoeba代理服务软件实现了MySQL数据库服务的读写分离。
原文地址:http://blog.51cto.com/13659253/2140011