Mysql 的主从复制+读写分离(纯实验)

1. 主从复制

1.1 环境

四台centos7服务器
一台做client 192.168.152.12
三台做mysql服务器:
主服务器 5.6版本 192.168.152.130
从服务器1 5.7版本 192.168.152.129
从服务器2 5.7版本 192.168.152.128

1.2 防火墙设置

systemctl stop firewalld.service 
setenforce 0

1.3 更改主机名+配置时钟同步

192.168.152.130[root@server ~]# hostnamectl set-hostname master
[root@server ~]# su

192.168.152.129[root@client ~]# hostnamectl set-hostname slave1
[root@client ~]# su

192.168.152.128[root@localhost ~]# hostnamectl set-hostname slave2
[root@localhost ~]# su

三台都做相同的配置,达到时间同步:
yum install ntp -y
yum -y install ntpdate ntp
ntpdate ntp.aliyun.com
crontab -e
crontab -l
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com

[root@master ~]# date
20210720日 星期二 14:56:58 CST
[root@slave1 ~]# date
20210720日 星期二 14:57:02 CST
[root@slave2 ~]# date
20210720日 星期二 14:57:05 CST

1.4 配置主从复制

1.4.1 主服务器

[root@master ~]# vim /etc/ntp.conf 
server 127.127.1.0
fudge 127.127.1.0 stratum 8
#这两段可以增加也可以不加,我是设置的三台都同步的阿里云时钟服务器

[root@master ~]# vim /etc/my.cnf

 30 log_bin=master-bin
 31 log_slave=updates=true
 32 server_id = 11
 
