MySQL主从同步与读写分离
目录
第一部分 实验环境
第二部分 配置主从同步
第三部分 配置读写分离
第四部分 测试验证
第一部分 实验环境
- 实验拓扑图:
- 服务器五台:
1)客户端服务器一台:
IP地址:192.168.80.10(client)
需安装软件:mysql-boost-5.7.20.tar.gz
2)Amoeba调度服务器一台:
IP地址:192.168.80.20(amoeba)
需安装软件:jdk-8u144-linux-x64.tar.gz
amoeba-mysql-3.0.5-RC-distribution.zip
3)Mysql主服务器一台:
IP地址:192.168.80.30(master)
需安装软件:mysql-boost-5.7.20.tar.gz
4)Mysql从服务器两台:
IP地址:192.168.80.40(slave01)
192.168.80.50(slave02)
需安装软件:mysql-boost-5.7.20.tar.gz - 系统信息
注意:本实验mysql都是源码编译安装,本文档中涉及安装配置mysql数据库部分省略,请参考文档:http://blog.51cto.com/12227558/2074113
第二部分 主从同步(需三台Mysql服务器)
第一步 mysql主服务器搭建配置(192.168.80.30)
一:在主mysql服务器上搭建NTP时间服务器
[[email protected] ~]# yum install -y ntp
[[email protected] ~]# vi /etc/ntp.conf
restrict 192.168.80.0 mask 255.255.255.0 nomodify notrap //修改,去掉#号
server 127.127.1.0 //添加
fudge 127.127.1.0 stratum 8 //添加,设置时间服务器的层级为8级,顶级是0
保存退出
[[email protected] ~]# service ntpd restart
[[email protected] ~]# service firewalld stop
[[email protected] ~]# setenforce 0
二:源码编译安装mysql
此处参考http://blog.51cto.com/12227558/2074113,源码安装并配置mysql
三:配置master主服务器的mysql
[[email protected] ~]# vi /etc/my.cnf
//在[mysqld]下面配置
server_id = 11
log_bin=master_bin
log_slave_updates=true
保存退出
[[email protected] ~]# service mysqld restart
[[email protected] ~]# mysql -uroot -pabc123 //登录数据库
mysql> GRANT REPLICATION SLAVE ON . TO ‘myslave‘@‘192.168.80.%‘ IDENTIFIED BY ‘123456‘;
//为所有从服务器授权所有数据库
mysql> FLUSH PRIVILEGES; //刷新权限
mysql> show master status;
第二步 配置从服务器slave01(192.168.80.40)
[[email protected] ~]# service firewalld stop
[[email protected] ~]# setenforce 0
一:设置时间同步(同步到主服务器)
[[email protected] ~]# yum install -y ntpdate
[[email protected] ~]# ntpdate 192.168.80.30 //手动同步时间
[[email protected] ~]# echo ‘/30 * /usr/sbin/ntpdate 192.168.80.30‘ >> /var/spool/cron/root
//写计划任务,每隔三十分钟,自动同步时间
[[email protected] ~]# crontab –l //查看计划任务
二:源码编译安装mysql
此处参考http://blog.51cto.com/12227558/2074113,源码安装并配置mysql
三:配置slave01从服务器的mysql
[[email protected] ~]# vi /etc/my.cnf
server_id = 22
relay_log=relay-log-bin
relay_log_index=slave-relay-bin.index
保存退出
[[email protected] ~]# service mysqld restart
[[email protected] ~]# mysql -uroot -pabc123 //登录数据库
mysql> change master to master_host=‘192.168.80.30‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master_bin.000001‘,master_log_pos=603;
mysql> start slave;
mysql> show slave status \G
第三步 配置从服务器slave02(192.168.80.50)
一:设置时间同步(同步到主服务器)
[[email protected] ~]# service firewalld stop
[[email protected] ~]# setenforce 0
[[email protected] ~]# yum install -y ntpdate
[[email protected] ~]# ntpdate 192.168.80.30
[[email protected] ~]# echo ‘/30 * /usr/sbin/ntpdate 192.168.80.30‘ >> /var/spool/cron/root
[[email protected] ~]# crontab –l
二:源码编译安装mysql
此处参考http://blog.51cto.com/12227558/2074113,源码安装并配置mysql
三:配置slave02从服务器的mysql
[[email protected] ~]# vi /etc/my.cnf
server_id = 33
relay_log=relay-log-bin
relay_log_index=slave-relay-bin.index
保存退出
[[email protected] ~]# service mysqld restart
[[email protected] ~]# mysql -uroot -pabc123
mysql> change master to master_host=‘192.168.80.30‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master_bin.000001‘,master_log_pos=603;
mysql> start slave;
mysql> show slave status \G
第四步 验证
//在主服务器上新建库并验证同步
mysql> create database hello;
mysql> show databases;
//在从服务器上验证结果
Slave01:
mysql> show databases;
Slave02:
mysql> show databases;
//验证成功
第三部分 读写分离
第一步 在amoeba服务器上配置(192.168.80.20)
[[email protected] ~]# service firewalld stop
[[email protected] ~]# setenforce 0
一:设置同步时间
[[email protected] ~]# yum install -y ntpdate
[[email protected] ~]# ntpdate 192.168.80.181
[[email protected] ~]# echo ‘/30 * /usr/sbin/ntpdate 192.168.80.30‘ >> /var/spool/cron/root
[[email protected] ~]# crontab –l
二:安装JDK
[[email protected] ~]# tar xf jdk-8u144-linux-x64.tar.gz
[[email protected] ~]# cp -rv jdk1.8.0_144/ /usr/local/java
[[email protected] ~]# vi /etc/profile
最后添加以下内容:
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
保存退出
[[email protected] ~]# source /etc/profile //立即生效
[[email protected] ~]# java –version
三:安装amoeba //下载地址:https://sourceforge.net/projects/amoeba/files/
[[email protected] ~]# yum install -y unzip
[[email protected] ~]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
[[email protected] ~]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
[[email protected] ~]# chmod -R 755 /usr/local/amoeba/
[[email protected] ~]# vi /usr/local/amoeba/jvm.properties
修改以下内容:
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k" //32行
保存退出
四:制作amoeba管理脚本
[[email protected] ~]# vi /etc/init.d/amoeba
#!/bin/bash
#chkconfig: 35 62 62
#
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
NAME=Amoeba
AMOEBA_BIN=/usr/local/amoeba/bin/launcher
SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown
PIDFILE=/usr/local/amoeba/Amoeba-MySQL.pid
SCRIPTNAME=/etc/init.d/amoeba
case "$1" in
start)
echo -n "Starting $NAME... "
$AMOEBA_BIN
echo " done"
;;
stop)
echo -n "Stoping $NAME... "
$SHUTDOWN_BIN
echo " done"
;;
restart)
$SHUTDOWN_BIN
sleep 1
$AMOEBA_BIN
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac
保存退出
[[email protected] ~]# chmod +x /etc/init.d/amoeba
[[email protected] ~]# chkconfig --add amoeba
[[email protected] ~]# service amoeba start
//启动过程较慢,ctrl+z放后台暂停运行,
[[email protected] ~]# bg //后台继续运行
[[email protected] ~]# netstat -anpt | grep 8066
第二步 配置读写分离
一:主服务器创建test数据库
mysql> create database test;
mysql> show databases;
二:在三台mysql数据库服务器中为amoeba授权
mysql> GRANT ALL ON . TO [email protected]‘192.168.80.%‘ IDENTIFIED BY ‘abc123‘;
mysql> FLUSH PRIVILEGES;
三:在amoeba服务器上编辑amoeba配置文件
[[email protected] ~]# cd /usr/local/amoeba
[[email protected] amoeba]# vi conf/amoeba.xml
//编辑以下内容
<property name="user">amoeba</property> //28行
<property name="password">123456</property> //30行
//以上设置客户端连接amoeba前端服务器时使用的用户名和密码
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
//83行开始修改,85行与88行是注释,删除
保存退出
[[email protected] amoeba]# vi conf/dbServers.xml
修改以下内容:
<property name="user">test</property>
<property name="password">abc123</property>
//以下是主服务器配置:
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.80.30</property>
//从服务器slave01配置:
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.80.40</property>
//从服务器slave02配置:
将slave01相关内容复制(共六行),直接往下粘贴,并作修改
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.80.50</property>
//以下修改两行内容:
保存退出
[[email protected] amoeba]# service amoeba restart
按ctrl+z,bg,后面运行
[[email protected] amoeba]# netstat -anpt | grep 8066
第四部分 测试验证
第一步 客户端上操作(192.168.80.10)
[[email protected] ~]# service firewalld stop
[[email protected] ~]# setenforce 0
一:源码编译安装mysql
此处参考http://blog.51cto.com/12227558/2074113,源码安装并配置mysql
二:测试读写分离
//在MASTER上新建的数据库或者里面的表,两台从服务器会同步--通过amoeba操作
- 客户端登录操作
[[email protected]@client ~]# mysql -u amoeba -p123456 -h 192.168.80.20 -P8066
mysql> show databases;
mysql> use test;
mysql> create table zhang (id int(10),name varchar(10),address varchar(20));
mysql> show tables;
//在三台数据库服务器上查看会是相同结果
- 在两台从服务器上停止主从同步服务
mysql> stop slave;
测试一: 在主服务器上插入的内容不会同步-通过amoeba操作的
//在客户端上操作
mysql> insert into zhang values(‘1‘,‘hahahha‘,‘this_is_master‘);
//在主服务器上查看
//在两台从服务器上查看
mysql> show databases;
mysql> use test;
mysql> select * from zhang;
测试二:在从服务器上新建内容
Slave01:
mysql> use test;
mysql> insert into zhang values(‘2‘,‘zhang‘,‘this_is_slave1‘);
Slave02:
mysql> use test;
mysql> insert into zhang values(‘3‘,‘zhang‘,‘this_is_slave2‘);
//在客户端上测试,第一次会向从服务器slave01上读取数据,第二次会向slave02读取
测试三:在通过客户端连接数据库后写入的数据只有主会记录,然后同步给从-从服务器不
会记录,从而实现了读写分离
//客户端上操作
mysql> insert into zhang values(‘4‘,‘zhang‘,‘write_test‘);
这条记录只能在主服务器上看到记录
在客户端上看不到新插入的数据,因为没有开启同步
//在客户端开启同步后,主服务器上数据会同步到各从服务器中,但是从服务器上自己增加的数据不会同步,只有本地保存
mysql> start slave; //在两台从服务器上开启
在客户端查看会看到主上同步过来的数据,以及自己本地增加的数据,但是看不到其它从上自己增加的数据:
//测试完成
原文地址:http://blog.51cto.com/12227558/2104641