一.mysql主从复制
1.1 原理
1.2 复制的过程
◆在每个事物更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成后,Master通知存储
引擎提交事物
◆Slave将Master的Binary log 复制到中继日志,首先Slave开始一个工作线程–I/O线程,I/O线程在Master上开
一个普通的连接,然后开始Binlog dump process ,Binlog dump process从Master的二进制日志中读取事件,如果
已经更上Master,它会睡眠并等待Master产生的新事件。I/O线程将这些日志写入中继日志
◆SQL Slave thread (SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其的事件而更新
Slave数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,
所以中继日志的开销很小。
二.实验案例
2.1 案例环境
主机 操作系统 IP地址 主要软件
amoeba centos-7.6-X86_64 20.0.0.19 amoeba-mysql-3.0.5-RC-distribution.zip
jdk-8u144-linux-x64.tar.gz
Master centos-7.6-X86_64 20.0.0.20 mysql-boost-5.7.20.tar.gz
Slave1 centos-7.6-X86_64 20.0.0.21 mysql-boost-5.7.20.tar.gz
Slave2 centos-7.6-X86_64 20.0.0.22 mysql-boost-5.7.20.tar.gz
###master、slave1、slave2####
关闭防火墙、关闭核心防护,并且配置本地yum源
软件选择:xshell
2.2 实验过程
2.2.1 建立时间同步环境
1、在主机Master 搭建时间同步服务器NTP
登录到20.0.0.20
yum -y install ntp
vi /etc/ntp.conf //最后面添加这二行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
重新启动ntp服务器和设置开机自启
service ntpd restart
systemctl restart ntpd
systemctl enable ntpd
2、在从服务器(1) 上配置NTP同步
登录到20.0.0.21
yum -y install ntpdate
ntpdate 20.0.0.20
crontab -e #建立一次性计划任务
添加:*/2 * * * * /usr/sbin/ntpdate 20.0.0.20 >> /var/log/ntpdate.log
systemctl restart crond
systemctl enable crond
touch /var/log/ntpdate.log
tail -f /var/log/ntpdate.log //动态查看更新日志文件
安装部分省略!
计划任务里添加
查看日志文件
3、在从服务器 (2) 上配置NTP同步
登录到20.0.0.22
和从服务器(1)一样的配置,这里就省略了。。。
##Master、slave1、slave2 安装MySQL数据库##
!!如果想看mysql的配置文件的意思,可以看我之前的lamp架构,上面有解释
2.2.2 编译安装MySQL数据库
【安装 MySQL 服务】
1、安装Mysql环境依赖包
[root@localhost ~]#
yum -y install
gcc-c++
gcc
make
ncurses
ncurses-devel
bison
cmake
2、创建运行用户
useradd -s /sbin/nologin mysql
3、编译安装
###上传mysql-boost-5.7.20.tar.gz到opt目录下###
cd /opt
tar xzvf mysql-boost-5.7.20.tar.gz
cd /opt/mysql-5.7.20/
[root@localhost mysql-5.7.20]#
cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock
-DSYSCONFDIR=/etc
-DSYSTEMD_PID_DIR=/usr/local/mysql
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1
-DMYSQL_DATADIR=/usr/local/mysql/data
-DWITH_BOOST=boost
-DWITH_SYSTEMD=1
[root@localhost mysql-5.7.20]# make && make install
4、数据库目录进行权限调整
[root@localhost mysql-5.7.20]#chown -R mysql:mysql /usr/local/mysql/
5、调整配置文件
[root@localhost mysql-5.7.20]#vi /etc/my.cnf
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
chown mysql:mysql /etc/my.cnf
6、设置环境变量
echo ‘PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH’ >> /etc/profile
echo ‘export PATH’ >> /etc/profile
source /etc/profile
7、初始化数据库
cd /usr/local/mysql/
bin/mysqld
–initialize-insecure
–user=mysql
–basedir=/usr/local/mysql
–datadir=/usr/local/mysql/data
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
8、数据库开启自启、 关闭、状态
systemctl enable mysqld
systemctl start mysqld
systemctl stop mysqld
systemctl status mysqld
netstat -anpt | grep 3306
9、设置Mysql密码
mysqladmin -u root -p password //设置的密码为abc123
10、登录数据库
mysql -u root -p
4.登录Master主服务器配置 20.0.0.20
vi /etc/my.cnf #在原来server-id = 1的地方修改成11
server-id = 11
log_bin = master-bin //主服务器日志文件
log-slave-updates = true //从服务器更新二进制日志
systemctl restart mysqld //重启一下数据库
5.登录Master数据库 给从服务器授权
[root@localhost mysql]# mysql -uroot -p
mysql>grant replication slave on . to ‘myslave’@‘20.0.0.%’ identified by ‘abc123’;
//开启同步,允许对方使用所有的数据库和所有的表通过myslave用户,地址在20.0.0.网段,使用密码abc123进行登录。
mysql>flush privileges; //刷新
mysql>show master status; //查看master数据库状态
输入密码,进入数据库
6.登录 从服务器 (1) 配置 20.0.0.21
[root@localhost mysql]# vi /etc/my.cnf
server-id = 22
relay-log = relay-log-bin //主服务器上同步日志文件记录到本地
relay-log-index = slave-relay-bin.index //定义relay-log的位置和名称
systemctl restart mysqld
7.在从服务器 (1) 配置同步
[root@localhost mysql]# mysql -uroot -p
mysql> change master to master_host=‘20.0.0.20’,master_user=‘myslave’,master_password=‘abc123’,master_log_file=‘master-bin.000001’,master_log_pos=1653;
mysql> start slave; //开启同步
mysql> show slave status\G //以竖向显示slave的状态,横向容易错乱
从服务器 (2) 20.0.0.22也是同样的操作,最后要看到这两个线程处于开启状态!!
三.验证
登录20.0.0.20
[root@localhost mysql]# mysql -uroot -p
mysql> create database school;
mysql> show databases;
登录20.0.0.21
[root@localhost mysql]# mysql -uroot -p
mysql> show databases;
登录20.0.0.22
[root@localhost mysql]# mysql -uroot -p
mysql> show databases;
验证成功!