[root@master ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

[root@master ~]# mysql -u root -p
Enter password: 

mysql> grant replication slave on *.* to 'myslave'@'192.168.152.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000003 |      412 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

1.4.2 从服务器1

[root@slave1 ~]# vim /etc/my.cnf

 19 server-id = 22
 20 log-bin=master-bin
 21 relay-log=relay-log-bin 
 22 relay-log-index=slave-relay-bin.insex
[root@slave1 ~]# systemctl restart mysqld
[root@slave1 ~]# mysql -u root -p
Enter password: 

mysql> change master to master_host='192.168.152.130',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=412;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G;

在这里插入图片描述

1.4.3 从服务器2

[root@slave1 ~]# vim /etc/my.cnf 

 19 server-id = 33
 20 log-bin=master-bin
 21 relay-log=relay-log-bin
 22 relay-log-index=slave-relay-bin.insex
 [root@slave2 ~]# systemctl restart mysqld

[root@slave2 ~]# mysql -u root -p
Enter password: 

mysql> change master to master_host='192.168.152.130',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=412;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G;

在这里插入图片描述

1.5 实现主从复制

在主服务器上创建一个数据库,查看从服务器上是否存在

主服务器:
mysql> create database aaa;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

从服务器1:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

从服务器2:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

若是在slave1服务器上面更改,master主服务器与slave2并没有同步更改

2. 读写分离

2.1 环境

五台centos7服务器
一台做client 192.168.152.12
一台mysql-amoeb 192.168.152.127
三台做mysql服务器:
主服务器 5.6版本 192.168.152.130
从服务器1 5.7版本 192.168.152.129
从服务器2 5.7版本 192.168.152.128

事先都要把防火墙给关闭

2.2 安装amoeb服务器

2.2.1 安装jdk环境

[root@localhost ~]# hostnamectl set-hostname amoeba
[root@localhost ~]# su
[root@amoeba ~]# cd /opt
[root@amoeba opt]# ls
amoeba-mysql-binary-2.2.0.tar.gz  jdk-6u14-linux-x64.bin  rh

[root@amoeba opt]# mv jdk-6u14-linux-x64.bin /usr/local/
[root@amoeba opt]# cd /usr/local/
[root@amoeba local]# chmod +x jdk-6u14-linux-x64.bin 
[root@amoeba local]# ./jdk-6u14-linux-x64.bin 

Do you agree to the above license terms? [yes or no]
yes

#然后输入yes,开始等待
Press Enter to continue.....

 
Done.

[root@amoeba local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@amoeba local]# ls
bin  games    jdk1.6                  lib    libexec  share
etc  include  jdk-6u14-linux-x64.bin  lib64  sbin     src
[root@amoeba local]# java -version
openjdk version "1.8.0_181"
[root@amoeba local]# vim /etc/profile

 75 unset i
 76 unset -f pathmunge
 77 export JAVA_HOME=/usr/local/jdk1.6
 78 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
 79 export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
 80 export AMOEBA_HOME=/usr/local/amoeba
 81 export PATH=$PATH:$AMOEBA_HOME/bin
 
[root@amoeba local]# source /etc/profile
[root@amoeba local]# java -version
java version "1.6.0_14"

2.2.2 安装amoeba服务

[root@amoeba local]# mkdir amoeba
[root@amoeba local]# tar zvxf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@amoeba local]# chmod -R 755 /usr/local/amoeba/
[root@amoeba local]# /usr/local/amoeba/bin/amoeba
amoeba start|stop

2.2.3 配置amoeba服务

#在主从服务器中的数据库中开放amoeba的访问权限
mysql> grant all on *.* to 'test'@'192.168.152.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

[root@amoeba local]# cd /usr/local/amoeba/conf
[root@amoeba conf]# ls
access_list.conf  dbserver.dtd   functionMap.xml  rule.dtd
amoeba.dtd        dbServers.xml  log4j.dtd        ruleFunctionMap.xml
amoeba.xml        function.dtd   log4j.xml        rule.xml
[root@amoeba conf]# vim amoeba.xml #进入主配置文件

#30行,修改账户名
<property name="user">amoeba</property>
#32行,修改账户密码(amoeba访问数据库的密码)
<property name="password">abc123</property>
#115行,修改默认池
<property name="defaultPool">master</property>
#117行---120行的注释合并到到117行后
<!-- -->
#118行,修改写池
<property name="writePool">master</property>
#119行,修改读池
<property name="readPool">slaves</property>

[root@amoeba conf]# vim dbServers.xml  #进入数据库配置文件

#23行,将test改为mysql
<property name="schema">mysql</property>
#26行,将root改为test(amoebe访问三台数据库的用户)
<property name="user">test</property>
#29行,修改test用户登录数据库的密码
<property name="password">123.com</property>
#45行,修改数据库主服务器名
<dbServer name="master"  parent="abstractServer">
#48行,修改主服务器IP地址
<property name="ipAddress">192.168.152.130</property>
#52行,修改数据库从服务器名,和IP地址
##复制52行到57行,粘贴到58行下
<dbServer name="slave1"  parent="abstractServer">
 53                 <factoryConfig>
 54                         <!-- mysql ip -->
 55                         <property name="ipAddress">192.168.152.129</property>
 56                 </factoryConfig>
 57         </dbServer>
 58 
 59         <dbServer name="slave2"  parent="abstractServer">
 60                 <factoryConfig>
 61                         <!-- mysql ip -->
 62                         <property name="ipAddress">192.168.152.128</property>
 63                 </factoryConfig>
 64         </dbServer>     

#66行,修改多个服务器池的名称
<dbServer name="slaves" virtual="true">
#72行,添加两个从服务器名称
<property name="poolNames">slave1,slave2</property>

[root@amoeba conf]# /usr/local/amoeba/bin/amoeba start #启动amoeba服务
#另开中端
[root@amoeba conf]# netstat -natp | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      70400/java 

2.3 实现读写分离

2.3.1 测试主从同步及amoeba服务的开启是否成功

client客户端:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname client
[root@localhost ~]# su

[root@client ~]# yum -y install mariadb

[root@client ~]# mysql -u amoeba -pabc123 -h 192.168.152.127 -P8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1196121930
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> create database zwh;
Query OK, 1 row affected (0.01 sec)

主服务器:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| test               |
| zwh                |
+--------------------+
6 rows in set (0.00 sec)

两台从服务器:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
| zwh                |
+--------------------+
6 rows in set (0.00 sec)

2.3.2 测试mysql的读写分离

2台从服务器关闭主从同步,在客户端数据库的数据表内插入数据验证amoeba读写分离

#2台从服务器关闭主从同步,查询状态都是no
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;

在这里插入图片描述

client客户端:
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| test               |
| zwh                |
+--------------------+
6 rows in set (0.01 sec)

MySQL [(none)]> use zwh;
Database changed
MySQL [zwh]> create table aaa(id int(10));
Query OK, 0 rows affected (0.03 sec)

MySQL [zwh]> insert into aaa values(1);
Query OK, 1 row affected (0.01 sec)


#分别查看主服务器跟从服务器

主服务器:master处理写的任务,可以查询到数据表
mysql> use zwh;
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> select *from aaa;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

从服务器:从服务器处理读的任务,查询看不到数据
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
| zwh                |
+--------------------+
6 rows in set (0.00 sec)

mysql> 
mysql> use zwh;
Database changed
mysql> select *from aaa;
ERROR 1146 (42S02): Table 'zwh.aaa' doesn't exist

2.3.3 在从服务器上更改表数据,使用客户端验证从服务器读,和轮询的方式读

由于之前创建表的时候是关闭主从同步的状态,所以这里先开启一下服务,把表现同步过来,然后再关闭两台从服务器的同步操作,分别在两个从服务器上进行写入内容记录,在客户端上进行查看

从服务器1:
mysql> use zwh;
Database changed
mysql> show tables;
+---------------+
| Tables_in_zwh |
+---------------+
| aaa           |
+---------------+
1 row in set (0.00 sec)

mysql> insert into aaa values(2);
Query OK, 1 row affected (0.01 sec)

从服务器2:
mysql> use zwh;
Database changed

mysql> show tables;
+---------------+
| Tables_in_zwh |
+---------------+
| aaa           |
+---------------+
1 row in set (0.00 sec)

mysql> insert into aaa values(3);
Query OK, 1 row affected (0.00 sec)

client客户端:
MySQL [zwh]> select *from aaa;
+------+
| id   |
+------+
|    1 |
|    3 |
+------+
2 rows in set (0.00 sec)

MySQL [zwh]> select *from aaa;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

3. 小结

MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离
MySQL支持的复制类型有三种:基于语句的复制、基于行的复制和混合类型的复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值