【MySQL高可用集群 一】MySQL主从搭建(传统同步方式)
【MySQL高可用集群 二】MySQL主从搭建(GTID方式)
【MySQL高可用集群 七】ProxySQL&MySQL 主从环境搭建
【MySQL高可用集群 八】ProxySQL&MGR 环境搭建
一、环境准备
Ubuntu 22.04 LTS (三台虚拟机),每台上面安装MySQL 8.0.33
主机信息:
10.53.207.21 (MySQL master)
10.53.207.22 (MySQL slave)
10.53.207.23 (MySQL slave
MySQL主从复制原理:
当主库数据更新的同时会写二进制日志binlog将数据修改的内容进行记录。然后从库上特定的I/O thread检测到主库上的二进制日志变更时会立即同步到自身的中继日志relay log 中。
从库上特定的SQL thread 检测到自身的中继日志发生改变时,立即将对应的数据更改操作在自身数据库中回放,达到主从同步的目的。

1、配置机域名映射。由于MySQL是通过主机名来路由服务节点的(MySQL反向解析问题),所以在每台主机的 /etc/hosts 文件添加以下主机域名映射,域名可以自定义设置为任意字符串,例如one.com,我这里和ip设置为相同。
#IP 域名|主机名
10.53.207.21 10.53.207.21 10.53.207.22 10.53.207.22 10.53.207.23 10.53.207.23
执行命令使配置生效:
sudo /etc/init.d/dns-clean start; sudo /etc/init.d/networking restart;
2、关闭防火墙(或者添加白名单,我这里直接关闭),以下是防火墙相关操作
#如果没有则安装防火墙 sudo apt update sudo apt install ufw #开启 ufw enable #关闭 ufw disable #重置 ufw reload #开放端口 ufw allow 22 #关闭端口 ufw deny 22 #允许 200.200.200.200:22 进行访问 ufw allow from 200.200.200.200 to any port 22 #拒绝 主机23.24.25.x 上 80/443端口的tcp连接 ufw deny proto tcp from 23.24.25.0/24 to any port 80,443 #查看所有开放端口 netstat -aptn
3、安装并配置MySQL(最好使用 linux的root 账号登录)
sudo apt update
sudo apt install mysql-server netstat -anp | grep mysql mysql -u root -p
安装成功后,要求输入密码时直接回车。如果回车登录不了,则执行以下命令,查找默认生成密码。
cat /var/log/mysqld.log | grep 'temporary password'

重置root账号密码及权限(需要远程连接的账户建议设置密码校验方式为 mysql_native_password,密码可以自定义设置,我这里设置账号密码都为 root)
use mysql; #允许root远程访问 update user set host='%' where user='root'; #重置root密码以密码认证方式 alter user 'root'@'%' identified with mysql_native_password by 'root'; #使授权信息生效 flush privileges;
或者直接新建用户后授权
#create user 'root'@'%' identified with mysql_native_password by 'root'; #grant all privileges on *.* to 'root'@'%';
查看更新后的用户信息并退出mysql
select Host,user,authentication_string,plugin from user; quit;
修改mysqld.cnf 文件,将 bind-address = 127.0.0.1 改为 0.0.0.0 ,让mysql监听任何地址
vi /etc/mysql/mysql.conf.d/mysqld.cnf #重启并使用重置的密码进行登录 service mysql restart mysql -uroot -p
注意 mysql 密码插件,二者的混用可能导致一些认证问题:
如果远程登录mysql提示: The user specified as a definer ('mysql.infoschema'@'localhost') does not exist,可能是修改了用户的密码插件,执行下面语句然后重启mysql服务
update user set plugin = 'caching_sha2_password' where user='mysql.sys' or user='mysql.infoschema';
mysql_native_password mysql8 以前的密码加密校验插件,加密的密码以 * 开头,远程连接建议使用此插件
caching_sha2_password mysql8 及以后版本的默认加密插件,加密的密码以 $A$005$ 开头,连接需要公钥
二、Master 节点配置(10.53.207.21)
1、编辑 /etc/mysql/my.cnf 文件,可以通过 show variables like '%log_bin%' 命令查看binlog相关的配置,其他配置类似。
主节点关键变量,主节点的binlog必须开启。可以通过命令查看MySQL默认的变量值,然后自己进行自定义设置。下面配置文件中注释掉的会使用MySQL默认配置。
server-id:mysql集群服务唯一标识
log-bin :binlog文件位置和名称,只要设置了同时也就是开启了binlog
sync-binlog :binlog刷盘机制,1表示每一次事物就刷盘
binlog_ignore_db:不进行binlog记录的数据库
expire_logs_days:binlog 日志保存多久,默认值 0 表示不自动删除。
[mysqld] # mysql实例ID,必须全局唯一。 server-id=10 #开启binlog,当前默认已开启 #log-bin=/data/mysql/master-bin sync-binlog=1
expire_logs_days=10 #开启binlog的数据库 #binlog_do_db = my_data #不开启binlog的数据库 binlog_ignore_db = mysql #数据目录 #datadir=/data/mysql #端口文件 #socket=/data/mysql/mysql.sock #log-error=/data/mysql/error.log #pid-file=/data/mysql/mysqld.pid #slave-parallel-workers=4 #master-info-repository=TABLE #relay-log-info-repository=TABLE
#replicate-do-db=test_db #指定同步的数据库,不填写则默认所有的数据库
#binlog_format=ROW #binlog记录形式,默认ROW,另外还有MIXED
2、创建数据同步账户:
账户 repl 只允许 主机名以 10.53.207 开头的节点访问,同时 repl 只有 replication slave 权限。
use mysql;
create user 'repl'@'10.53.207.%' identified by 'P@repl'; grant replication slave on *.* to 'repl'@'10.53.207.%';
flush privileges;
三、slave 节点配置(10.53.207.22 | 10.53.207.23)
1、同样编辑 /etc/mysql/my.cnf 文件,查看mysql系统默认变的值,然后再进行自定义配置。关键的配置如下,注释掉的表示使用系统默认值。
server-id:服务id,必须唯一
read_only:只读,必须打开,默认是关闭的。
relay_log:中继日志,必须开启,默认开启。
skip-log-bin:关闭binlog,可选。普通模式下关闭可以提高从库性能,gtid模式下需要开启。
[mysqld] server-id=11 #从库的只读属性 read_only 必须开启 read_only=1 #关闭binlog(参考很多教程从库也开启了binlog,我这里进行了关闭,经过测试从库可以正常同步主库。binlog日志用于主从同步,下端不再接入从库时关闭) skip-log-bin #datadir=/data/mysql #socket=/data/mysql/mysql.sock #relay_log=/data/mysql/relay-log #log-error=/data/mysql/error.log #pid-file=/data/mysql/mysqld.pid #slave-parallel-workers=4 #master-info-repository=TABLE #relay-log-info-repository=TABLE #允许下端接入slave,A->B->C,其中B是A的从服务器,同时B又是C的主服务器,那么B服务器除了需要打开log-bin之外,还需要打开log-slave-updates选项,表示从主库同步过来的binlog数据也要更新到当前服务的binlog中 #log_slave_updates=on
2、配置主从同步信息,在mysql中执行下面命令配置。
change master to master_host='10.53.207.21', master_port=3306, master_user='repl', master_password='P@repl', master_log_file='binlog.000010', master_log_pos=0, get_master_public_key=1;
关键属性如下:
master_log_file:开始同步的master上的binlog文件名,可以在 /var/lib/mysql 目录或者自定义配置的binlog目录下查看。
master_log_pos:开始同步的master上binlog文件的位置。
get_master_public_key:获取master的公钥。mysql8 由于repl账户加密默认使用 caching_sha2_password 插件,需要添加 get_master_public_key=1 选项,8以下版本或者指定加密插件为 mysql_native_password 不需要加
3、开启并查看主从同步情况
在从库开启并查看情况(mysql8以后的可以使用 show replica status 命令查看)
mysql> start slave;
mysql> show slave status\G;
状态主要参数解释:
Replica_IO_Running:从库与主库连接进行数据同步的线程状态
Replica_SQL_Running:从库数据SQL回放的状态
Seconds_Behind_Source: 与主库同步的滞后的秒数
Source_Server_Id: 主库的server-id
Replica_SQL_Running_State:从库数据SQL回放的状态描述

只要Replica_IO_Running 和 Replica_SQL_Running 都是 yes ,则主从同步就是正常的,只要有一个不是yes则主从同步失败。
需要停止主从同步时执行:stop slave 。
在主库查看情况:show master status;

注意事项:
1、MySQL自定义配置(主从节点)
在ubuntu系统下由于权限安全限制,如果修改mysql默认的数据目录datadir,还需要做以下修改(由于修改比较繁琐,本人没有进行自定义配置,使用了默认配置):
编辑linux下 apparmor安全的限制
vim /etc/apparmor.d/usr.sbin.mysqld
找到:
# Allow data dir access /var/lib/mysql/ r, /var/lib/mysql/** rwk,
修改为自定义配置:
# Allow data dir access /data/mysql/ r, /data/mysql/** rwk,
修改/usr/share/mysql/mysql-systemd-start文件,将类似"/var/lib/mysql"的内容全部修改为"/data/mysql"
#重启apparmor service apparmor restart #mysql初始化 sudo mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
2、关于从节点的只读问题
从节点设置的read_only只读属性,对拥有 super 和 connection_admin 这两个权限的用户无效。对用户进行授权时应使用 库名.* 去赋权,而不是通配符 *.*。
3、关于binlog日志问题
如果在主库执行的某个修改不想同步到从库,可以通过 sql_log_bin 参数进行控制,sql_bin_log 设置 是否产生binlog日志。下面的命令不会产生binlog,数据不会同步至从库。
#设为0,执行的语句都不记录binlog set sql_log_bin=0; create user 'operator'@'%' identified with mysql_native_password by 'P@operator'; set sql_log_bin=1;
千万不要使用global修饰符,例如执行 set global sql_log_bin=0 命令会导致所有执行的语句都不产生 binlog 。
另外,如果mysql主库配置了 binlog_ignore_db 属性或者从库配置了 replicate_ignore_db 属性,则需要使用 use 命令切换到对应的库之后才会有效,例如 binlog_ignore_db = MySQL,要使之生效,则需使用 use mysql 命令切换到 mysql库下,执行的操作才不会被记录到binlog。
原创文章,转载或引用请注明出处:https://www.cnblogs.com/hewei-blogs/articles/17628685.html
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/17628685.html

浙公网安备 33010602011771号