MMM+Amoeba搭建MySQL高可用负载均衡群集

半世苍凉 提交于 2019-12-18 17:45:17

MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。MySQL的读写分离就是只在主服务器上写,只在从服务器上读。基本原理就是让主数据库处理事务性查询,而从服务器处理select查询。数据库复制被用来事务性查询导致的变更同步到群集中的从数据库。
Amoeba主要为应用层访问MySQL时充当sql路由,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关到目标数据库、可并发请求多台数据库。通过Amoeba能够完成数据源的高可用、负载均衡和数据切片等功能。
MMM(MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个Slave的read负载均衡。

amooeba在实际使用中存在单点故障的问题,所以在学习了MMMM之后,我就尝试了使用mmm+amoeba的架构来避免主库的单点故障,接下来我就为大家在虚拟机上模拟服务的搭建过程

项目环境

  • 使用六台服务器模拟搭建,拓扑图如下:
    MMM+Amoeba搭建MySQL高可用负载均衡群集
  • 虚拟机规划
主机 操作系统 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地址为主服务器地址

MMM+Amoeba搭建MySQL高可用负载均衡群集

搭建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是否安装成功

MMM+Amoeba搭建MySQL高可用负载均衡群集

在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>

MMM+Amoeba搭建MySQL高可用负载均衡群集
MMM+Amoeba搭建MySQL高可用负载均衡群集

修改/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>

    MMM+Amoeba搭建MySQL高可用负载均衡群集

  • 设置数据库服务器地址
    <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

    MMM+Amoeba搭建MySQL高可用负载均衡群集

    启动Amoeba

    /usr/local/amoeba/bin/amoeba start&
    netstat -anpt | grep java

    MMM+Amoeba搭建MySQL高可用负载均衡群集

    测试可用性

    安装mysql客户端

    yum install -y mysql

    登陆测试

    测试是否正常访问

    mysql -u amoeba -p123456 -h 192.168.100.130 -P8066  //IP地址为amoeba服务器地址
    show databases;

    MMM+Amoeba搭建MySQL高可用负载均衡群集

    测试数据是否同步

    use python
    create table java (id int,name varchar(10),sorce decimal(5,2));  //在python库中创建java表

    登陆各台服务器,python库中的Java表都存在,则表明双主双重同步成功
    MMM+Amoeba搭建MySQL高可用负载均衡群集

    测试读写分离

    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查看数据库中数据

    MMM+Amoeba搭建MySQL高可用负载均衡群集

    测试单点故障

    systemctl stop mysqld    //关闭master1

    VIP 发生迁移
    MMM+Amoeba搭建MySQL高可用负载均衡群集

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!