1:为何要部署Mysql主从复制
企业中应用单台数据库的环境很少,因为单台数据库存在宕机风险.在实际部署中,通常都会应用一些冗余类的部署方案,在 Mysql 数据库冗余类的部署方案中,主要以 Mysql 主从复制或各种高可用方案为主.
`2:MySQL主从复制介绍
(1)MySQL数据库默认是支持主从复制的,不需要借助于其他的技术,我们只需要在数据库中简单的配置即可。
(2)MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库 从另一台MySQL数据库进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
(3)二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的。
(4)简单来说就是一台服务器中的mysql数据库根据另一台服务器中的mysql数据库的日志文件进行分析然后执行sql语句进行数据复制。
MySQL的主从复制原理如下 :

部署 Mysql 主从复制
1. 实现 Mysql 主从复制,至少需要两台 Mysql 服务器,此案例共使用三太服务器 即一主两从,生产环境会更复杂,包括一主多从. 多主等.
(1)环境介绍:
| 主机名 | IP地址 | 安装软件 |
| master | 192.168.10.1 | Mysql |
| slave1 | 192.168.10.2 | Mysql |
| slave2 | 192.168.10.3 | Mysql |
(2)实验要求:
部署 Mysql 数据库主从复制
在master 主服务器中写入数据,查看数据是否同步到两台 slave 从服务器.
(3)实验思路
准备三台 Mysql 数据库服务器
修改配置文件 开启主从复制功能
给从服务器授权 并开启数据同步
在 Master 主服务器中写入数据 验证 Slave1 和 Slave2 两台从服务器的数据同步情况.
2.主从复制部署
(1) 配置时间同步 搭建时间同步服务器 从而实现时间同步 (ntp)
Master:

并在ntp 配置文件中加入东八区标准时间: /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
开启:
[root@localhost ~]# systemctl restart ntpd
[root@localhost ~]# systemctl enable ntpd
[root@localhost ~]# netstat -utpln |grep ntp
(2) Slave 跟随 Master 服务器时间 (Slave1 slave2 步骤一样)
yum -y install ntpdate
/usr/sbin/ntpdate 192.168.10.1 时间同步Master的
(3)安装Mysql 服务器
太麻烦 略...................................................................................
(4) Master 修改配置文件 及 授权指定用户
[root@localhost ~]# vim /etc/my.cnf
server-id = 11
log-bin=master-bin
log-slave-updates=true
[root@localhost ~]# /etc/init.d/mysqld restart 重启mysql success 即成功
[root@localhost ~]# mysql -uroot -p123 进入数据库
mysql> grant replication slave on *.* to 'myslave'@'%' identified by '123';
授权 复制 所有数据库和所有表 来源地址 用户密码
mysql> flush privileges; 刷新用户权限
mysql> show master status; ##记住File的及Position的值,此处为master-bin.000001和120
注意:上述两个值每个人可能不同,记录要准确
mysql> create database db_test; ##创建测试数据库
Query OK, 1 row affected (0.00 sec)
mysql> show databases; ## 查看已有数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_test |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.05 sec)
mysql> quit ## 退出数据库
(5)配置Slave服务器
[root@localhost ~]# vim /etc/my.cnf
server-id = 22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[root@localhost ~]# /etc/init.d/mysqld restart ## 重启 mysql 服务
[root@localhost ~]# mysql -uroot -p123 ## 进入 mysql
mysql> change master to master_host='192.168.10.1',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=120;
## Master IP地址 连接Master的用户 密码 二进制日志文件 及poition 值
mysql> start slave; ## 开启复制功能
mysql> show slave status\G; ##查看无error即可 ## 查看 Slave_IO_Running: Yes
Slave_SQL_Running: Yes 这两项显示一定要为yes状态
mysql> show databases; ##验证数据库是否同步
mysql> quit ## 退出数据库
搭建 Mysql 读写分离
(1) 读写分离的作用:
通过一个代理服务器实现读写分离,把写(即上传)的任务分给主服务器 把读(即查)的任务分给从服务器 实现负载均衡 大幅度提升数据库的并发负载能力 使用 amoeba 实现读写分离
一. 安装amoeba需要 java 环境支持 所以先需要安装 java源码包
[root@localhost ~]# yum -y remove java ## 卸载Centos 7 自带 java
[root@localhost ~]# chmod +x jdk-6u14-linux-x64.bin ## 给源码包添加执行权限
[root@localhost ~]# ./jdk-6u14-linux-x64.bin ## 执行 jdk 源码包
[root@localhost ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6 ## 将解压出来的内容移动至指定目录
[root@localhost ~]# vi /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
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version ## 查看 java 版本 确认安装成功
二. 编译安装 amoeba
[root@localhost ~]# mkdir /usr/local/amoeba ## 创建 amoeba安装目录
[root@localhost ~]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ 将amoeba源码包解压至指定目录
[root@localhost ~]# chmod -R 755 /usr/local/amoeba/ ## 修改该目录的权限
[root@localhost ~]# /usr/local/amoeba/bin/amoeba ##验证
三. 数据授权给 amoeba 读写权限
mysql> grant all on *.* to ly@'192.168.10.%' identified by '123123'; ##在192.168.10.1上完成
mysql> show grants for ly@'192.168.10.%'; ##在192.168.10.2上查看是否同步了权限
四. 修改配置文件amoeba.xml dbServer.xml
[root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml
30 <property name="user">amoeba</property>
31
32 <property name="password">123456</property>
115 <property name="defaultPool">master</property>
116
117 <property name="writePool">master</property> ##注意删除<!-- -->的注释
118 <property name="readPool">slaves</property>
[root@localhost ~]# vim /usr/local/amoeba/conf/dbServers.xml
25 <!-- mysql user -->
26 <property name="user">ly</property> ##该用户必须是上一步授权的用户
27
28 <!-- mysql password --> ##修改
29 <property name="password">123123</property> ##删除下一行的“-->”
44 <dbServer name="master" parent="abstractServer"> ##修改为master
45 <factoryConfig>
46 <!-- mysql ip -->
47 <property name="ipAddress">192.168.10.1</property> ##指定正确的master的ip
51 <dbServer name="slave1" parent="abstractServer"> ##修改为slave1
52 <factoryConfig>
53 <!-- mysql ip -->
54 <property name="ipAddress">192.168.10.2</property> ##指定slave1的ip地址
55 </factoryConfig>
56 </dbServer>
59 <dbServer name="slaves" virtual="true"> ##修改为slaves
65 <property name="poolNames">slave1</property> ##修改集群的成员名称用逗号隔开
:wq
/usr/local/amoeba/bin/amoeba start & ## 在后台开启amoeba代理服务
netstat -nputl | grep 8066 ## 验证
五.测试读写分离
1)验证读写分离:192.168.10.4
[root@localhost ~]# yum -y install mysql
[root@localhost ~]# mysql -uamoeba -p123456 -h 192.168.10.3 -P 8066 ##登录db集群192.168.10.3
mysql>show databases; ## 查看数据库
mysql> create database benet; ## 创建数据库
mysql> create table benet.ly(id int(10),name varchar(10),address varchar(20)); ## 创建表 ly 结构为: id name address
关闭 Slave 的复制功能
mysql> stop slave;
Master slave 分别在 benet 数据库中田间不同的数据
master:
mysql> insert into benet.ly values(1,'haha','this is master');
slave:
mysql> insert into benet.ly values(2,'hehe','this is slave');
应用客户端验证读:192.168.1.4
mysql> select * from benet.ly; ##第一次查询
+------+------+----------------+
| id | name | address |
+------+------+----------------+
| 2 | hehe | this is slave1 |
+------+------+----------------+
1 row in set (0.02 sec)
因为 amoeba 代理服务器 将读的任务分给了从服务器 所以只能查看 Slave 所添加的信息
应用客户端上验证写:
mysql> insert into benet.ly values(4,'xixi','app write test'); ##写入数据
Query OK, 1 row affected (0.02 sec)
mysql> select * from benet.ly; ##查不到刚写入的数据
+------+------+---------------+
| id | name | address |
+------+------+---------------+
| 2 | hehe | this is slave |
+------+------+---------------+
1 row in set (0.02 sec)
master上验证:
mysql> select * from benet.ly; ##查到数据
+------+------+----------------+
| id | name | address |
+------+------+----------------+
| 1 | haha | this is master |
| 4 | xixi | app write test |
+------+------+----------------+
2 rows in set (0.01 sec)
因为amoeba 把写的任务分配给了Master服务器 所以Master 能够查看应用客户端所插入的信息 因为刚刚把 Slave 的复制功能已经给关闭掉了 所以应用客户端查不到刚刚自己所插入的信息 此时读写分离已成功实现 要想看到刚刚所插入的信息 开启Slave 的复制功能即可.
总结:
用户添加信息 amoeba 通过机制把任务分配给Master服务器 Slave服务器通过主从复制功能同步用户所添加的信息 保持了数据的统一性 当用户查讯信息时, amoeba 通过机制把读(查)的任务分配给Slave服务器 Slave组来进行回应 既能实现数据库宕机的风险 又能实现数据库的并发负载能力.
文章介绍了MySQL主从复制的原理和部署过程,包括配置时间同步、安装MySQL、设置主从服务器、授权以及验证数据同步。此外,还详细讲解了通过amoeba实现读写分离,以提高数据库并发负载能力,确保在主服务器写入数据的同时,从服务器能处理读取请求,实现数据的统一性和系统的高可用性。
825

被折叠的 条评论
为什么被折叠?



