性能达到瓶颈的解决方案
MySQL扩展采用的方式读写分离
将数据库的访问拆分成两种访问,读(select)和写(增删改),通过调度器,将用户的不同请求分别发送给读服务器或者写服务器,在写服务器增加数据时,需要使用主从复制机制来同步数据到读服务器
主从复制特征
主从复制的功用
读写分离应用:
主从复制架构:
主从配置官网资料
https://mariadb.com/kb/en/library/setting-up-replication/
https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.html
主节点配置
log_bin
:启用二进制日志,在mariadb配置文件,[mysqld]内添加项 server_id=#
:为当前节点设置一个全局惟一的ID号,判断数据来源的标识,[mysqld]内添加项log-basename=master
:设置datadir中日志名称sync_binlog=1
: 每次写后立即同步二进制日志到磁盘,性能差innodb_flush_log_at_trx_commit=1
: 每次事务提交立即同步日志写磁盘innodb_support_xa=ON
: 默认值,分布式事务MariaDB10.3.0废除sync_master_info=#
:#次事件后master.info同步到磁盘GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
REPLICATION SLAVE
:给予从服务器的权限,只可以同步复制二进制日志repluser
:用户账号命名HOST
:从服务器IP或网段IDENTIFIED BY
:设置口令关键字从节点配置:
配置文件
server_id=#
:为当前节点设置一个全局惟的ID号relay_log=relay-log
:中继日志的文件路径,默认值文件名为hostname-relay-binrelay_log_index=relay-log.index
:中继日志索引文件路径,默认值hostname-relay-bin.indexskip_slave_start=ON
:不自动启动slavesync_relay_log=#
:#次写后同步relay log到磁盘sync_relay_log_info=#
:#次事务后同步relay-log.info到磁盘使用有复制权限的用户账号连接至主服务器,并启动复制线程
mysql> CHANGE MASTER TO <==同步关键字
MASTER_HOST='host', <==主服务器名
MASTER_USER='repluser', <==主服务器授权的账号
MASTER_PASSWORD='replpass', , <==授权账号的密码
MASTER_LOG_FILE='mysql-bin.xxxxx', <==数据同步开始位置来自哪个二进制日志
MASTER_LOG_POS=#; <==二进制日志的开始位置
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
复制架构中应该注意的问题
read_only=ON
mysql> FLUSH TABLES WITH READ LOCK;
STOP SLAVE
RESET SLAVE ALL
sql_slave_skip_counter = N
MariaDB [hellodb]> INSERT teachers VALUES(13,'k',26,'M');
'查看从服务器同步信息'
MariaDB [hellodb]> SHOW SLAVE STATUS\G
'出现如下错误提示'
Last_SQL_Error: Error 'Duplicate entry '13' for key 'PRIMARY'' on query. Default database: 'hellodb'. Query: 'INSERT teachers VALUES(13,'k',30,'M')'
1. '在堵塞的从服务器上,先停止线程'
MariaDB [hellodb]> STOP SLAVE;
2. '执行全局变量sql_slave_skip_counter,通过第2步得知只有1个错误,所以值为1'
MariaDB [hellodb]> SET GLOBAL sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.01 sec)
3. '启动线程,恢复主从复制'
MariaDB [hellodb]> START SLAVE;
理论上应该保持主从服务器版本一致,避免出现未知错误
主从复制
'修改配置文件'
[root@hai7-6 ~]$vim /etc/my.cnf
[mysqld]
server_id=1 <==设置主服务器server_id
innodb_file_per_table <==将表数据文件单独存放
skip_name_resolve <==不允许反向解析为主机名
log_bin <==启动二进制
'启动服务'
[root@hai7-6 ~]$systemctl restart mariadb
'授权账户为repluser在网段192.168.50.%,密码为centos,可以复制数据'
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos';
'授权账号后二进制日志位置'
MariaDB [(none)]> show master status;
| mysql_bin.000007 | 401 |
[root@hai7-8 ~]$vim /etc/my.cnf
[mysqld]
server_id=2 <==id号只要唯一就可以
innodb_file_per_table
skip_name_resolve
[root@hai7-6 ~]$mysql < hellodb_innodb.sql
'二进制日志大小为'
MariaDB [(none)]> show master status;
| mysql_bin.000007 | 7811 |
MariaDB [(none)]> help change <==帮助关键字
topics:
ALTER TABLE
CHANGE MASTER TO <==得到CHANGE MASTER TO
'再次help关键字`CHANGE MASTER TO`,得到修改模板,拿来用,修改为我们需要的配置,执行'
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.50.107',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysql_bin.000007',
-> MASTER_LOG_POS=245;
MariaDB [(none)]> SHOW SLAVE STATUS\G
Master_Log_File: mysql_bin.000007 <==从这个二进制日志复制
Read_Master_Log_Pos: 245 <==从以上日志的什么位置开始复制
Relay_Master_Log_File: mysql_bin.000007 <==将来生成的文件
Relay_Log_File: mariadb-relay-bin.000001 <==中继日志
Relay_Log_Pos: 4 <==中继位置
Slave_IO_Running: No <==IO线程启动状态
Slave_SQL_Running: No <==SQL线程启动状态
Seconds_Behind_Master: NULL <==和主服务器复制延迟有多久
Exec_Master_Log_Pos: 245 <==写入从服务器时,当前写入的主服务器的位置
MariaDB [(none)]> START SLAVE;
'增加一条记录'
MariaDB [hellodb]> insert teachers values(5,'a',20,'F');
MariaDB [hellodb]> select * from teachers;
| 5 | a | 20 | F | <==同步成功
已经有主从服务器,额外添加一个从服务器
[root@hai7-7 data]$vim /etc/my.cnf
[mysqld]
server_id=3
innodb_file_per_table
skip_name_resolve
'完全备份主服务器数据'
[root@hai7-6 data]$mysqldump -A -F --single-transaction --master-data=1 > all.sql
'传送给从服务器B'
[root@hai7-6 data]$scp all.sql 192.168.50.115:/data
--master-data=1
选项,会自动在备份文件中加入CHANGE MASTER TO
关键词,修改完全备份文件,在导入时备份文件时,使其可以直接执行从服务器同步复制指令`修改前完全备份--master-data=1选项,添加的行`
[root@hai7-7 data]$vim all.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql_bin.000008', MASTER_LOG_POS=245;
`修改为从服务器执行的CHANGE MASTER TO复制指令`
[root@hai7-7 data]$vim all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.50.107',MASTER_USER='repluser',
MASTER_PASSWORD='centos',MASTER_PORT=3306,
MASTER_LOG_FILE='mysql_bin.000008', MASTER_LOG_POS=245;
[root@hai7-7 data]$mysql < all.sql
MariaDB [(none)]> show slave status\G
Slave_IO_State:
Master_Host: 192.168.50.107 <==已自动执行CHANGE MASTER TO
Master_User: repluser
1. '启动从服务器线程'
MariaDB [(none)]> START SLAVE;
2. '在主服务器增加数据'
MariaDB [hellodb]> INSERT teachers VALUES(7,'c',30,'F');
3. '在从服务器查看是否自动同步'
MariaDB [hellodb]> SELECT * FROM teachers;
| 7 | c | 30 | F | <==同步成功
如果主服务器A宕机,在从服务器(B、C)中,选一个来充当主服务器
'查看从服务器文件master.info,可以得到二进制日志信息'
[root@hai7-8 ~]$cat /var/lib/mysql/master.info
18
mysql_bin.000008
445
'停止线程'
MariaDB [(none)]> STOP SLAVE;
'查看线程状态'
MariaDB [(none)]> show slave status\G
Slave_IO_Running: No <==已停止
Slave_SQL_Running: No
'清理从服务器信息命令'
MariaDB [(none)]> RESET SLAVE ALL;
'执行清理命令后,从服务器信息将清空'
MariaDB [(none)]> show slave status\G
Empty set (0.00 sec) <==信息被清空
[root@hai7-8 ~]$vim /etc/my.cnf
[mysqld]
server_id=2 <==id只要唯一就可以
log-bin <==打开二进制日志功能
'授权账户为repluser在网段192.168.50.%,密码为centos,可以复制数据'
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos';
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> RESET SLAVE ALL;
1. '重新配置从服务器信息'
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.50.111',MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
2. '启动线程'
MariaDB [(none)]> START SLAVE;
'主服务器C上添加数据'
MariaDB [hellodb]> INSERT teachers VALUES(9,'E',32,'f');
'从服务器B上查看'
MariaDB [hellodb]> select * from teachers;
| 9 | E | 32 | F |
级联复制,给从服务器B再下设从服务器C
主从复制依赖的是二进制日志文件,而从服务器接收主服务器的二进制文件通过中继日志执行写入磁盘,不会产生新的二进制日志(二进制日志产生是对数据库直接进行增删改),想要在从服务器生成二进制文件供级联使用,就需要在配置文件中加入选项log_slave_updates
主服务器为A,从服务器为B,从服务器的下设从服务器为C;在从服务器B上修改配置文件,开启二进制日志功能,重启服务,查看二进制日志位置
[root@hai7-8 ~]$vim /etc/my.cnf
[mysqld]
server_id=3
log_slave_updates <==级联从服务器关键项,产生二进制日志
log-bin <==为下设的从服务器复制提供二进制日志文件
read_only=ON
MariaDB [(none)]> show master logs;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 245 |
在C上设置从服务器设置,修改配置文件,设置唯一id,设只读设置等,然后进入mysql设置从服务器,将主机指向B
'如果之前为从服务器需要执行清理操作'
MariaDB [hellodb]> reset slave all;
Query OK, 0 rows affected (0.00 sec)
'重新配置从服务器设置'
MariaDB [hellodb]> CHANGE MASTER TO
-> MASTER_HOST='192.168.50.115',MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
'启动线程'
MariaDB [hellodb]> START SLAVE;
容易产生的问题
数据同步有延迟,两主机可能修改的是同一个数据,容易冲突;因此慎用
考虑要点:自动增长id
主主复制的配置步骤:
[root@hai7-7 data]$vim /etc/my.cnf
[mysqld]
server_id=3
log-bin
auto_increment_offset=2 <==自增ip起始数为2
auto_increment_increment=2 <==自增ip递增为2
[root@hai7-7 data]$vim /etc/my.cnf
[mysqld]
server_id=2
log-bin
auto_increment_offset=1 <==修改ip起始数为1
auto_increment_increment=2
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos';
1. '先实现同步复制功能'
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.50.111',MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
2. '启动同步复制线程'
MariaDB [(none)]> START SLAVE;
3. '在A主机授权的账号信息也一起同步到了B主机'
MariaDB [(none)]> SELECT user , host FROM mysql.user;
| repluser | 192.168.50.% |
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.50.115',MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
Query OK, 0 rows affected (0.02 sec)
'启动同步复制线程'
MariaDB [(none)]> START SLAVE;
MariaDB [hellodb]> CREATE TABLE test (id int auto_increment primary key,name char(20));
MariaDB [hellodb]> INSERT test (name)VALUES('a'),('b');
MariaDB [hellodb]> select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a | <==奇数式增长
| 3 | b |
+----+------+
MariaDB [hellodb]> INSERT test (name)VALUES('e'),('f');
MariaDB [hellodb]> select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 3 | b |
| 4 | e | <==auto_increment只取最大值,不会插入,所以显示偶数为4
| 6 | f |
默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。
由于MySQL的复制内在机制,可能会产生比较大的延迟,这意味着当主服务器或从服务器端发生故障时,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失;而同步方式效率又不高。
rpl_semi_sync_master
,这个插件表现为库so文件/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;
mysql>SET GLOBAL rpl_semi_sync_master_timeout = 1000;
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
1. '修改主服务器配置文件'
[root@hai7-8 ~]$vim /etc/my.cnf
[mysqld]
server_id=2
log-bin
2. '重启服务'
root@hai7-8 ~]#systemctl start mariadb
3. '授权账户'
[root@hai7-8 ~]$mysql
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos';
1. '修改配置文件'
[root@hai7-7 data]$vim /etc/my.cnf
[mysqld]
server_id=3
2. '重启服务'
[root@hai7-7 data]$systemctl start mariadb
3. '实现从服务器同步复制'
[root@hai7-7 data]$mysql
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.50.111',MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
4. '启动同步线程'
MariaDB [(none)]> START SLAVE;
1. '修改配置文件'
[root@hai7-6 ~]$vim /etc/my.cnf
[mysqld]
server_id=1
2. '启动服务'
[root@hai7-6 ~]$systemctl restart mariadb
3. '实现从服务器同步复制功能'
[root@hai7-6 ~]$mysql
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.50.111',MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
4. '启动同步线程'
MariaDB [(none)]> START SLAVE;
1. '查看系统自带插件'
MariaDB [(none)]> SHOW PLUGINS;
2. '安装半同步插件'
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
3. '启动半同步插件,重启失效,生产环境要写入配置文件my.cnf'
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | <==半同步服务器个数
1. '安装插件'
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2. '启动插件'
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;
3. '启动后,从服务器线程并没有价值此插件,所以需要重启从服务器线程'
MariaDB [(none)]> stop slave;
MariaDB [(none)]> start slave;
4. '查看插件运行状态,值为ON说明设置半同步成功'
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1. '停掉从服务器同步线程,根据半同步原理可知,主服务无法同步数据,会在超过等待时长后返回成功'
MariaDB [(none)]> STOP SLAVE;
2. '在主服务器更改数据'
MariaDB [hellodb]> INSERT teachers VALUES(6,'A',30,'M');
Query OK, 1 row affected (10.00 sec) <==等待10秒后返回成功结果
让从节点仅复制指定的数据库,或指定数据库的指定表
服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件
注意:此项和binlog_format相关,基于二进制还原将无法实现;不建议使用
参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db
binlog-do-db = 数据库白名单列表,多个数据库需多行实现
binlog-ignore-db = 数据库黑名单列表
从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地
问题:会造成网络及磁盘IO浪费
示例,在从服务器上在白名单中添加数据库hellodb,只能对进入库操作起作用,需要use hellodb
进入数据库,改变数据后从服务器才能同步,hellodb.teacher写法会被过滤掉
MariaDB [hellodb]> SET GLOBAL replicate_do_db=hellodb;
在默认的主从复制过程或远程连接到MySQL/MariaDB所有的链接通信中的数据都是明文的,外网里访问数据或则复制,存在安全隐患。通过SSL/TLS加密的方式进行复制的方法,来进一步提高数据的安全性
配置实现:
参看:https://mariadb.com/kb/en/library/replication-with-secure-connections/
配置示例
openssl genrsa 2048 > cakey.pem
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650
openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > master.csr
openssl x509 -req -in master.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt
openssl req -newkey rsa:1024 -days 100 -nodes -keyout slave.key > slave.csr
openssl x509 -req -in slave.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt
'传送ca证书、主服务器私钥、主服务器证书给主服务器'
scp cacert.pem master.crt master.key 192.168.50.107:/etc/my.cnf.d/ssl/
'传送ca证书、从服务器私钥、从服务器证书给从服务器'
scp cacert.pem slave.crt slave.key 192.168.50.115:/etc/my.cnf.d/ssl/
1. '修改配置文件'
[root@hai7-8 ssl]$vim /etc/my.cnf
[mysqld]
server_id=2
log-bin
ssl <==主服务器启用加密功能
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem <==ca证书
ssl-cert=/etc/my.cnf.d/ssl/master.crt <==主服务器证书
ssl-key=/etc/my.cnf.d/ssl/master.key <==主服务器私钥
2. '重启服务'
[root@hai7-8 ssl]$systemctl restart mariadb
[root@hai7-8 ssl]$mysql
MariaDB [(none)]> show variables like '%ssl%';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| have_openssl | YES | <==YES表示配置成功
| have_ssl | YES |
require ssl
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO ssluser@'192.168.50.%' IDENTIFIED BY 'centos' require ssl;
1. '清空同步信息,重新以加密方式同步' MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> RESET SLAVE ALL 2. '重新配置加密同步' MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.111', -> MASTER_USER='ssluser', -> MASTER_PASSWORD='centos', -> MASTER_LOG_FILE='mariadb-bin.000002', -> MASTER_LOG_POS=411, -> MASTER_SSL=1, <=启用加密 -> MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem', <==ca的证书 -> MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt', <==从服务器的证书 -> MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key'; <==从服务器的私钥 Query OK, 0 rows affected (0.00 sec) 3. '启动从服务器同步线程' MariaDB [(none)]> start slave;
8 主从复制的监控和维护
- 清理日志
- 删除指定部分二进制日志
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
- 删除二进制日志信息
RESET MASTER
- 删除从服务器信息
RESET SLAVE
- 主从复制监控
- 查看当前二进制日志位置,白名单和黑名单
SHOW MASTER STATUS
- 查看二进制日志记录详细内容
SHOW BINLOG EVENTS
- 查看所有二进制日志大小及位置
SHOW BINARY LOGS
- 查看从服务器同步复制信息
SHOW SLAVE STATUS
- 显示哪些连接线程正在运行
SHOW PROCESSLIST
- 从服务器是否落后于主服务,在
SHOW SLAVE STATUS
列表中
Seconds_Behind_Master: 0
- 如何确定主从节点数据是否一致
percona-tools
- 数据不一致如何修复
删除从数据库,重新复制9 MySQL高可用-集群架构
9.1 集群概述
实现高可用性解决方案
主服务器宕机原因
为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制
MHA软件由两部分组成,Manager工具包和Node工具包
工具 | 功能描述 |
---|---|
masterha_check_ssh | 检查MHA的SSH配置状况 |
masterha_check_repl | 检查MySQL复制状况 |
masterha_manger | 启动MHA |
masterha_check_status | 检测当前MHA运行状态 |
masterha_master_monitor | 检测master是否宕机 |
masterha_master_switch | 故障转移(自动或手动) |
masterha_conf_host | 添加或删除配置的server信息 |
工具 | 功能描述 |
---|---|
save_binary_logs | 保存和复制master的二进制日志 |
apply_diff_relay_logs | 识别差异的中继日志事件并将其差异的事件应用于其他的slave |
filter_mysqlbinlog | 去除不必要的ROLLBACK事件(MHA已不再使用此工具) |
purge_relay_logs | 清除中继日志(不会阻塞SQL线程) |
工具包安装位置
MHA集群搭建
vim /etc/mastermha/app1.cnf
[server default]
user=mhauser <==MHA服务器管理各主从服务器使用的账号
password=magedu <==MHA服务器密码
manager_workdir=/data/mastermha/app1/ <==工作目录
manager_log=/data/mastermha/app1/manager.log <==日志
remote_workdir=/data/mastermha/app1/ <==被管理节点上manager的工作目录,自动生成
ssh_user=root <==主服务器上设置的管理员权限的账号,用来读取日志、提升从服务器等
repl_user=repluser <==复制数据的账号密码
repl_password=magedu
ping_interval=1 <==1秒监控一次服务器是否正常工作
[server1] <==被管理的服务器
hostname=192.168.8.17
candidate_master=1 <==可以充当master的从服务器,人为定义充当主服务器
[server2]
hostname=192.168.8.27
candidate_master=1
[server3]
hostname=192.168.8.37
自定义扩展选项
secondary_check_script: ‘通过多条网络路由检测master的可用性’
master_ip_ailover_script: ‘更新Application使用的masterip’
shutdown_script: ‘强制关闭master节点’
report_script: ‘发送报告’
init_conf_load_script: ‘加载初始配置参数’
master_ip_online_change_script:‘更新master节点ip地址’
1. '修改配置文件'
vim /etc/my.cnf
[mysqld]
log-bin
server_id=1
skip_name_resolve=1 <==在MHA中,反向解析为强制项
2. '查看二进制文件,备用配置从服务器'
mysql>show master logs
3. '创建从服务器复制权限账号'
mysql>grant replication slave on *.* to repluser@'192.168.8.%' identified by 'magedu';
4. '创建高权限账号查看二进制与提升从服务器'
mysql>grant all on *.* to mhauser@'192.168.8.%’identified by‘magedu';
1. '修改配置文件'
vim /etc/my.cnf
[mysqld]
server_id=2 <==不同节点此值各不相同
log-bin
read_only <==Manage会自动在提升为主的时候去掉此项
skip_name_resolve=1
2. '实现从服务器同步复制'
mysql>CHANGE MASTER TO MASTER_HOST=‘MASTER_IP', MASTER_USER='repluser', MASTER_PASSWORD=‘magedu', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
示例
在所有节点实现相互之间ssh key验证
1. '管理机manager上生成ssh秘钥'
[root@hai7-8 ~]$ssh-keygen
2. '将秘钥导出至本机'
[root@hai7-8 ~/.ssh]$ssh-copy-id 192.168.50.110
3. '将整个目录拷贝至集群所有主机上'
[root@hai7-8 ~]$scp -pr .ssh 192.168.50.115:/root/
......其他主机类似操作
实现主从关系
[root@hai7-8 ~]$vim /etc/my.cnf
[mysqld]
server_id=1
innodb_file_per_table
log_bin
skip_name_resolve
重启服务
[root@hai7-8 ~]$systemctl start mariadb
1. '用来主从复制的账号'
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'magedu';
2. '用于提升从服务器,读取日志等账号'
mysql>GRANT all ON *.* TO mhauser@'192.168.50.%' IDENTIFIED BY 'magedu';
3. '查看二进制日志文件位置'
MariaDB [(none)]> SHOW MASTER LOGS;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 541 |
+--------------------+-----------+
[mysqld]
server_id=2
log-bin
innodb_file_per_table
skip_name_resolve
relay_log_purge=0 <==禁止SQL线程执行完中继日志就删除,保留日志以备宕机补齐数据
read_only
[root@hai7-6 ~]$systemctl restart mariadb
1. '设置复制命令' MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.108', -> MASTER_USER='repluser', -> MASTER_PASSWORD='magedu', -> MASTER_LOG_FILE='mariadb-bin.000001', -> MASTER_LOG_POS=541; 2. '启动复制线程命令' MariaDB [(none)]> START SLAVE; 3. '查看从服务器设置,确定状态' MariaDB [(none)]> SHOW SLAVE STATUS\G
配置MHA,需要epel源,需要的工具包
mha4mysql-node-0.56-0.el6.noarch.rpm
和mha4mysql-manager-0.56-0.el6.noarch.rpm
- 在manage管理端两个都要安装
[root@hai7-8 ~]$yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm [root@hai7-8 ~]$yum -y install mha4mysql-manager-0.56-0.el6.noarch.rpm
- 1
- 2
mha4mysql-node
[root@hai7-8 ~]$yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
[root@hai7-8 ~]$mkdir /etc/mha/ <==自建存放配置文件的目录,路径没有要求
[root@hai7-8 ~]$vim /etc/mha/appq.conf <==编辑配置文件,文件名没有要求
[server default]
user=mhauser
password=magedu
manager_workdir=/data/mastermha/app1/ <==工作目录,会自动生成
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=magedu
ping_interval=1
[server1]
hostname=192.168.50.108
candidate_master=1
[server2]
hostname=192.168.50.115
candidate_master=1
[server3]
hostname=192.168.50.107
[root@hai7-8 ~]$masterha_check_ssh --conf=/etc/mha/app1.conf
[root@hai7-8 ~]$masterha_check_repl --conf=/etc/mha/appq.conf
[root@hai7-8 ~]$masterha_manager --conf=/etc/mha/appq.conf
测试manage,自动提升从服务器功能,宕掉主服务器
在主服务器端执行,杀掉进程,模拟宕机
[root@hai7-8 ~]$killall mysqld
管理端提升从服务器后,会从前端管理模式退出,为一次性任务,可以通过查看管理端日志,查看被提升从服务器。被提升的从服务器会自动将read_only修改为OFF状态,但是配置文件中内容还在,需要手工清除,避免重启修改回去
集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案;
目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案
如图示:三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构想
同步复制与异步复制
同步复制优缺点
解决同步复制中的缺点
Galera集群使用的基于证书的复制系统就是建立以下方法之上的
基于认证的复制需要什么
Galera Cluster特点
Galera Cluster官方文档:
http://galeracluster.com/documentation-webpages/galera-documentation.pdf
http://galeracluster.com/documentation-webpages/index.html
https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/
Galera Cluster包括两个组件
WSREP复制实现:
至少需要三个节点,不能安装mariadb-server
查看集群中相关系统变量和状态变量
Galera Cluster实现步骤
安装,需要配置yum源,这里使用清华的yum源
[root@hai7-8 ~]$vim /etc/yum.repos.d/mysql.repo
[mysql]
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.59/yum/centos7-amd64/
gpgcheck=0
MariaDB-Galera-server
[root@hai7-8 ~]$yum install MariaDB-Galera-server -y
修改配置文件
[root@hai7-8 ~]$vim /etc/my.cnf.d/sevim server.cnf
[galera] <==在此语句块下修改
# Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so <==galera提供的驱动模块
wsrep_cluster_address='gcomm://192.168.50.108,192.168.50.115,192.168.50.107' <==galera组中的IP地址
binlog_format=row <==基于二进制行的复制格式
default_storage_engine=InnoDB <==默认存储引擎
innodb_autoinc_lock_mode=2 <==innodb锁级别
bind-address=0.0.0.0 <==绑定的地址,默认就行
下面为配置可选项
wsrep_cluster_name = ‘mycluster‘默认my_wsrep_cluster <==集群名称
wsrep_node_name = ‘node1’ <==自定义节点名称
wsrep_node_address = ‘192.168.8.7’
首次启动时,需要初始化集群,在其中一个节点上执行脚本mysql
mysql脚本来自安装包
[root@hai7-8 init.d]$rpm -qf mysql
MariaDB-Galera-server-5.5.59-1.el7.centos.x86_64
在其中一个节点上运行此脚本,后面跟start --wsrep-new-cluster
表示开启新的组,后续的节点只要启动服务即可
[root@hai7-8 ~]$/etc/init.d/mysql start --wsrep-new-cluster
其他节点启动服务即可
[root@hai7-6 mysqldata]$service mysql start
数据库服务衡量指标:
压力测试工具
MYSQL压力测试工具Mysqlslap
来自于mariadb包,测试的过程默认生成一个mysqlslap的schema,生成测试表t1,查询和插入测试数据,mysqlslap库自动生成,如果已经存在则先删除。用–only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹
--auto-generate-sql, -a
--auto-generate-sql-load-type=type
--auto-generate-sql-add-auto-increment
--number-char-cols=N, -x
--number-int-cols=N, -y
--number-of-queries=N
--query=name,-q
--create-schema
--commint=N
--compress, -C
--concurrency=N, -c
--concurrency=100,200,500
--engine=engine_name, -e engine_name
--iterations=N, -i
--only-print
--detach=N
--debug-info, -T
示例
mysqlslap -a -uroot -pmagedu
mysqlslap -a -c 100 -uroot -pmagedu
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -pmagedu
--number-of-queries 1000
:查询一千次--concurrency=50,100
:并发50和100分别测试--iterations=5
:迭代5次--engine=myisam,innodb
:分别对myisam,innodb引擎测试mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -pmagedu
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -pmagedu
高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”
'硬件:内存32G'
innodb_file_per_table = 1
'打开独立表空间'
max_connections = 8000
'MySQL服务所允许的同时会话数的上限,经常出现Too Many Connections的错误提示,则需要增大此值,根据服务器性能判断,防止设置过大超过承载能力崩溃'
back_log = 300
'back_log 是操作系统在监听队列中所能保持的连接数,也就是最大会话数上限后,等待数上限'
max_connect_errors = 1000
'每个客户端连接最大的错误允许数量,当超过该次数,MYSQL服务器将禁止此主机的连接请求,直到MYSQL服务器重启或通过flush hosts命令清空此主机的相关信息'
open_files_limit = 10240
'所有线程所打开表的数量'
max_allowed_packet = 32M
'每个连接传输数据大小.最大1G,须是1024的倍数,一般设为最大的BLOB的值'
wait_timeout = 10
'指定一个请求的最大连接时间,超时时长'
sort_buffer_size = 16M
'排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序'
join_buffer_size = 16M
'不带索引的全表扫描.使用的buffer的最小值'
query_cache_size = 128M
'查询缓冲大小'
query_cache_limit = 4M
'指定单个查询能够使用的缓冲区大小,缺省为1M'
transaction_isolation = REPEATABLE-READ
'设定默认的事务隔离级别'
thread_stack = 512K
'线程使用的堆大小. 此值限制内存中能处理的存储过程的递归深度和SQL语句复杂性,此容量的内存在每次连接时被预留.'
log-bin
'二进制日志功能'
binlog_format=row
'二进制日志格式'
innodb_buffer_pool_size = 24G
'InnoDB使用一个缓冲池来保存索引和原始数据, 可设置这个变量到服务器物理内存大小的80%'
innodb_file_io_threads = 4
'用来同步IO操作的IO线程的数量'
innodb_thread_concurrency = 16
'在InnoDb核心内的允许线程数量,建议的设置是CPU数量加上磁盘数量的两倍'
innodb_log_buffer_size = 16M
'用来缓冲日志数据的缓冲区的大小'
innodb_log_file_size = 512M
'在日志组中每个日志文件的大小'
innodb_log_files_in_group = 3
'在日志组中的文件总数'
innodb_lock_wait_timeout = 120
'SQL语句在被回滚前,InnoDB事务等待InnoDB行锁的时间'
long_query_time = 2
'慢查询时长'
log-queries-not-using-indexes
'将没有使用索引的查询也记录下来'