MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。MySQL的读写分离就是只在主服务器上写,只在从服务器上读。基本原理就是让主数据库处理事务性查询,而从服务器处理select查询。数据库复制被用来事务性查询导致的变更同步到群集中的从数据库。
Amoeba主要为应用层访问MySQL时充当sql路由,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关到目标数据库、可并发请求多台数据库。通过Amoeba能够完成数据源的高可用、负载均衡和数据切片等功能。
MMM(MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个Slave的read负载均衡。
amooeba在实际使用中存在单点故障的问题,所以在学习了MMMM之后,我就尝试了使用mmm+amoeba的架构来避免主库的单点故障,接下来我就为大家在虚拟机上模拟服务的搭建过程
项目环境
- 使用六台服务器模拟搭建,拓扑图如下:
- 虚拟机规划
主机 | 操作系统 | IP地址 | VIP | 主要软件 |
---|---|---|---|---|
Master1 | CentOS-7 | 192.168.100.101 | 192.168.100.200 | mysql-5.7、mysql-mmm |
Master1 | CentOS-7 | 192.168.100.102 | 192.168.100.200 | mysql-5.7、mysql-mmm |
Slave1 | CentOS-7 | 192.168.100.111 | 192.168.100.166 | mysql-5.7、mysql-mmm |
Slave2 | CentOS-7 | 192.168.100.112 | 192.168.100.188 | mysql-5.7、mysql-mmm |
Amoeba | CentOS-7 | 192.168.100.130 | jdk、amoeba、mysql | |
MMM | CentOS-7 | 192.168.100.120 | mysql-mmm |
项目实施
安装MySQL
本次实验中我所使用的MySQL版本为MySQL5.7,有关于mysql5.7的安装方式,请参考Centos7中编译安装MySQL(mysql-5.7)
搭建MySQL-MMM双主双从架构
之前我有写过一篇MariaDB-MMM高可用群集,MariaDB与MySQL同属一脉。MariaDB是完全兼容MySQL的,包括API和命令行,使其能轻松成为MySQL的代替品,所以有关于MMM的搭建方式自然也是一样的,请参考前文。
经过本人手动测试,方法都是共通的,关于搭建MySQL-MMM架构与MariaDB-MMM唯一的不同点就是/etc/my.cnf配置文件的修改.[mysqld]修改为如下内容。
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
binlog-ignore-db=mysql,information_schema
log_bin=mysql_bin
log_slave_updates=true
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
搭建MySQL读写分离
MySQL的主从复制在搭建MMM架构时已经完成,此时我们只需要利用Amoeba搭建读写分离即可。
建立时间同步
建立时间同步环境,在Master1上搭建时间同步服务器
yum -y install ntp
配置NTP服务器
修改ntp配置文件,添加配置。
vim /etc/ntp.conf
server 127.127.100.0 //本地是时钟源,本地地址为192.168.100.101,此处地址则也为100段
fudge 127.127.100.0 stratum 8 //stratum 8 时间层级为8(限制在15内)
关闭防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service
setenforce 0
启动服务
systemctl start ntpd
在master2、slave1、slave2上进行时间同步
yum -y install ntp ntpdate //若是使用centos7系统,一般都已默认安装
systemctl stop firewalld.service
setenforce 0
systemctl start ntpd //三台服务器的创建方式一致
/usr/sbin/ntpdate 192.168.100.101 //与主服务器进行时间同步,IP地址为主服务器地址
搭建Amoeba服务器
关闭防火墙及selinux
systemctl stop firewalld.service
setenforce 0
安装环境(jdk1.6)
cp /opt/jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local
./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
#source /etc/profile //刷新使环境变量立即生效
安装amoeba
tar zxf /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是否安装成功
在MySQL上为Amoeba授权
这里授权的账户和密码是方便amoeba连接后台数据库所设置的密码,只需授权一主两从即可,双主之间是相互复制的,数据都会完全同步。用户名和密码自定义。
mysql>grant all on *.* to chen@'192.168.100.%' identified by '123123';
配置Amoeba服务器
修改/usr/local/amoeba/conf/amoeba.xml
<property name="user">amoeba</property>
<property name="password">123456</property> //访问amoeba的账户和密码
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
修改/usr/local/amoeba/conf/dbServers.xml
- 修改的是Amoeba访问数据库的用户名和密码,因为系统默认的用户是test,当你不使用默认账号时,就需要对默认账号进行注释,或者修改为“mysql”
<!-- mysql schema --> <property name="schema">mysql</property> //修改或者直接删除 <!-- mysql user --> <property name="user">chen</property> <property name="password">123123</property>
- 设置数据库服务器地址
<dbServer name="master" parent="abstractServer"> //数据库名称master <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.100.200</property> //此处填写的为VIP地址,方便故障切换 </factoryConfig> </dbServer> <dbServer name="slave1" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.100.166</property> //slave1,地址为vip地址 </factoryConfig> </dbServer> <dbServer name="slave2" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.100.188</property> //slave2,地址为VIP地址 </factoryConfig> </dbServer> <dbServer name="slaves" virtual="true"> //读数据库池 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> <property name="loadbalance">1</property> //1 代表轮询 <!-- Separated by commas,such as: server1,server2,server1 --> <property name="poolNames">slave1,slave2</property> //包括slave1,slave2
启动Amoeba
/usr/local/amoeba/bin/amoeba start& netstat -anpt | grep java
测试可用性
安装mysql客户端
yum install -y mysql
登陆测试
测试是否正常访问
mysql -u amoeba -p123456 -h 192.168.100.130 -P8066 //IP地址为amoeba服务器地址 show databases;
测试数据是否同步
use python create table java (id int,name varchar(10),sorce decimal(5,2)); //在python库中创建java表
登陆各台服务器,python库中的Java表都存在,则表明双主双重同步成功
测试读写分离
insert into java (id,name,sorce) values (1,'master',1);//在master1表中插入一条数据 insert into java (id,name,sorce) values (2,'slave1',2);//在slave1表中插入一条数据 insert into java (id,name,sorce) values (3,'slave2',3);//在slave2表中插入一条数据 mysql -u amoeba -p123456 -h 192.168.100.130 -P8066 use python select * from java; //登陆amoeba查看数据库中数据
测试单点故障
systemctl stop mysqld //关闭master1
VIP 发生迁移
来源:51CTO
作者:cchenyz
链接:https://blog.51cto.com/13643643/2148335