5

部署MySQL主从复制与读写分离

 3 years ago
source link: https://www.wencst.com/archives/1004
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、实验坏境

1.一台CentOS 7作为客户端测试,对应的地址为:192.168.80.120
2.一台CentOS 7作为Amoeba前端代理服务器,对应的地址为:192.168.80.110
3.一台CentOS 7作为mysql主服务器,对应的地址为:192.168.80.100
4.两台CentOS 7分别作为mysql从服务器,对应的地址分别为:192.168.80.140,192.168.80.150
5.所有的虚拟机都绑定同一块虚拟网卡vnet1:192.168.80.10

二、主从复制和读写分离的原理

1、主从复制的原理

MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离。

MySQL支持的复制类型有:基于语句的复制、基于行的复制、混合类型的复制。
复制的工作过程如下:

2、读写分离的原理

简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从服务器处理select查询。数据库复制被用来把事务性查询导致的变更同步到从数据库中。

基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户段的请求通过判断后转发到后端数据库。
读写分离的过程如下:

三、搭建MySQL主从复制

将三台CentOS 7分别用源码编译安装MySQL数据库具体操作:http://blog.51cto.com/13871362/2328667

1、配置主服务器

1)建立时间同步环境

yum install ntp -y      
vi /etc/ntp.conf

17行添加

restrict 192.168.80.0 mask 255.255.255.0 nomodify notrap        //限定同步的网段
server 127.127.1.0fudge 127.127.1.0 stratum 8     //设置时间服务器的层级为8级,顶级是0


systemctl start ntp    //开启服服务

2)配置主MySQL

vi /etc/my.cnf      //编辑数据库配置文件
在 [mysqld]模块下面添加以下几行
server_id = 11      //主服务器编号
log_bin=master_bin  //指定二进制日志
log_slave_updates=true      //允许从服务器更新


systemctl restart mysqld       //重启服务

3)进入数据库授权

mysql -u root -pabc123      //进入数据库GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.1

2、配置从服务器(两台从步骤一样,区别server-id不同)

1)配置从MySQL

vi /etc/my.cnf      //编辑数据库配置文件
在 [mysqld]模块下面添加以下几行
server_id = 22      //从服务器编号
relay_log=relay-log-bin //指定从服务器的中继日志
relay_log_index=slave-relay-bin.index   //定义中级日志的位置和名称

systemctl restart mysqld       //重启服务

2)在从服务器上进行时间同步

yum install ntpdate -y  
ntpdate 192.168.80.10


echo '*/30 * * * * /usr/sbin/ntpdate 192.168.80.183' >> /var/spool/cron/root
crontab -l

3)进入从数据库授权

mysql -uroot -pabc123   //进入数据库change master to master_host='192.168.80.100',master_user='mysyslave',master_password='abc123',master_log_file='master_bin.000001'',master_log_pos=603;     //指定主服务器

start slave;    //开启从服务器
show slave status \G

3、验证主从复制

进入主服务器数据库

mysql -u root -p123456create database test;   //建库测试

在两台从服务器上验证

show databases;

四、搭建MySQL读写分离

1、配置前端代理服务器

1) 安装JDK环境(amoeba基于jdk开发的)

tar xf jdk-8u144-linux-x64.tar.gz   
cp -rv jdk1.8.0_144/ /usr/local/java

vi /etc/profile

添加Java环境

export JAVA_HOME=/usr/local/javaexport JRE_HOME=/usr/local/java/jreexport PATH=$PATH:/usr/local/java/binexport CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/libsource /etc/profile     //刷新环境
java -version   //验证jdk环境

2)安装Amoeba

unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/ //解压软件包

mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba      //更改软件位置
chmod -R 755 /usr/local/amoeba/     //提权

vi /usr/local/amoeba/jvm.properties //编辑jvm配置文件优化
32行下注释新增:
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"

3)制作amoeba启动脚本

vi /etc/init.d/amoeba#!/bin/bashexport JAVA_HOME=/usr/local/javaexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHNAME=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/amoebacase "$1" instart)echo -n "Starting $NAME... "$AMOEBA_BINecho " done";;
stop)echo -n "Stoping $NAME... "$SHUTDOWN_BINecho " done";;
restart)$SHUTDOWN_BINsleep 1$AMOEBA_BIN;;
*)echo "Usage: $SCRIPTNAME {start|stop|restart}"exit 1
;;esacchmod +x /etc/init.d/amoeba     //将amoeba启动脚本提权
chkconfig --add amoeba      //加入系统配置中

service amoeba start    //出现下面的端口说明启动成功,直接ctrl+C退出

netstat -anpt | grep 8066 //默认监听在8066端口

4)与客户端对接

vi /usr/local/amoeba/conf/amoeba.xml
28-30行

5)与后端服务器对接

vi /usr/local/amoeba/conf/dbServers.xml
26-29行

43-56行

65-73行

service restart amoeba  //服务重启

6)在三台mysql数据库中(一主两从)为amoeba授权

GRANT ALL  ON *.* TO test@'192.168.80.%' IDENTIFIED BY '123.com';   //为代理授权链接FLUSH PRIVILEGES;       //刷新权限

2、配置客户端

yum install -y mysql        
mysql -u amoeba -p123456 -h 192.168.80.110 -P8066

3、测试读写分离

1) 在MASTER上新建的数据库或者里面的表,两台从服务器会同步

use test;create table zhang (id int(10),name varchar(10),address varchar(20));show tables; //三台数据库

2)在两台从服务器上停止从服务后
stop slave;
在主主服务器插入内容

use testinsert into zhang values('1','hahahha','this_is_master');

在从服务器1上出入内容

use test;insert into zhang values('2','zhang','this_is_slave1');

在从服务器2上出入内容

use test;insert into zhang values('3','zhang','this_is_slave2');

3)在客户端上面测试从服务器只读数据

Select * from test.zhang;

4)在客户端上面测试主服务器只写数据

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

在客户端查看

select * from zhang;

在主服务器查看

在从服务1上查看

在从服务器2上查看

4、结论

以上实验在主从同步的基础上验证了MySQLd的读写分离,而Amoeba充当代理服务器,负责将客户的请求进行转发,分配到相应的服务器,也验证的原理。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK