Mysql
下载安装
源码编译
这个方法在LNMP架构里的MySQL安装里详细说过
rpm包安装
同样在官网选择下载
下载推荐下载:Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit), RPM Bundle,这个rpm包中包含了下面的所有模块,也方便使用,提醒一下,因为MySQL官网并不在国内所以访问和下载的时候都会比较慢
这里我使用的是rpm包安装的,因为源码编译起来耗时是比较长的。
RPM Bundle下载下来是一个打包的tar文件包,需要先进行拆解,选择需要的安装包留下安装即可
然后删除
[root@server5 Downloads]# rm -fr mysql-community-devel-5.7.28-1.el7.x86_64.rpm \
> mysql-community-embedded-5.7.28-1.el7.x86_64.rpm \
> mysql-community-embedded-compat-5.7.28-1.el7.x86_64.rpm \
> mysql-community-embedded-devel-5.7.28-1.el7.x86_64.rpm \
> mysql-community-test-5.7.28-1.el7.x86_64.rpm
剩下的就可以使用yum进行全部安装了
主配置文件: /etc/my.cnf
服务名:mysqld
端口:3306
使用rpm包安装完的MySQL会生成一个日志文件文件 /var/log/mysql.log
里面会有和源码编译一样的一个临时密码供第一次登录MySQL使用
但是这里列出数据还是没有的,需要执行安全初始化,执行安全初始化时需要注意的是rpm包安装的MySQL没有开启弱密码,所以密码设置必须要8位的字母大小写+数字+字符,设置完密码,剩下的选项都是 “y” 。
初始化完成后,使用新密码测试登录,就可以列出数据库了
MySQL数据库的主从复制
方法可以查看官方文档进行详细的了解
主从复制,所需要的测试的主机有两台,一台是作为master主机,一台从节点主机
在两台主机上都安装MySQL
第一步:主节点添加配置
编辑配置文件: /etc/my.cnf
第二步:在主节点上创建用户
根据文档的提示,在MySQL里创建一个用来进行复制操作的用户,名字和密码自定义,@后可以跟网段或域名,“%”表示所有
然后进行授权,给创建的用户复制的权限对所有库的所有表
这里有一个操作是读锁,就是将数据锁定不可看。保护数据安全,我们测试就不去使用了,企业中是需要执行的,但是数据同步时需要打开读锁
查看主节点的二进制文件名称和位置
第三步:配置从节点Slave节点
在配置文件里写上id号,和master区分开即可
执行安全初始化,同样先在mysql日志里找到初始密码
并且可以使用在master节点设置的用户redhat在slave节点上登录
在mysql程序里输入配置信息
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.25.254.5', #master节点IP
-> MASTER_USER='redhat', #创建用来复制的用户
-> MASTER_PASSWORD='He1234..', #用户的密码
-> MASTER_LOG_FILE='mysql-bin.000002', #使用SHOW MASTER STATUS;在master节点查看到的二进制文件名
-> MASTER_LOG_POS=154; #SHOW MASTER STATUS; 查看到的Position
完成后开启slave:
开启后查看slave节点的状态,查看到 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 就可以了
第四步:测试主从复制
这里测试写操作必须是在master节点进行的,因为我们复制是从master节点到slave节点
在master节点创建新的数据库
在slvae节点可以接收到了新建的数据库
这样就完成了主从复制,需要注意的是测试时要配置火墙或者关闭防止干扰实验。
主从复制的真实工作方式并不是将数据进行传输,而是复制master节点上的操作,通过二进制日志文件记录,这些操作都记录在/var/lib/mysql里,这里有我们查看到的二进制日志文件,并且Position号也是记录在内
主从复制:GTID方式复制
二进制日志文件的主从复制弊端是如果在复制过程中系统奔溃了,文件里的操作步骤并没有进行完,就会出现数据丢失。
GTID(global transaction identifier)复制是通过将整个作为一个事物,分为事物1、事物2,复制操作是将整个事物进行复制,要么成功要么失败,这样就保证不会出现复制一般时中断而导致的数据丢失。
操作步骤同样可以在官方文档里看到。
操作配置:
第一步:配置master节点
在配置文件里打开gtid功能
重启mysqld服务
第二步:配置slave节点
上面的配置操作在slave节点同样需要操作一次
写完配置重启配置节点的MySQL服务
在mysql程序里停止之前的slave复制
再去更改新的master配置
mysql> CHANGE MASTER TO
> MASTER_HOST = '172.25.254.5', #master节点的ip
> MASTER_PORT = 3306, #master节点的mysql的端口
> MASTER_USER = 'redhat', #用户名
> MASTER_PASSWORD = 'He1234..', #密码
> MASTER_AUTO_POSITION = 1; #设定从事物1开始复制
然后再执行开启复制,查看复制的状态
第三步:测试
在master节点里登录数据库写入数据
去slave节点查看是否同步数据
看到数据已经同步过来了,再去查看复制状态里的gtid的设定,这里是捕捉到一个事物1,并且复制过来了
半同步复制
主从复制的方式是通过主节点的操作产生事物1,写入bin-log buffer,通知slave,经过bin-log buffer检测后传输到slave的relay-log,再写入slave的数据库里。
如果在事物1在给slave传输过程中slave没有收到,并且master节点宕机了,slave节点会提升为了master节点,这就会丢失事物1.
半同步复制:
从mysql5.5之后,mysql为了保证主从库数据一致性,引进了semi-sync功能。在半同步复制的架构下,当master在将自己binlog发给slave上的时候,要确保slave已经接受到了这个二进制日志以后,才会返回数据给客户端。对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是不能确保二进制日志确实到达了slave上;半同步复制对于客户的请求响应稍微慢点,但是他可以保证二进制日志的完整性。
半同步复制的概念:
1,当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。
2,当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。
3,当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。在 Master 实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。
4,如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。
5,半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。
6,半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。
配置半同步复制
第一步:配置master节点
在MySQL程序里安装master的插件
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
查看插件是否正确安装
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
激活插件
mysql> set global rpl_semi_sync_master_enabled= 1;
第二步:配置slave节点
在MySQL程序里安装slave的插件
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
查看插件是否正确安装
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
激活插件
mysql> set global rpl_semi_sync_slave_enabled= 1;
重启IO线程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
第三步:测试半同步传输
在master节点查看状态,可以看到有一个节点在等待数据同步,因为我们只有一个从节点
查看master节点的变量,里面有超时时间,单位是毫秒,还有我们开启的半同步插件
# 超时时间的设定
mysql> SET GLOBAL rpl_semi_sync_master_timeout =10000000000000000000; #一般设置为最大值
测试数据复制,在master节点写数据
在slave节点查看是没有问题的,
为了验证半同步复制的效果,关闭slave节点的IO线程,再去master节点写数据
master节点写的数据等待了10s钟,原因是我们设置的超时时间就是10s,超过时间之后就会自动转为异步复制,除非slave节点的IO线程再开启。这时master节点的写的数据是无法传输到slave节点的。
全同步复制,组复制
组复制和半同步复制的区别的是:
半同步复制是至少有一个slave节点返回信号;
组复制是需要组内所有节点返回信号。
这里测试需要将之前的数据库内容全部清除,将配置文件里新增的配置也删除
因为是组复制所以需要3台主机进行实验,一台主节点,两台作为从节点
编辑配置文件,写入以下配置内容
server_id=1 #三台主机的id号不同
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="8053c671-0622-11e8-a300-525400b9c5e8" #此ID可以自己指定格式一样就可以
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.92.5:33061" #绑定本地的172.25.92.1以及25901端口接受其他组成员的连接,
loose-group_replication_group_seeds="172.25.254.5:33061,172.25.254.6:33061,172.25.254.7:33061" #本行为告诉服务器当服务器加入组,本设置可以不是全部的组成员服务地址
loose-group_replication_bootstrap_group= off #配置是否自动引导组
loose-group_replication_single_primary_mode=FALSE #设置组自动选择一个 server 来处理读/写工作。 这个 server 是主(PRIMARY),所有其他的都是从
loose-group_replication_enforce_update_everywhere_checks=FALSE #多主模式下为多主更新启用或禁用严格一致性检查。
loose-group_replication_ip_whitelist="127.0.0.1,172.25.254.0/24" #添加白名单本机和172.25.254网段的主机
loose-group_replication_enforce_update_eveywhere_checks=ON #打开检测查看所有节点数据是否是同步的
loose-group_replication_single_primary_mode=OFF #关闭单主节点模式,因为我们设置的是从节点也是可以接替主节点工作的
第一台节点上的操作
配置完后重新启动mysql,如果失败清空/var/lib/mysql目录里的内容,启动后还是去mysql.log日志里找初始密码,执行安全初始化
在mysql程序里关闭二进制日志
mysql> SET SQL_LOG_BIN=0;
创建用户,并授权复制,刷新列表
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'He1234..'; #创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'He1234..'; #授权
mysql> FLUSH PRIVILEGES; #刷新授权表
然后再开启二进制日志
使用组复制方式
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='He1234..' FOR CHANNEL 'group_replication_recovery';
安装组复制的插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
启动组复制,开启后关闭参数是防止每次开启时都会产生新的组名
mysql> SET GLOBAL group_replication_bootstrap_group=ON; #打开参数
mysql> START GROUP_REPLICATION; #开启组复制
mysql> SET GLOBAL group_replication_bootstrap_group=OFF; #关闭参数
查看组状态
SELECT * FROM performance_schema.replication_group_members;
其他节点配置
2台从节点的配置和主节点上的是一样的,配置完,同样进行安全初始化
在程序里同样进行操作
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'He1234..';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'He1234..';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='He1234..' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; #强制开启加入组复制
mysql> START GROUP_REPLICATION;
测试
配置需要在所有节点主机上配置地址解析
配置完成后,在任意节点上可以查看到3台服务器都是online状态
组复制的特点是在任意节点上插入数据其他节点都会同步,任何节点在写的时候都是主节点