探究rh6上mysql5.6的主从、半同步、GTID多线程、SSL认证主从复制

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介:

mysql's replication

       Mysql Replication 是一个异步的复制过程,从一个 Mysql Master复制到另一个 Mysql Slave。在 Master  Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程( thread )( SQL_ThreadIO_Thread ) Slave 端,另外一个线程(IO_Tread ) Master 端。

   要实现 MySQL  Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是SlaveMaster端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。打开 MySQL  Binary Log 可以通过在启动 MySQL Server 的过程中使用“—log-bin参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加log-bin参数项。

MySQL 复制的基本过程如下:

1.

Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

2.

Master 接收到来自 Slave  IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的Binary Log 文件的名称以及在 Binary Log 中的位置;

3.

Slave  IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

4.

Slave  SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的Query,所以两端的数据是完全一样的。



实验过程

虚拟机版本

Rhel6.4

32

MySQL版本

mysql-5.6.10

linux-glibc2.5-i686.tar.gz


MySQL-5.6主从复制

两个HA节点

MASTER

SLAVE

HA1:172.16.111.12

HA2:172.16.111.13

node1.doubao.com

node2.doubao.com

(基本是相同的设置,做node1的演示)

关掉selinux

# setenforce 0

或者

# vim /etc/selinux/config

##修改

SELINUX=permissive

配置主机名,保持主机名一致

# hostname node1.doubao.com

# vim /etc/sysconfig/network

##修改如下:

HOSTNAME=node1.doubao.com #当然HA2上要改为node2

:wq #保存退出

主机名称解析:

# vim /etc/hosts

##添加如下内容

172.16.111.6node1.doubao.com node1

172.16.111.7node2.doubao.com node2

双机互信:

#ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' 生成密钥

#ssh-copy-id -i .ssh/id_rsa.pub root@node2 ##将公钥文件发送到HA2上边

时间同步:

# hwclock –s #由于笔者的实验环境特殊,暂用此方法,也可以使用ntpdate的方法进行更新

配置好yum

http://407711169.blog.51cto.com/6616996/1179601 ## 此处前边是一个配置yum的例子


mysql 配置 node1,node2 执行同样操作)

1
2
3
4
5
6
7
8
9
# mkdir /mydata/data -pv
# groupadd -r -g  3306  mysql
# useradd -r -g  3306  mysql
# chown -R mysql.mysql /mydata/data/
# tar xf mysql- 5.6 . 10 -linux-glibc2. 5 -i686.tar.gz -C /usr/local
# ln -sv mysql- 5.6 . 10 -linux-glibc2. 5 -i686 mysql
# chown -R root.mysql ./*
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

然后这个时候现在主节点(node1 | MASTER)上执行

1
2
3
4
5
6
7
# vim my.cnf#注意这个my.cnf在/usr/local/mysql下
#添加如下内容
datadir = /mydata/data
innodb_file_per_table = ON
server-id =  1
socket =/tmp/mysql.sock
:wq

保存退出后,将mysql的快捷路径输出下,便于以后打开mysql


1
2
3
4
5
# vim /etc/profile.d/mysql.sh
##添加如下内容
export PATH=$PATH:/usr/local/mysql/bin
##完成后退出,执行下此脚本。
# . /etc/profile.d/mysql.sh


然后命令提示符下打开mysql测试下链接


为从服务器添加用户及复制权限:

1
2
3
4
mysql> GRANT REPLICATION SLAVE ON *.* TO  'repluser' @ '172.16.%.%'  IDENTIFIED BY  'replpass' ;
Query OK,  0  rows affected ( 0.00  sec)
mysql> FLUSH PRIVILEGES;
Query OK,  0  rows affected ( 0.00  sec)

从服务器配置

# vim my.cnf

##添加如下内容

1
2
3
4
5
datadir = /mydata/data
server-id =  11
socket = /tmp/mysql.sock
relay-log = relay-log
relay-log-index =relay-log.index

保存退出

保存退出后,将mysql的快捷路径输出下,便于以后打开mysql

1
2
3
4
5
# vim /etc/profile.d/mysql.sh
##添加如下内容
export PATH=$PATH:/usr/local/mysql/bin
##完成后退出,执行下此脚本。
# . /etc/profile.d/mysql.sh



主上观看

从上

在主上创建个数据库测试下。

到从上,刚开始是同步不了的,因为IOSQLTHREAD还没开启,

