MySQL主从同步与读写分离

目录
第一部分 实验环境
第二部分 配置主从同步
第三部分 配置读写分离
第四部分 测试验证

第一部分 实验环境

  1. 实验拓扑图:
  2. 服务器五台:
    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
  3. 系统信息

    注意:本实验mysql都是源码编译安装,本文档中涉及安装配置mysql数据库部分省略,请参考文档:https://blog.51cto.com/12227558/2074113

第二部分 主从同步(需三台Mysql服务器)

第一步 mysql主服务器搭建配置(192.168.80.30)

一:在主mysql服务器上搭建NTP时间服务器

[root@master ~]# yum install -y ntp

[root@master ~]# 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

一个新的MySQL做从节点_java


保存退出

[root@master ~]# service ntpd restart

[root@master ~]# service firewalld stop

[root@master ~]# setenforce 0

二:源码编译安装mysql
此处参考https://blog.51cto.com/12227558/2074113,源码安装并配置mysql

三:配置master主服务器的mysql

[root@master ~]# vi /etc/my.cnf

//在[mysqld]下面配置

server_id = 11

log_bin=master_bin

log_slave_updates=true

一个新的MySQL做从节点_运维_02


保存退出

[root@master ~]# service mysqld restart

[root@master ~]# mysql -uroot -pabc123 //登录数据库

mysql> GRANT REPLICATION SLAVE ON . TO 'myslave'@'192.168.80.%' IDENTIFIED BY '123456';

//为所有从服务器授权所有数据库

mysql> FLUSH PRIVILEGES; //刷新权限

mysql> show master status;

一个新的MySQL做从节点_运维_03

第二步 配置从服务器slave01(192.168.80.40)
[root@slave01 ~]# service firewalld stop
[root@slave01 ~]# setenforce 0
一:设置时间同步(同步到主服务器)
[root@slave01 ~]# yum install -y ntpdate
[root@slave01 ~]# ntpdate 192.168.80.30 //手动同步时间
[root@slave01 ~]# echo '/30 * /usr/sbin/ntpdate 192.168.80.30' >> /var/spool/cron/root
//写计划任务,每隔三十分钟,自动同步时间
[root@slave01 ~]# crontab –l //查看计划任务

二:源码编译安装mysql
此处参考https://blog.51cto.com/12227558/2074113,源码安装并配置mysql

三:配置slave01从服务器的mysql

[root@slave01 ~]# vi /etc/my.cnf

server_id = 22

relay_log=relay-log-bin

relay_log_index=slave-relay-bin.index

一个新的MySQL做从节点_数据库_04


保存退出

[root@slave01 ~]# service mysqld restart

[root@slave01 ~]# 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做从节点_java_05


mysql> start slave;

mysql> show slave status \G

一个新的MySQL做从节点_java_06

第三步 配置从服务器slave02(192.168.80.50)
一:设置时间同步(同步到主服务器)
[root@slave02 ~]# service firewalld stop
[root@slave02 ~]# setenforce 0
[root@slave02 ~]# yum install -y ntpdate
[root@slave02 ~]# ntpdate 192.168.80.30
[root@slave02 ~]# echo '/30 * /usr/sbin/ntpdate 192.168.80.30' >> /var/spool/cron/root
[root@slave02 ~]# crontab –l

二:源码编译安装mysql
此处参考https://blog.51cto.com/12227558/2074113,源码安装并配置mysql

三:配置slave02从服务器的mysql

[root@slave02 ~]# vi /etc/my.cnf

server_id = 33

relay_log=relay-log-bin

relay_log_index=slave-relay-bin.index

一个新的MySQL做从节点_一个新的MySQL做从节点_07


保存退出

[root@slave02 ~]# service mysqld restart

[root@slave02 ~]# 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做从节点_mysql_08


mysql> start slave;

mysql> show slave status \G

一个新的MySQL做从节点_mysql_09

第四步 验证

//在主服务器上新建库并验证同步

mysql> create database hello;

mysql> show databases;

一个新的MySQL做从节点_运维_10


//在从服务器上验证结果

Slave01:

mysql> show databases;

一个新的MySQL做从节点_一个新的MySQL做从节点_11


Slave02:

mysql> show databases;

一个新的MySQL做从节点_运维_12


//验证成功

第三部分 读写分离
第一步 在amoeba服务器上配置(192.168.80.20)
[root@amoeba ~]# service firewalld stop
[root@amoeba ~]# setenforce 0

一:设置同步时间
[root@amoeba ~]# yum install -y ntpdate
[root@amoeba ~]# ntpdate 192.168.80.181
[root@amoeba ~]# echo '/30 * /usr/sbin/ntpdate 192.168.80.30' >> /var/spool/cron/root
[root@amoeba ~]# crontab –l

二:安装JDK

[root@amoeba ~]# tar xf jdk-8u144-linux-x64.tar.gz

[root@amoeba ~]# cp -rv jdk1.8.0_144/ /usr/local/java

[root@amoeba ~]# 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

保存退出

[root@amoeba ~]# source /etc/profile //立即生效

[root@amoeba ~]# java –version

一个新的MySQL做从节点_一个新的MySQL做从节点_13

三:安装amoeba //下载地址:https://sourceforge.net/projects/amoeba/files/[root@amoeba ~]# yum install -y unzip
[root@amoeba ~]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
[root@amoeba ~]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/
[root@amoeba ~]# vi /usr/local/amoeba/jvm.properties
修改以下内容:
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k" //32行
保存退出

四:制作amoeba管理脚本
[root@amoeba ~]# 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

