三期总目录链接
目录
一、概述
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的,因此,一般都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施的
1、MySQL主从复制原理
MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
1.1、MySQL支持的复制类型
(1)、基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
(2)、基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3)、混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
1.2、复制的工作过程
(1)、在每个事务更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。
(2)、 Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作线程——1/0线程,l/0线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件。1/0线程将这些事件写入中继日志。
(3) 、SQL slave thread (SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave的数据,使其与Master中的数据一致。只要该线程与l/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作
2、MySQLd读写分离原理
简单说就是在Master上写,在slave上读。原理Master处理事务性查询,而slave处理 select 查询,数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库
MySQL读写分离分为两种:
1、基于程序代码内部实现
在代码中根据select、insert进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
2、基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序。
2.1、MySQL-Proxy:MySQL-Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL-Proxy用到生产环境。
2.2、Amoeba (变形虫):由陈思儒开发,其曾就职于阿里巴巴。该程序用Java语言进行开发.阿里巴巴将其用于生产环境。它不支持事务和存储过程。
通过程序代码实现MySQL读写分离是一个不错的选择,但并不是所有的应用都适合在程序代码中实现读写分离,例如一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种大型复杂的应用一般会考虑使用代理层来实现
二、案例
(一)搭建MySQL主从复制
最少5台机器
主服务器(Master) | 192.168.1.8 |
从服务器(Slave1) | 192.168.1.4 |
从服务器(Slave2) | 192.168.1.5 |
Amoeda | 192.168.1.6 |
CentOS7 (客户机c-7) | 192.168.1.7 |
1、 在Master上搭建时间同步服务器
[root@Master ~]# yum -y install ntp
......
...
[root@Master ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf #使用sed直接编辑开头是server的在前面添加#号
[root@Master ~]# cat <<END >>/etc/ntp.conf #给/etc/ntp.conf文件在最后添加内容
server 127.127.1.0
fudge 127.127.1.0 stratum 8
END
[root@Master ~]# systemctl restart ntpd
[root@Master ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
[root@Master ~]# netstat -utpln | grep ntpd
udp 0 0 192.168.122.1:123 0.0.0.0:* 1760/ntpd
udp 0 0 192.168.1.1:123 0.0.0.0:* 1760/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1760/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1760/ntpd
udp6 0 0 fe80::b0bb:e9c5:dd1:123 :::* 1760/ntpd
udp6 0 0 ::1:123 :::* 1760/ntpd
udp6 0 0 :::123 :::* 1760/ntpd
Slave1、2上同步时间
[root@Slave1 ~]# yum -y install ntpdate
......
...
[root@Slave1 ~]# /usr/sbin/ntpdate 192.168.1.8 #输入Master服务器地址
8 Sep 22:57:37 ntpdate[1099]: step time server 192.168.1.8 offset -0.507863 sec
安装略
[root@Slave2 ~]# /usr/sbin/ntpdate 192.168.1.8 #同步
8 Sep 23:07:41 ntpdate[1132]: step time server 192.168.1.8 offset -0.857266 sec
2、在Master、Slave1、2上安装mysql
方法一: 在slave1上安装:其他两个服务器步骤相同密码相同
本次实验使用手动安装:原因脚本安装可能有问题暂时没有发现解决方法
[root@Slave1 ~]# yum -y install ncurses-devel
......
...
[root@Slave1 ~]# tar zxvf /root/cmake-2.8.6.tar.gz -C /usr/src/ #安装基础环境
......
...
[root@Slave1 ~]# cd /usr/src/cmake-2.8.6
[root@Slave1 cmake-2.8.6]# ./configure && gmake && gmake install #配置,编译安装cmake
......
...
[root@Slave1 cmake-2.8.6]# tar zxvf /root/mysql-5.6.36.tar.gz -C /usr/src/ #解压mysql
[root@Slave1 cmake-2.8.6]# cd /usr/src/mysql-5.6.36/
[root@Slave1 mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/
........
....
[root@Slave1 mysql-5.6.36]# make &&make install
.........
....
cmake进行配置mysql | |
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql | 指定安装目录 |
-DDEFAULT_CHARSET=utf8 | 指定字符集为utf8 |
-DDEFAULT_COLLATION=utf8_general_ci | 指定字符校验 |
-DWITH_EXTRA_CHARSETS=all | 支持额外字符集 |
-DSYSCONFDIR=/etc/ | 指定配置文件位置 |
[root@Slave1 mysql-5.6.36]# cp /usr/src/mysql-5.6.36/support-files/my-default.cnf /etc/my.cnf #复制配置文件
cp:是否覆盖"/etc/my.cnf"? yes
添加系统服务
[root@Slave1 mysql-5.6.36]# cp /usr/src/mysql-5.6.36/support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@Slave1 mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld
[root@Slave1 mysql-5.6.36]# chkconfig --add mysqld
[root@Slave1 mysql-5.6.36]# chkconfig mysqld on
[root@Slave1 mysql-5.6.36]# echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile #优化PATH路径,执行命令时方便,单引号双引号都行
[root@Slave1 mysql-5.6.36]# source /etc/profile #执行文件
初始化mysql,创建用户,赋权
[root@Slave1 mysql-5.6.36]# useradd -M -s /sbin/nologin mysql
[root@Slave1 mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql
[root@Slave1 mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
........
...
[root@Slave1 mysql-5.6.36]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/usr/local/mysql/data/Slave1.err'.
. SUCCESS!
[root@Slave1 mysql-5.6.36]# chkconfig mysqld on
[root@Slave1 mysql-5.6.36]# mysqladmin -u root password '123' #修改密码,并提示密码
Warning: Using a password on the command line interface can be insecure.
[root@Slave1 ~]# mysql -uroot -p123 #进入mysql
......
...
mysql>quit #退出 安装完成
方法二:脚本安装
执行脚本前确保:防火墙、selinux已关闭,yum源已正确配置并运行,源码包cmake-2.8.6.tar.gz、mysql-5.6.36.tar.gz已上传到root目录中
解决cp命令 -f选项强制复制 依旧提示的问题:因cp命令的alias别名为‘cp -i’原因造成
unalias cp
echo '#!/bin/bash
yum -y install ncurses-devel
#解压cmake,安装基础环境
tar xf /root/cmake-2.8.6.tar.gz -C /usr/src/
cd /usr/src/cmake-2.8.6
#配置,编译安装cmake
./configure && gmake && gmake install
#解压mysql
cd
tar zxvf /root/mysql-5.6.36.tar.gz -C /usr/src/
cd /usr/src/mysql-5.6.36/
#cmake进行配置mysql
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/
make &&make install
#1.复制配置文件
cp -f /usr/src/mysql-5.6.36/support-files/my-default.cnf /etc/my.cnf
#2.添加系统服务
cp -f /usr/src/mysql-5.6.36/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
#3.优化PATH路径,执行命令时方便,单引号双引号都行
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
#4.初始化mysql,创建用户,赋权
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
/etc/rc.d/init.d/mysqld start
chkconfig mysqld on
netstat -anput |grep 3306
/usr/local/mysql/bin/mysqladmin -u root password 123
' > mysqlaz.sh
chmod +x mysqlaz.sh #赋权
./mysqlaz.sh #执行脚本
这时候使用命令mysql命令的时候提示我们没有此命令:原因我们的source命令在脚本中执行,只能在脚本的子shell中生效。
解决方法:重新执行source
source /etc/profile
3、配置MySQL主从复制
Master服务器上配置
[root@Master ~]# vim /etc/my.cnf
......
...
server-id = 11 #添加到最后
log-bin=master-bin #启用二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中
log-slave-updates=true
保存
[root@Master ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
[root@Master ~]# mysql -uroot -p123
......
...
mysql> grant replication slave on *.* to 'myslave'@'%' identified by '123'; #给slave授权
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> show master status; #记住File的及Position的值,此处为 master-bin.000001和400
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 400 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
File 列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要
注意:上述两个值每个人可能不同,记录要准确
mysql> create database db_test; #创建测试数据库
Query OK, 1 row affected (0.01 sec)
mysql> show databases; #查看
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_test |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.03 sec)
在slave1配置:slave2同1
[root@Slave1 ~]# vim /etc/my.cnf
......
...
server-id = 22 #不能与Master的ID相同 添加到最后
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[root@Slave1 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.... SUCCESS!
[root@Slave1 ~]# mysql -uroot -p123
......
..
mysql> change master to master_host='192.168.1.8',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=400;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G; #查看slave状态
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.8
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 503
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 387
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes #一定要为yes
Slave_SQL_Running: Yes #一定要为yes
.......
...
slave1上验证
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_test | #同步成功
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)
mysql> quit
slave2上验证
[root@Slave2 ~]# mysql -uroot -p123
......
...
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa | #同步成功
| db_test | #同步成功
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
错误显示:如果显示no表示错误
Slave_IO_Running: No
Slave_SQL_Running: Yes
解决方法 :
进入数据库后操作
注意输入内容前先到master服务器上查看
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 491 | | | |
+-------------------+----------+--------------+------------------+-------------------+
因master服务器上的Position变更导致我们的slave服务器无法同步
slave服务器修改错误
mysql> stop slave; #关闭slave的复制功能
mysql> change master to master_host='192.168.1.8',master_user='myslave',master_password='123',master_log_file='master-bin.00000s1',master_log_pos=491; #输入内容
mysql> start slave; #启动slave的复制功能
mysql> show slave status\G; #查看是否已经成为yes
注意:在slave服务器上 执行
change master to master_host='192.168.1.8',master_user='myslave',master_password='123',master_log_file='master-bin.00000s1',master_log_pos=491;
时必须是master的 File 和 Position
(二)搭建MySQL读写分离
1、在Amodba上安装java环境
搭建java环境
[root@Amoeba ~]# yum -y remove java
已加载插件:fastestmirror
源 'aaa' 在配置文件中未指定名字,使用标识代替
参数 java 没有匹配
不删除任何软件包
[root@Amoeba ~]# chmod +x jdk-6u14-linux-x64.bin
[root@Amoeba ~]# ./jdk-6u14-linux-x64.bin #按Enter完成即可
.................
.....
[root@Amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@Amoeba ~]# 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
保存退出
[root@Amoeba ~]# source /etc/profile
[root@Amoeba ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
java环境配置成功
2、安装并配置Amoeda软件
[root@Amoeba ~]# mkdir /usr/local/amoeba
[root@Amoeba ~]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
.......
.....
[root@Amoeba ~]# chmod -R 755 /usr/local/amoeba/
[root@Amoeba ~]# /usr/local/amoeba/bin/amoeba #查看是否安装成功
amoeba start|stop #显示此内容说明安装成功
2.1在master数据库授权给amoeba读写权限:
在master服务器上配置
mysql> grant all on *.* to boss@'192.168.1.%' identified by '123123';
Query OK, 0 rows affected (0.01 sec)
slave服务器上查看是否同步
在slave1上查看
mysql> show grants for boss@'192.168.1.%';
+------------------------------------------------------------------------------------------------------------------------+
| Grants for boss@192.168.1.% |
+------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'boss'@'192.168.1.%' IDENTIFIED BY PASSWORD '*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1' |
+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
在slave2上查看
mysql> show grants for boss@'192.168.1.%';
+------------------------------------------------------------------------------------------------------------------------+
| Grants for boss@192.168.1.% |
+------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'boss'@'192.168.1.%' IDENTIFIED BY PASSWORD '*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1' |
+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
3、修改配置文件
[root@Amoeba ~]# vim /usr/local/amoeba/conf/amoeba.xml
........
...
30 <property name="user">amoeba</property> #修改为amoeba
31
32 <property name="password">123456</property> #添加密码
......
...
115 <property name="defaultPool">master</property> #修改为master
116
117
118 <property name="writePool">master</property> #修改为master ,删除上面的的注释
119 <property name="readPool">slaves</property> #修改为slaves,删除下面的的注释
120
保存退出
[root@Amoeba ~]# vim /usr/local/amoeba/conf/dbServers.xml
.....
...
26 <property name="user">boss</property> #修改为授权的用户
27
28 <!-- mysql password --> #修改
29 <property name="password">123123</property> #输入密码删除下一行的-->
30
44
45 <dbServer name="master" parent="abstractServer"> #修改为master
46 <factoryConfig>
47 <!-- mysql ip -->
48 <property name="ipAddress">192.168.1.8</property> #指定正确的master的ip
49 </factoryConfig>
50 </dbServer>
51
52 <dbServer name="slave1" parent="abstractServer"> #修改为slave1
53 <factoryConfig>
54 <!-- mysql ip -->
55 <property name="ipAddress">192.168.1.4</property> #指定slave1的ip地址
56 </factoryConfig>
57 </dbServer>
58
59 <dbServer name="slave2" parent="abstractServer"> #修改为slave2
60 <factoryConfig>
61 <!-- mysql ip -->
62 <property name="ipAddress">192.168.1.5</property> #指定slave2的ip地址
63 </factoryConfig>
64 </dbServer>
65
66 <dbServer name="slaves" virtual="true"> #修改为slaves
67 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
68 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
69 <property name="loadbalance">1</property>
70
71 <!-- Separated by commas,such as: server1,server2,server1 -->
72 <property name="poolNames">slave1,slave2</property> #修改集群的成员名称用逗号隔开
73 </poolConfig>
74 </dbServer>
保存退出
[root@Amoeba ~]# /usr/local/amoeba/bin/amoeba start & #启动代理服务
启动服务后需要等待一会
[root@Amoeda ~]# netstat -utpln |grep 8066 #查看端口8066
tcp6 0 0 :::8066 :::* LISTEN 1333/java
4、测试读写分离
用c-7机器进行测试
[root@C-7 ~]# yum -y install mysql
[root@c-7 ~]# mysql -u amoeba -p123456 -h 192.168.1.6 -P 8066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 367145653
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| bbb |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.01 sec)
MySQL [(none)]> create database benet; #创建数据库benet
Query OK, 1 row affected (0.02 sec)
MySQL [(none)]> create table benet.ly(id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.02 sec)
在slave1和slave2服务器上查看结果
slave1服务器上查看
mysql> use benet;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------+
| Tables_in_benet |
+-----------------+
| ly | #已然同步
+-----------------+
1 row in set (0.00 sec)
slave2上查看
mysql> use benet;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------+
| Tables_in_benet |
+-----------------+
| ly | #已然同步
+-----------------+
1 row in set (0.00 sec)
4.1 、关闭slave的复制功能:slave1和slave2
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
4.2、在master,slaves服务器上创建不同的数据
master服务器上
mysql> insert into benet.ly values(1,'今天上课','this is master数据库');
Query OK, 1 row affected (0.00 sec)
slave1
mysql> insert into benet.ly values(2,'国庆节','slave1服务器hh');
Query OK, 1 row affected (0.00 sec)
slave2
mysql> insert into benet.ly values(2,'中秋节','slave2歪比巴卜');
Query OK, 1 row affected (0.00 sec)
4.3、在c-7上查看
MySQL [(none)]> select * from benet.ly; #查看数据显示是slave2的
+------+-----------+--------------------+
| id | name | address |
+------+-----------+--------------------+
| 2 | 中秋节 | slave2歪比巴卜 |
+------+-----------+--------------------+
1 row in set (0.01 sec)
MySQL [(none)]> select * from benet.ly; ##查看数据显示是slave1的
+------+-----------+-------------------+
| id | name | address |
+------+-----------+-------------------+
| 2 | 国庆节 | slave1服务器hh |
+------+-----------+-------------------+
1 row in set (0.01 sec)
4.4、在客户机c-7上验证写
MySQL [(none)]> insert into benet.ly values(4,'JD','c-7 user111'); #写入数据
Query OK, 1 row affected (0.01 sec)
查看刚才写入的数据,查看不到刚刚写入的数据
MySQL [(none)]> select * from benet.ly;
+------+-----------+--------------------+
| id | name | address |
+------+-----------+--------------------+
| 2 | 中秋节 | slave2歪比巴卜 |
+------+-----------+--------------------+
1 row in set (0.01 sec)
MySQL [(none)]> select * from benet.ly;
+------+-----------+-------------------+
| id | name | address |
+------+-----------+-------------------+
| 2 | 国庆节 | slave1服务器hh |
+------+-----------+-------------------+
1 row in set (0.00 sec)
在master服务器上查看,可以看到我们在客户机c-7机器上写入的数据
mysql> select * from benet.ly;
+------+--------------+-------------------------+
| id | name | address |
+------+--------------+-------------------------+
| 1 | 今天上课 | this is master数据库 |
| 4 | JD | c-7 user111 |
+------+--------------+-------------------------+
2 rows in set (0.00 sec)
总结:在c-7客户机写入数据时,amoeda会将数据路由到master服务器上进行存储,客户机读取时,amoeda会将读的请求进行轮系的方式发给slaves组(slave1+slave2),实现读写分离,分担服务器压力。
复习题
1. MySQL主从复制与读写分离应用于什么场景下?目的是什么?
主从复制应用于:
读写分离应用于:分布式数据库前端代理层 目的:SQL路由功能
2. MySQL支持哪几种复制类型? MySQL默认使用什么样的复制类型?
3种复制类型:(1)、基于语句的复制、(2)、基于行的复制、(3)、混合类型的复制
默认使用:基于语句的复制
3. 图示MySQL主从复制的原理
4. 图示MySQL读写分离的原理
5. MySQL读写分离可以基于哪两种方式实现?简述其优缺点?
1、基于程序代码内部实现
优:性能较好,在程序代码中实现,不需要增加额外的设备作为硬件开支
缺:需要开发人员协助
2、基于中间代理层实现
amoeba 优:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案,自己分配账户,和后端数据库权限管理独立
缺:权限处理不够灵活
6. 在Linux系统中执行ntpdate 192.168.1.101命令的作用是什么?
同步192.168.1.101服务器的时间
7. 在/etc/my.cnf 中设置log_bin=master-bin与log-slave-updates=true配置项的作用是什么?
log_bin=master-bin作用:启用二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中
log-slave-updates=true作用:从库从主库复制的数据会写入log-bin日志文件里
8. 简述部署MySQL主从复制时,主服务器与从服务器的主配置文件的区别
Master:开启二进制日志,写入二进制日志完成后,Master通知存储引擎提交事务
slave:开启中继日志,读取事件,并重放其中的事件而更新 Slave的数据,使其与Master中的数据一致
9. 简述Amoeba安装部署的过程
1)、在Amodba上安装java环境;2)、安装并配置Amoeda软件;3)、修改配置文件
10. 简述MySQL读写分离的测试方法及步骤
1)、用linux机器进行测试安装msqyl,进行查看,创建一个数据库;2)、在slave1和slave2服务器上查看结果,只能在master;3)、关闭slave的复制功能:slave1和slave2;4)、在master,slaves服务器上创建不同的数据;5)、在c-7上查看;6)、在客户机c-7上验证写,写完后查看