MySQL的主从复制和MySQL的读写分离二者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。MySQL的读写分离就是只在主服务器上写,只在从服务器上读。基本原理就是让主数据库处理事务性查询,而从服务器处理select查询。数据库复制被用来事务性查询致使的变动同步到群集中的从数据库。
Amoeba主要为应用层访问MySQL时充当sql路由,并具备负载均衡、高可用性、SQL过滤、读写分离、可路由相关到目标数据库、可并发请求多台数据库。经过Amoeba可以完成数据源的高可用、负载均衡和数据切片等功能。
MMM(MySQL主主复制管理器)是一套支持双主故障切换和双主平常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫作双主复制,可是业务上同一时刻只容许对一个主进行写入,另外一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,能够说MMM这套脚本程序一方面实现了故障切换的功能,另外一方面其内部附加的工具脚本也能够实现多个Slave的read负载均衡。java
amooeba在实际使用中存在单点故障的问题,因此在学习了MMMM以后,我就尝试了使用mmm+amoeba的架构来避免主库的单点故障,接下来我就为你们在虚拟机上模拟服务的搭建过程python
主机 | 操做系统 | IP地址 | VIP | 主要软件 |
---|---|---|---|---|
Master1 | CentOS-7 | 192.168.100.101 | 192.168.100.200 | mysql-5.七、mysql-mmm |
Master1 | CentOS-7 | 192.168.100.102 | 192.168.100.200 | mysql-5.七、mysql-mmm |
Slave1 | CentOS-7 | 192.168.100.111 | 192.168.100.166 | mysql-5.七、mysql-mmm |
Slave2 | CentOS-7 | 192.168.100.112 | 192.168.100.188 | mysql-5.七、mysql-mmm |
Amoeba | CentOS-7 | 192.168.100.130 | jdk、amoeba、mysql | |
MMM | CentOS-7 | 192.168.100.120 | mysql-mmm |
本次实验中我所使用的MySQL版本为MySQL5.7,有关于mysql5.7的安装方式,请参考Centos7中编译安装MySQL(mysql-5.7)mysql
以前我有写过一篇MariaDB-MMM高可用群集,MariaDB与MySQL同属一脉。MariaDB是彻底兼容MySQL的,包括API和命令行,使其能轻松成为MySQL的代替品,因此有关于MMM的搭建方式天然也是同样的,请参考前文。
通过本人手动测试,方法都是共通的,关于搭建MySQL-MMM架构与MariaDB-MMM惟一的不一样点就是/etc/my.cnf配置文件的修改.[mysqld]修改成以下内容。linux
[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的主从复制在搭建MMM架构时已经完成,此时咱们只须要利用Amoeba搭建读写分离便可。sql
yum -y install 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
yum -y install ntp ntpdate //如果使用centos7系统,通常都已默认安装 systemctl stop firewalld.service setenforce 0 systemctl start ntpd //三台服务器的建立方式一致 /usr/sbin/ntpdate 192.168.100.101 //与主服务器进行时间同步,IP地址为主服务器地址
systemctl stop firewalld.service setenforce 0
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 //刷新使环境变量当即生效
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是否安装成功
这里受权的帐户和密码是方便amoeba链接后台数据库所设置的密码,只需受权一主两从便可,双主之间是相互复制的,数据都会彻底同步。用户名和密码自定义。vim
mysql>grant all on *.* to chen@'192.168.100.%' identified by '123123';
<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>
<!-- 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
/usr/local/amoeba/bin/amoeba start& netstat -anpt | grep java
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表都存在,则代表双主双重同步成功centos
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 发生迁移服务器