一、主从复制
一、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端查看,发现两台从服务器一轮询的方式显示表数据