【MySQL高可用集群 一】MySQL主从搭建(传统同步方式)

【MySQL高可用集群 一】MySQL主从搭建(传统方式)

【MySQL高可用集群 二】MySQL主从搭建(GTID方式)

【MySQL高可用集群 三】MySQL双主搭建

【MySQL高可用集群 四】MySQL多主多从

【MySQL高可用集群 五】MySQL的MGR集群

【MySQL高可用集群 六】ProxySQL安装部署

【MySQL高可用集群 七】ProxySQL&MySQL 主从环境搭建

【MySQL高可用集群 八】ProxySQL&MGR 环境搭建

【MySQL高可用集群 九】ProxySQL集群 环境搭建

【MySQL高可用集群 】相关SQL脚本

一、环境准备

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

posted @ 2023-08-14 17:25  蓝迷梦  阅读(728)  评论(0)    收藏  举报