MySQL:(十三)MySQL集群其二
(一)关系型数据库基础
(二)MySQL安装
(三)管理数据库和表
(四)用户和权限管理
(五)函数,存储过程和触发器
(六)MySQL架构
(七)存储引擎
(八)MySQL服务器选项,系统和状态变量
(九)优化查询和索引管理
(十)锁和事务管理
(十一)日志管理
(十二)备份还原
(十三)MySQL集群
MySQL读写分离
读写分离应用
- mysql-proxy:Oracle,https://downloads.mysql.com/archives/proxy/
- Atlas:Qihoo,https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
- dbproxy:美团,https://github.com/Meituan-Dianping/DBProxy
- Cetus:网易乐得,https://github.com/Lede-Inc/cetus
- Amoeba:https://sourceforge.net/projects/amoeba/
- Cobar:阿里巴巴,Amoeba的升级版
- Mycat:基于Cobar, http://www.mycat.io/
- ProxySQL:https://proxysql.com/
ProxySQL
ProxySQL简介
- ProxySQL: MySQL中间件 两个版本:官方版和percona版,percona版是基于官方版基础上修改
- C++语言开发,轻量级但性能优异(支持处理千亿级数据)
- 具有中间件所需的绝大多数功能,包括: 多种方式的读/写分离
- 定制基于用户、基于schema、基于语句的规则对SQL语句进行路由
- 缓存查询结果
- 后端节点监控
- 官方站点:https://proxysql.com/
- 官方手册:https://github.com/sysown/proxysql/wiki
ProxySQL安装
- 准备:
- 实现读写分离前,先实现主从复制
- 注意:slave节点需要设置read_only=1
- 基于YUM仓库安装
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
- 基于RPM下载安装:https://github.com/sysown/proxysql/releases
ProxySQL软件
-
ProxySQL组成
- 服务脚本:/etc/init.d/proxysql
- 配置文件:/etc/proxysql.cnf
- 主程序:/usr/bin/proxysql
- 基于SQLITE的数据库文件:/var/lib/proxysql/
proxySQL本身也是一个小型的数据库,SQLLITE是一个小型的SQL数据库。
-
启动ProxySQL:service proxysql start
- 启动后会监听两个默认端口
- 6032:ProxySQL的管理端口
- 6033:ProxySQL对外提供服务的端口
-
使用mysql客户端连接到ProxySQL的管理接口6032,默认管理员用户和密码都是admin:
- mysql -uadmin -padmin -P6032 -h127.0.0.1
ProxySQL数据库说明
-
SQLITE的数据库说明:
-
main是默认的数据库名,表里存放后端db实例、用户验证、路由规则等信息。表名以runtime_开头的表示proxysql当前运行的配置内容。
- 修改方式:不能通过dml语句修改,只能①修改对应的不以runtime_ 开头的(在内存)里的表,②然后LOAD使其生效,③SAVE使其存到硬盘以供下次重启加载。
-
disk是持久化到硬盘的配置,sqlite数据文件
-
stats是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间,等等
-
monitor库存储monitor模块收集的信息,主要是对后端db的健康/延迟检查
-
其中main、disk、stats、monitor是安装proxysql默认自带的数据库
-
-
修改runtime_运行配置说明:
-
在main和monitor数据库中的表, runtime_开头的是运行时的配置,不能修改,只能修改非runtime_表
-
修改后必须执行LOAD … TO RUNTIME才能加载到RUNTIME生效
-
执行save … to disk 才将配置持久化保存到磁盘,即保存在proxysql.db文件中
-
global_variables 有许多变量可以设置,其中就包括监听的端口、管理账号等
-
参考: https://github.com/sysown/proxysql/wiki/Global-variables
-
ProxySQL实现读写分离中proxysql配置
【1.添加MySQL节点】
- 向ProxySQL中添加MySQL节点,以下操作不需要use main也可成功
- MySQL > show tables;
- MySQL > select * from sqlite_master where name=‘mysql_servers’\G
- MySQL > select * from mysql_servers;
- MySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.17’,3306);
- MySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.27’,3306);
- MySQL > load mysql servers to runtime;
- MySQL > save mysql servers to disk;
【2.在MySQL节点创建一个供proxysql连接的账户】
-
添加监控后端节点的用户。ProxySQL通过每个节点的read_only值来自动调整它们是属于读组还是写组
-
在master上执行
- MySQL> grant replication client on *.* to monitor@‘192.168.8.%’ identified by ‘centos’;
【3.将2中账户添加至proxysql中】
- ProxySQL上配置监控
- MySQL [(none)]> set mysql-monitor_username=‘monitor’;
- MySQL [(none)]> set mysql-monitor_password=‘centos’;
- 加载到RUNTIME,并保存到disk
- MySQL [(none)]> load mysql variables to runtime;
- MySQL [(none)]> save mysql variables to disk;
【4.添加监控账户后可查询是否配置成功,能否连接至mysql节点】
- 监控模块的指标保存在monitor库的log表中
- 查看监控连接是否正常的 (对connect指标的监控):
- 如果connect_error的结果为NULL则表示正常
- MySQL> select * from mysql_server_connect_log;
- 查看监控心跳信息 (对ping指标的监控):
- MySQL> select * from mysql_server_ping_log;
【5.创建读组写组相关信息】
- 设置分组信息
-
需要修改的是main库中的mysql_replication_hostgroups表,该表有3个字段:writer_hostgroup,reader_hostgroup,comment, 指定写组的id为10,读组的id为20
-
查看main库中的mysql_replication_hostgroups表结构:
MySQL [(none)]> select * from sqlite_master where name=‘mysql_replication_hostgroups’\G -
*MySQL> insert into mysql_replication_hostgroups values(10,20,“test”);*将mysql_replication_hostgroups表的修改加载到RUNTIME生效
-
MySQL> load mysql servers to runtime;
-
MySQL> save mysql servers to disk;
-
Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组
-
MySQL> select hostgroup_id,hostname,port,status,weight from mysql_servers;
-
【6.创建一个可以远程连接数据库账户】
- 配置发送SQL语句的用户
- 在master节点上创建访问用户
- MySQL> grant all on *.* to sqluser@‘192.168.38.%’ identified by ‘centos’;
【7.将连接账户添加至proxysql中,让其能够通过此账户连接mysql】
- 在ProxySQL配置,将用户sqluser添加到mysql_users表中, default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库
- MySQL> insert into mysql_users(username,password,default_hostgroup) values(‘sqluser’,‘centos’,10);
- MySQL> load mysql users to runtime;
- MySQL> save mysql users to disk;
【8.连接测试查看当前连接在哪个mysql节点】
- 使用sqluser用户测试是否能路由到默认的10写组实现读、写数据
- mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select @@server_id’
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 17 |
+-------------+
MySQL [(none)]> status;
....
Connection: 192.168.38.47 via TCP/IP
...
目前并未实现读写分离,所有请求均发送给master节点了(10组)
【9.定义读写分离规则,将查询仅发送给slave】
-
在proxysql上配置路由规则,实现读写分离
-
与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,后者是前者的扩展表,1.4.7之后支持
-
插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句
- SELECT…FOR UPDATE它会申请写锁,应路由到10的写组
- MySQL> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)VALUES (1,1,’^SELECT.*FOR UPDATE$’,10,1),(2,1,’^SELECT’,20,1);
- MySQL> load mysql query rules to runtime;
- MySQL> save mysql query rules to disk;
-
==注意:==因ProxySQL根据rule_id顺序进行规则匹配,select … for update规则的rule_id必须要小于普通的select规则的rule_id
【测试:读写分离】
- 测试读操作是否路由给20的读组
- # mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select @@server_id’
- 测试写操作,以事务方式进行测试
- mysql -usqluser -pcentos -P6033 -h127.0.0.1 \ -e ‘start transaction;select @@server_id;commit;select @@server_id’
- mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘insert testdb.t values (1)’
- mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select id from testdb.t’
- 路由的信息:查询stats库中的stats_mysql_query_digest表
- MySQL > SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;
读写分离实验
【1.实验架构】
【2.实验规划】
- OS:centos7.6
- user:192.168.38.57
- proxy:192.168.38.47
- master:192.168.38.17
- slave:192.168.38.27
【3.主从实现】
- 实现详情看mysql复制,此处略
- 注意:slave节点需要设置read_only=1
【4.proxy配置】
安装软件:proxysql 1.4版本
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
需要联网
# yum install proxysql -y
安装mysql客户端,管理连接proxysql使用
# yum install mariadb -y
# rpm -ql proxysql
/etc/init.d/proxysql 启动脚本,因此只能使用service启动
/etc/proxysql.cnf proxy配置文件,只是现在,第一次启动之前能生效,一旦服务启动成功,配置文件就无效啦,所有的配置均放在数据库中了。
/usr/bin/proxysql
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl
修改对外提供的端口:6033 ==> 3306
# vim /etc/proxysql.cnf
启动proxysql
# service proxysql start
管理连接
# mysql -uadmin -padmin -P6032 -h127.0.0.1 只允许本地连接
MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name | file |
+-----+---------------+-------------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |对应一个磁盘文件
| 3 | stats | |
| 4 | monitor | |
| 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
MySQL [(none)]> show tables;
【5.读写分离的实现】
proxy | sql_server:master |
---|---|
1.将mysql-server添加至mysql_servers表中 | |
insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.27’,3306); | |
insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.17’,3306); | |
检查:select * from mysql_servers; | |
load mysql users to runtime;save mysql users to disk; | |
- | - |
创建一个供proxysql连接的账户 | |
grant replication client on . to monitor@‘192.168.38.%’ identified by ‘centos’; | |
将monitor用户添加至proxysql中 | |
set mysql-monitor_username=‘monitor’; | |
set mysql-monitor_password=‘centos’; | |
load mysql variables to runtime;save mysql variables to disk; | |
实际修改的是global_variables这个表 | |
检查前面步骤是否成功: | |
select * from mysql_server_ping_log; | |
- | - |
添加读组写组 | |
insert into mysql_replication_hostgroups values(10,20,“test”); | |
load mysql users to runtime;save mysql users to disk; | |
- | - |
创建一个远程连接账户、 | |
grant all on . to sqluser@‘192.168.38.%’ identified by ‘centos’; | |
将连接账户添加至proxysql中,让其能够通过此账户连接mysql | |
insert into mysql_users(username,password,default_hostgroup) values(‘sqluser’,‘centos’,10); | |
load mysql users to runtime;save mysql users to disk; | |
添加时定义了规则,此时远程主机的请求只会往10组的主机发 | |
检查前面步骤是否成功:select hostgroup_id,hostname,port,status,weight from mysql_servers; | |
- | - |
添加规则,将查询语句分离出来发送给20组的mysql节点即slave节点 | |
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)VALUES (1,1,’^SELECT.*FOR UPDATE$’,10,1),(2,1,’^SELECT’,20,1); | |
load mysql users to runtime;save mysql users to disk; | |
至此读写分离配置完成啦~ |
【6.客户端测试】
# mysql -usqluser -pcentos -h192.168.38.47
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 27 |
+-------------+
MySQL [(none)]> create database db2;
MySQL [(none)]> begin;select @@server_id;commit;
+-------------+
| @@server_id |
+-------------+
| 17 |
+-------------+
==> 以事务方式执行将在master上执行。
MySQL高可用
MySQL高可用应用
-
MMM: Multi-Master Replication Manager for MySQL,Mysql主主复制管理器是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)
- 官网: http://www.mysql-mmm.org
- https://code.google.com/archive/p/mysql-master-master/downloads
-
MHA:Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从
- 官网:https://code.google.com/archive/p/mysql-master-ha/
-
Galera Cluster:wsrep(MySQL extended with the Write Set Replication)通过wsrep协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主读写
-
GR(Group Replication):MySQL官方提供的组复制技术(MySQL 5.7.17引入的技术),基于原生复制技术Paxos算法,实现了多主更新,复制组由多个server成员构成,组中的每个server可独立地执行事务,但所有读写事务只在冲突检测成功后才会提交
MHA实现MySQL高可用
MHA集群架构
- MHA会提升一个与master复制日志差比较小的slave(在默认没有指定优先提升哪个slave时)
- MHA可以快速的提升一个slave成为新的master,但是它在master系统宕机这种情况下可能会丢失部分数据,但是如果master只是MySQL数据进程故障,会利用ssh协议将二进制日志拷贝至从节点,此时数据不会丢失。
MHA工作原理
1.MHA工作原理
- 1)从宕机崩溃的master保存二进制日志事件(binlog events)
- 2)识别含有最新更新的slave
- 3)应用差异的中继日志(relay log)到其他的slave
- 4)应用从master保存的二进制日志事件(binlog events)
- 5)提升一个slave为新的master
- 6)使其他的slave连接新的master进行复制
2.MHA软件
- MHA软件由两部分组成,Manager工具包和Node工具包
3.Manager工具包主要包括以下几个工具:
- 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信息
4.Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
-
save_binary_logs 保存和复制master的二进制日志
-
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
-
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用此工具)
-
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
-
==注意:==为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制
5.自定义扩展:
- 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地址
6.配置文件:
- 在MHA中比较关键的是需要写这个配置文件,数据节点的ip和master,slave,当master故障时,优先提升哪个slave为master等等。
- global配置,为所有的application提供默认配置,指定的是MHA监控的集群,因为MHA可以监控多个主从集群。
- application配置:为每个主从复制集群,即其中一组主从集群的相关配置。
实现MHA
1.管理节点
-
在管理节点上安装两个包
- mha4mysql-manager
- mha4mysql-node
-
在管理节点建立配置文件
# vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=centos 此用户名和密码是用来管理和提升一个slave节点的。
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=centos
ping_interval=1 1s钟发送一次监控报文[server1]
hostname=192.168.38.17
[server2]
hostname=192.168.38.27
candidate_master=1 优先提升谁作为新的master
[server3]
hostname=192.168.38.37
2.被管理节点
-
在被管理节点安装
- mha4mysql-node
-
实现Master
vim /etc/my.cnf
[mysqld]
log-bin
server_id=1
skip_name_resolve=1 MHA建议配置此项或者说必须配置,禁止ip反向解析成名字mysql>show master logs
mysql>grant replication slave on *.* to repluser@‘192.168.38.%’ identified by ‘centos’;
mysql>grant all on *.* to mhauser@'192.168.38.%’identified by ‘centos’; -
实现slave
vim /etc/my.cnf
[mysqld]
server_id=2 不同节点此值各不相同
log-bin
read_only
relay_log_purge=0 不清楚中继日志,中继日志默认过一段时间将会清理中继日志。
skip_name_resolve=1mysql>CHANGE MASTER TO MASTER_HOST=‘MASTER_IP’, MASTER_USER=‘repluser’, MASTER_PASSWORD=‘centos’, MASTER_LOG_FILE=‘mariadb-bin.000001’, MASTER_LOG_POS=245;
3.其他事项
-
在所有节点实现相互之间ssh key验证
-
Mha验证和启动
- masterha_check_ssh --conf=/etc/mastermha/app1.cnf
- masterha_check_repl --conf=/etc/mastermha/app1.cnf
- masterha_manager --conf=/etc/mastermha/app1.cnf
**注意:masterha_manager是一个前台执行的命令,**生产环境中可以结合screen放置后台。
-
排错日志:
- /data/mastermha/app1/manager.log
MHA实验
【1)实验规划】
- master ip:192.168.38.17
- slave1 ip:192.168.38.27
- slave2 ip:192.168.38.37
- manager ip:192.168.38.47
【2)搭建主从节点】
- ①master 和slaves节点先安装数据库:
yum install mariadb-server -y
- ②master节点配置
# vim /etc/my.cnf
[mysqld]
innodb-file-per-table
log-bin
server_id=17
skip_name_resolve=1
# systemctl start mariadb
# mysql
>grant replication slave on *.* to repluser@'192.168.38.%' identified by 'centos';
- ③slave节点配置
# vim /etc/my.cnf
[mysqld]
innodb-file-per-table
log-bin
server_id=27 slave2 的server_id设为37即可
read-only
relay_log_purge=0
skip_name_resolve=1
# systemctl start mariadb
# mysql
> CHANGE MASTER TO MASTER_HOST='192.168.38.17', MASTER_USER='repluser', MASTER_PASSWORD='centos', MASTER_PORT=3306, MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245, MASTER_CONNECT_RETRY=10;
> start slave;
【3)MHA相关的配置】
- ②所有节点实现相互之间ssh key验证
- manager,master,slave1,和slave2之间实现ssh
在其中一台主机实现如下操作:
# ssh-keygen
# ssh-copy-id 127.0.0.1
# scp .ssh/ 192.168.38.17:/root
# scp -r .ssh/ 192.168.38.17:/root
# scp -r .ssh/ 192.168.38.27:/root
# scp -r .ssh/ 192.168.38.37:/root
【4)MHA相关的配置】
- ①master为MHA提供管理的用户:
>grant all on *.* to mhauser@'192.168.38.%' identified by 'centos';
- ②软件安装
- manager安装
- mha4mysql-manager
- mha4mysql-node
- mysql节点安装
- mha4mysql-node
- 注意:mha4mysql-manager安装依赖epel源
- manager安装
# yum install mha*.rpm
- ③manager的配置文件
- 配置文件的存放路径都行,此处放置在 /etc/mha.conf
- 注意账户匹配问题
# vim /etc/mha.conf
[server default]
user=mhauser
password=centos
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=centos
ping_interval=1
[server1]
hostname=192.168.38.17
[server2]
hostname=192.168.38.27
candidate_master=1
[server3]
hostname=192.168.38.37
# masterha_check_ssh --conf=/etc/mha.conf
# masterha_check_repl --conf=/etc/mha.conf
# masterha_manager --conf=/etc/mha.conf 目前是放置前台执行的
【4)测试mha】
- 在master执行大量的写操作时突然停止mariadb程序
- # systemctl stop mariadb
- 查看manager的错误日志 cat /data/mastermha/app1/manager.log如下:
- …
- 192.168.38.37(192.168.38.37:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.38.27(192.168.38.27:3306)
- 192.168.38.27(192.168.38.27:3306): Resetting slave info succeeded.
- Master failover to 192.168.38.27(192.168.38.27:3306) completed successfully.
- master已经切换为了192.168.38.27
此时mha检测到master故障,将按照配置文件中指定优先提升slave1 ip:27的主机成为新的master
此时slave2将指向新的master
在slave2查询:
> show slave status\G
...
Master_Server_Id: 27
Galera Cluster
Galera Cluster简介
Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案。
下图图示:三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构。
Galera Cluster特点
1.**多主架构:**真正的多点读写的集群,在任何时候读写数据,都是最新的
2.**同步复制:**集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失
3.**并发复制:**从节点APPLY数据时,支持并行执行,更好的性能
4.**故障切换:**在出现数据库故障时,因支持多点写入,切换容易
5.**热插拔:**在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小
6.**自动节点克隆:**在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致
7.**对应用透明:**集群的维护,对应用程序是透明的
Galera Cluster工作过程
Galera Cluster
1.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/
2.Galera Cluster包括两个组件
- Galera replication library (galera-3)
- WSREP:MySQL extended with the Write Set Replication
- WSREP:一种协议
3.WSREP复制实现:
- PXC:Percona XtraDB Cluster,是Percona对Galera的实现
- MariaDB Galera Cluster
- 参考仓库:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.65/yum/centos7-amd64/
4.注意:都至少需要三个节点,不能安装mariadb-server,与系统安装的mariadb-server是冲突的,安装MariaDB-Galera-server会自动将mariadb-server卸载
Galera Cluster实现
- yum install MariaDB-Galera-server
- vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider = /usr/lib64/galera/libgalera_smm.so 启用galera模块,安装MariaDB-Galera-server时会自动生成此模块
wsrep_cluster_address=“gcomm://192.168.38.17,192.168.38.27,192.168.38.37” 说明galera-cluster的集群节点分别有哪些
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
下面配置可选项
wsrep_cluster_name = ‘mycluster’ galera-cluster集群的名称默认my_wsrep_cluster
wsrep_node_name = ‘node1’ 当前节点名称
wsrep_node_address = ‘192.168.38.17’ - 首次启动时,需要初始化集群,在其中一个节点上执行命令
- /etc/init.d/mysql start --wsrep-new-cluster
- 而后正常启动其它节点
- service mysql start
- 查看集群中相关系统变量和状态变量
- SHOW VARIABLES LIKE ‘wsrep_%’;
- SHOW STATUS LIKE ‘wsrep_%’;
- SHOW STATUS LIKE ‘wsrep_cluster_size’;
Galera Cluster复制的问题和解决方案
1).数据损坏或丢失
- Master: MHA + semi repl
- Slave: 重新复制
2).混合使用存储引擎
- MyISAM:不支持事务
- InnoDB: 支持事务
3).不惟一的server id
- 重新复制
4).复制延迟
- 需要额外的监控工具的辅助
- 一从多主:mariadb10版后支持
- 多线程复制:对多个数据库复制
Galera Cluster实验
【1.实验规划】
- wsrep_node_address1:192.168.38.17 wsrep_node_name = ‘node1’
- wsrep_node_address2:192.168.38.27 wsrep_node_name = ‘node2’
- wsrep_node_address3:192.168.38.37 wsrep_node_name = ‘node3’
【2.yum仓库配置并安装MariaDB-Galera-server】
# vim /etc/yum.repos.d/mysql.repo
[mysql]
name=mysql
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.65/yum/centos7-amd64/
gpgcheck=0
# yum install MariaDB-Galera-server -y
【3.节点配置】
# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.38.17,192.168.38.27,192.168.38.37"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name = 'mycluster'
wsrep_node_name = 'node1'
wsrep_node_address = '192.168.38.17'
【4.服务启动】
- 使用service启动
第一个节点(node1):
17 ~]# /etc/init.d/mysql start --wsrep-new-cluster
其后的节点:
# service mysql start
【5.实验测试】
利用xshell的撰写栏同时创建db1这个数据库:
三个节点只有一个节点显示成功,解决了多主时数据不一致的问题。