保存退出

[root@amoeba ~]# chmod +x /etc/init.d/amoeba

[root@amoeba ~]# chkconfig --add amoeba

[root@amoeba ~]# service amoeba start

//启动过程较慢,ctrl+z放后台暂停运行,

[root@amoeba ~]# bg //后台继续运行

一个新的MySQL做从节点_java_14


[root@amoeba ~]# netstat -anpt | grep 8066

一个新的MySQL做从节点_java_15

第二步 配置读写分离

一:主服务器创建test数据库

mysql> create database test;

mysql> show databases;

一个新的MySQL做从节点_java_16

二:在三台mysql数据库服务器中为amoeba授权

mysql> GRANT ALL ON . TO test@'192.168.80.%' IDENTIFIED BY 'abc123';

mysql> FLUSH PRIVILEGES;

一个新的MySQL做从节点_mysql_17

三:在amoeba服务器上编辑amoeba配置文件

[root@amoeba ~]# cd /usr/local/amoeba

[root@amoeba amoeba]# vi conf/amoeba.xml

//编辑以下内容

<property name="user">amoeba</property> //28行

<property name="password">123456</property> //30行

//以上设置客户端连接amoeba前端服务器时使用的用户名和密码

一个新的MySQL做从节点_mysql_18


<property name="defaultPool">master</property>

<property name="writePool">master</property>

<property name="readPool">slaves</property>

//83行开始修改,85行与88行是注释,删除

一个新的MySQL做从节点_数据库_19


保存退出

[root@amoeba amoeba]# vi conf/dbServers.xml

修改以下内容:

<property name="user">test</property> <property name="password">abc123</property>

一个新的MySQL做从节点_一个新的MySQL做从节点_20


//以下是主服务器配置:

<dbServer name="master" parent="abstractServer">

<property name="ipAddress">192.168.80.30</property>

一个新的MySQL做从节点_一个新的MySQL做从节点_21


//从服务器slave01配置:

<dbServer name="slave1" parent="abstractServer">

<property name="ipAddress">192.168.80.40</property>

一个新的MySQL做从节点_mysql_22


//从服务器slave02配置:

将slave01相关内容复制(共六行),直接往下粘贴,并作修改

<dbServer name="slave2" parent="abstractServer">

<property name="ipAddress">192.168.80.50</property>

一个新的MySQL做从节点_java_23


//以下修改两行内容:

一个新的MySQL做从节点_java_24


保存退出

[root@amoeba amoeba]# service amoeba restart

按ctrl+z,bg,后面运行

[root@amoeba amoeba]# netstat -anpt | grep 8066

一个新的MySQL做从节点_一个新的MySQL做从节点_25

第四部分 测试验证
第一步 客户端上操作(192.168.80.10)
[root@client ~]# service firewalld stop
[root@client ~]# setenforce 0
一:源码编译安装mysql
此处参考https://blog.51cto.com/12227558/2074113,源码安装并配置mysql

二:测试读写分离
//在MASTER上新建的数据库或者里面的表,两台从服务器会同步--通过amoeba操作

  1. 客户端登录操作
    [root@@client ~]# mysql -u amoeba -p123456 -h 192.168.80.20 -P8066
    mysql> show databases;
  2. 一个新的MySQL做从节点_mysql_26

  3. mysql> use test;
    mysql> create table zhang (id int(10),name varchar(10),address varchar(20));
    mysql> show tables;
  4. 一个新的MySQL做从节点_一个新的MySQL做从节点_27

  5. //在三台数据库服务器上查看会是相同结果
  6. 一个新的MySQL做从节点_java_28


  7. 一个新的MySQL做从节点_java_29


  8. 一个新的MySQL做从节点_java_30

  9. 在两台从服务器上停止主从同步服务
    mysql> stop slave;

测试一: 在主服务器上插入的内容不会同步-通过amoeba操作的

//在客户端上操作

mysql> insert into zhang values('1','hahahha','this_is_master');

//在主服务器上查看

一个新的MySQL做从节点_运维_31


//在两台从服务器上查看

mysql> show databases;

mysql> use test;

mysql> select * from zhang;

一个新的MySQL做从节点_mysql_32

测试二:在从服务器上新建内容

Slave01:

mysql> use test;

mysql> insert into zhang values('2','zhang','this_is_slave1');

一个新的MySQL做从节点_数据库_33


Slave02:

mysql> use test;

mysql> insert into zhang values('3','zhang','this_is_slave2');

一个新的MySQL做从节点_一个新的MySQL做从节点_34


//在客户端上测试,第一次会向从服务器slave01上读取数据,第二次会向slave02读取

一个新的MySQL做从节点_mysql_35


一个新的MySQL做从节点_数据库_36

测试三:在通过客户端连接数据库后写入的数据只有主会记录,然后同步给从-从服务器不

会记录,从而实现了读写分离

//客户端上操作

mysql> insert into zhang values('4','zhang','write_test');

这条记录只能在主服务器上看到记录

一个新的MySQL做从节点_mysql_37


在客户端上看不到新插入的数据,因为没有开启同步//在客户端开启同步后,主服务器上数据会同步到各从服务器中,但是从服务器上自己增加的数据不会同步,只有本地保存

mysql> start slave; //在两台从服务器上开启

在客户端查看会看到主上同步过来的数据,以及自己本地增加的数据,但是看不到其它从上自己增加的数据:

一个新的MySQL做从节点_mysql_38


//测试完成

转载于:https://blog.51cto.com/12227558/2104641