Mysql5.7.21+双主架构安装
XX年XX月XX日
修订历史记录
(A-添加,M-修改,D-删除)
目录
1概述 (4)
1.1简介 (4)
1.2术语和缩写词 (7)
2使用场景 (7)
3安装 (8)
3.1系统要求 (8)
3.2JDK环境以及其他依赖包 (8)
3.3前期准备(https://https://www.doczj.com/doc/5716038701.html,/downloads/mysql/) (8)
3.4安装包名称 (9)
3.5部署步骤(以下使用InnoDB存储引擎) (9)
3.6验证方案 (18)
4常用操作 (18)
5原理以及实现方式 (18)
1概述
1.1简介
1.1.1什么是MySQL
MySQL是一种关系型数据管理系统;关系模型及二维关系,二维关系主要是表,表是由行(row)、列(column)组成,为了能够加速表中
的数据查询,给表创建索引(index)
1.1.2MySQL的存储引擎是什么?
MySQL中的数据以各种不同的方法存储在内存或者文件中。这些方法中的每一种技术都使用不同的存储机制、索引方式、锁机制并且最终
提供不同的功能和能力。通过选择不同的技术,能够获得额外的效率提
升,从而改善整体应用功能;这些不同的技术结合相关的功能在MySQL
中被称作为存储引擎,一般也被称为表类型;
MySQL中有的表简单,有的表复杂,有的表不需要来存储任何长期数据,有的表读取时非常快,但是插入数据特别慢;而在实际使用过程
中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数
据,数据的处理也会存在差异。那么对于MySQL来说,他提供了多种
类型的存储引擎。
1.1.3MySQL主流存储引擎MySIAM、InnoDB区别
a:存储结构
MySIAM:数据在磁盘上存储成3个文件。文件的名字以表的名
字开始,扩展名指出文件类型。Frm文件存储表定义。数据文件的扩展名是MYD。索引文件的扩展名是MYI
InnoDB:所有的表都存储在一个数据文件中,也可能是多个文件,或者是独立的表空间文件,InnoDB表的大小只受限于操作系统文件的大小,一般为2G
b:可移植性、备份及恢复
MySIAM:数据是以文件的形式存储,所以在跨平台的数据转移会很方便。在备份和恢复时可单独针对某个表进行操作。InnoDB:免费的方案可以是拷贝数据文件、备份binlog、或者用mysqldump
c:表锁差异
MySIAM:只支持表级锁,用户在操作MySIAM表时,执行select、update、delete、insert语句都会给表自动加锁,如果加锁以后的表满足insert高并发的情况下,可以在表的尾部插入新的数据InnoDB:行级锁。行锁大幅度提高了多用户并发操作,但是InnoDB 的行锁只是在WHERE的主键是有效的,非主键的WHERE都会锁全表
d:事务支持
MySIAM:强调的是性能,每次查询具有原子性,执行速度比InnoDB更快,但是不提供事务支持
InnoDB:提供事务、支持事务。具有事务、回滚和崩溃修复能力的安全事务
1.1.4MySQL事务简介
事务由单个或多个SQL语句组成,在整个语句中,每个SQL语句都是相互依赖的。而整个语句做为一个不可分割的整体,如果其中某个SQL
语句一旦执行失败或者产生错误,则整个语句将会回滚。所有受到影响的数据将返回到事务开始以前的状态;如果整个语句中的所有SQL语句均执行成功,则事务被顺利进行;
事务具有四个特性:
原子性:事务是由一个或多个相关联的SQL语句组成,这些语句被认为是一个不可分割的单元。主要用来管理insert、update、delete语句,要么全部执行成功,要不全部不执行;事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务重来没有执行过一样
一致性:在事务开始前和事务结束后,对于数据库的修改是一致的,数据库的完整性没有被破坏;即多个客户查询的数据是一样的。一致性主要由MySQL的日志机制处理,他记录数据的变化,为事务恢复提供跟踪记录;
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read Uncommitted)、读提交(Read Committed)、可重复度(Repeatable Read)和串行化(Serializable)
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会消失
1.2术语和缩写词
数据库:数据库是关联表的集合
数据表:数据的存储矩阵,类似于电子表格
主键:主键是唯一的,一个数据表中只能包含一个主键,一般使用主键查询数据
外键:外键用于关联2个表
索引:索引是对数据表中一列或多列的值进行排序的一种结果。类似于书籍的目录
I/O Thread:从master请求二进制日志事件
SQL Thread:从中继日志中读取事件,在本地完成重放
Dump Thread:为每个I/O线程开启一个此线程,用于传输二进制事件
Bin-log:MySQL二进制日志
Relay-log:MySQL中继日志
Server-id:MySQL集群全局唯一id
Slow_query_log_file:查询日志记录
Slow_query_log:SQL慢查询开关
2使用场景
MySIAM:
R/W > 100:1 且update的相对较少
并发量不高
表数据量较小
硬件资源有限
InnoDB:
R/W 较多,频繁更新大字段
表数据量较大(1000w),并发高
安全性和可用性较高
3安装
3.1系统要求
CentOS 6 yum安装默认5.5(如果想yum安装可配置5.7源)CentOS 7 yum安装默认5.7
3.2JDK环境以及其他依赖包
无
3.3前期准备(https://https://www.doczj.com/doc/5716038701.html,/downloads/mysql/)
3.3.1虚拟机
两台CentOS 6.9 虚拟机10.10.x.x
3.3.2安装依赖包
yum install lrzsz ntpd(win和linux之间传输包)
3.3.3时间同步
集群时间保持一致,避免复制出现问题
方法一:统一对外同步
方法二:其中一台对外同步时间,其他节点向他同步时间
节点一开启ntpd服务(开启ntpd服务之前先同步windows源)
Ntpdate https://www.doczj.com/doc/5716038701.html, ##step time server
Service ntpd start ## udp 123
节点二将节点一做为时间源,进行同步
ntpd $ip ##如果想实时同步可加入crontab
3.4安装包名称
mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
3.5部署步骤(以下使用InnoDB存储引擎)
3.5.1创建数据存储路径、创建mysql组、用户(2台master
操作一致)
mkdir -m /data ##创建数据存储路径
groupadd mysql ##创建mysql组
useradd -g mysql -d /data/mysql mysql ##添加mysql用户,家目录在data下
3.5.2创建MySQL服务所需要的目录,编辑权限修改为mysql
(2台master操作一致)
mkdir -m 755 /data/{binlog,errorlog,pid,relaylog,slowlog,sock,tmpdir}
-m:避免出现系统环境的umask非022,导致数据存储路径权限不足
binlog:MySQL二进制日志存储路径
Errorlog:MySQL应用日志存储路径
Pid:MySQL进程pid文件存储路径
Relaylog:MySQL中继日志存储路径
Slowlog:MySQL慢日志存储路径
Sock:MySQL套接字文件存储路径
Tmpdir:MySQL临时表存储路径
chown -R mysql.mysql /data ##将数据存储路径属主、数组修改为mysql用户
3.5.3解压tar包(2台master操作一致)
pwd:/root
tar -xf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
3.5.4将解压后的目录重命名为mysql或者软连接为mysql(以
下方式为软连接),并将软连接的目录权限修改为mysql
pwd:/usr/local
ln -sv mysql-5.7.21-linux-glibc2.12-x86_64/ mysql
chown mysql.mysql mysql
chown -R mysql.mysql mysql/*
3.5.5节点一创建MySQL配置文件(以下为简洁配置,确保能
正常启动配置集群)
vim /etc/https://www.doczj.com/doc/5716038701.html,f
[client] ##客户端选项(使用MySQL连接时可不用指定以下参数)
port=38383 ##指明MySQL服务监听的TCP端口
socket=/data/sock/mysql.sock ##指明MySQL服务套接字文件
default-character-set=utf8 ##指定连接MySQL使用的字符集,避免出现登陆成功后,查看MySQL中文数据是乱码
[mysqld] ##应用端选项
server-id=1 ##配置全局唯一ID,同一集群内的此参数不能一样
port = 38383 ##指明MySQL的TCP端口
socket = /data/mysql/mysql.sock ##指明MySQL套接字文件路径
pid_file = /data/mysql/pid/mysql.pid ##指明MySQL进程文件路径datadir = /data/mysql ##指明MySQL数据存储路径
default_storage_engine = InnoDB ##指明MySQL存储类型
character_set_server = utf8 ##指明MySQL字符集类型,注意此配合和客户端配置不同
log-error = /data/mysql/errorlog/mysql_error.log ##指明MySQL应用日志路径
bin-log = /data/mysql/binlog/mysql-bin ##指明MySQL二进制日志
存储路径
slow_query_log = 1 ## 指定MySQL开启慢查询功能,此参数支持布尔型值
slow_query_log_file = /data/slowlog/mysql_slow_query.log ##指明MySQL慢日志存储路径
long_query_time = 3 ##MySQL判定语句是否为慢查询的时间阀值relay-log = /data/relaylog/relay-log ##指定MySQL中继日志存储路径
auto_increment_offset = 1 ##设置自增长ID,参数是起始值,双主均有写操作,禁止read_only,防止写入数据时重复;
auto_increment_increment = 2 ##自增长ID的偏移位
3.5.6节点二创建MySQL配置文件
vim /etc/https://www.doczj.com/doc/5716038701.html,f
[client] ##客户端选项(使用MySQL连接时可不用指定以下参数)
port=38383 ##指明MySQL服务监听的TCP端口
socket=/data/sock/mysql.sock ##指明MySQL服务套接字文件
default-character-set=utf8 ##指定连接MySQL使用的字符集,避免出现登陆成功后,查看MySQL中文数据是乱码
[mysqld] ##应用端选项
server-id=2 ##配置全局唯一ID,同一集群内的此参数不能一样
port = 38383 ##指明MySQL的TCP端口
socket = /data/mysql/mysql.sock ##指明MySQL套接字文件路径
pid_file = /data/mysql/pid/mysql.pid ##指明MySQL进程文件路径datadir = /data/mysql ##指明MySQL数据存储路径
default_storage_engine = InnoDB ##指明MySQL存储类型
character_set_server = utf8 ##指明MySQL字符集类型,注意此配合和客户端配置不同
log-error = /data/mysql/errorlog/mysql_error.log ##指明MySQL应用日志路径
bin-log = /data/mysql/binlog/mysql-bin ##指明MySQL二进制日志存储路径
slow_query_log = 1 ## 指定MySQL开启慢查询功能,此参数支持布尔型值
slow_query_log_file = /data/slowlog/mysql_slow_query.log ##指明MySQL慢日志存储路径
long_query_time = 3 ##MySQL判定语句是否为慢查询的时间阀值relay-log = /data/relaylog/relay-log ##指定MySQL中继日志存储路径
auto_increment_offset = 2 ##设置自增长ID,参数是起始值,双主均有写操作,禁止read_only,防止写入数据时重复;
auto_increment_increment = 2 ##自增长ID的偏移位
3.5.7为MySQL服务添加全局变量(2台master操作一致)
echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
source /etc/profile
3.5.8对MySQL数据库进行初始化,并确认初始密码(2台
master操作一致)
pwd:/usr/local/mysql
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/
--user:指明初始化用户
--basedir:指明MySQL服务路径
--datadir:指明MySQL数据存储路径
grep "temporary password" /data/errorlog/mysql_error.log ##获取密码,此密码对应的默认用户是root
3.5.9生成SSL秘钥,server-key.pem、client-key.pem(这
是5.7的新特性,初始化不在是免秘钥登陆,2台master 操作一致))
pwd:/usr/local/mysql
mysql_ssl_rsa_setup --basedir=/usr/local/mysql --datadir=/data/mysql/ 3.5.10将MySQL配置到系统环境(2台master操作一致)
pwd:/usr/local/mysql
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld ##将MySQL服务添加至系统中
chkconfig mysqld on ##设置MySQL服务开机自动启动(可基于chkconfig --list查看查看)
3.5.11启动MySQL服务(2台master操作一致)
service mysqld start ###...............SUCCESS
3.5.12修改配置文件;重启MySQL;修改root用户密码(进入
MySQL命令行端执行命令的前提:必须要重置密码,才能有执行权限,2台master一致)
echo "skip-grant-tables" &>> /etc/https://www.doczj.com/doc/5716038701.html,f ##添加此配置,登陆MySQL免秘钥
service mysqld reload ##修改配置后,对MySQL进行重启操作
mysql ##进入mysql命令行端
use mysql ##进入mysql库,查看user表
update user set authentication_string=PASSWORD('Umfintech_0PS') where User='root'; ##将root用户的密码修改为Umfintech_0PS
此时退出MySQL命令行端,并重新登录,执行命令抛出异常"You must reset your password using ALTER USER statement before executing this statement",需要再次修改密码
mysql
mysql> SET PASSWORD = PASSWORD('Umfintech_0PS'); ##再修
改密码
sed -i '/skip/d' /etc/https://www.doczj.com/doc/5716038701.html,f ##将免秘钥登陆配置删除
service mysqld restart ##重启MySQL服务,并用修改后的密码尝试登陆
3.5.13为双方节点创建复制权限账号,创建完后可基于创建的
账号登陆检测是否有效
节点一:mysql> grant replication slave,replication client on *.* to 'Umfintech_123'@'10.10.%.%' identified by 'wtc';
节点二:mysql> grant replication slave,replication client on *.* to 'Umfintech_789'@'10.10.%.%' identified by 'wtc';
3.5.14确认双方节点的当前二进制日志文件及最后一个事件的
position ID(确保二进制日志开启)
节点一:进入MySQL命令行,show master status\G;
File: mysql-bin.000012 ##当前二进制日志文件
Position: 479 ##当前事件的position ID
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
节点二:进入MySQL命令行,show master status\G;
File: mysql-bin.000010 ##当前二进制日志文件
Position: 479 ##当前事件的position ID
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
3.5.15双方节点配置复制账号权限
节点一配置节点二的复制账号
节点二配置节点一的复制账号
节点一:
change master to master_host='10.10.87.15',master_port=38383,master_user='Umfintech_789' ,master_password='wtc',master_log_file='mysql-bin.000010',master_log_pos =479;
节点二:
mysql> change master to master_host='10.10.87.14',master_port=38383,master_user='Umfintech_123' ,master_password='wtc',master_log_file='mysql-bin.000012',master_log_pos =479;
master_host:指明使用复制账号节点的IP
master_port:指明使用复制账号节点的端口,如果端口是3306,可不指明
master_user:指明复制账号用户
master_password:指明复制账号密码
master_log_file:指明使用复制账号节点的当前二进制文件
master_log_pos:指明使用复制账号节点的当前事件ID
3.5.16启动复制线程,并核实(2台master操作一致)
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running: Yes ##Yes表示IO线程远程连接ok
Slave_SQL_Running: Yes ##SQL线程表示重放中继日志OK
Seconds_Behind_Master: 0 ##主从延时
3.6验证方案
3.6.1在节点一上创建测试数据库,并导入info、channel、
product三张表
mysql> create database Umfintech_MM_Test character set utf8;
3.6.2核实数据
4常用操作
DDL命令(数据定义语言,面向表)
Alter、create、drop
DML命令(数据操作语言,面向数据)
Select、update、delete、insert
5原理以及实现方式
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些变化。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的,在事件写入二进制日志完成后,maser 通知存储引擎提交事务
下一步就是slave请求master的二进制日志拷贝至它自己的中继日志。首先,slave开始一个工作线程(I/O线程)。IO线程在master上打开一个普通连接,然后开始二进制日志传输进程。传输进程从master的二进制日志中读取事件,如果已经跟上master,他会睡眠等待master产生新的事件。IO线程将这些事件写入中继日志
从的SQL线程处理该过程的左后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新从的数据,使其与master中的数据保持一致。只要该线程与IO线程保持一致,中继日志通常在操作系统的缓存中