目录
MySQL主从复制的原理
MySQL支持的复制类型
复制的工作过程
案例环境
案例需求
案例实现思路
案例实施
搭建MySQL主从复制
配置防火墙和SELinux
安装MySQL数据库
基础环境准备
二进制安装
设定配置文件
配置systemctl方式启动
配置master主服务器
(1)在etc/my.cnf中修改或者增加下面内容
(2)重启MySQL服务
(3)登录MySQL程序,给从服务器授权
配置Slave从服务器
(1)在/etc/my.cnf中修改或者增加下面内容,这里要注意server-id不能相同。
(2)重启MySQL服务
(3)登录MySQL,配置同步
(4)启动同步
(5)查看slave状态,确保以下两个值为YES
验证主从复制效果
(1)在主,从服务器上登录MySQL
(2)在主服务器上新建数据库 db_test.
(3)在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功
MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离
1.基于语句的复制。在主服务器上执行的SQL语句,在从最务器上执行同样的语句,MySQL默认采用基于语句的复制,效率比较高。
2.基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
3.混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
1.在每个事务更新数据完成之前,Master将这些改变记录进二进制日志。写入二进制日志完成后,Master通知存储引擎提交事务。
2.Slave将Master的Binary log 复制到其中继日志(Relay log)。首先,Slave开始一个工作线程一一I/0线程,I/0线程在Master上打开一个普通的连接,然后开始Binlogdump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件。I/0线程将这些事件写入中继日志。
3.SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新Slave数据,使其与Master中的数据保持一致。只要该线程与I/0线程保持一致,中继日志通常会位于 0S 的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在SIave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。
主机 | 操作系统 | IP地址 | 应用 |
Master | openEuler 24.03 | 192.168.10.101 | MySQL-server |
Slave1 | openEuler 24.03 | 192.168.10.102 | MySQL-server |
Slave2 | openEuler 24.03 | 192.168.10.103 | MySQL-server |
Mycat | openEuler 24.03 | 192.168.10.104 | Mycat2 |
客户端 | openEuler 24.03 | 192.168.10.105 | mysql |
本案例要求通过Mycat2实现 MySQL数据库请求的读写分离。
(1)安装MySQL数据库;
(2)配置MySQL主从复制;
(3)安装并配置Mycat2;
(4)客户端测试读写分离。
在所有节点进行时间同步
[root@localhost~]# yum -y install ntpdate
[root@localhost~]# ntpdate ntpl.aliyun.com
25 Mar 22:52:12 ntpdate 2044]: adjust time server 47.96.149.233 offse
t +0.003477 sec
在每台服务器上关闭firewalld或者在防火墙上开放指定的端口和服务
[root@localhost ~]# systemctl stop firewalld
[root@localhost~]# systemctl disable firewalld
[root@localhost ^]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g
etc/selinux/config
[root@localhost~]# setenforce 0
如果采用OpenEulerminimal安装的系统,在使用前需要安装一些基础软件包
工具。
[root@master ~]# dnf -y install gcc vim wget net-tools lrzsz tar
安装MySQL依赖的软件包
[root@master ~]# dnf install -y libaio numactl openssl ncurses-ccompat
-libs
创建运行MySQL程序的用户
[root@master ~]# useradd -M -s /sbin/nologin mysql
关闭SELinux和防火墙
[root@master^]# sed -i 's/SELINUX=enforcing/SELINUX=disabled\' /etc/
selinux/config
[root@master~]# setenforce 0
[root@master~]# systemctl disable firewalld
[root@master~]# systemctl stop firewalld
二进制安装的版本采用跟上面编译安装的版本一样MySQL8.00.36。首先需
要下载该软件包或者提前上传,然后再解压进行配置。
[root@master~]# tar xJf mysql-8.0.36-linux-glibc2.28-x86_64. tar. xz
[root@master~]# mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local//my
sql
[root@master~]# mkdir /usr/local/mysql/data
[root@master~]# chown -R mysql:mysql /usr/local/mysql/data
[root@master~]# cd /usr/local/mysql/bin~]#./mysqld --initialize --user=mysql --basedir=/usr/lo
[root@master~]cal/mysql --datadir=/usr/local/mysql/data
此次初始化没有采用无密码模式,因此会生成初始随机密码,需要保存,用以后继续登录mysql数据库使用
MySQL的配置文件跟上面编译安装的配置文件类似。
[root@master ^]# vim /etc/my.cnf
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
max_allowed_packet=16M
将MySQL的可执行文件写入环境变量中。
[root@master~]# echo "export PATH=$PATH:/usr/local/mysql/bin
/etc
/profile
[root@master ~]# . /etc/profile
//使配置在当前Shell中生效
将MySQL添加成为系统服务,通过使用systemctl来管理。在/usr/local/mysql/support-files目录下找到mysql.server文件,将其复制到/etc/rc.d/init.d目录下,改名为mysqld并赋予可执行权限。
[root@master ~]# cp /usr/local/mysql/support-files/mysql.server /etc/
rc.d/init.d/mysqld
[root@master ~]# chmod +x /etc/rc.d/init.d/mysqld
编辑生成mysqld.service服务,通过 systemctl方式来管理。
[root@master~]# vim /lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc. d/init.d/mysqld restart _
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@master~]# systemctl daemon-reload
[root@master~]# systemctl enable mysqld
[root@master~]# systemctl start mysqld~]# netstat -tunlp grep 3306
[root@master~]# netstat -tunlp |grep 3306
[root@master~]# mysqladmin -u root password 'pwd12:3'/为root用户设
置密码
log-bin=/usr/local/mysql/data/mysql-bin #启用二进制日志(Binary Log并指定其存储路径
binlog_format=MIXED #定义二进制日志的记录格式为混合模式
server-id=1#为mysql实例分配一个唯一的服务器标识符
[root@master `]# systemctl restart mysqld
[root@master ^]# mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysq1_native_pas
sword BY '123456';
Query OK, O rows affected (0.01 sec)
mysql> CREATE USER ' myslave' @'%'IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@%
Query OK, O rows affected (0.01 sec)
mysql>ALTER USER 'myslave' IDENTIFIED WITH mysql_native_password BY'123456';
#MySQL8.0默认使用caching_sha2_password认证插件,将mysql_native_password替换为旧版认证插件,确保从库能兼容
mysql>FLUSH PRIVILEGES;
mysql>show master status;
其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要。Slave应从该点上进行新的更新。
在Slavel、Slave2服务器上面分别执行下面步骤。
[root@localhost ^]# vim /etc/my.cnf
server-id=2//增加,唯一的服务器标识符,集群内不能冲突
[root@localhost ^]# systemctl restart mysqld
按主服务器结果更改下面命令中 master_log_file和master_log_pos 参数
[root@localhost ^]# mysql -uroot -p
mysql>ALTER USER 'root'@localhost' IDENTIFIED WITH mysql_native_pas sword BY'123456';
Query OK, O rows affected (0.01 sec)
mysql> change master to master_host='192.168.10.101', masteer_user=' myslave', master_password='123456',master_log_file='mysq1-bin. 0000001', master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
mysql>start slave;
Query OK, O rows affected (0.00 sec)
Slave_I0_Running: Yes
Slave SQL_Running: Yes
[root@localhost ^]# mysql -uroot -p
mysql>show databases;
两台数据库执行结果应该相同。
mysql>create database db_test;
mysql> show databases;
Database
db_test
information schema
mysql
performance_schema
sys
5 rows in set (0.00 sec)