这样,主从的模型就完成了。

------------------------完成

(主上创建数据库,从上观看)

为了让mysql只做读操作,

首先观察从中的mysqlread-only变量,为OFF,为了使其永久生效需要编辑其配置文件:

退出后重启下Mysql服务。然后在进去到mysql中查看其,已经打开(为on)。然后在Mysql中进行下创建数据库的操作(即写操作),就能发现其已经不能执行



MySQL-5.6半同步复制

PS:这里沿用上边的实验数据,从而进行进一步的修改

设置半同步步骤

1
2
3
4
5
6
7
8
9
在Master和Slave的mysql命令行运行如下代码:
在Master和Slave的my.cnf中编辑:
# On Master
[mysqld]
rpl_semi_sync_master_enabled= 1 ##永久生效
rpl_semi_sync_master_timeout= 1000  1  second
# On Slave
[mysqld]
rpl_semi_sync_slave_enabled= 1

然后重启Mysql

主服务器

从服务器

重启下IO线程才能正式启动

主上看

1
2
3
4
5
6
7
8
9
# 也可通过设置全局变量的方式来设置,如下:
set  global rpl_semi_sync_master_enabled= 1
# 取消加载插件
mysql> UNINSTALL PLUGIN rpl_semi_sync_master;
==============================================
# 查看从服务器上的semi_sync是否开启:
mysql> SHOW GLOBAL STATUS LIKE  'rpl_semi%' ;
# 查看主服务器上的semi_sync是否开启,注意clients 变为 1  ,证明主从半同步复制连接成功:
mysql> SHOW GLOBAL STATUS LIKE  'rpl_semi%' ;

这样一个半同步复制的mysql服务器就已经搭建好了,大家可以进行实验测试。



MySQL-5.6-GTID多线程复制

主服务中编辑my.cnf文件添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
datadir = /mydata/data
innodb_file_per_table = ON
server-id =  1
socket=/tmp/mysql.sock
log-bin = master-bin
binlog-format=ROW
log-slave-updates= true
gtid-mode=on
enforce-gtid-consistency= true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info= 1
slave-parallel-workers= 2
binlog-checksum=CRC32
master-verify-checksum= 1
slave-sql-verify-cheksum= 1
binlog-rows-query-log_events= 1
repo-port= 3306
port= 3306
report-host= 172.16 . 111.12

# service mysqld restart

从服务器中编辑my.cnf文件添加内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
datadir = /mydata/data
server-id =  11
socket=/tmp/mysql.sock
log-bin = master-bin
binlog-format=ROW
log-slave-updates= true
gtid-mode=on
enforce-gtid-consistency= true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info= 1
slave-parallel-workers= 2
binlog-checksum=CRC32
master-verify-checksum= 1
slave-sql-verify-cheksum= 1
binlog-rows-query-log_events= 1
repo-port= 3306
port= 3306
report-host= 172.16 . 111.13


重启服务

主上边


然后主上mysql命令中设置


这个时候,GTID多线程复制已经创建好了。当然一台从服务器很难看出来其效果。这里不做具体演示,大家可以自行几个同学一起做下此个实验。



MySQL-5.6-SSL主从复制

PS:主从复制的过程仿照上边来进行,ok后仿照下面来执行SSL的配置

如果是编译安装MySQL,需要加上 --with-openssl  --with-vio的安装(这里不做具体演示)


1、自建SSL认证文件

1
2
3
4
5
6
7
8
9
10
11
12
# cd /data/ssl
##创建、签署CA过程
# openssl genrsa  2048  > ca-key.pem#生成密钥
# openssl req - new  -x509 -nodes -days  3600  -key ca-key.pem -out ca-cert.pem
# openssl req -newkey rsa: 2048  -days  3600  -nodes -keyout server-key.pem -out server-req.pem
# openssl rsa - in  server-key.pem -out server-key.pem
# openssl x509 -req - in  server-req.pem -days  3600  -CA ca-cert.pem -CAkey ca-key.pem -set_serial  01  -out server-
cert.pem
# openssl req -newkey rsa: 2048  -days  3600  -nodes -keyout client-key.pem -out client-req.pem
# openssl rsa - in  client-key.pem -out client-key.pem
# openssl x509 -req - in  client-req.pem -days  3600  -CA ca-cert.pem -CAkey ca-key.pem -set_serial  01  -out client-
cert.pem

