数据库主从复制的原理&集群搭建

发布于:2023-01-11 ⋅ 阅读:(146) ⋅ 点赞:(0)

目录

一:数据库主从复制原理

二:主从复制的条件

三:主从复制的搭建

1、准备服务器&配置环境

2、主服务开启log_bin(从服务器也可以开启)

3、克隆主服务器数据到从服务器

4、清除master主机上所有二进制日志文件,确保干净

5、在master上新建一个授权用户,给slave来复制二进制日志

6、在slave上配置master info的信息

7、查看slave是否配置成功 

8、启动slave

9、测试(在master主机上输入SQL语句操作,看slave是否同步)


一:数据库主从复制原理

        MySQL的主从复制方案,和上述文件及文件系统级别同步是类似的,都输数据的传输。只不过MySQL无需借助第三方工具,而是其自带的同步复制功能,另外一点,MySQL的主从复制并不是从硬盘给上文件直接同步,而是逻辑的binlog日志同步到本地的应用执行的过程

数据复制过程的步骤如下 :

1、在Slave 服务器上执行start slave命令开启主从复制开关,开始进行主从复制。

2、此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。

3、Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的IO线程。返回的信息中有binlog中的下一个指定更新位置。

4、当Slave服务器的IO线程获取到Master服务器上dump线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容。

5、Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点。

搭建主从复制集群的目的

增加业务高可用和负载均衡,数据备份
数据库的负载均衡概念:读写分离,写到主服务器,读从数据库。

二:主从复制的条件

1、主需要开启Binlog功能

2、主库要建立账号(授权从服务器过来复制binlog)

3、从库要配置master.info(CHANGE MASTER to…相当于配置密码文件和Master的相关信息)

4、start slave 开启复制功能

三:主从复制的搭建

1、准备服务器&配置环境

master 192.168.149.160
slave 192.168.149.167

1)两台机器都配置静态IP

BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.149.160    #两台服务器,这里注意更改
PREFIX=24
GATEWAY=192.168.149.2
DNS1=114.114.114.114

2)修改主机名

hostnamectl set-hostname slave  #主机改sc-master

3)关闭防火墙和selinux

[root@slave ~]# systemctl stop firewalld
[root@slave ~]# systemctl disable firewalld

[root@slave ~]# vi /etc/selinux/config 
[root@slave ~]# vi /etc/sysconfig/selinux 
两台都关闭令SELINUX=disabled

4)安装mysql

我这里是使用脚本下载mysql二进制安装包进行安装

需要下载mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz压缩包

[root@slave ~]# cat onekey_install_mysql_binary_v3.sh 
#!/bin/bash

#解决软件的依赖关系
yum  install cmake ncurses-devel gcc  gcc-c++  vim  lsof bzip2 openssl-devel ncurses-compat-libs -y

#解压mysql二进制安装包
tar  xf  mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

#移动mysql解压后的文件到/usr/local下改名叫mysql
mv mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql

#新建组和用户 mysql
groupadd mysql
#mysql这个用户的shell 是/bin/false 属于mysql组 
useradd -r -g mysql -s /bin/false mysql

#关闭firewalld防火墙服务,并且设置开机不要启动
service firewalld stop
systemctl  disable  firewalld

#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config

#新建存放数据的目录
mkdir  /data/mysql -p
#修改/data/mysql目录的权限归mysql用户和mysql组所有,这样mysql用户可以对这个文件夹进行读写了
chown mysql:mysql /data/mysql/
#只是允许mysql这个用户和mysql组可以访问,其他人都不能访问
chmod 750 /data/mysql/

#进入/usr/local/mysql/bin目录
cd /usr/local/mysql/bin/

#初始化mysql
./mysqld  --initialize --user=mysql --basedir=/usr/local/mysql/  --datadir=/data/mysql  &>passwd.txt

#让mysql支持ssl方式登录的设置
./mysql_ssl_rsa_setup --datadir=/data/mysql/

#获得临时密码
tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
  #$NF表示最后一个字段
  # abc=$(命令)  优先执行命令,然后将结果赋值给abc 

# 修改PATH变量,加入mysql bin目录的路径
#临时修改PATH变量的值
export PATH=/usr/local/mysql/bin/:$PATH
#重新启动linux系统后也生效,永久修改
echo  'PATH=/usr/local/mysql/bin:$PATH' >>/root/.bashrc

