mysq的主从复制与读写分离:史上最详细!!

总实验环境如下

master 192.168.100.102 ::slave1 192.168.100.103

slave2 192.168.100.104 : :Amoba 192.168.100.105

客户端 192.168.100.106

所有操作系统均为centos7, vm网络均为 vm1

需要的所有软件包我都放在下面这个链接里了

链接:https://pan.baidu.com/s/17AGcvkgUPYCPAZcz4rFnpQ
提取码:13s4

读写分离需要,在主从复制的基础上操作

首先搭建主从复制

1)首先建立时间同步,在主节点 100.102中建立时间同步服务器

安装并配置ntp
[root@CentOS7-02 ~]# yum -y install ntp
[root@CentOS7-02 ~]# vim /etc/ntp.conf (添加如下两行)
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@CentOS7-02 ~]# systemctl restart ntpd
[root@CentOS7-02 ~]# systemctl enable ntpd

2)进入从节点 100.103,100.104做相同操作,进行时间同步

[root@centos7-03 ~]# ntpdate 192.168.100.102
25 Oct 03:31:48 ntpdate[1070]: adjust time server 192.168.100.102 offset 0.052240 sec
上面这个报错正常,如果服务器联网就不会报这个错了,这样就可以

3)在所有服务器中关闭防火墙

[root@centos7-03 ~]# systemctl stop firewalld
[root@centos7-03 ~]# systemctl disable firewalld

4)安装mysql数据库,在主 102 ,和slave1,slave2 :103,104主机操作

注意这部三个服务器都要安装,我这里只演示一个服务器安装,操作一模一样

1.编译安装mysql

[root@CentOS7-02 ~]# yum -y install ncurses-devel
cmake包拖入Xshell中
[root@CentOS7-02 ~]# tar zxf cmake-2.8.6.tar.gz
[root@CentOS7-02 ~]# cd cmake-2.8.6
[root@CentOS7-02 cmake-2.8.6]# ./configure && gmake && gmake install
[root@CentOS7-02 ~]# cd …

把mysql包拖入Xshell
[root@CentOS7-02 mysql-5.6.36]# tar zxf mysql-5.6.36.tar.gz
[root@CentOS7-02 mysql-5.6.36]# cd mysql-5.6.36
[root@CentOS7-02 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
(上面这部非常重要,不要打错字母,要不然后面mysql服务起不了)
[root@CentOS7-02 mysql-5.6.36]# make && make install

2.优化调整

[root@CentOS7-02 mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
[root@CentOS7-02 mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@CentOS7-02 mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld
[root@CentOS7-02 ~]# chkconfig --add mysqld
[root@CentOS7-02 mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@CentOS7-02 mysql-5.6.36]# . /etc/profile

3.初始化数据库

[root@centos7-03 ~]# groupadd mysql
[root@centos7-03 ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@centos7-03 ~]# chown -R mysql:mysql /usr/local/mysql
[root@centos7-03 ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

4.启动的mysql服务,三台mysql密码设置为一致的

[root@CentOS7-02 ~]# systemctl start mysqld
[root@CentOS7-02 ~]# mysqladmin -u root password 'pwd123'

Warning: Using a password on the command line interface can be insecure.
(上面这个不是报错,对的)

再次重申一般,上面的这4小步是在3台mysql服务器上都要操作的

5)配置mysql 主服务器 100.102

更新配置文件

[root@CentOS7-02 ~]# vim /etc/my.cnf (在最后,添加如下,#后的不用添加,是解释)
server-id = 11
log_bin = master-bin #开启二进制日志
log-slave-updates = true #允许从服务器过来更新
[root@CentOS7-02 ~]# systemctl restart mysqld

登陆mysql,给从服务器权限

[root@CentOS7-02 ~]# mysql -u root -p
Enter password: (我这里密码pwd123)
进去后做如下图配置,一定要看下面的图片,要不后面做的时候会有问题
mysql> GRANT REPLICATION SLAVE ON . TO 'myslave'@'192.168.100.%' 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;
在这里插入图片描述

6)配置从服务器

这步是在 100.103 ,100.104 做的,我这里还是只演示一个,操作都一模一样

1 进入从服务器,修改配置文件

[root@centos7-03 ~]# vim /etc/my.cnf (也是添加到最后)
server_id = 22 #这里不可以和刚刚主的一样,id两个从服务器的一样
relay-log=relay-log-bin #开启中继日志
relay-log-index=slave-relay-bin.index #设置中继日志
[root@centos7-03 ~]# systemctl restart mysqld

2 登陆mysql配置,配置同步,

[root@centos7-03 ~]# mysql -u root -p
配置如下图,我后面有打好的但是不全,但是你必须先看图,不然你会出错的
在这里插入图片描述
下面这个是打好的图上的,你们可以复制,但是不全,需要你们填入东西
mysql> change master to master_host='192.168.100.102',master_user='myslave',master_password='123456',master_log_file='',master_log_pos=;

3 查看状态,确保两个YES

mysql> show slave status\G;
在这里插入图片描述

再次重申一遍,这小三步,是在两个从服务器都要做的

7)验证主从复制效果

1 首先进入主的数据库中,创建一个表

mysql> create database db_test;
Query OK, 1 row affected (0.00 sec)

2.进入两个从服务器从查看,应该同步过来才对

mysql> show databases;
在这里插入图片描述

至此主从复制完成

搭建读写分离,实验环境不变,继续即可

这里才用到前面的Amoba 100.105 ,与客户机 100.106

1)在主机Amoeba 105上安装Java环境

