实验一、MySQL主从服务器搭建
实验前准备
 Master服务器:192.168.188.14   mysql5.7
 Slave服务器1:192.168.188.15   mysql5.7
 Slave服务器2:192.168.188.16   mysql5.7
 关闭虚拟机防火墙
 systemctl stop firewalld
 setenforce 0
- 主服务器准备 - 安装相关软件
 yum -y install ntp
- 修改ntp配置
 vim /etc/ntp.conf
 在末尾添加以下内容:server 127.127.1.0 fudge 127.127.1.0 stratum 8 
 启动服务
 service ntpd start
 
- 安装相关软件
- 从服务器准备 - 安装相关软件
 yum -y install ntp ntpdate -y
- 进行时间同步
 /usr/sbin/ntpdate 192.168.188.14
 设置定时任务,每30分钟同步一次时间
 crontab -e*/30 * * * * /usr/sbin/ntpdate 192.168.188.14 
 
- 安装相关软件
- 主服务器的mysql配置 - 修改mysql配置文件
 vim /etc/my.cnf
 添加以下内容:server-id = 11 log-bin=master-bin binlog_format = MIXED log-slave-updates=true 
 重启mysql服务
 systemctl restart mysqld
- 给myslave用户赋权,从节点可以通过myslave用户获取需要复制的数据
 mysql -uroot -p
 grant replication slave on *.* to 'myslave'@'192.168.188.%' identified by ‘123456’; flush privileges; 
 查看节点状态
 show master status;
 File显示日志名,Position显示偏移量 
 
- 修改mysql配置文件
- 从服务器的mysql配置 - 修改mysql配置文件
 vim /etc/my.cnfserver-id = 22 # 服务器id,各不相同 relay-log=relay-log-bin # 开启中继日志 relay-log-index=slave-relay-bin.index # 定义中继日志的位置和名称 relay_log_recovery = 1 # slave宕机后,如果relay-log损坏,会放弃所有还未执行的relay-log,重新从master上获取 
 另一台从服务器的配置,只有id改了 
 重启mysql服务
 systemctl restart mysqld
- 进入数据库配置同步
 mysql -uroot -pchange master to master_host='192.168.188.14', master_user='myslave',master_password='123456', master_log_file='master-bin.000001', master_log_pos=604; 
- 启动slave节点
 start slave;
 查看状态,如果能看到Slave_IO_Running: Yes和Slave_SQL_Running: Yes,说明没问题
 show slave status\G 
 
- 修改mysql配置文件
- 验证 - 在主MySQL服务器上创建一个数据库
 create database db_test;
 在从服务器上能看到就说明没问题
 show databases; 
 
- 在主MySQL服务器上创建一个数据库
实验一点五、MySQL读写分离实验
实验前准备
 该实验建立在实验一基础上,使用Amoeba对数据库的操作进行读写分离,读操作将会分发到两个从MySQL服务器上,写操作则会分发到主MySQL服务器上
 Master服务器:192.168.188.14     mysql5.7
 Slave服务器1:192.168.188.15     mysql5.7
 Slave服务器2:192.168.188.16     mysql5.7
 Amoeba服务器:192.168.188.13    jdk1.6、Amoeba(jdk不建议版本太高)
 客户端:192.168.188.12
- 安装Java环境 - cd /opt/
 cp jdk-6u14-linux-x64.bin /usr/local/
 cd /usr/local/
 我用的是编译好的文件,所以直接赋权执行
 chmod +x jdk-6u14-linux-x64
 ./jdk-6u14-linux-x64.bin
- 优化Java环境
 mv jdk1.6.0_14/ /usr/local/jdk1.6
 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
 看一下Java版本,三个java说明没问题
 java -version 
 
- cd /opt/
- 安装amoeba - mkdir /usr/local/amoeba
 tar zxvf /opt/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 说明没问题 
 
- mkdir /usr/local/amoeba
- 配置amoeba读写分离 - 首先需要在三台服务器的MySQL上开放权限给amoeba
 grant all on *.* to 'amo'@'192.168.188.%' identified by '123456';
- 修改amoeba配置文件
 cd /usr/local/amoeba/conf/
 做个备份
 cp amoeba.xml amoeba.xml.bak
 修改配置文件
 vim amoeba.xml
 主要需要修改以下内容  
- 修改数据库配置文件
 先备份
 cp dbServers.xml dbServers.xml.bak
 修改文件
 vim dbServers.xml
 主要改以下内容  
 后台运行
 /usr/local/amoeba/bin/amoeba start&
 ctrl+c返回
 查看一下端口是否正常使用,主要是8066是否开启
 netstat -anpt | grep java 
 
- 首先需要在三台服务器的MySQL上开放权限给amoeba
- 测试读写分离 - 客户端上安装mariadb
 yum -y install mariadb-server mariadb
 启动
 systemctl start mariadb
 通过amoeba代理服务器访问mysql
 mysql -uamoeba -p123456 -h192.168.188.13 -P8066(端口号前面是大写P!千万别写错) 
- 在主服务器上新建表
 use db_test;
 create table test (id int(10),name varchar(10),address varchar(20));
 两台从服务器上先关闭同步
 stop slave;
 在从服务器1上往新表中插入数据
 use db_test;
 insert into test values('1','zhangsan','this_is_slave1');
 在从服务器2上往新表中插入数据
 use db_test;
 insert into test values('2','lisi','this_is_slave2');
 在主服务器上往新表中插入数据
 use db_test;
 insert into test values('3','wangwu','this_is_master');
- 在客户端上查询新表
 use db_test;
 select * from test;
 为什么是这样的结果?首先因为我们关闭了同步,所以主服务器写入的数据无法同步到从服务器,同时因为我们设定从服务器用来读,所以当我们查询时就会去找两台从服务器,所以就能看到这两台服务器上的数据,而且是独立分开的,因为我们是直接往从服务器上插入数据,从服务器上的数据本身就无法同步,在工作中是因为他们同时复制主服务器的数据才能保持一致。 
- 如果我们在上一步基础上,在客户端上往数据库插入新数据
 use db_test;
 insert into test values('4','qianqi','this_is_client');
 在主服务器上查询的结果如下 
 两台从服务器上查询结果如下  
 设定上主服务器用来写,所以我们在客户端上写入的数据会直接保存在主服务器上,因为没开同步的原因,从服务器无法复制主服务器上的数据,所以从服务器上的数据没变。
 那么我们在从服务器上打开同步
 start slave;
 再查询,立马就有了主服务器上的数据  
 
- 客户端上安装mariadb