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 时间服务器
- [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
保存退出
- [root@master ~]# service ntpd restart
- [root@master ~]# service firewalld stop
- [root@master ~]# setenforce 0
二: 源码编译安装 mysql
此处参考 http://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
保存退出
- [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;
第二步 配置从服务器 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
此处参考 http://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
保存退出
- [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> start slave;
mysql> show slave status \G
第三步 配置从服务器 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
此处参考 http://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
保存退出
- [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> 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)
- [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
三: 安装 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 // 后台继续运行
[root@amoeba ~]# netstat -anpt | grep 8066
第二步 配置读写分离
一: 主服务器创建 test 数据库
- mysql> create database test;
- mysql> show databases;
二: 在三台 mysql 数据库服务器中为 amoeba 授权
- mysql> GRANT ALL ON . TO test@'192.168.80.%' IDENTIFIED BY 'abc123';
- mysql> FLUSH PRIVILEGES;
三: 在 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 前端服务器时使用的用户名和密码
- <property name="defaultPool">master</property>
- <property name="writePool">master</property>
- <property name="readPool">slaves</property>
- //83 行开始修改, 85 行与 88 行是注释, 删除
保存退出
[root@amoeba 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>
// 以下修改两行内容:
保存退出
[root@amoeba amoeba]# service amoeba restart
按 ctrl+z,bg, 后面运行
[root@amoeba amoeba]# netstat -anpt | grep 8066
第四部分 测试验证
第一步 客户端上操作(192.168.80.10)
- [root@client ~]# service firewalld stop
- [root@client ~]# setenforce 0
一: 源码编译安装 mysql
此处参考 http://blog.51cto.com/12227558/2074113, 源码安装并配置 mysql
二: 测试读写分离
// 在 MASTER 上新建的数据库或者里面的表, 两台从服务器会同步 -- 通过 amoeba 操作
客户端登录操作
- [root@@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