mysql:主从复制与读写分离

主从复制

原理

在这里插入图片描述
1、dump线程监控二进制日志文件的更新,发现更新后通知io线程过来同步。
2、io线程收到通知后申请同步,申请成功后,dump线程会把同步的sql日志内容给slave服务器。
3、然后io线程将内容写入中继日志,sql线程监听中继日志。
4、有更新后,把更新语句同步执行到数据库内部,以达到和master数据库趋近一致。
由于网络传输和slave服务器的性能导致不能真正意义上算作实时同步。

实验

#需要两台服务器,一台作为主,一台作为从。但是为了下面的读写分离,部署两台从服务器,一台主服务器,一台client,一台amoeba服务器,amoeba服务器用于读写分离,暂不做介绍。
主服务器	192.168.60.214
从服务器	192.168.60.11	192.168.60.20
client	192.168.60.60
amoeba服务器	192.168.60.215

#主从同步依赖于二进制日志文件中的sql语句,从服务器根据sql语句是起始位置与时间戳执行语句,所以主从服务器的时间需要同步。
#主从三台服务器安装ntp、ntpdate
yum -y install ntp ntpdate
#主从服务器同步阿里云服务器的时间
ntpdate ntp.aliyun.com
#时间同步过后服务器全部安装mysql,安装过程省略

#对主服务器进行设置,[mysqld]的注释下面添加
vim /etc/my.cnf
log_bin=master-bin		#开启二进制文件
log_slave=updates=true	#开启主从同步
server_id = 1			#将该服务器的id设置为1
:wq

service mysqld stop
service mysqld start

#进入数据库,给从服务器设置权限,允许从服务器从192.168.60.0的网段登录主服务器并复制主服务器的所有数据库的所有表,登录密码为123
mysql>grant replication slave on *.* to 'myslave'@'192.168.60.%' identified by '123';
mysql>flush privileges;	#刷新权限

#再对从服务器进行设置
vim /etc/my.cnf

log-bin=matser-bin			#开启二进制文件
relay-log=relay-log-bin		#将主服务器的二进制文件同步到本地的中继文件
relay-log-index=slave-relay-bin.index	#定义中继文件的索引
:wq
systemctl restart mysqld

#进入数据库,开启从服务器,指定一下主服务器ip,登录到主服务器的用户,密码,同步的文件,文件的起始位置
mysql>change master to master_host='192.168.60.214',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=332;
mysql>start slave;	#开启服务
mysql>show slave status\G;	#查看从服务器状态
            Slave_IO_Running: Yes		io线程和sql线程yes表示正在运行
            Slave_SQL_Running: Yes

#全部设置完毕后,在主服务器上创建库
mysql> create database games;
Query OK, 1 row affected (0.00 sec)

#在从服务器上查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| games              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

读写分离

原理

在这里插入图片描述

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

实验

#amoeba负责接收client的所有请求,并根据请求是读还是写分发给主服务器或从服务器
#实验环境
主服务器	192.168.60.214
从服务器	192.168.60.11	192.168.60.20
client	192.168.60.60
amoeba服务器	192.168.60.215

#安装amoeba,由于amoeba是java制作的,依赖于java环境。
#先安装java,在/usr/local/下放入jdk-6u14-linux-x64.bin二进制文件
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin	#下拉到最后输入yes,再下拉到最后等待。

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	#重载环境变量
#再安装amoeba,将amoeba-mysql-binary-2.2.0.tar.gz放入系统
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/		#设置权限
/usr/local/amoeba/bin/amoeba	#输入后如果出现amoeba start|stop表示amoeba安装成功
#分别在master、slave1、slave2的mysql上开放amoeba的访问权限
mysql> grant all on *.* to 'test'@'192.168.60.%' identified by '123';
mysql>flush privileges;

#再在amoeba服务器上更改
vim amoeba.xml	进入amoeba的主配置文件
<property name="user">amoeba</property>		#30行修改登录用户
<property name="password">123</property>	#32行指定登录用户的密码
<property name="defaultPool">master</property>	#115行指定一下默认地址池为master
<property name="writePool">master</property>	#117行这段注释取消掉,然后将写的地址池指向master
<property name="readPool">slaves</property>		#将读的地址池指向slave

vim dbServer.xml
<property name="schema">mysql</property>	#数据库指向mysql
<property name="user">test</property>		#指定amoeba访问三台服务器的数据库用户
<property name="password">123</property>	#指定密码
<dbServer name="master"  parent="abstractServer">	#指定主服务器的主机名和ip地址
<property name="ipAddress">192.168.60.214</property>

<dbServer name="slave1"  parent="abstractServer">	#指定第一个从服务器的主机名和ip地址
<property name="ipAddress">192.168.60.11</property>

#复制52-57行,然后在下面
<dbServer name="slave2"  parent="abstractServer">	#指定第二个从服务器的主机名和ip地址
<property name="ipAddress">192.168.60.20</property>

<dbServer name="slaves" virtual="true">				#指定服务器池
<property name="poolNames">slave1,slave2</property>	#在地址池中添加两个从服务器的主机名

#完成后,开启服务
/usr/local/amoeba/bin/amoeba start
#新开一个终端,查看服务是否开启
netstat -anpt |grep 8066

测试一

测试通过amoeba对mysql进行操作是否能在主从三台服务器中找到

#在client端登录数据库,然后操作
MySQL [(none)]> create database game;
Query OK, 1 row affected (0.01 sec)

#在主从服务器进行查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| game               |
| games              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
#发现创建的库成功显示出来,证明amoeba正常运行。

测试二

关闭主从同步,测试读写分离是否正常开启

#两个从服务器进入数据库,关闭主从同步
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

#client登入数据库,创建库
MySQL [(none)]> create database player;
Query OK, 1 row affected (0.59 sec)

#再查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| game               |
| games              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

#在主服务器上查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bbs                |
| game               |
| games              |
| mysql              |
| performance_schema |
| player             |
| test               |
+--------------------+
8 rows in set (0.00 sec)
#可以发现是写入进去的,但是没有读取到

测试三

在两个从服务器上写入不同的数据,查看读的方式什么

#两台从服务器分辨创建不同的表数据
mysql> create table test(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test values(1);
Query OK, 1 row affected (0.01 sec)

mysql> create table test(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test values(2);
Query OK, 1 row affected (0.01 sec)

#client查看
MySQL [player]> select * from test;
+------+
| id   |
+------+
|    2 |
+------+
1 row in set (0.01 sec)

MySQL [player]> select * from test;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
#发现amoeba以轮询的方式查看数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值