最后验证下是否正确,如下则是正确的:

1
2
3
# openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK

2、主从数据库配置调整:

编辑主服务器配置/etc/my.cnf  [mysqld] 下,加上如下几行,并重启数据库:

1
2
3
4
ssl
ssl-ca = /data/ssl/ca-cert.pem
ssl-cert = /data/ssl/server-cert.pem
ssl-key = /data/ssl/server-key.pem

复制生成的认证文件到从库服务器/data/ssl

编辑从库数据库配置/etc/my.cnf  [mysqld] 下,加上如下几行,并重启数据库:

1
2
3
4
ssl
ssl-ca = /data/ssl/ca-cert.pem
ssl-cert = /data/ssl/client-cert.pem
ssl-key = /data/ssl/client-key.pem

登陆到主从数据库上,

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> show  var iables like  '%ssl%' ;
+--------------------+------------------------------------------+
| Variable_name | Value|
+--------------------+------------------------------------------+
| have_openssl| YES|
| have_ssl| YES|
| ssl_ca| /data/newscrets/ca-cert.pem|
| ssl_capath||
| ssl_cert| /data/newscrets/server-cert.pem |
| ssl_cipher||
| ssl_key| /data/newscrets/server-key.pem|
+-------------------+--------------------------------------------+
7  rows  in  set  ( 0.00  sec)

看到YES就是成功了,如果看到的是NO或者DISABLE,那么看下验证文件的目录权限和文件权限。确保mysql用户可以读取即可。

3、主从同步

在主库上创建同步帐号:

1
2
mysql> GRANT FILE,SELECT,REPLICATION SLAVEON *.* TO  'repluser' @ '192.168.1.241'  IDENTIFIED BY  'replpass'  REQUIRE
SSL;

在从库上测试下是否可以成功登陆:

1
2
mysql -h192. 168.1 . 154  -urepluser -preplpass -S /tmp/mysql.sock --ssl-ca=/data/ssl/ca-cert.pem --ssl-
cert=/data/ssl/client-cert.pem --ssl-key=/data/ssl/client-key.pem

如果没有问题,登陆从库mysqlchange master到主库

1
2
3
4
5
6
7
8
9
10
11
mysql> change master to
master_host= '172.16.111.12' ,
master_port= 3306 ,
master_user= 'repluser' ,
master_password= 'replpass' ,
master_log_file= 'mysql-bin.000001' ,
master_log_pos= 348221 ,
master_ssl= 1 , #是说开启SSL认证的意思。
master_ssl_ca= '/data/ssl/ca-cert.pem' ,
master_ssl_cert= '/data/ssl/client-cert.pem' ,
master_ssl_key= '/data/ssl/client-key.pem' ;

这样,基于SSL的主从复制模型就搭建成功了。大家可以进行测试。

基于SSL认证这些内容,个人参考了一些资料。大家觉得不对的地方欢迎指出。










本文转自 陈延宗 51CTO博客,原文链接:http://blog.51cto.com/407711169/1203973,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
安全 网络安全 数据安全/隐私保护
ssl证书认证失败的原因和解决办法
ssl证书认证失败的原因和解决办法
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
1767 2
|
关系型数据库 MySQL 数据安全/隐私保护
windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了
windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了
2850 3
|
11月前
|
存储 Oracle 关系型数据库
MySQL 8.4 配置SSL组复制(八个步骤)
MySQL 8.4 配置SSL组复制(八个步骤)
804 0
|
Prometheus 监控 关系型数据库
数据库同步革命:MySQL GTID模式下主从配置的全面解析
数据库同步革命:MySQL GTID模式下主从配置的全面解析
1811 0
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
259 4
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之同步MySQL数据到Hologres时,配置线程池的大小该考虑哪些
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
网络安全
嗯… 无法访问此页面43.139.210.211 花了太长时间进行响应,无法连接宝塔,是服务器内的宝塔面板开启了ssl的验证,但是没有绑定证书,所以被拦截,关闭宝塔面板的ssl访问认证恢复正常
嗯… 无法访问此页面43.139.210.211 花了太长时间进行响应,无法连接宝塔,是服务器内的宝塔面板开启了ssl的验证,但是没有绑定证书,所以被拦截,关闭宝塔面板的ssl访问认证恢复正常

热门文章

最新文章

推荐镜像

更多