实验目的:
在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论在安全性、高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般需要通过主从复制(master-slave)的方式来同步数据,再通过读写分离提升数据库的并发负载能力。
主从复制
(一)原理
复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
(二)mysql支持的复制类型
(1)基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时, 会自动选着基于行的复制。
(2)基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
(3)混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
(三)复制工作过程
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将更改应用到自己的数据上。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
读写分离
(一)原理
简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库中。
(二)读写分离工作过程
基于中间代理层实现:Mysql-Proxy Amoeba'
本实验中用amoeba实现
实验拓扑:
实验环境:
主机 | 操作系统 | IP地址 | 主要软件 |
---|---|---|---|
master | CentOS-7-x86_64 | 192.168.37.128 | mysql-5.5.24 |
slave1 | CentOS-7-x86_64 | 192.168.37.131 | mysql-5.5.24 |
slave2 | CentOS-7-x86_64 | 192.168.37.132 | mysql-5.5.24 |
amoeba | CentOS-7-x86_64 | 192.168.37.130 | jdk-6u14-linux-x64.bin ;amoeba-mysql-binary-2.2.0. |
client | CentOS-7-x86_64 | 192.168.37.130 | --- |
实验安装包:
链接:https://pan.baidu.com/s/1bHbR0fPzmVrZf5rGB3UNCA 密码:8tho
实验过程:
一、时间同步
主服务器:
1、安装ntp,编辑配置文件
yum install ntp -y #如果已安装忽略此步骤
vim /etc/ntp.conf #末尾添加
server 127.127.37.0 #本地是时钟源
fudge 127.127.37.0 stratum 8 #设置时间层级为8/时钟可以扩散8层
2、开启服务
systemctl start ntpd.service #开启服务
systemctl stop firewalld.service
setenforce 0
从服务器:
3、安装ntp、ntpdate,开启服务
yum install ntp ntpdate -y #如果已安装忽略此步骤
systemctl start ntpd.service
systemctl stop firewalld.service
setenforce 0
4、开启时间同步
/usr/sbin/ntpdate 192.168.37.128
二、主从复制
5、在三台服务器上手工编译安装mysql5.5(操作过程概述如下)
//安装环境
yum install gcc gcc-c++ make cmake ncurses-devel bison libaio-devel
//解压安装包
mkdir /opt/abc
mount.cifs //192.168.37.1/SHARE /opt/abc
tar zxvf /opt/abc/mysql-5.5.24.tar.gz -C /opt/
//编译安装
cd /opt/mysql-5.5.24
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/home/mysql/ \
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_SSL=system \
-DMYSQL_TCP_PORT=3306 \
-DENABLE_DOWNLOADS=1 \
-DWITH_SSL=bundled
make && make install
//mysql配置文件复制
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 35 mysqld on
//环境变量设置
echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile
. /etc/profile #(注意:"."后面有空格)//创建管理用户mysql
useradd -s /sbin/nologin mysql
chown -R mysql.mysql /usr/local/mysql
//数据初始化
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
//让系统识别mysql
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
vi /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/home/mysql
//开启服务
service mysqld start
6、主服务器:
//编辑配置文件
vim /etc/my.cnf
service mysqld restart
mysql
//给从服务器授权
mysql>grant replication slave on . to 'myslave'@'192.168.37.%' identified by '123456'; #授权给myslave用户
#replication 复制
mysql>flush privileges; #刷新权限
mysql>show master status; #查看主服务器日志文件
7、从服务器:
//编辑配置文件
vim /etc/my.cnf
service mysqld restart
注意:此处启动失败,可重新加载环境变量,或者查看进程是否被占用,重新启动即可
mysql
//从服务器同步主服务器
slave1:
注意:指定主服务器(操作前查看主服务器日志文件位置,会不断变化)
change master to master_host='192.168.37.128',master_user='myslave',master_password='123456',master_log_file='master-bin.000005',master_log_pos=107;
start slave; #开启主从复制
show slave status \G; #看到两个yes
slave2:
change master to master_host='192.168.37.128',master_user='myslave',master_password='123456',master_log_file='master-bin.000005',master_log_pos=828;
start slave; #开启主从复制
show slave status \G; #看到两个yes
8、测试主从复制:主服务器上create database aaa,查看从服务器上是否存在数据库aaa
三、Amoeba安装(识别java语言)与配置
9、首先关闭防火墙
systemctl stop firewalld.service
setenforce 0
10、共享jdk安装包,复制到/usr/local目录下
mkdir /opt/abc
mount.cifs //192.168.37.1/SHARE /opt/abc
cd /opt/abc
cp jdk-6u14-linux-x64.bin /usr/local
11、执行jdk文件
./jdk-6u14-linux-x64.bin
12、使系统识别jdk文件,其工作目录全部放到/usr/local下
mv jdk1.6.0_14/ /usr/local/jdk1.6
13、环境变量修改,系统可以运用安装文件的命令
vim /etc/profile
source /etc/profile #刷新,使环境变量生效
14、安装amoeba
mkdir /usr/local/amoeba #新建目录
cd /opt/abc
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ #解压安装包到新建目录下
chmod -R 755 /usr/local/amoeba/ #保证755权限
15、开启amoeba
/usr/local/amoeba/bin/amoeba
16、在三台服务器上添加权限,开放给amoeba访问
mysql>grant all on . to test@'192.168.37.%' identified by '123.com';
mysql>flush privileges;
17、配置代理服务器amoeba
vim /usr/local/amoeba/conf/amoeba.xml #配置文件
vim conf/dbServers.xml #数据库配置文件
26行
<property name="user">"test"</property> 用test身份读取mysql数据
29行
<property name="password">123.com</property>
42--主服务器地址
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.37.128</property>
50--从服务器
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.37.131</property>
64行--服务器池
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>
18、开启amoeba,查看端口
/usr/local/amoeba/bin/amoeba start&
netstat -ntap | grep java
四、客户机测试(此处客户机与amoeba同用一台虚拟机)
19、简易安装mysql
yum install mysql -y
20、登录mysql,进行如下操作
mysql -u amoeba -p123456 -h 192.168.37.130 -P8066
21、从服务器:(作测试使用,实际生产环境不会停掉)
stop slave;
主服务器:只负责写入,amoeba读不到
insert into info values(1,'zhangsan',99);
slave1:
insert into info values(2,'lisi',88);
slave2:
insert into info values(3,'wangwu',77);
在客户机查看:
至此,实验已全部完成!