mysql主从是真的复杂!!!

一、主从复制

一、MySQL的复制类型

1、基于语句的复制
2、基于行的复制
3、混合类型的复制

二、主从复制机制/策略

1、全同步:全部完成
2、半同步:至少一个完成
3、异步:master完成就行(默认)

三、核心/工作过程

日志:
1、二进制日志
2、中继日志
线程:
1、dump线程:监听二进制日志,同时通知salve io线程
2、io线程:
①向master请求更新
②将更新内容同步到本地中继日志
3、sql线程:监听中继日志,将中继日志更新的内容同步到salve数据库中。

实例设备ip地址
mysql-master 192.168.238.150
mysql-slave1 192.168.238.100
mysql-slave2 192.168.238.99
ameoba 192.168.238.133
client 192.168.238.134
脚本安装5.7的mysql

mysql-master配置

[root@localhost ~]# ntpdate ntp.aliyun.com #同步阿里云时钟服务器
19 Jul 18:54:51 ntpdate[101496]: adjust time server 203.107.6.88 offset -0.000178 sec
[root@localhost ~]# hostnamectl set-hostname master #永久修改主机名
[root@localhost ~]# su
[root@master ~]# crontab -e
[root@master ~]# crontab -l
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com
[root@master ~]# vim /etc/my.cnf

在这里插入图片描述

server-id = 11 #主服务器id为11
log_bin=master-bin #开启二进制文件
log_slave_updates=true #开启从服务器日志同步

[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -u root -p123
mysql> grant replication slave on *.* to 'myslave'@'192.168.238.%' identified by '123456'; #给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456
mysql> flush privileges; #刷新权限
mysql> show master status; #查看master数据库状态
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 |      154 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql-slave1配置

[root@localhost ~]# ntpdate ntp.aliyun.com
19 Jul 19:43:47 ntpdate[44287]: adjust time server 203.107.6.88 offset -0.000607 sec
[root@localhost ~]# hostnamectl set-hostname salve1
[root@localhost ~]# su
[root@salve1 ~]# crontab -e
[root@salve1 ~]# crontab -l
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com
[root@salve1 ~]# vim /etc/my.cnf

在这里插入图片描述

server-id = 22 #
log-bin=master-bin #开启二进制日志
relay-log=relay-log-bin #从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.insex #定义relay-log的位置和名称

[root@slave1 ~]# systemctl restart mysqld
[root@slave1 ~]# mysqladmin -uroot -p password
[root@slave1 ~]# mysql -u root -pabc123
mysql> change master to master_host='192.168.238.150',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;

在这里插入图片描述
mysql-slave2配置

[root@localhost ~]# ntpdate ntp.aliyun.com
19 Jul 19:43:59 ntpdate[37591]: adjust time server 203.107.6.88 offset -0.001144 sec
[root@localhost ~]# hostnamectl set-hostname slave2
[root@localhost ~]# su
[root@slave2 ~]# crontab -e
[root@slave2 ~]# crontab -l
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com
[root@slave2 ~]# vim /etc/my.cnf

在这里插入图片描述

server-id = 33
log-bin=master-bin #开启二进制文件
relay-log=relay-log-bin #从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.insex #定义relay-log的位置和名称

[root@slave2 ~]# systemctl restart mysqld
[root@slave2 ~]# mysqladmin -uroot -p password
[root@slave2 ~]# mysql -u root -pabc123
mysql> change master to master_host='192.168.238.150',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;

在这里插入图片描述

二、读写分离

[root@localhost ~]# hostnamectl set-hostname amoeba
[root@localhost ~]# su
[root@amoeba ~]# cd /opt
[root@amoeba opt]# rz
[root@amoeba opt]# ls

在这里插入图片描述
Java环境变量配置

[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
[root@amoeba local]# mv jdk1.6.0_14/ /usr/local/jdk1.6 #改名
[root@amoeba local]# ls
bin  etc  games  include  jdk1.6  jdk-6u14-linux-x64.bin  lib  lib64  libexec  mysql  sbin  share  src
[root@amoeba local]# vim /etc/profile

在这里插入图片描述

[root@amoeba local]# source /etc/profile #重启环境变量文件
[root@amoeba local]# java -version #查看Java版本
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)

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
在mysql-master、mysql-slave1、mysql-slave2的数据库中开放amoeba的访问权限
mysql> grant all on *.* to 'test'@'192.168.238.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
[root@amoeba local]# cd /usr/local/amoeba/conf
[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行的注释,取消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</property>
#45行,修改数据库主服务器名
<dbServer name="master"  parent="abstractServer">
#48行,修改主服务器IP地址
<property name="ipAddress">192.168.238.150</property>
#52行,修改数据库从服务器名,和IP地址
##复制52行到57行,粘贴到58行下

在这里插入图片描述

#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 ~]# netstat -natp | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      104266/java

一、测试读写分离

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

[root@client ~]# mysql -u amoeba -pabc123 -h 192.168.238.133 -P8066 #在client端上登录amoeba数据库
mysql> create database ghs; #创建库

主服务上的数据库:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ghs                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

从服务上的数据库:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ghs                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

测试amoeba的读写分离

#两台从服务关闭主从同步
mysql> stop slave;

#client端
mysql> create table game (id int(10));
mysql> insert into game values(1);

#主服务器
mysql> use ghs;
mysql> select * from game;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

#从服务器
mysql> select * from game; #说明从服务器不能写
ERROR 1146 (42S02): Table 'ghs.game' doesn't exist

测试从服务端的读

#slave1
mysql> create table game (id int(10));
mysql> insert into game values(2);

#slave2
mysql> create table game (id int(10));
mysql> insert into game values(3);

#client端
mysql> select * from game;
+------+
| id   |
+------+
|    2 |
+------+
1 row in set (0.03 sec)

mysql> select * from game;
+------+
| id   |
+------+
|    3 |
+------+
1 row in set (0.01 sec)
发现clime端查看,发现两台从服务器一轮询的方式显示表数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值