#复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
cp  ../support-files/mysql.server   /etc/init.d/mysqld

#修改/etc/init.d/mysqld脚本文件里的datadir目录的值
sed  -i '70c  datadir=/data/mysql'  /etc/init.d/mysqld

#生成/etc/my.cnf配置文件
cat  >/etc/my.cnf  <<EOF
[mysqld_safe]

[client]
socket=/data/mysql/mysql.sock

[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8

[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m  mysql>
EOF

#修改内核的open file的数量
ulimit -n 1000000
#设置开机启动的时候也配置生效
echo "ulimit -n 1000000" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local


#启动mysqld进程
service mysqld start

#将mysqld添加到linux系统里服务管理名单里
/sbin/chkconfig --add mysqld
#设置mysqld服务开机启动
/sbin/chkconfig mysqld on

#初次修改密码需要使用--connect-expired-password 选项
#-e 后面接的表示是在mysql里需要执行命令  execute 执行
#set password='Sanchuang123#';  修改root用户的密码为Sanchuang123#
mysql -uroot -p$tem_passwd --connect-expired-password   -e  "set password='Sanchuang123#';"


#检验上一步修改密码是否成功,如果有输出能看到mysql里的数据库,说明成功。
mysql -uroot -p'Sanchuang123#'  -e "show databases;"

2、主服务开启log_bin(从服务器也可以开启)

[root@sc-master ~]# cd /etc/my.cnf

[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8

#二进制日志
log_bin
server_id = 1

重启mysql后:systemctl restart mysql

查看二进制日志是否打开:show variables like "%log_bin%";

3、克隆主服务器数据到从服务器

        为了保存2台服务器的初始数据是一样的,先导出主服务器数据库里的内容,然后导入到从服务器里。

主服务器数据克隆到文件
[root@sc-master ~]# mysqldump -uroot -p'123456'  --all-databases  >all_db.SQL
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@sc-master ~]#

把文件通过ssh传到从服务器
[root@sc-master ~]# scp all_db.SQL root@192.168.149.167:/root
The authenticity of host '192.168.149.167 (192.168.149.167)' can't be established.
ECDSA key fingerprint is SHA256:PYCgNLkVXLEDZ6mG6OZOO5+tkWWZCNvRPRRHM0gbH3E.
ECDSA key fingerprint is MD5:7e:12:9a:b9:68:5f:9b:02:f1:3e:33:55:8c:40:c8:05.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.149.167' (ECDSA) to the list of known hosts.
root@192.168.149.167's password: 
all_db.SQL                                           100%  897KB  27.3MB/s   00:00    
[root@sc-master ~]# 

从服务器接收数据
[root@slave ~]# mysql -uroot -p'Sanchuang123#' <all_db.SQL 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@slave ~]# 

4、清除master主机上所有二进制日志文件,确保干净

root@(none) 16:50  mysql>reset master;
Query OK, 0 rows affected (0.01 sec)

root@(none) 17:10  mysql>show master status;

5、在master上新建一个授权用户,给slave来复制二进制日志

root@(none) 17:10  mysql>grant replication slave on *.* to 're'@'192.168.149.%' identifiied by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 17:14  mysql>

6、在slave上配置master info的信息

root@(none) 20:36  mysql>CHANGE MASTER TO MASTER_HOST='192.168.149.160',
    ->  MASTER_USER='yuan',
    ->  MASTER_PASSWORD='123456',
    ->  MASTER_PORT=3306,
    ->  MASTER_LOG_FILE='sc-master-bin.000001',
    ->  MASTER_LOG_POS=742;

7、查看slave是否配置成功 

8、启动slave

root@(none) 20:37  mysql>start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 20:40  mysql>show slave status\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes   有这两个说明I/O线程和SQL线程都起来了

9、测试(在master主机上输入SQL语句操作,看slave是否同步)

root@(none) 20:46  mysql>create database test;
Query OK, 1 row affected (0.01 sec)

root@(none) 20:46  mysql>use test;
Database changed
root@test 20:56  mysql>create table t(id int,name varchar(10));
Query OK, 0 rows affected (0.01 sec)

root@test 20:57  mysql>insert into t(id,name) values(1,"test1");
Query OK, 1 row affected (0.04 sec)

root@test 20:57  mysql>select * from t;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
+------+-------+
1 row in set (0.01 sec)

slave同步结果:

 


网站公告

今日签到

点亮在社区的每一天
去签到