把我上面提供的jdk .bin文件拖入
[root@centos7-05 ~]# chmod +x jdk-6u14-linux-x64.bin
[root@centos7-05 ~]# ./jdk-6u14-linux-x64.bin
(执行后,一直按着enter,然后会提示yes,no,输入yes等着即可)
[root@centos7-05 ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6 (后面的jdk1.6是手打的)
[root@centos7-05 ~]# vim /etc/profile (在文件最后添加如下)
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVE_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@centos7-05 ~]# source /etc/profile
[root@centos7-05 ~]# 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环境配置成功,一定要有Jave环境,才可以

2)安装并配置Amoeba软件

还是 100.105中操作,拖入软件包
[root@centos7-05 ~]# mkdir /usr/local/amoeba
[root@centos7-05 ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@centos7-05 ~]# chmod -R 755 /usr/local/amoeba/
[root@centos7-05 ~]# /usr/local/amoeba/bin/amoeba (提示如下表示安装成功)
amoeba start|stop

3)配置Amoeba读写分离,两个Slave读负载均衡

1.主,从 1 ,从2 开放权限给Amoba访问,这部操作三个mysql中都要打

mysql> grant all on *.* to test@'192.168.100.%' identified by '123.com';

2.编辑amoeba.xml文件

回到100.105 Amoeba中
[root@centos7-05 ~]# cd /usr/local/amoeba/
[root@centos7-05 amoeba]# vim conf/amoeba.xml

更改或添加我图中画下划线的地方,其他地方不用动

这个用户是通过代理远程连接数据库的用户名,密码

在这里插入图片描述
继续往下滑
在这里插入图片描述
保存退出

3.编辑dbServers.xml配置文件

[root@centos7-05 amoeba]# vim conf/dbServers.xml
在这里插入图片描述
继续往下滑
在这里插入图片描述
保存退出

4.启动Amoeba软件,端口为8066

[root@centos7-05 amoeba]# bin/amoeba start& (注意看一下下面的图片)
在这里插入图片描述

4)测试读写分离

这个测试有点不好理解,我最后会专门来说原理,先按照我下面来

1.在客户机106中,通过代理访问msql,这里是上面amoeba.xml配置文件中的用户名密码

[root@centos7-06 ~]# yum -y install mysql
[root@centos7-06 ~]# mysql -u amoeba -p123456 -h 192.168.100.105 -P8066
(注意上面 105是amoeba的IP,后的的是大写的P,显示如下连上了)
MySQL [(none)]>

2.在主mysql上创建一个表,同步到各服务器上,然后关闭从服务器的slave(就是主从复制)功能,再插入区别语句

在主mysql 102服务器上
mysql> use db_test; (这个库是上面测试是主从复制同步的,)
Database changed
mysql> create table zang(id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.70 sec)

在两个从服务器(103,104)上 都执行如下
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

在回到主mysql服务器上
mysql> use db_test;
mysql> insert into zang values('1','zhang','this_is_master');
Query OK, 1 row affected (0.09 sec)
mysql> select * from zang;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 1 | zhang | this_is_master |
+------+-------+----------------+

3.没关闭主从复制时从服务器同步了表,关了之后不会同步了,没有同步内容了,分别插入区别语句

从 1 103 中
mysql> use db_test;
mysql> insert into zang values('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.00 sec)
mysql> select * from zang;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+

从2 104 中
mysql> use db_test;
mysql> insert into zang values('3','zang','this_is_slave2');
Query OK, 1 row affected (0.00 sec)
mysql> select * from zang;
+------+------+----------------+
| id | name | address |
+------+------+----------------+
| 3 | zang | this_is_slave2 |
+------+------+----------------+

4.测试读操作,回到客户机 106中

如下,会来回循环从服务器1 2 的表
在这里插入图片描述

5.测试写操作

还是在100.106中,插入一条语句
MySQL [db_test]> insert into zang values('4','zhang','write_test');
Query OK, 1 row affected (0.16 sec)

在106中查不到,因为没有写进,103和104中,最终只能在,主mysql上查到,说明写操作,在主上就对了,进到主 102中查看
mysql> select * from zang;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 1 | zhang | this_is_master |
| 4 | zhang | write_test |
+------+-------+----------------+

现在着重来说一下,这个测试的原理

首先解释一些为什么关闭主从复制,因为如果不关的话,数据都会同步,没法验证

然后,测试读操作那里,只会读到,从服务器上的

写操作,在客户机查不出来,因为没有同步到从服务器从

在现实生活中,两台从服务器中的数据肯定是要一样的,从而实现负载均衡,不要忘了再把读写分离打开

实验完毕!!

发布了54 篇原创文章 · 获赞 57 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_45308292/article/details/102729766